Linux内核速览_4_进程调度(1)CFS算法原理

前言

进程调度是操作系统核心内容之一.以"<Linux内核设计与实现>第三版"(以下称本书)为参考,本贴对应本书第三章4.1~4.4节内容,以"完全公平调度算法"(CFS)为核心内容

概述

进程调度问题的抽象是"共享资源合理分配,尽量令每个参与者满意".以下是一些理解:

1>进程调度本质上是个数学问题.之前有个经典疑问:编程和数学有没有关系?回答是大部分情况下两者没关系,如果编程用到了数学,那将是较复杂的问题.这个回答在这里可以得到印证.能把调度算法写出来的也是挺牛叉的.

2>数学上讲,如果有n个条件,而写出的关系式个数小于n,那答案不止一个.所以进程调度没有唯一解,有多个解,因此可以写出多个调度算法,根据条件选择.

3>采用"逼近"的方式,预先将某些未知条件设为已知,当剩余未知条件个数等于关系式个数时,可得到设定条件下的唯一解.

概念

4.1~4.3节的概念,为理解CFS算法做准备

调度程序

本书P35第二段:调度程序负责决定将哪个进程投入运行,何时运行及运行多长时间.

多任务

本书P35第四段:多任务操作系统就是能同时并发地交互执行多个进程地操作系统.

本书P35第五段:多任务系统可以划分为两类:非抢占式多任务和抢占式多任务.

---现在抢占式多任务系统是主流.关于"抢占",笔者理解为"排队"---谁更满足条件谁先来

I/O消耗型和处理器消耗型的进程

本书P36最后一段:I/O消耗型进程指进程的大部分时间用来提交I/O请求或等待I/O请求.

本书P37第二段:处理器耗费型进程把时间大多用在执行代码上.

---举例:I/O消耗型进程像文字处理,或游戏,根据人机交互进行的进程.而后台运行的程序多数属于处理器耗费型.

这种划分法不是绝对的,书上举的例子:X Window服务器.以及字处理器.

操作系统到底是为人服务的,所以Unix和Linux都倾向于I/O消耗型(Windows更不用说)

进程优先级

各个进程之间进行比较,有的进程更重要,他们的优先级高.nice值是进程优先级的度量,越大的nice值意味着越低的优先级,反之越小的nice值优先级越高.

---这个也容易理解.进程优先级对于进程调度会有影响,一般说来要把优先级高的进程排在进程队列的前面,这种想法在实践中大部分时候成立---优先级是影响因素但不绝对.

时间片

本书P38黑体字下:时间片是一个数值,它表明进程在被抢占前所能持续运行的时间.

---一个进程在被CPU处理数据的时候持续的时间. 注意:Linux的CFS调度器并没有直接分配时间片到进程,它是将处理器的使用比划分给了进程.这点非常重要,在下面的内容将有说明.

Linux调度算法

推导"nice值直接映射时间片"的不合理.引入了"目标延迟","最小粒度"的概念,讲了CFS原理

调度器类

本书P39倒数第三段:Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法.

---Linux的调度算法不止一种.当然CFS是比较成熟的一种,但也可以自己开发算法.

Unix系统中的进程调度

本书P40中指明了将nice值映射到时间片的不合理.第二段结尾:事实上,给定高nice值(低优先级)的进程往往是后台进程且多是计算密集型;而普通优先级的进程则更多是前台用户任务.所以这种时间片分配方式显然是和初衷背道而驰的.

---I/O消耗型进程,往往给了高优先级,以及长的时间片,但用不到那么长.反之处理器消耗型进程,面对的是繁重的计算任务,往往优先级低,时间片给的短,所以将nice值映射到时间片的做法不合理.

公平调度CFS

这节的内容描述的是怎样做可以达到一种较为公平的调度.首先有个推导:越小的时间片,越快的进程轮转,更容易实现公平调度(看描述理解).引入了两个重要概念:目标延迟,最小粒度.

最小粒度

最小粒度是推导出来的条件.进程切换时有个切换时间,如果分配给每个进程的时间片过小,那么切换时间占的比重越高,效率越低.因此给出了最小粒度.本书用了1ms---这个值是相对的,试想如果CPU频率越高,这个值可以缩小.

===========================内容分割线↓=====================================

笔者认为最小粒度还有个指标---能够在最小粒度时间内处理紧急代码.例如有个进程是由紧急情况触发,那么最小粒度应一次把它走完.当然以现在芯片的运算能力,这个问题不大.例如1GHZ的CPU,1ms可以跑一万条指令吧---具体情况笔者并不清楚,这段仅代表个人观点

===========================内容分割线↑=====================================

目标延迟

理解目标延迟可以不用本书的描述,而靠自己的感觉.它和"网络延迟"类似.网络延迟指上网时点击某个链接后,看到相关画面.这个过程中包含了客户端向服务器发起申请,服务器响应后,把数据传到浏览器程序中.

++目标延迟是一种"硬件延迟"++.举个例子:晃动一下鼠标,屏幕上的鼠标指针会随之而动.这个过程包含了鼠标进程被调入运行态并且执行.目标延迟在进程调度中有重要的意义.进程调度要满足目标延迟.

假设目标延迟用变量object_delay表示,运行态队列中有n个进程,每个进程的时间片为a1,a2...an.那么a1+a2+....+an≤object_delay.根据每个进程用到最小粒度的时间片,可推算出运行态的进程个数n.

目标延迟的设定:站在I/O消耗型进程的角度,目标延迟要满足人的观感需求.例如人的反应时间是100ms,那么目标延迟最好设计成100ms以内---本书给了20ms.但如果以处理器消耗型进程的角度,这个值设得大一些也没关系.

CFS的原理

CFS采用了一种"加权时间"的方法来实现公平调度.首先,++所有进程的nice值换算成相对值++ .例如有10和15两个nice值的进程A和B,换算成0和5.当这两个进程被执行了1次,那么加权时间(vruntime)记作1和5.第二次排进程顺序的时候,按照**++"加权时间越小越靠前"++**这个原则,第2次A排第一,B排第二.

看起来他们的顺序永远不会变.但如果进程很多,情况就会不一样了,再假如进程B运行1次后转成睡眠态,当转回运行态时,进程A执行了10次,那么第11次是加权时间比较:进程A是10,进程B是5,此时运行态队列中B应排在A前面.优先级不同的进程以这种方法达到一种动态平衡.

目标延迟和运行态进程

目标延迟是一个理想值,目标延迟和运行态进程个数成正比.当运行态进程多于预期时,目标延迟会变长.这点很明显:用一台老式电脑打开的程序多时,会感到电脑反应变慢.

相关推荐
漠月瑾-西安5 天前
软件忘了“擦黑板”:一次内核信息泄露事件(CVE-2024-49997)的深度剖析
网络安全·linux内核·内核安全·信息泄露·内存安全·cve漏洞分析
jllws18 天前
Linux内核速览_2_内核开发的特点
linux内核
程序猿编码13 天前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
Watink Cpper13 天前
Ubuntu24.04网络图标消失导致无法上网--排查得到原因:内核和驱动版本不匹配
运维·网络·linux内核·运维开发·debug·ubuntu24.04
十年编程老舅19 天前
深入 Linux 中断:原理详解 + 实战落地
linux·网络·linux内核·c/c++·中断
皮皮哎哟23 天前
ARM驱动基础(基于正点原子IMX6ULL Mini)
arm开发·linux内核·imx6ull·nxp·正点原子、·imx6u mini
程序猿编码25 天前
Linux内核级隐身术:进程与端口隐藏技术剖析
linux·运维·服务器·linux内核·进程
Qt程序员1 个月前
Linux 内核 SPI 驱动
linux·linux内核·嵌入式开发·spi
新兴AI民工1 个月前
【Linux内核二十九】进程管理模块:CFS调度器check_preempt_wakeup
linux·linux内核·wakeup