OS Thread Model

aside section ._1OhGeD · · 671 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

概念

线程: 程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,线程由CPU独立调度,在多CPU下可以多线程同时运行。
进程: 进程是资源(CPU、内存等)分配的基本单位,拥有独立的地址空间,它是程序执行时的一个实例,一个进程可有多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。

操作系统线程模型

1:1核心线程模型 pthread线程库--NPTL

image.png

内核线程(KLT)由操作系统内核直接支持的线程,内核通过操纵调度器对线程进行调用,程序不直接与内核线程接触而是通过轻量级进程(LWP),LWP内核线程一一对应,程序和内核线程通过轻量级进程联系起,这样的局限性就是每次线程操作都需要从用户态到内核态的转化,代价高,而且由于一一对应的关系,轻量级线程数量肯定有限的,受限于内核线程的数量

N:1用户线程

image.png

过去的操作系统大部分是这种实现方式,这种方式的好处之一就是即使操作系统不支持线程,也可以通过库函数来支持线程,但是需要程序员自己实现线程的数据结构、创建销毁和调度维护。也就相当于需要实现一个自己的线程调度内核,在操作系统中实现了真实的多线程,减少了操作系统从内核态到用户态的切换开销

N:M混合线程模型NGPT

image.png

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]


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:aside section ._1OhGeD

查看原文:OS Thread Model

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

671 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传