概念
线程: 程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,线程由CPU独立调度,在多CPU下可以多线程同时运行。
进程: 进程是资源(CPU、内存等)分配的基本单位,拥有独立的地址空间,它是程序执行时的一个实例,一个进程可有多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
操作系统线程模型
1:1核心线程模型 pthread线程库--NPTL
内核线程(KLT)由操作系统内核直接支持的线程,内核通过操纵调度器对线程进行调用,程序不直接与内核线程接触而是通过轻量级进程(LWP),LWP内核线程一一对应,程序和内核线程通过轻量级进程联系起,这样的局限性就是每次线程操作都需要从用户态到内核态的转化,代价高,而且由于一一对应的关系,轻量级线程数量肯定有限的,受限于内核线程的数量
N:1用户线程
过去的操作系统大部分是这种实现方式,这种方式的好处之一就是即使操作系统不支持线程,也可以通过库函数来支持线程,但是需要程序员自己实现线程的数据结构、创建销毁和调度维护。也就相当于需要实现一个自己的线程调度内核,在操作系统中实现了真实的多线程,减少了操作系统从内核态到用户态的切换开销
N:M混合线程模型NGPT
N:M混合线程模型提供了两级控制,将用户线程映射为系统的可调度体以实现并行,这个可调度体称为轻量级进程(LWP:light weight process),LWP
再一一映射到核心线程。如下图所示。OS内核将每一个核心线程都调到系统CPU上,因此,所有线程都工作在“系统竞争范围.
语言小结
Golang的协程就是使用了这种模型,在用户态,协程能快速的切换,避免了线程调度的CPU开销问题
Java线程实现基于操作系统原生线程模式来实现,对于SUN JDK windows版本和linux版本都是使用一对一的线程模型来实现,就是一条java线程就映射到一条轻量级进程一种,也就是说现在的Java中线程的本质,其实就是操作系统中的线程
参考链接:
[https://www.cnblogs.com/jingzhishen/p/4433023.html]
[https://blog.csdn.net/CringKong/article/details/79994511#1_1]