线程的实现可分为两大类,用户级线程(user-levelthread,ULT)和内核级线程(kernel-levelthread,KLT)。后者又称为内核支持的线程或轻量级进程。
(1)用户级线程
在一个纯粹的用户级线程软件中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。
使用用户级线程而不是内核级线程的优点有:
- 线程切换不需要内核态特权,进程并不需要为了线程管理而切换到内核态
- 可以为应用程序量身定做调度算法而不扰乱底层的操作系统调度程序
- 用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程
相比内核级线程,用户级线程有两个明显的缺点:
- 许多系统调用都会引起阻塞,当用户级线程执行一个系统调用时,不仅这个线程会被阻塞,进程中的所有线程都会被阻塞
- 在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术
(2)内核级线程
在一个纯粹的内核级线程软件中,有关线程管理的所有工作都是由内核完成的,应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口(API)。
该方法克服了用户级线程方法的两个基本缺陷:内核可以同时把同一个进程的多个线程调度到多个处理器中;如果进程中的一个线程被阻塞,内核可以调度同一个进程中的另一个线程。
相比用户级线程它的主要缺点是:用户级线程的线程切换需要少量的机器指令,而内核级线程需要完整的上下文切换,修改内存映像,使高速缓存失效,这导致了若干数量级的延迟。