L13 操作系统之树
建议二倍速观看
L14 CPU调度策略
参考 王道笔记:https://blog.csdn.net/tfnmdmx/article/details/119214333
好的调度算法: 1.尽快结束任务:周转时间(从任务进入到任务结束)短 2.用户操作尽快响应:响应时间(从操作发生到响应)短 3.系统内耗时间少:吞吐量(完成的任务量)大 总原则:系统专注于任务执行,又能合理调配任务…
IO约束型的任务指的是经常要进行IO操作的任务,这些任务每次使用CPU的时间短,但是频率高,相应的优先级就得高,这样才能实现CPU与IO的并行操作。 CPU约束型的任务指每次使用CPU的时间都比较长,切换次数少,这样的任务就优先级就相对低一些。 参考https://blog.csdn.net/williamgavin/article/details/83099394
1.先来先服务FCFS: 平均周转时间可能会很长 2.短作业优先SJF:周转时间短,但是响应时间长 3.轮转调度RR:这种方式可以较好的满足响应时间,但是时间片的选取时间要好好考虑。 时间片大:响应时间太长;时间片小:吞吐量少,因为内耗大了。 4.优先级轮转:固定优先级,可能会造成有程序一直没法得到执行,需要动态调整优先级
但是这样会有很多问题?比如前台任务一直存在,那么后台任务是不是永远不执行了?执行一个后台任务的时间一般比较长,那么是不是这段时间就不响应前台任务?
对于第一个问题,给任务设置优先级,前台任务的优先级大于后台任务优先级,首先执行优先级高的任务,随着时间的增长,后台任务优先级动态升高,这样后台任务才有执行的机会。 对于第二个问题,采用时间片的方式,后台任务执行一段时间之后就跳到下一个任务。
除此之外还有很多其他的问题?例如: 我们怎么知道哪些是前台任务,哪些是后台任务,fork时告诉我们吗? gcc就一点不需要交互吗? Ctrl+C按键怎么工作? word就不会执行一段批处理吗? Ctrl+F按键? SJF中的短作业优先如何体现? 如何判断作业的长度?
L15 一个实际的schedule函数
凡是已耗尽时间片(即counter=0)的,则立即退出本周期的竞争;当所有未被阻塞进程的时间片都耗尽,那就不等了。然后,由调度器重新为进程分配时间片,开始下一个调度周期。 参考https://zhuanlan.zhihu.com/p/342626101
schedule(){ 死循环{c=-1(准备存储最大的counter);next=0(下一进程的下标);i=NR_TASKS(NR_TASKS是PCB数组的范围) 先将p指向PCB的最后一个元素 遍历整个数组{如果p指向进程的状态为就绪态 且 其优先级大于 c 令c=该优先级(目前最大优先级);next=该进程下标
} 如果c大于零,就跳出死循环,执行switch_to(next),即执行counter最大的那个进程。 重新为进程分配时间片: counter = counter/2 + 优先级 } switch_to(next)切换到下一进程 }
就绪进程的counter = 0,阻塞进程的counter > 0,所以重新分配时间片时, 就绪进程的counter = 0 + priority,阻塞进程的counter = counter/2 + priority
后台程序基本不和用户交互,优先级别稍微低一点 前台程序和用户交互,需要较高的响应速度,优先级别稍微高一点 参考https://blog.csdn.net/senvil/article/details/48915731 IO是前台进程的特征
1.counter保证了响应时间的界。 时间片c(∞) <= 2p 若有n个进程,响应时间 <= 2np
2.IO就是阻塞,时间片到后,阻塞的counter=counter/2+priority,阻塞时间越长,counter越大 counter越大,也即优先级越大,照顾了IO进程,IO操作是前台进程的特征,也即变相照顾了前台进程
3.后台进程一直按照counter轮转,近似于SJF调度。
4.每个进程只用维护一个counter变量,简单、高效。
|