进程拥有两个基本的属性:资源的拥有者 和 独立调度单位。
进程是资源分配和独立运行的基本单位,每一个进程都完成一个特定的任务。
线程的引入进一步提高了程序并发执行的程度,从而进一步提高了资源的利用率和系统的吞吐量。引入线程目的是减少进程并发执行时的时空开销。因为进程的创建、撤销、切换较费时空,它既是调度单位,又是资源拥有者。
线程是系统独立调度和分派的基本单位,基本上不拥有系统资源,只需要少量的资源(指令指针IP,寄存器,栈),但可以共享其所属进程所拥有的全部资源。
一个进程可以创建一个或多个线程;一个线程可以创建一个或多个线程;一个进程可以创建一个或多个进程;但是线程不可以创建进程。
进程与线程的比较:
(1)引入线程后,线程是处理机调度的基本单位,进程是资源分配的基本单位,而不再是一个可执行的实体。在同一进程中线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时。将会引起进程的切换。
(2)引入线程后,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行。多个线程会争夺处理机,在不同的状态之间进行转换。线程也是一个动态的概念,也有一个从创建到消亡的生命过程,具有动态性。
(3)进程是资源分配的单位,一般线程自己不拥有系统资源,但可以访问其隶属进程的资源。同一进程中的所有线程都具有相同的地址空间(进程的地址空间)。
(4)同进程的不同线程间的独立性要比不同进程间的独立性低得多。多个线程共享进程的内存地址空间和资源。
(5)创建、撤销一个新线程系统开销小。两个线程间的切换系统开销小。
(6)同进程的不同线程可以分配到多个处理机上执行,加快了进程的完成。
线程共享的资源包括:
(1) 进程代码段
(2) 进程的公有数据(利用这些数据,线程很容易实现相互之间的通讯)
(3) 进程的所拥有资源。
线程独立的资源包括:
(1)线程ID:每个线程都有自己唯一的ID,用于区分不同的线程。
(2)寄存器组的值:当线程切换时,必须将原有的线程的寄存器集合的状态保存,以便重新切换时得以恢复。
(3)线程的堆栈:堆栈是保证线程独立运行所必须的。
(4)错误返回码:由于同一个进程中有很多个线程同时运行,可能某个线程进行系统调用后设置了error值,而在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的错误返回码变量。
(5)线程优先级:线程调度的次序(并不是优先级大的一定会先执行,优先级大只是最先执行的机会大)。