Linux进程调度原理

<p><img src="https://upload-images.jianshu.io/upload_images/14047264-3b496bf0206a3ce1" /></p><section class="mpa-template" mpa-from-tpl="t" data-mpa-powered-by="yiban.io"><p ><img class="mpa-template" data-ratio="0.10344827586206896" src="https://upload-images.jianshu.io/upload_images/14047264-6e3e40d7a34c513a" data-w="580" width="auto" /></p></section><p ><br /></p><section class="mpa-template" mpa-from-tpl="t"><p data-mid=""><br data-mid="" mpa-from-tpl="t" /></p><section data-mpa-category="标题" data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t" ><p data-mid="">极简联盟</p></section></section></section></section></section><p data-mid=""><br data-mid="" mpa-from-tpl="t" /></p></section><p ><span >假设我的系统只有一种调度算法cfs<br /></span></p><p ><span >那么有个调度的队列 cfs_rq</span></p><p ><span >所有running的进程都会 进入这个队列,不在running 或者其他情况会出队列,ok。则假设队列控制的算法有以下。</span></p><p ><span ><br /></span></p><section class="code-snippet__fix code-snippet__js"><pre class="code-snippet__js" data-lang="nginx"><code><span class="code-snippet_outer" >cfs_rq_enqueue</span></code><code><span class="code-snippet_outer">cfs_rq_dequeue</span></code><code><span class="code-snippet_outer">cfs_rq_pick</span></code></pre></section><p ><span > </span></p><p ><span >所操作的是进程描述符 task_struck.</span></p><p ><span >那么很简单可以理解上述过程</span></p><p ><span >scehed_pick ---->cfs_rq_pick就行了。</span></p><p ><span > </span></p><section class="mpa-template" mpa-from-tpl="t"><p data-mid=""><br data-mid="" mpa-from-tpl="t" /></p><section data-mpa-category="标题" data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t" ><p data-mid="" mpa-is-content="t">多个调度算法</p></section></section></section></section></section><p data-mid=""><br data-mid="" mpa-from-tpl="t" /></p></section><p ><span >那么如果除了cfs还有rt算法</span><br /></p><p ><span >那么就有两个调度队列,cfs_rq和rt_rq。</span></p><p ><span >一个进程task_struck 有可能属于cfs和rt。</span></p><p ><span ><br /></span></p><p ><strong><span >那么考虑 scehed_pick 是如何pick?</span></strong></p><p ><strong><span ><br /></span></strong></p><p ><span >ok,Linux建立一个sched_class 的结构链表,sched_class_cfs和sched_class_rt或者还有其他的。顺序的从这么多个调度算法中选择一个合适的。</span></p><section class="code-snippet__fix code-snippet__js"><pre class="code-snippet__js" data-lang="nginx"><code><span class="code-snippet_outer"><span class="code-snippet__attribute">stop_sched_class</span> -> -> rt_sched_class -> fair_sched_class -> idle_sched_class</span></code></pre></section><p ><span ><br /></span></p><p ><span >如上。那么问题来了,如果前面的队列一直满足,后面的队列就永远得不到执行,这些sched_class之间没有个合理的逻辑吗?</span></p><p ><span ><br /></span></p><p ><span >目前看到的逻辑,任务dl 是最先满足的,rt次之,cfs随后,idle当然是最后的,这样的逻辑,基本上能让人有点信服。</span></p><p ><span > </span></p><h2 ><span >再抽象一层sched_entity,</span></h2><p><span ><br /></span></p><p ><span >一般情况 cfs和rt或者其他的什么的调度算法的接口 enqueue或者dequeue 都是对task_struck 进行操作的。</span></p><p ><span ><br /></span></p><p ><span >但是Linux 这里再抽象一个sched_entity,每个task_struck 对应一个sched_entity 。调度算法对sched_entity操作就行了。</span></p><p ><span ><br /></span></p><p ><span >这样抽象我猜想有两个目的,一个是统一比较好看,和task_struck隔离。第二个是,为了下面的组调度做准备。</span></p><p ><span > </span></p><section class="mpa-template" mpa-from-tpl="t"><p data-mid=""><br data-mid="" mpa-from-tpl="t" /></p><section data-mpa-category="标题" data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t"><section data-mid="" mpa-from-tpl="t" ><p data-mid="" mpa-is-content="t">加入组调度</p></section></section></section></section></section><p data-mid=""><br data-mid="" mpa-from-tpl="t" /></p></section><p><br /></p><p ><span >组调度的数据结构,和组织架构大概是如下这个样子</span></p><p ><br /></p><p ><img class="rich_pages" data-ratio="0.3425" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-df9d7221a319314f" data-type="jpeg" data-w="800" /></p><p ><img class="rich_pages" data-ratio="0.415" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-9a663cfc29043fc0" data-type="jpeg" data-w="800" /></p><p ><br /></p><p ><span >OK,如果Linux进行组调度,就不会说使用全局的cfs_rq队列,或者rt_rq队列。而是将这些队列分配到task_group中。大概流程是这样子的。</span></p><p ><span ><br /></span></p><p ><span >我们假设我们有两个组 GroupA 和GroupB A占2 B占1 就是有三次调用的情况下 A组会被调用两次,B组只有1次。</span></p><p ><span ><br /></span></p><p ><img class="rich_pages" data-ratio="0.39" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-d3a4116dafb74c4c" data-type="jpeg" data-w="800" /></p><p ><br /></p><p ><br /></p><p ><span >这个时候有一个进程启动了 task_struck task1</span><br /></p><p ><span ><br /></span></p><p ><span ><img class="rich_pages" data-ratio="0.325" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-d8038aa160bd2932" data-type="jpeg" data-w="800" /></span></p><p ><span ><br /></span></p><p ><span >他选择A组,同理task2 可能也选择A task3可能选择B 如下</span><br /></p><p ><span ><br /></span></p><p ><span ><img class="rich_pages" data-ratio="0.47" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-a9033473d6e2211b" data-type="jpeg" data-w="800" /></span></p><p ><span > </span></p><p ><span >而A 和 B 不会记录 task的接口体,他记录task 的sched_entity 并用一个se[] 数组表示。</span></p><p ><span ><br /></span></p><p ><span >那么还有,task1 task2 有可能是cfs调度也有可能是rt,那么gruop结构体就用 cfs_se[] cfs_rq 和 rt_se[] rt_rq记录。</span></p><p ><span > </span></p><p ><span ><strong>那么问题来了</strong></span></p><p ><span > </span></p><h3 ><strong><span >task1 task2 属于cfs还是属于rt 是什么时候设置的?</span></strong></h3><p><strong><span ><br /></span></strong></p><h3 ><span >在Android和linux里面没有看到,目前看到的是 0 也就是cfs,</span></h3><p ><span >那么有以下可能就是说,如果你不设置,就默认是0,或者继承父亲的等等这种默认策略。</span></p><p ><span > </span></p><h3 ><strong><span >scehed_pick 时候怎么pick?</span></strong></h3><p><strong><span ><br /></span></strong></p><p ><span >按照pick三次 两次是A,ok。到了A,再使用这个策略</span></p><p ><span >stop_sched_class -> dl_sched_class -> rt_sched_class -> fair_sched_class -> idle_sched_class</span></p><p ><span >这个是说的通的。</span></p><p ><span >但是要根据代码来。</span></p><p ><span ><br /></span></p><p ><span ><strong><span >>>>Linux进程调度系列笔记如下:</span></strong></span></p><p ><span ><br /></span></p><p ><em><span >>>> Linux进程调度原理</span></em></p><p ><em><span >>>> Linux周期调度过程</span></em></p><p ><em><span >>>> Linux调度器源码分析</span></em></p><p ><em><span >>>> Linux组调度思想浅析</span></em></p><p ><br /></p><p ><br /></p><section data-id="us671599" ><section ><section ><section ><section ><section >关</section><section >注</section></section></section><section ><section ><section ><p>听说关注了我们的人</p><p>都升职加薪啦</p></section></section></section></section></section></section><section data-role="paragraph" ><p ><img class="rich_pages" data-copyright="0" data-ratio="1" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-55760492918cb962" data-type="jpeg" data-w="430" /></p><p ><img class="rich_pages" data-copyright="0" data-ratio="0.315" data-s="300,640" src="https://upload-images.jianshu.io/upload_images/14047264-15e939bb0650a3eb" data-type="jpeg" data-w="800" /></p></section>

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

推荐阅读更多精彩内容