用户级别线程和内核级别线程
https://www.cnblogs.com/tobe98/archive/2019/10/13/11664779.html
https://blog.csdn.net/zxc024000/article/details/78972283
https://blog.csdn.net/winterfeng123/article/details/79788714?utm_source=blogxgwz6
用户级别线程和内核级别线程
1、进程是系统分配资源的最小单位。
2、线程是处理器调度的最小单位, 是分配CPU的基本单位
3、一个进程可以包含很多线程,且这些线程共享进程内的所有资源。
并行
多个执行命令同时执行
并发
多个执行命令交替执行
用户级别线程
- 使用线程库来实现线程, 位于用户空间, 对内核透明
- 用线程库实现的多线程只能在一个CPU上运行:并发执行
- 线程的创建,消息传递,调度,保存/恢复上下文都由线程库来完成
- 由于操作系统只能看见进程, 当有一个线程阻塞时, 整个进程都会阻塞, 代替方案jacket(取决于实现), 将一个产生阻塞的系统调用转换为一个不产生阻塞的系统调用
- jacket的目标是把一个产生阻塞的系统调用转化成一个非阻塞的系统调用。例如,当进程中的一个线程调用IO中断钱,先调用一个应用级的I/O jacket例程,而不是直接调用一个系统I/O。让这个jacket例程检查并确定I/O设备是否忙。如果忙,则jacketing将控制权交给该进程的线程调度程序,决定该线程进入阻塞状态并将控制权传送给另一个线程。
内核级别线程
- 可以做到并行
- 内核中存在内核线程表和进程表, 一个内核线程阻塞不会导致其他线程阻塞
- 每次执行线程切换, 都需要切换状态, 代价更大
- 线程表是存放在操作系统固定的表格空间或者堆栈空间里,所以内核级线程的数量是有限的,扩展性比不上用户级线程
多对一用户级线程模型
该模型下, 同一个进程的所有线程都对应一个内核调度实体(内核中的进程表)(KES), 并且内核不知道这个进程有哪些线程。 KES无法将其他线程, 调度到其他处理器上。 该进程(所有的线程)被阻塞, 直到本次系统调用(比如I/O)结束。
现在几乎没有系统继续使用这个模型,因为它无法利用多个处理核。
一对一内核级线程模型
相当于使用一根内核级别线程
- 每个用户线程都对应一个的内核调度实体。
- 内核会对每个线程进行调度,可以调度到其他处理器上。
- 线程每次操作会在用户态和内核态切换。
- 线程数量过多时,对系统性能有影响。
多对多两级线程模型
- 每个用户线程拥有多个内核调度实体
- 多个用户线程也可以对应一个内核调度实体
- 实现该模型非常复杂
开发人员可以创建任意多的用户线程,并且相应内核线程能在多处理器系统上并发执行。而且,当一个线程执行阻塞系统调用时,内核可以调度另一个线程来执行
由于Linux是使用线程的创建和进程没什么区别, 所以相当于使用的是一对一线程模型。 有两个模型:LinuxThread和NPTL

浙公网安备 33010602011771号