点这里排版好一点
开学之后,作息一直很局促
,喘不过气来
借着高操这门课,应该会把Linux源码好好读一读
今天先借胆来谈一下Linux下的线程调度策略
PS: 以下解析的Linux kernel版本号为4.19.25
Thread schedule
Motivation
首先,为什么
要有线程调度这种东西
主要是因为人民日益增长的CPU需求
和同落后的I/O速度
之间的矛盾
为了不让没准备好的CPU上战场,也为了降低进程之间的通信成本
设计了一套线程状态体系,从三状态
,五状态
,到七状态
于是因为线程带上了这些状态,就需要根据状态对线程进行一系列的操作
一开始想的挺好的,把线程按状态分堆之后,各个状态应该井然有序的工作
但事实上,随着工业技术的发展,线程数量已经到了一个十分恐怖的数量,
如何公平的调度,更高效的调度,这成为了设计OS的一个难点
传统的线程调度算法有SJF(短作业优先)
,SRTN(最短剩余时间优先)
, HRRN(最高响应比优先)
, RR(轮转)
, HPF(优先级)
等等
这些算法都有自己的有点,也有自己的缺点
CFS
Linux使用的是带时间片
的动态优先级抢占式
调度模式, 被称之为公平调度CFS的算法
利用nice值+实时优先级+时间片共同维护线程的优先级
而这个优先级队列,也就是就绪态队列,Linux是用红黑树
来维护的 (回想一下Java的CurrentHashMap
和Linux kernel的schedule
都是维护红黑树,所以DS要学学好呀)
Linux中对nice的处理和Unix不太一样
在Unix中如果有两个同nice值的进程,那么他们都将分配到一半的时间片,一般为5ms的时间,在这段时间内CPU完全属于占用的进程
理想状态下线程调度应该实现均衡划分任务,对待相同优先级的进程应该是共同使用这段时间片10ms,各占有CPU一半的能力