线程的分类

来源:互联网 发布:cmd查询数据库 编辑:程序博客网 时间:2024/06/04 23:21

线程分类:

用户级线程和内核级线程(轻量级进程)

用户级线程:

在一个纯粹的用户级线程软件中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。

这里写图片描述

使用用户级线程而非内核级线程有很多优点:
(1)由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核态特权,因此,进程不需要为了线程管理而切换到内核态,这节省了两次状态转换(从用户态到内核态,从内核态返回到用户态)的开销。
(2)调度可以是应用程序相关的。一个应用程序可能更适合简单的轮转调度算法,二零一个应用程序可能更适合基于优先级的调度算法。可以做到为应用程序量身定做调度算法而不影响底层的操作系统调度程序。
(3)用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程。线程库是一组供所有应用程序共享的应用程序共享的应用程序级别的函数。

用户级线程相对于内核级线程的缺点:
(1)在典型的操作系统中,许多系统调用会引起阻塞。因此,当用户级线程执行一个系统调用时,不进这个线程会被阻塞,进程中所有线程都会被阻塞。
(2)在纯粹的用户级线程中,一个多线程应用程序不能利用多处理技术。内核一次只把一个进程分配给一个处理器,因此一个进程中只有一个线程可以执行。

解决办法:
(1)把应用程序写成一个多进程应用程序而非多线程应用程序,但这种方法消除了线程的主要优点:每次切换都变成了进程间的切换,而不是线程间的切换,导致开销过大。
(2)使用jacketing技术,jacketing目标是把一个产生阻塞的系统调用转换成一个非阻塞的系统调用。

内核级线程:

在一个纯粹的内核级应用软件中,有关线程的所有工作都是由内核完成的,应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口(API)。

内核为进程及其内部的每个线程维护上下文信息,调度是基于线程完成的。

该方法克服了用户级线程的两个基本缺陷:
首先,内核可以同时把同一个进程中的多个线程调度到多个处理器中,再者,如果进程中的一个线程被阻塞,内核可以调度同一个线程中的另一个线程。

内核级线程方法的优点是:内核例程自身也是可以使用多线程的。
缺点:在把控制从一个线程传送到同一个进程内的另一个线程时,需要到内核的状态切换。

下表是单处理器VAX机上运行类UNIX操作系统的测量结果。
进行了两种测试:Null Fork(测试创间,调度,执行和完成一个调用空过程的进程/线程的时间,即就是派生一个进程、线程的开销)和Single-Wait(测量进程/线程给正在等待的进程/线程发信号,然后在某个条件上等待所需要的时间,即就是两个进程/线程的同步时间)。

这里写图片描述

从上表可以看出,用户级线程和内核级线程之间、内核级线程和进程之间都有一个数量级以上的性能差异。
从表面上看,虽然使用内核级进程和多线程技术会比使用单线程的进程有明显的速度提高,使用用户级线程却比内核级线程有额外的提高。不过额外的提高取决于应用程序的性质。如果应用程序中大多数线程切换都需要内核态的访问,那么基于用户级线程的方案不会比基于内核级线程的方案好多少。

这里写图片描述

混合方法:
在混合系统中,线程创建完全在用户空间中完成,现成的调度和同步也在应用程序中进行。
一个应用程序中的多个用户及线槽被映射到一些(小于或者等于用户级线程的数目)内核到线程上。程序员可以为特定的应用程序和处理器调节内核级线程的数目,以达到最佳效果。

这里写图片描述

在混合方法中,同一个应用程序中的多个线程可以在多个处理器上并行的运行,某个会引起阻塞的系统调用不会阻塞整个进程。

0 0