1、基本调度模型
- 调度算法
- 进程切换
- 时钟中断
2、进程调度与时间片
进程调度:Linux通过一个进程到另一个进程的快速切换,达到表面上看来多个进程同时执行的效果
时间片:分时操作系统分配给每个正在运行的进程微观上的一段CPU时间
3、调度的主战场:就绪队列
3.1 Linux2.4以前内核调度
队列是一个单链表,init_task(0号进程PCB)为队头
- 采取动态优先级,选择进程的依据就是剩余时间片counter的大小,寻找剩余时间片最长的就绪进程
- 进程被创建时,counter = priority(0~40)
- 进程运行过程中,counter不断减少,而priority(静态优先级)不变
- count为0(时间片用完),发生调度
- 如果所有就绪进程的时间片都用完了,重置所有进程的时间片:counter = counter/2 + priority (就绪进程时间片还是静态优先级priority,等待队列I/O进程时间片增大)
- 用户可以通过系统调用改变policy、priority等
3.2 Linux2.6内核的O(1)调度算法
每CPU一个就绪队列,系统所有就绪进程首先经过负载均衡模块挂入各个CPU的就绪队列上,然后由主调度器和周期性调度器驱动该CPU上的调度行为,基于多级反馈队列算法,内核是抢占式调度,基本优化思路就是把原来就绪队列的单链表变成多个链表
3.3 目前内核的完全公平调度(CFS)-红黑树
CFS通过每个进程的虚拟运行时间(vruntime)来衡量哪个进程最值得被调度
CFS调度器总是选择红黑树最左边的叶子节点作为下一个运行进程
虚拟运行时间是通过实际运行时间和进程的权重计算