用户级别线程和内核级别线程

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、一个进程可以包含很多线程,且这些线程共享进程内的所有资源。

 

并行

多个执行命令同时执行

并发

多个执行命令交替执行

 

用户级别线程

  1. 使用线程库来实现线程, 位于用户空间, 对内核透明
  2. 用线程库实现的多线程只能在一个CPU上运行:并发执行
  3. 线程的创建,消息传递,调度,保存/恢复上下文都由线程库来完成
  4. 由于操作系统只能看见进程, 当有一个线程阻塞时, 整个进程都会阻塞, 代替方案jacket(取决于实现), 将一个产生阻塞的系统调用转换为一个不产生阻塞的系统调用
  5. jacket的目标是把一个产生阻塞的系统调用转化成一个非阻塞的系统调用。例如,当进程中的一个线程调用IO中断钱,先调用一个应用级的I/O jacket例程,而不是直接调用一个系统I/O。让这个jacket例程检查并确定I/O设备是否忙。如果忙,则jacketing将控制权交给该进程的线程调度程序,决定该线程进入阻塞状态并将控制权传送给另一个线程。

内核级别线程

  1. 可以做到并行
  2. 内核中存在内核线程表和进程表, 一个内核线程阻塞不会导致其他线程阻塞
  3. 每次执行线程切换, 都需要切换状态, 代价更大
  4. 线程表是存放在操作系统固定的表格空间或者堆栈空间里,所以内核级线程的数量是有限的,扩展性比不上用户级线程

 

多对一用户级线程模型

该模型下, 同一个进程的所有线程都对应一个内核调度实体(内核中的进程表)(KES), 并且内核不知道这个进程有哪些线程。 KES无法将其他线程, 调度到其他处理器上。 该进程(所有的线程)被阻塞, 直到本次系统调用(比如I/O)结束。

现在几乎没有系统继续使用这个模型,因为它无法利用多个处理核。

一对一内核级线程模型

相当于使用一根内核级别线程

  1. 每个用户线程都对应一个的内核调度实体。
  2. 内核会对每个线程进行调度,可以调度到其他处理器上。
  3. 线程每次操作会在用户态和内核态切换。
  4. 线程数量过多时,对系统性能有影响。

多对多两级线程模型

  1. 每个用户线程拥有多个内核调度实体
  2. 多个用户线程也可以对应一个内核调度实体
  3. 实现该模型非常复杂

开发人员可以创建任意多的用户线程,并且相应内核线程能在多处理器系统上并发执行。而且,当一个线程执行阻塞系统调用时,内核可以调度另一个线程来执行

 

由于Linux是使用线程的创建和进程没什么区别, 所以相当于使用的是一对一线程模型。 有两个模型:LinuxThread和NPTL

 

posted @ 2020-08-15 14:49  x_Aaron  阅读(355)  评论(0)    收藏  举报