文章目录
- 调度
- 三个问题:
- 进程行为
- 何时调度
- 调度分类
- 依据时钟中断来分类
- 系统环境分类
调度
调度:
一个程序。
调度对象:进程和内核级线程。
1.调度程序调度P1,读取PCB块在CPU中恢复它的现场(ctx);
2.当CPU执行完了P1之后,主动放弃时间片,去执行调度算法重复上述过程;
三个问题:
1.什么时候调度 - - 时机 - - 不能过于频繁
2.从哪里调度任务 - - 执行 - - 从就绪队列中选一个
3.选哪一个任务 - - 调度算法
进程三状态:就绪、运行、阻塞
调度:老状态保护起来,保存到PCB,读取一个新状态,新PCB
进程行为
CPU密集型:单位时间段内,CPU几乎被占满;
I/O密集型:单位时间内,离散的使用CPU。
CPU:运算一些逻辑、数学模型 – 卡
GPU:渲染模型 – 图像很差
CPU密集型:
任务时间长,频繁调度反而降低效率,建议直接分一个核给任务;
若是单核系统,CPU密集型意义就不大了,如果有死循环,直接死机了。
CPU密集型核心线程数 = CPU核数
I/O密集型:
经验公式:核心线程数 = CPU核数 / (1 - 阻塞系数)
阻塞系数是I/O操作占总时间的比例∈[0, 1]
何时调度
进程何时调度:
1.创建时:可以选择调度父进程还是子进程,但是实际上其实是不管的,比如Linux就是随机的;
2.退出时:进程运行完退出时,要决定下一个调度谁
- CPU不会空转,PC指针只会往下一直读;
- 当在没有任务时,希望执行一个低功耗的功能区,切换CPU频率,关闭一些不必要的组件 – IDLE进程,永远不会阻塞的进程,有新任务时立马滚,且有任务的时候不会调度;
- 实现:标记级别,调度用基于级别的调度
3.阻塞在I/O、信号等原因
阻塞I/O时会放弃CPU,所以会执行调度程序。
4.当I/O发生中断时,可以做调度策略
调度过程
进程运行 -> 调用I/O -> 进入内核 -> 查找驱动 -> 没反应(无I/O) -> 休眠进程并放入对应队列,同时调用调度程序
调度分类
依据时钟中断来分类
非抢断式
只能主动释放CPU。
抢占式
依据硬件的时钟中断来完成。
系统环境分类
批处理:一个接一个的处理;
交互式:依靠时间片;
实时:更关注截止时间,某些场合下也需要开始时间。
批处理
1.吞吐量:单位时间内做的任务量;
2.周转时间:结束时间-到来时间(进入队列的时间)
3.CPU利用率
交互系统
1.响应时间:被调度的时间-任务创建时间
2.均衡性
实时系统
1.满足截止时间
2.可预测性
批处理的调度
先来先服务FCFS:非抢占式的基础设计,先来后到。
最短作业优先