【线程的实现方式】
线程的实现可以分为两类:用户级线程(User-Level Thread,ULT)、内核级线程(Kernel-Level Thread,KLT)
在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在
通常,应用程序从单线程开始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程
在内核级线程中,有关线程管理的所有工作都由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口
内核进程为进程及其内部的每个线程都会维护上下文信息,调度也是在内核基于线程架构的基础上完成
【多线程模型】
在某些系统中,同时支持用户线程和内核线程,由此可使用组合方式来实现多线程模型,线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行
一个应用程序的多个用户级线程被映射到一些小于等于用户级线程数目的内核级线程中
具体来说,用户级线程与内核级线程的连接方式分为三种:
1.多对一模型
多个用户级线程映射到一个内核级线程上,线程管理在用户空间中完成,用户级线程对操作系统透明
该方案的线程管理是在用户空间中进行的,效率较高,但当一个线程在使用内核服务被阻塞时,整个进程都会被阻塞,此外,多个线程也不能并行地在处理机上运行
2.一对一模型
每个用户级线程映射到一个内核级线程上
当一个线程被阻塞时,允许另外一个线程继续执行,并发能力较强,但每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销较大,影响应用程序性能
3.多对多模型
$n$ 个用户级线程映射到 $m$ 个内核级线程上,要求 $m\leq n$
该方案是对多对一模型和一对一模型的折中,不仅克服了多对一模型的并发性不高的缺点,还克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点