多通道模式 线程进程( 二 )


早期的操作系统只有进程,没有线程 。
后来随着计算机的发展 , 多任务间的上下文切换效率越来越高,于是抽象出一个更小的概念——线程 。通常 , 一个进程会有多个(或一个)线程 。
线程的出现允许一个进程拥有多个线程 。
多线程和多核上述时间片轮换的调度方式是指一个任务经过一小段时间后强制暂停执行下一个任务,每个任务依次执行 。很多操作系统书都说“同一时间只执行一个任务” 。那么可能有人要问双核处理器了?两个核心不是同时运行吗?
其实“同时只执行一个任务”这句话是不准确的 , 至少是不完整的 。在多核处理器的情况下,线程如何执行?这需要了解内核线程 。
多核(core)处理器是指在一个处理器上集成多个计算核心来提高计算能力,即有多个处理核心进行真正的并行计算 , 每个处理核心对应一个内核线程 。
内核线程(KLT)是由操作系统内核直接支持的线程 。这种线程由内核切换,内核通过操作调度器调度线程 , 负责将线程的任务映射到各个处理器 。一般一个处理核心对应一个内核线程,比如单核处理器对应一个内核线程,双核处理器对应两个内核线程,四核处理器对应四个内核线程 。
现在的电脑一般都是双核四线程,四核八线程 。超线程技术是将一个物理处理核心模拟成两个逻辑处理核心,对应两个内核线程,所以操作系统中看到的CPU数量是实际物理CPU的两倍 。例如,如果您的计算机是双核四线程,请打开任务管理器\性能查看四个CPU的监视器 , 打开四核八线程查看八个CPU的监视器 。
在Windows8中查看四核线程的结果
超线程技术是利用特殊的硬件指令将一个物理芯片模拟成两个逻辑处理核心,使单个处理器可以使用线程级并行计算,从而兼容多线程操作系统和软件 , 减少CPU的空闲时间,提高CPU的运行效率 。这种超线程技术(如双核四线程)是由处理器的硬件决定的,也需要操作系统的支持才能在电脑中显示 。
程序一般不直接使用内核线程,而是使用内核线程的一个高级接口——轻量级进程(LWP) 。轻量级进程就是我们通常所说的线程,也叫用户线程 。由于每个轻量级进程都由一个内核线程支持 , 所以只有首先支持内核线程,才能有轻量级进程 。用户与内核线程的对应关系有三种模型:一对一模型、多对一模型和多对多模型 。这里以四个内核线程和三个用户线程为例来说明这三种模型 。
一对一模型对于一对一模型,一个用户线程唯一对应一个内核线程(反之不一定成立,内核线程也不一定有对应的用户线程) 。这样,如果CPU不采用超线程技术(如四核四线程计算机),一个用户线程唯一映射到一个物理CPU的内核线程,线程间的并发就是真并发 。一对一的模式使得用户线程拥有和内核线程一样的优势 。当一个线程因为某种原因被阻塞时 , 其他线程的执行不会受到影响 。在这里,一对一模型也可以使多线程程序在多处理器系统上执行得更好 。
但是一对一模式也有两个缺点:
很多操作系统限制内核线程的数量,所以一对一的模式会限制用户线程的数量;
当调度多个操作系统内核线程时 , 上下文切换开销大,导致用户线程执行效率下降 。
一对一模型
多对一模型多对一模型将多个用户线程映射到一个内核线程,线程之间的切换由用户态代码完成 , 所以系统内核感受不到线程的实现 。用户线程的建立、同步和销毁都在用户态完成,不需要内核的干预 。所以相对于一对一模型,多对一模型的线程上下文切换速度要快很多;此外,多对一模型对用户线程的数量几乎没有限制 。
但是多对一模型也有两个缺点:
如果其中一个用户线程被阻塞 , 所有其他线程将无法执行,因为此时内核线程被阻塞 。
在多处理器系统上,处理器数量的增加不会显著提高多对一模型的线程性能,因为所有用户线程都映射到一个处理器 。
多对一模型
多对多模型多对多模型结合了一对一模型和多对一模型的优点 , 将多个用户线程映射到多个内核线程 。线程库负责在可用的可调度实体上调度用户线程,这使得线程的上下文切换非常快 , 因为它避免了系统调用 。然而,它增加了复杂性和优先级反转的可能性,以及在用户模式调度程序和内核调度程序之间没有广泛(且昂贵)协调的情况下的次优调度 。