线程的引入:
进程创建、撤销和切换中,系统付出较大的时空开销。
这限制了系统中所设置的进程的数目,而且进程切换也不宜过于频繁,从而限制了并发程度的进一步提高。
如果将拥有资源的单位和可独立调度/分派的单位分离,即对于拥有资源的基本单位,不对之进行频繁的切换,所以引入了线程。
线程和进程的比较:
【操作系统】进程和线程比较_暮色_年华的博客
线程状态:
执行状态:获得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)多对多模型:将许多用户线程映射到同样数量或更少数量的内核线程上。
结合了前两种模型的优点