1、背景
目前对内核不熟悉的阶段,所有的知识有零碎的来自网络。但是网络上各有各见解,有片面,有大牛,有过时,有现在的。我作为一个小白,只能做到兼听则明。如果我的博客中有什么问题,请大家指出,共同进步。
1.1 参考资料
https://www.cnblogs.com/Mered1th/p/10745137.html
https://www.zhihu.com/question/35128513
https://www.cnblogs.com/jingzhishen/p/4433023.html
2、用户线程和内核线程
线程按其调度者(如果内核知悉这个线程,即由内核调度这个线程;否则就是进程来调度它,线程竞争进程的运行时间)可分为用户级线程和内核级线程两种。
用户线程:有关线程的管理的所有工作都由应用程序来完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。
1>用户级线程仅存在于用户空间
2>内核并不能看见用户线程
3>内核资源的分配仍然是安装进程进行分配的;各个用户线程只能在进程内进行资源竞争。
内核线程:线程管理的所有工作都由内核完成,应用程序没有进行线程管理的代码,仅有一个到内核级线程的编程接口。内核为进程及内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。
1>线程的创建、撤销和切换等都需要内核直接实现,即内核了解每个作为可调度实体的线程;
2>这些线程可在全系统内进行调度资源的竞争;
3>内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。
在一定程度上类似于进程,只是创建、调度的开销比进程小。
(a) N:1用户线程模型----多对一模型
用户线程由进程来管理,OS内核完全不知道线程信息。每个线程在同一进程竞争“被调度的CPU时间”。
由于内核不干涉线程的任何生命活动,也不干涉同一进程下的线程环境切换,因此多个线程只能调度到一个CPU,约束了并发总量;
若一个线程阻塞,进程的所有线程都会阻塞。
(b)1:1核心线程模型(PThread线程库---NPTL(Native POSIX Thread Libary))
应用程序创建的每一个线程都由一个内核线程直接管理,OS内核将每一个内核线程都调度到系统CPU上,
所有线程直接和"系统范围"内的其他线程竞争。
优点:当一个线程被阻塞时,允许另一个线程继续运行,并发能力强
缺点:每创建一个用户线程都需要创建一个内核级线程与之对应,这样创建线程开销比a要大,会影响到应用程序的性能
(3)N:M模型
N:M混合模型提供了两级控制,将用户线程映射为系统的可调度体以实现并行,这个可调度体称为轻量级进程(LWP:light weight process)。LWP再一一映射到内核线程。OS 内核将每个核心线程都调到系统CPU上,因此所有线程都在“系统竞争范围”工作。
a、b的折中