利用传统的进程概念和设计方法已经难以设计出适合于SMP(多对称处理机)结构计算机系统的OS,其根本原因在于多处理机环境下进程的创建,调度,分配所花费的时空开销太大,引入线程,以线程作为调度和分派的基本单位可以提升系统的并发性,改善多处理机系统的性能。
1.创建进程:系统在创建一个进程时,必须为它分配其所必须的,除处理机外的所有资源,如内存空间,IO设备,以及建立相应的PCB。
2.撤销进程:系统在撤销进程时,必须先对其所占有的资源执行回收操作,然后再撤销PCB;
3.进程切换:对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中的CPU环境,需要花费不少处理机时间。
设法将进程的两个属性分开,即:不把作为调度和分派的基本单位也同时作为拥有资源的单位,以做到“轻装上阵”;而对于拥有资源的基本单位,又不对之施以频繁的切换。
线程运行的三个状态:
线程控制块TCB
1.调度的基本单位
在引入线程的OS中,已把线程作为调度和分派的基本单位,当线程切换时,仅需保存和设置少量寄存器内容,切换代价远低于进程。在同一进程中,线程的切换不会引起进程的切换,但从一个进程的线程切换到另一个进程的线程时,必然会引起进程的切换。
2.并发性
在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,甚至允许一个进程中的所有线程都能并发执行,不同进程中的线程也能并发执行。使OS具有了更好的 并发性。
3.拥有资源
进程可以拥有资源,并作为系统中拥有资源的一个基本单位。然而,线程本身并不拥有资源,而是仅有一点必不可少的,能保证独立运行的资源。每个线程中都应具有一个用于控制线程运行的线程控制块TCB,用于指示被执行指令序列的程序计数器,保留局部变量,少数状态参数和返回地址等的一组寄存器和堆栈。
多个线程可以共享该进程所拥有的资源,属于同一进程的所有线程都具有相同的地址空间,线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的资源,如已打开的文件,定时器,信号量机构等的内存空间和它所申请的IO设备等。
4.独立性
同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。为防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其它资源,除了共享全局变量外,不允许其它进程访问。但是同一进程的不同线程往往为了提高并发性以及进行相互之间的合作而创建的,它们共享进程的内存地址空间和资源,如每个线程都可以访问它们所属进程地址空间中的所有地址,一个线程的堆栈可以被其它线程读,写,甚至完全清除。由一个线程打开的文件可以供其它线程读,写。
5.系统开销
在创建或撤销进程时,系统都要为之分配和回收进程控制块,分配或回收其它资源,如内存空间和IO设备等。OS为此所付出的开销明显大于线程创建或撤销时所付出的开销。此外由于一个进程中多个线程具有相同的地址空间,线程之间的同步和通信也比进程的简单。因此一些OS中,线程的切换,同步和通信都无需操作系统内核的干预。
6.支持多处理机系统
在多处理机系统中,单线程进程只能在一个处理机上运行,但多线程进程可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行。
多线程OS中的进程:
概念介绍:
kST——Kernel Supported Threads
内核支持线程KST是在内核的支持下运行的,它们的创建,阻塞,撤销和切换等,都是在内核空间实现的。为了对内核线程进行控制和管理,在内核空间为每一个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并对其加以控制。当前大多数OS都支持内核支持线程。
内核支持线程的优点:
内核支持线程的缺点:
内核支持线程的实现
系统在创建一个新进程时,便为它分配一个任务数据区PTDA(Per Task Data Area),其中包括若干个线程控制块TCB空间。
在每一个TCB中可保存线程标识符,优先级,线程运行的CPU状态等信息。
这些信息与用户级线程TCB中的信息相同,但是现在却是被保存在内核空间当中。
每当进程要创建一个线程时,便为新线程分配一个TCB,将有关信息填入该TCB中,并为之分配必要的资源。内核支持线程的调度和切换与进程的调度和切换十分相似。
概念介绍:
用户级线程是在用户空间中实现的。对于线程的创建,撤销,同步与通信等功能,都无需内核的支持,即用户级线程是与内核无关的。在一个系统中的用户级线程的数目可以达到数百个至数千个。由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。
注:对于设置了用户级线程的系统,其调度仍是以进程为单位进行的。
而内核支持线程调度是以线程为单位进行的
用户级线程的优点:
用户级线程的缺点:
用户级线程的实现
用户级线程是在用户空间实现的。所有的用户级线程都具有相同的结构,它们都运行在一个中间系统上。当前有两种方式实现中间系统:
1.运行时系统:实质上是用于管理和控制线程的函数的集合,包括用于创建和撤销线程的函数,线程同步和通信的函数以及实现线程调度的函数等。这些函数能使用户级线程与内核无关。运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
用户级线程在切换时不须转入核心态,而是由运行时系统中的线程切换过程来执行切换任务。当线程需要系统资源时,将该要求传送给运行时系统,由后者通过相应的系统调用来获得系统资源。
2.内核控制线程:这种线程又称为轻型进程LWP。
为了节省资源,将多个LWP做成一个缓冲池,称为线程池。
用户进程中的任何一个线程都可以连接到LWP池中的任何一个LWP上。
多个用户级线程可多路复用一个LWP,但是只有当前连接到LWP上的线程才能和内核通信,其余线程或阻塞或等待LWP。
概念介绍:
在组合方式线程系统中,内核支持多个内核支持线程的建立,调度和管理,同时也允许用户应用程序建立,调度和管理用户级线程。
由于用户级线程和内核支持线程连接方式不同,从而形成了三种不同模型:

上一篇:PHP反序列化漏洞之pop链2
下一篇:第五章——大数定律和中心极限定理