内核级线程与用户级线程

这两天在写这篇blog的时候,顺带复习操作系统的资料,遇到了一个之前没有弄明确的问题,就是关于内核级线程与用户级线程。在查阅了一些资料之后,发表一下我个人简单介绍。

线程已经在很多系统中实现。到那时各个操作系统实现方式不全然同样。
比方在有的系统中,特倍是一些数据库管理系统如IBM的infomix系统。所实现的用户级线程(UserLevel Threads ,ULT);而还有一些系统如(Mac os的前身Macintosh和OS/2操作系统)所实现的是内核支持线程 ( Kernel Supported threads, KST);还有一些是Solaris操作系统,则同一时候实现了这两中类型的线程。


KST:

  内核支持线程是在核心空间实现的。内核为每一个线程在核心空间中设置了一个线程控制块,用来登记该线程的线程标识符、寄存器值、状态、优先级等信息。全部对线程的操作,如创建、撤消和切换等。都是通过系统功能调用由内核中的相应处理程序完毕;设置了内核支持线程的系统,其调度是以线程为单位进行的。

长处:
在多处理器系统中,内核能够同一时候调度同一进程中多个线程并行运行到多个处理器中;假设进程中的一个线程被堵塞,内核能够调度同一个进程中的还有一个线程。内核支持线程具有非常小的数据结构和堆栈,线程的切换比較快。切换开销小;内核本身也能够使用多线程的方式来实现。


缺点:
即使CPU在同一个进程的多个线程之间切换。也须要陷入内核,因此其速度和效率不如用户级线程。



ULT:

用户级线程仅存在于用户空间中,与内核无关。就内核而言。它仅仅是管理常规的进程—单线程进程。而感知不到用户级线程的存在每一个线程控制块都设置在用户空间中。全部对线程的操作也在用户空间中由线程库中的函数完毕。无需内核的帮助设置了用户级线程的系统,其调度仍是以进程为单位进行的。
长处:
线程的切换无需陷入内核,故切换开销小。速度非常快线程库对用户线程的调度算法与OS的调度算法无关。因此,线程库可提供多种调度算法供应用程序选择使用用户级线程的实现与操作系统平台无关。
缺点:
系统调用的堵塞问题:相应用程序来讲。一个线程的堵塞将导致整个进程中全部线程的堵塞;多线程应用无法享用多处理机系统中多个处理器带来的长处。

组合方式:

内核支持多KST线程的建立、调度和管理,同一时候,也同意用户应用程序建立、调度和管理用户级线程一些内核支持线程相应多个用户级线程,程序猿可按应用须要和机器配置对内核支持线程数目进行调整,以达到较好的效果。
长处:
同一个进程内的多个线程能够同一时候在多处理器上并行运行;在堵塞一个线程时。并不须要将整个进程堵塞


两者比較:

(1)内核支持
用户级线程可在一个不支持线程的OS中实现。
内核支持线程则须要得到OS内核的支持。


(2)处理器分配
在多处理机环境下。对用户级线程而言主。内核一次仅仅为一个进程分配一个处理器。进程无法享用多处理机带来的长处;
在设置有内核支持线程时,内核可调度一个应用中的多个线程同一时候在多个处理器上并行运行,提高程序的运行速度和效率。

(3)调度和线程运行时间
设置有内核支持线程的系统,其调度方式和算法与进程的调度十分类似,仅仅只是调度单位是线程;
对仅仅设置了用户级线程的系统,调度的单位仍为进程。


因此,在条件同样的情况下,内核支持的线程通常比用户级线程得到很多其它的CPU运行时间。
(4)切换速度
用户级线程的切换,通常发生在一个应用程序的诸线程之间,而不须要陷入内核,并且切换的规则也非常easy,切换速度比内核支持线程至少快一个数量级。

(5)系统调用
在典型OS中,很多系统调用都会引起堵塞。

当一个用户级线程运行这些系统调用时,被堵塞的将是整个进程;当一个内核支持线程运行这些系统调用时。内核仅仅堵塞这个线程。但仍可调度其所属进程的其它线程运行。


非常多是从CC的ppt上拷贝的,希望会有帮助!


原文地址:https://www.cnblogs.com/mengfanrong/p/5063152.html