这两天在写这篇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)切换速度
用户级线程的切换,通常发生在一个应用程序的诸线程之间,而不需要陷入内核,而且切换的规则也很简单,切换速度比内核支持线程至少快一个数量级。
(5)系统调用
在典型OS中,许多系统调用都会引起阻塞。当一个用户级线程执行这些系统调用时,被阻塞的将是整个进程;当一个内核支持线程执行这些系统调用时,内核只阻塞这个线程,但仍可调度其所属进程的其他线程执行。
很多是从CC的ppt上拷贝的,希望会有帮助!