进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L13L14L15

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变量,简单、高效。

猜你喜欢

转载自blog.csdn.net/tfnmdmx/article/details/119460283
今日推荐