双核四线程在Windows8下查看的结果
超线程技术就是利用特殊的硬件指令,把一个物理芯片模拟成两个逻辑处理核心,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率。这种超线程技术(如双核四线程)由处理器硬件的决定,同时也需要操作系统的支持才能在计算机中表现出来。
程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Lightweight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,也被叫做用户线程。由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。用户线程与内核线程的对应关系有三种模型:一对一模型、多对一模型、多对多模型,在这以4个内核线程、3个用户线程为例对三种模型进行说明。
一对一模型对于一对一模型来说,一个用户线程就唯一地对应一个内核线程(反过来不一定成立,一个内核线程不一定有对应的用户线程)。这样,如果CPU没有采用超线程技术(如四核四线程的计算机),一个用户线程就唯一地映射到一个物理CPU的内核线程,线程之间的并发是真正的并发。一对一模型使用户线程具有与内核线程一样的优点,一个线程因某种原因阻塞时其他线程的执行不受影响;此处,一对一模型也可以让多线程程序在多处理器的系统上有更好的表现。
但一对一模型也有两个缺点:
- 许多操作系统限制了内核线程的数量,因此一对一模型会使用户线程的数量受到限制;
- 许多操作系统内核线程调度时,上下文切换的开销较大,导致用户线程的执行效率下降。
一对一模型
多对一模型多对一模型将多个用户线程映射到一个内核线程上,线程之间的切换由用户态的代码来进行,系统内核感受不到线程的实现方式。用户线程的建立、同步、销毁等都在用户态中完成,不需要内核的介入。因此相对一对一模型,多对一模型的线程上下文切换速度要快许多;此外,多对一模型对用户线程的数量几乎无限制。
但多对一模型也有两个缺点:
- 如果其中一个用户线程阻塞,那么其它所有线程都将无法执行,因为此时内核线程也随之阻塞了;
- 在多处理器系统上,处理器数量的增加对多对一模型的线程性能不会有明显的增加,因为所有的用户线程都映射到一个处理器上了。
多对一模型
多对多模型多对多模型结合了一对一模型和多对一模型的优点,将多个用户线程映射到多个内核线程上。由线程库负责在可用的可调度实体上调度用户线程,这使得线程的上下文切换非常快,因为它避免了系统调用。但是增加了复杂性和优先级倒置的可能性,以及在用户态调度程序和内核调度程序之间没有广泛(且高昂)协调的次优调度。
多对多模型的优点有:
- 一个用户线程的阻塞不会导致所有线程的阻塞,因为此时还有别的内核线程被调度来执行;
- 多对多模型对用户线程的数量没有限制;
- 在多处理器的操作系统中,多对多模型的线程也能得到一定的性能提升,但提升的幅度不如一对一模型的高。
多对多模型
在现在流行的操作系统中,大都采用多对多的模型。
查看进程与线程一个应用程序可能是多线程的,也可能是多进程的,如何查看呢?在Windows下我们只须打开任务管理器就能查看一个应用程序的进程和线程数。按“Ctrl Alt Del”或右键快捷工具栏打开任务管理器。
查看进程数和线程数: