0 前言
上一篇文章:进程调度(3):RR(轮转) 算法 原理与实践
1 前提铺垫
与上一篇同。
2 引入I/O操作
之前我们一直提及的是计算密集型程序,现在我们的程序可以进行I/O交互了,它会发起I/O请求,比如向磁盘发起请求获取数据。
这个时候,我们之前的算法会发生怎样的变化呢?我们来探索一下!
2.1 进程的三状态模型
- Ready:就绪态
- Running:运行态
- Waiting:阻塞态 / 等待
最后还有一个DONE,代表执行完成,我们看一下其定义:
RUNNING - the process is using the CPU right now
READY - the process could be using the CPU right nowbut (alas) some other process is
WAITING - the process is waiting on I/O(e.g., it issued a request to a disk)
DONE - the process is finished executing
之前我们的计算密集型程序,仅仅使用CPU,没有Waiting状态,不过现在有了!
2.2 傻等:糟糕的资源利用方式
我们看一看一个向磁盘发起IO请求的程序,将会如何执行。
我们先假定其采用FIFO策略顺序执行吧!
- A:每在CPU执行10s,就发起IO请求,IO耗时10s,之后再在CPU执行10s,发起IO,共循环3次。
- B:运行时间30s,100%使用CPU,不发起IO请求。
假定A比B先到达一点点。
它的执行就成了这样,注意红色箭头部分,CPU是空闲的!OMG!CPU空闲了30s!如此昂贵的CPU空闲30s……这真是太糟糕了。
2.3 重叠:高效利用资源
既然B执行30s,为什么不在空闲的时候执行B呢?反正我们拥有上下文切换机制!
这看起来棒多了,A和B重叠了起来!CPU没有被浪费,系统的整体性能也提高了,之前100s做的现在70s完成了!
3 不可预测的运行时间
3.1 无法预知的未来
之前我们的假设是任务运行时间已知,但是这怎么可能?我们不可能在程序运行前,就知道它将会运行多久……这很荒谬不是吗?那怎么办?
3.2 以史为鉴:预测时间
我们将会使用以史为鉴的方式,估计运行时间,也就是基于该程序之前运行时间的历史情况,估算一下,这听起来还有点靠谱了!具体实现先不谈,之后再说。
3.3 思想贯通:CPU流水线的分支预测
CPU流水线,是硬件,也有类似的技术,就是分支预测,更著名的是动态分支预测,这这很棒!我想之后软硬件的预测思想可以结合起来理解,达到融会贯通。
4 预告:进程调度(5)MLFQ(多级反馈队列)算法 原理与实践
之前我们的算法,无法同时兼顾周转时间和响应时间,那么,何不将二者的优点结合? 这也就是接下来我们做的事情。
5 模拟软件链接
点击此处,在Linux可以运行模拟软件,请阅读README.md文档,然后进行软件的使用。
此模拟软件可以充分体会多进程运行时候的转换,体会IO引入程序之后带来的重叠使用方式。