进程与线程
L14 CPU调度策略
就是next下面一个进程到底是谁
操作系统在调度的时候,关键是折中,需要综合考虑。
响应时间小,是切换次数多,是因为要很快切回来。切换时间就是内耗,内耗大,吞吐量就小。
IO约束型就是word类似的,就是一直需要IO
CPU约束就是GCC MATLAB计算类的
IO优先级较高,是因为往往是前台任务,和用户有交互。然后也可以实现并行计算。但是CPU约束性高的话,CPU一直运行,IO无法运行。
短作业优先
短作业优先,是周转时间最短
因为p1乘数最多,所以总时间小
时间片小,切换次数多,吞吐量就小。
只要有前台任务,就不执行后面的。前台轮转调度,后面短作业调度,这就是优先级调度。产生饥饿
轮转调度为核心,又要保证前台优先级。
需要不断的调整优先级。
L15 一个实际的schedule函数
counter就是优先级。counter也是时间片轮转。两个调度使用一个变量,核心是如何修改counter。
阻塞态回复就绪的counter大,比直接等待转就绪的大。
do_timer时钟中断
IO长时间不做的,阻塞时间越长,优先级就越高。具有IO特征的优先级就高。
每个进程最长也就是2P,保证了边界。
L16 进程同步与信号量
多进程同步就是进程之间的合作变得合理有序,是通过信号量实现进程的同步。
从信号到信号量是一个很大的进步,
等待是进程图的核心,阻堵塞
停是更重要的
只发信号还是不可以的,因为信号表达的内容不够丰富。
上面的解释应该是就像传热,只有换热表面换热大,也就是两边热阻很大。信号没有深入到内部。
一个counter无法表达到底几个生产者
不能只记录睡眠和唤醒。
缺一个变成-1,又缺一个,sem表示有两个进程等待了
根据信号量决定是否喊醒,信号只能表达0 1
为什么不用counter作为信号量?用大于小于之类的判断,这就有点像counter+sem,可能这样就不方便了。
等待队列
p,v是系统调用。这边都是生产,但是没有考虑消费边界的问题。
empty是空闲缓冲区数量。full表示可消费的内容个数。
P是test测试的意思,V是增加。
mutex互斥信号量,就是表示一次只能一个人用。要么是一个生产,要么一个消费。
这个互斥有点像一个厕所 上面显示有人没人。
类比:
3个厨师,3个消费者。
厨师上菜,首先看有没有空位置(empty)
然后呢看有没有人在吃
接着上菜呢要先通知大家我在上菜,不要吃,也不要上菜(full菜的个数)
然后我上菜
P是看看要不要这个状态的东西要阻塞等待
V是起到唤醒作用,唤醒肯定是唤醒对面的。所以v()括号里的是和所在进程合作的另一个进程的内容。