2010-05-06 星期四 晴朗
引入进程与线程这两个抽象,主要是资源的问题。硬件资源是有限的(如CPU,内存,各个寄存器等),而要支持多用户“同时”操作。以烹饪比喻,硬件资源就好像厨房以及厨房中的各种厨具。进程就好像各个厨师,操作系统调度程序决定什么时候应该将哪个厨师经来做饭,并且给了他们一定的时间限制,如果到时间没有做完,那么会为其保存现场,切换成下个厨师上次的现场,然后请下一个厨师进来继续做饭。而线程的概念是进程的拓展,可以理解线程实际上不只是一个厨师,而是一组厨师,对操作系统来说没有区别,同组厨师可以随便在上一个厨师的基础上继续工作。他们的切换不需要切换现场(保存现场,调出下个进程现场)。所以开销比较大,但是几个厨师同时在厨房中干活是需要配合的。因此,听到“谁把我的菜给扔掉了”是不足为奇的。
一般的讲,线程是一个程序,或者进程内部的一个顺序控制流。线程本身不能独立运行,必须在进程中执行,使用进程的地址空间。每个线程有自己单独的程序计数器。
线程有时称为轻量级进程。与进程一样,它们拥有通过程序运行的独立的并发路径,并且每个线程都有自己的程序计数器,称为堆栈和本地变量。然而,线程存在于进程中,它们与同一进程内的其他线程共享内存、文件句柄以及每进程状态。
一个进程中的线程是在同一个地址空间中执行的,所以多个线程可以同时访问相同对象,并且它们从同一堆栈中分配对象。