一,调度
调度类型:
如图:
高级调度:选择一或多进程调入内存;
中级调度:将不能运行的进程调到外存挂起;
低级调度:决定就绪队列中哪个进程获得处理机;
调度方式:
可剥夺和不可剥夺方式
调度时机:
进程退出,阻塞,创建,中断发生,时钟中断;
调度算法:
1.先来先服务(FCFS)
思想:按照到达时间顺序先后执行:
//对进程数组按照到达时间顺序排列(冒泡排序!!!)
//PID:进程名 AT:进程到达时间 RT:进程运行时间
void Sort(List &L) //顺序表的冒泡排序
{
int m = L.length - 1;
int flag = 1;
int j;
double t;
while ((m>0)&&(flag==1))
{
flag = 0;
for (j = 0; j < m; j++)
if (L.elem[j].AT> L.elem[j+1].AT)
{
flag = 1;
t = L.elem[j].PID; L.elem[j].PID = L.elem[j + 1].PID; L.elem[j+1].PID = t;
t = L.elem[j].AT; L.elem[j].AT = L.elem[j + 1].AT; L.elem[j+1].AT = t;
t = L.elem[j].RT; L.elem[j].RT = L.elem[j + 1].RT; L.elem[j+1].RT = t;
}
--m;
}
}
2.短作业优先(SJB)
思想:第一个进程到达后,对后续进程按照运行时间由小到大排列,若RT小的未到达,则运行下一个进程
void SJF_sort(List &L) //顺序表的冒泡排序
{
int m = L.length - 1;
int flag = 1;
int j;
int t;
for(j=L.length-1;j>0;j--)
if (L.elem[j].AT< L.elem[j-1].AT)
{
t = L.elem[j].PID; L.elem[j].PID = L.elem[j - 1].PID; L.elem[j-1].PID = t;
t = L.elem[j].AT; L.elem[j].AT = L.elem[j - 1].AT; L.elem[j-1].AT = t;
t = L.elem[j].RT; L.elem[j].RT = L.elem[j - 1].RT; L.elem[j-1].RT = t;
}
//按照运行时间由小到大排列
while ((m>0)&&(flag==1))
{
flag = 0;
for (j = 1; j < m; j++) //第二个元素开始 此处m表示下标
if (L.elem[j].RT> L.elem[j+1].RT)
{
flag = 1;
t = L.elem[j].PID; L.elem[j].PID = L.elem[j + 1].PID; L.elem[j+1].PID = t;
t = L.elem[j].AT; L.elem[j].AT = L.elem[j + 1].AT; L.elem[j+1].AT = t;
t = L.elem[j].RT; L.elem[j].RT = L.elem[j + 1].RT; L.elem[j+1].RT = t;
}
--m;
}// RT排列成功
}
3.时间轮转算法(Round Robin,RR)
思想:按到达时间排序成一队列,分配处理机给队首,时间片用完则发出时钟中断,将其暂停执行送入队尾;
缺点:不利于I/O频繁的操作;
注:时间片大小至少要保证一个交互过程完成;
改进: 时间片用完依然进入就绪队尾;但I/O中断时,进入辅助队列(优先于就绪队列);
4.优先权调度算法(Priority)
适用于:作业调度,进程调度
思想:从后备队列中选若干最高作业调入,处理机分配给就绪队列中优先级最高的进程;
进程优先级的确定:
静态优先权:创建即确定,运行也不变;
动态优先权:随推进而改变,进程等待时间↑ 优先权↓;反之,亦然,防止垄断CPU。
5.多级反馈队列算法(Multilevel Feedback Queue,MFQ)
思想:有多个优先权不同的就绪队列且优先级越高,时间片越短,新锦成放入优先级高的队尾,按FCFS调度,完成则退出,否则调到优先级其次的就绪队列队尾,依次类推,只有优先级高的队为空时,才调度优先级低的队列。
二,死锁
描述:相互竞争资源,通信的进程的“永久阻塞”;
原因:资源不足,进程推进次序非法
产生条件:互斥条件,请求和保持,不可剥夺条件,环境条件
预防和避免:
1.预防:
①一次性请求所有资源,不满足则阻塞;
② 1.进程申请新资源被拒,则停止运行,释放所占资源;
2.进程请求另一进程的资源时,剥夺资源,释放其他资源;
③环路: 进程当前分配某类型资源,则接下来请求资源只能是其次类型的资源;
2.避免:
定义系统安全状态,不安全状态(资源分配拒绝策略)
安全状态:至少存在一个安全序列<p1,p2,…pn>否则为不安全状态
思想: 允许动态申请资源,分配前,计算安全性,安全则分配
检测和解除
1.检测:
看是否有循环等待;利用资源简化图:
P->R:申请资源
R->P:分配资源
思想: 找图中非孤立且无阻塞的进程P,运行完毕,释放所占资源,成为孤立点;然后找下一个进程,反复进行若所有P简化成孤立点则不会发生死锁;
2.解除:
①撤销所有死锁的进程;
②恢复到前面的某个未死锁的检查点,重新运行;
③有选择的撤销死锁进程,每撤销一个,死锁检测一次,直至不存在死锁;
④基于最小代价原则剥夺资源,直至不死锁,每撤销一个,死锁检测一次,直至不存在死锁;