进程调度综述
背景
阻塞和就绪机制的出现:进程调度的原始状态很简单,就是选定一个进程让CPU去执行,但是会出现一个问题,有的进程需要一些资源无法满足的时候或者有突然的IO操作就要等待,CPU和它一起等待,这可太折磨人了,让CPU的效率降低非常多,但是谁也不知道哪些进程会阻塞什么的,所以我们将进程分为两类,好的(就绪)和不好的(阻塞),让CPU只运行好的,不允许不好的,但是不好的和好的可以相互转化。就像古代的科举制度,皇帝只听大臣的话,听不到平民的话,但是平民可以变成大臣,大臣也可以被贬为平民。
阻塞是中断的子集,阻塞是有特定唤醒条件的中断,比如时间片在就绪队列中运作,这属于中断但是不属于阻塞。
挂起和不挂起的出现:出现是因为内存是有限的,有些就绪的运行不着,有些阻塞的更运行不着,不如换到外存吃灰,外存除了速度慢其他方面薄纱内存,所以挂起也挺好的,释放了内存空间。
既然出现了不同类型的进程,那么就产生了新的问题,比如阻塞和就绪进程放在哪里?我们创造了两个队列。比如就绪队列里进程的运行顺序按照什么算法,约束条件是什么?按照几种调度算法,约束条件有多种比如CPU利用率系统吞吐量周转时间等。
调度的层次
高级调度(作业调度):决定后备队列里哪些放到内存里
中级调度(内存调度):决定哪些进程被挂起,频率中
低级调度(进程调度):决定就绪队列里哪个进程先执行,频率高
低级调度分为两类:
非抢占式调度,只有进程运行完才会进行下一个
抢占式调度,有权利随时剥夺进程运行权力
为啥没有决定哪些进程阻塞捏?因为阻塞是一种否定,根据否定之否定规律,阻塞是自身的否定,也就是阻塞的原因在于自己的程序满足某条件,所以不需要外部去阻塞。可以设置一个条件监视器,条件满足就唤醒,所以唤醒也不需要外部算法。
调度的目标
调度要尽可能满足多个目标,就像餐厅要满足多个目标一样
1、CPU利用率,等于有效工作时间除以总时间,也就是狠狠压榨厨子,恨不得九九六零零七,永不休息。
2、系统吞吐量,表示单位时间内CPU完成作业的数量,也就是平均上菜量
3、周转时间,每个用餐用户的等待时间,用餐用户是每个进程关系到客户满意度
4、等待时间,每个进程等待总时间
5、响应时间,使用电脑的用户提交请求到系统响应时间,也就是目标是让电脑使用者等待时间越短越好
调度实现
排队器:负责创造和操作队列
分派器:负责带领CPU在就绪里面转悠的
上下文切换器:大量load和sotore指令,负责操作切换进程的
调度时机
不能在这几个情况下调度
1、处理中断时
2、进程在操作系统内核临界区中:进入临界区后,需要独占式访问,理论上必须加锁,以防止其他并行进程进入,在解锁前不应该切换其他进程,以加快临界区的释放
3、执行屏蔽中断的原子操作的时候
进程调度算法
有的适合低级调度有的适合高级调度
1、先来先服务算法(低级调度)
2、短作业优先算法(低级调度或高级调度)
3、优先级调度算法(低级调度或高级调度)
可以使用静态优先级和动态优先级,
一般优先级规则有:系统进程>用户进程;交互型进程>非交互进程;IO型进程>计算型进程;
4、高相应比优先调度算法(主要高级调度,或低级调度)
本质上是动gao态优先级调度算法,响应比等于(等待时间+要求服务时间)/(要求服务时间)
继承了短作业优先的优点,并且加入等待时间的因素也不会发生长期饥饿现象。薄纱短作业优先算法。
5、时间片轮转算法(低级调度,分时系统)
抢占式调度,运行完时间片就退出
6、多级队列调度,每个队列使用不同算法
7、多级反馈队列调度算法(集大成者)
前几级队列使用FCFS,最后一级使用时间片轮转
浙公网安备 33010602011771号