线程的实现方式
用户级线程
User-Leve Thread(ULT)
早期的操作系统只支持进程, 不支持线程
当时的"线程"是由线程库实现的
即代码层次实现线程
举个最简单的例子
let i = 0;
while(true){
if(i==0){
// do something
}
if(i==1){
// do something
}
i++;
i%=2;
}
以上的while循环中相当于有两个线程, 线程的切换通过每次i的值进行切换
很多编程语言提供了复杂而强大的线程库, 同样可以实现线程的创建, 销毁, 调度等
这样形成的"线程"由应用程序进行管理, 而CPU仍只是为该进程工作, 操作系统对其内部不关心
优缺点
-
优点
-
缺点
内核级线程
Kernel-Level Thread
又称 内核支持的线程
现代大多数操作系统都实现了内核级线程
内核级线程的线程管理毫无疑问就是操作系统进行管理了
线程的切换由操作系统负责, 需要从用户态转为内核态
优缺点
-
优点
-
缺点
此处的成本与开销是对比于 用户级线程 而不是对比于进程
多线程模型
多线程模型就是 用户级线程 与 内核级线程 的对应关系
一对一模型
一个用户级线程 对应 一个内核级线程 即如果代码层面请求创建一个线程,
那么操作系统中该进程中就为其添加一个线程
多对一模型
多个用户级线程 对应 一个内核级线程
这相当于和最初操作系统没有线程一样,
或者说一个进程只有一个线程一样
多对多模型
n个用户级线程 对应 m个内核级线程
(n>=m)
注意, 有一个进程有多个内核级线程后, 他们的阻塞关系
内核级线程被阻塞后, 进程不一定被阻塞, 或者说进程未被完全阻塞
只有该进程中所有的内核级线程全被阻塞之后, 该进程才被完全阻塞
但如果该进程只有一个内核级线程, 那么该线程被阻塞相当于该进程被阻塞
上述没有说m数量, 但必然有m>=2, 因为m=1时其就成了多对一模型