高级调度: 又称作业调度或长程调度。调度对象是作业,按照进程调度算法,决定作业的调度时机,主要用于多道批处理系统。
低级调度: 又称进程调度或短程调度。调度对象是进程,根据调度算法决定进程的调度时机,是一种最基本的调度,多道批处理、分时、实时都必须配置。
中级调度: 又称内存调度,目的是提高内存利用率和系统吞吐量,把暂时不能运行 的进程调至外存(挂起),具备运行条件并且内存空闲时调入内存(就绪)。
1. 排队器。实现将系统中所有就绪进程按照一定策略排成一个或多个队列,以便调度进程快速找到。
2. 分派器。依据进程调度程序所选择的进程,将其从就绪队列中取出,将处理机分配给新选择的进程。
3. 上下文切换器在对处理机进行切换时,会发生两对上下文的切换操作:1. 上下文切换时,OS将保存当前进程的上下文,即把当前进程的处理机寄存器内容保存到该进程的进程控制块内的相应单元,再装入分派程序的上下文,以便分派程序运行;2. 上下文切换是移出分派程序的上下文,而把新选进程的CPU现场信息装入到处理机的各个相应寄存器中,以以便新选进程运行。
依据进程进入就绪状态的先后顺序排列,进程进入等待或结束状态时,就绪队列中的下一个进程占用CPU
缺点:
Shortest job next (SJN), also known as shortest job first (SJF) or shortest process next (SPN)
选择就绪队列中执行时间最短进程占用CPU进入运行状态 就绪队列按预期的执行时间来排序。
SPN与FCFS的比较:
适用于抢占方式的调度方式,按剩余所需运行时间抢占,SPN算法的可抢占改进。
缺点:
Highest Response ratio Next
选择就绪队列中响应比R值最高的进程
R=(w+s)/s w: 等待时间(waiting time) s: 执行时间(service time)
优点: 在短进程优先算法的基础上改进,关注进程的等待时间,防止无限期推迟。
时间片: 分配处理机资源的基本时间单元。 算法思路: 时间片结束时,按FCFS算法切换到下一个就绪进程,每隔(n – 1)个时间片进程执行一个时间片q。
问题:
不同时间片的比较:
Multiple queue 就绪队列被划分成多个独立的子队列,每个队列拥有自己的调度策略
Multiple feedback queue 1. 设置多个就绪队列,每个队列赋予不同优先级,优先级越高的队列时间片就越小。 2. 每个队列采用FCFS算法。新进程先放入第一队列末尾按照FCFS等待调度,轮到该进程执行时,若不能在时间片内执行完成则放入第二队列的末尾,直到放入最后一个队列的末尾,最后一个队列按照RR方式运行。
FSS控制用户对系统资源的访问,一些用户组比其他用户组更重要,保证不重要的组无法垄断资源,未使用的资源按比例分配,没有达到资源使用率目标的组获得更高的优先级。
由于竞争资源或者通信关系,两个或更多进程(线程)在执行中出现,永远相互等待只能由其他进程引发的事件
请求/获取(申请空闲资源)->使用/占用(进程占用资源)->释放(资源状态由占用变成空闲)
可重用资源: 可供用户重读多次使用,不允许进程共享,按照进程访问资源的流程使用可重用资源。进程运行期间可重用资源不能被创建和删除。
可消耗性资源: 临时性资源,在进程运行过程中可以由进程动态地创建和消耗。
可剥夺资源: 该资源可以在已经被进程占有的前提下被其他进程或者系统抢占。
不可剥夺资源: 一旦系统把该资源分配给进程后,不能强行收回,只能等待自行释放,比如刻录光盘,如果中途打断会造成光盘的损坏。
1.竞争不可剥夺资源产生死锁:
如图,进程A占有文件1同时请求文件2,进程B占有文件2同时请求文件1,两个进程由于得不到所需的进程,一起阻塞,发生死锁。
2. 竞争消耗性资源产生死锁:
执行顺序不同可能会造成死锁,执行顺序2就发生了死锁。
3. 进程推进顺序不当产生死锁:
曲线四:进程1先申请S1,S1分配给P1,然后进程2申请S2,S2分配给P2,接着进程1申请S2,由于S2被P2占有,S1阻塞,接着P2申请S1,同样也阻塞,进入死锁点。D区域被称为不安全区,表示进入该区域最终会导致死锁,并不代表进入该区域就已经死锁。
如下图,左边的所有进程形成了一个环,发生死锁,右边的图虽然有环,但并不包括所有进程,所以不会死锁。
确保系统永远不会进入死锁状态,预防是采用某种策略,限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。
在使用前进行判断,只允许不会出现死锁的进程请求资源。利用额外的先验信息,在分配资源时判断是否会出现死锁,只在不会死锁时分配资源。
在检测到运行系统进入死锁状态后,进行死锁解除恢复。
死锁检测: 允许系统进入死锁状态,维护系统的资源分配图,定期调用死锁检测算法来,搜索图中是否存在死锁,出现死锁时,用死锁恢复机制进行恢复
死锁接触:
当进程请求资源时,系统判断分配后是否处于安全状态,即判断是否存在安全序列。
安全序列: 序列<P1,P2,…,PN>是安全的,有如下要求:
安全状态与死锁的关系
银行家算法是一个避免死锁产生的算法。以银行借贷分配策略为基础,判断并保证系统处于安全状态。
这里的银行家就是操作系统,资金就是资源,客户就是申请资源的线程。
Work = Available; //Work表示当前资源剩余空闲量
for(int i = 1; i <= n; i++) //全部进程一开始都未执行
Finish[i] = false;
for(int i = 1; i <= n; i++) {
if(Finish[i] == false && Need[i][j] <= Work[j]) break;//找到满足的进程Pi
}
//如果没找到进入第4步骤
Finish[i] = true;//表示进程i已经运行
Work[j] = Work[j]+Allocation[i][j];//回收进程i已分配的资源
bool judge(){
for(int i = 1; i <= n; i++) {
if(Finish[i] == false) return false;// 有进程未执行,不安全
}
return true;//全部进程都执行过,安全状态
}
Request[i]
表示进程Pi
的资源请求向量
Request[i][j]
表示进程Pi
请求资源Rj
的实例个数Request[i][j] <= Need[i][j]
, 转到步骤2。否则, 拒绝资源申请, 因为进程已经超过了其最大要求Request[i][j] <= Available[j]
, 转到步骤3。否则, Pi
必须等待, 因为资源不可用Available[j] = Available[j] - Request[i][j] ;
Allocation[i][j]= Allocation[i][j] + Request[i][j] ;
Need[i][j]= Need[i][j] – Request[i][j] ;
Pi
(实施本次分配)
如果返回结果是不安全,系统会拒绝Pi
的资源请求 (撤销预分配)