线程的引入:

进程创建、撤销和切换中,系统付出较大的时空开销。

这限制了系统中所设置的进程的数目,而且进程切换也不宜过于频繁,从而限制了并发程度的进一步提高。

如果将拥有资源的单位和可独立调度/分派的单位分离,即对于拥有资源的基本单位,不对之进行频繁的切换,所以引入了线程。

线程和进程的比较:

【操作系统】进程和线程比较_暮色_年华的博客

线程状态:

执行状态:获得CPU正在运行

就绪状态:线程已具备各种执行条件,只需获得CPU便可立即执行

阻塞状态:线程在执行中因某事件受阻而处于暂停状态。

线程控制块TCB(了解)

多线程OS中的进程属性:

(1)进程是系统资源分配的基本单位

资源:用户的地址空间,实现进程(线程)间同步和通信的机制,已打开的文件和已申请到的IO设备,地址映射表

(2)进程可包含多个线程,至少有一个线程

(3)进程不是一个可执行的实体。在多线程OS中,把线程作为独立运行的基本单位,此时的进程已不再是一个可执行的实体。

如进程处于执行状态,是指进程中的某线程正在执行。

如把某个进程挂起,该进程中所有线程也被挂起。

线程的实现:

内核支持线程KST:

线程的创建、撤销和切换都是在内核。

内核根据线程控制块感知某线程的存在。

内核支持线程的优点:

(1)在多处理器系统中,内核能够同时调度同一进程的多个线程并行执行。

(2)进程中的一个线程被阻塞,内核能调度同一进程的其他线程占有处理器运行

(3)内核支持线程具有较小的数据和堆栈,线程的切换比较快,开销小。

(4)内核自身可用多线程技术实现,能提高系统的执行速度和效率。

内核支持线程的缺点:

对于用户的线程切换而言,其模式切换的开销较大,同一个进程中,从一个线程切换到另一个线程时,需要从用户态转到核心态进行。

因为用户进程的线程在用户态运行,而线程调度和管理在内核实现,系统开销大。

用户级线程ULT:

在用户空间实现,线程的创建、撤销、同步与通信等功能,无需内核的支持,由用户空间中的线程库完成。即用户级线程是与内核无关的,内核不知道线程的存在。

用户级线程的系统,调度以进程为单位。

如果采用轮转调度算法,各个进程轮流执行一个时间片,如果A进程有1个线程,B进程有100个线程,A中线程的运行时间是B中线程运行时间的100倍。不公平

内核支持线程,调度以线程为单位。

用户级线程的优点:

(1)线程切换不需要转换到内核空间。

对一个进程而言,所有线程的管理数据结构均在进程的用户空间中,管理线程切换的线程库也在用户地址空间运行,因此进程不必切换到内核方式做线程管理,节省开销。

(2)调度算法可以是进程专用的。

在不干扰OS调度的情况下,不同的进程可以选择不同的调度算法。

(3)用户级线程的实现与操作系统平台无关。

缺点:

(1)系统调用的阻塞问题

基于进程机制的OS中,大多数系统调用将使进程阻塞,因此,当线程执行一个系统调用时,不仅该线程被阻塞,而且,进程内的所有线程会被阻塞。

在内核支持线程方式中,则进程中的其他线程仍然可以运行。

(2)多线程应用不能利用多处理机进行多重处理的优点。

内核每次分配给一个进程仅有一个CPU,因此,进程中仅有一个线程能执行。

组合方式:

内核支持多KST(内核支持线程)的建立、调度和管理

允许应用程序建立、调度和管ULT(用户支持线程)

同一个进程的多个线程可以在多处理器上并行执行。

阻塞一个线程时并不需要将整个进程阻塞。

通过时分多路复用技术,一些内核支持线程对应多个用户级线程

三种模型:

(1)多对一模型:

用户线程映射到一个内核控制线程。

这些用户线程一般属于一个进程,运行在该进程的用户空间,线程管理由用户空间的线程库来完成。

优点:开销小,效率高

缺点:

(1)如果一个线程在访问内核时发生阻塞,则整个进程都会被阻塞。

(2)只能有一个线程访问内核,多个线程不能同时在多个处理机上运行。

(2)一对一模型:每个用户级线程映射到一个内核支持线程。

每个用户级线程都需要映射到内核控制线程

每创建一个用户级线程,相应地就需要创建一个内核线程。

优点:提供了比多对一模型更好的并发功能

缺点:开销大、限制了整个系统的线程数

(3)多对多模型:将许多用户线程映射到同样数量或更少数量的内核线程上。

结合了前两种模型的优点