2018-12-02

线程模型

内核级线程模型(KSE(Kernel Scheduling Entity))

关键点: 完全靠操作系统调度

每一个用户线程绑定一个实际的内核线程,而线程的调度则完全交付给操作系统内核去做,应用程序对线程的创建、终止以及同步都基于内核提供的系统调用来完成

用户级线程模型

关键点: 完全靠自己调度

用户线程与内核线程KSE是多对一(N : 1)的映射模型,多个用户线程的一般从属于 单个进程 的调度是由用户自己的线程库来完成,线程的创建、销毁以及多线程之间的协调等操作都是由用户自己的线程库来负责而无须借助系统调用来实现。操作系统只知道用户进程而对其中的线程是无感知的,内核的所有调度都是基于用户进程。

两级(混合型)线程模型

关键点: 自身调度与系统调度协同工作

用户线程与内核KSE是多对多(N : M)的映射模型:

首先,区别于用户级线程模型,两级线程模型中的一个进程可以与多个内核线程KSE关联,于是进程内的多个线程可以绑定不同的KSE,这点和内核级线程模型相似;

其次,又区别于内核级线程模型,它的进程里的所有线程并不与KSE一一绑定,而是可以动态绑定不同KSE, 当某个KSE因为其绑定的线程的阻塞操作被内核调度出CPU时,其关联的进程中其余用户线程可以重新与其他KSE绑定运行

GPM模型

基本概念

OS线程抽象,代表着真正执行计算的资源, 每一个 goroutine 实际上就是在 M 中执行, M 的数量目前最多 10000 个.

M 并不保存 G 的状态, 与 G 本身并没有关系, 所以 G 可以在不同的 M 执行

分配程序执行的上下文环境, 数量 <= 内核数量, 即同时能够并行执行的 G 的数量,相对于 G 而言, P的角色相当于CPU.

程序代码中的每一次使用关键字 go 执行函数其实都生成了一个 G ,并将之加入到本地的 G 队列中, 之后 M 会生成 G 执行的上下文也就是绑定 P 来执行函数.

G 维护者goroutine需要的栈、程序计数器以及它所在的M等信息。

  • Seched

代表着一个调度器 它维护有存储空闲的 M 队列和空闲的 P 队列,可运行的 G 队列,自由的 G 队列以及调度器的一些状态信息等。

模型调度

[图片上传失败...(image-401ce0-1543731894810)]

  1. P 如何获得 G
    调度器 Seched 生成一个 M , 然后 M 需要持有(绑定)一个 P ,接着 M 会启动一个OS线程,循环让 P 会首先从自己的本地队列(Local Quequ)中取可执行(Runnable)的 G 执行, 如果本地队列中没有, 则会从全局队列(Globle Queue)中取 G , 如果还没有, 则会从其他的 P 的本地队列中取一半的队列放入自己本地队列之中

  2. M 执行函数遇到阻塞,如何处理

实际代码执行中可能存在下面的问题,导致程序阻塞

<pre class="prettyprint hljs perl" style="box-sizing: border-box; overflow: auto; font-family: monospace, monospace; font-size: 10px; display: block; padding: 0.5em; color: rgb(171, 178, 191); background: rgb(40, 44, 52); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">blocking syscall (for example opening a file)
network input
channel operations
primitives in the sync package</pre>

主要可归为两类

  • 用户态阻塞/唤醒

goroutine 因为channel操作或者network I/O而阻塞时(实际上golang已经用netpoller实现了goroutine网络I/O阻塞不会导致M被阻塞,仅阻塞G,这里仅仅是举个栗子),对应的G会被放置到某个 wait 队列(如channel的waitq),该G的状态由 _Gruning 变为 _Gwaitting ,而M会跳过该G尝试获取并执行下一个G,如果此时没有runnable的G供M运行,那么M将解绑P,并进入 sleep 状态;当阻塞的G被另一端的G2唤醒时(比如channel的可读/写通知),G被标记为runnable,尝试加入G2所在P的runnext,然后再是P的Local队列和Global队列。

  • 系统调用阻塞

当G被阻塞在某个系统调用上时,此时G会阻塞在 _Gsyscall 状态,M也处于 block on syscall 状态,此时的M可被抢占调度:执行该G的M会与P解绑,而P则尝试与其它 idle 的M绑定,继续执行其它G。如果没有其它 idle 的M,但P的Local队列中仍然有G需要执行,则创建一个新的M;当系统调用完成后,G会重新尝试获取一个 idle 的P进入它的Local队列恢复执行,如果没有idle的P,G会被标记为runnable加入到Global队列。

调度使用了名叫 work stealing 的算法, 这种算法适用场景是任务之间的耗时相差比较大,即有的任务很耗时,有的任务很快完成,用这种用算法很合适;如果任务的耗时很平均则不适合,因为窃取任务也是需要抢占锁的,会造成额外的消耗。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容