二 ,调度与死锁

一,调度

调度类型:

如图:
在这里插入图片描述
高级调度:选择一或多进程调入内存;
中级调度:将不能运行的进程调到外存挂起;
低级调度:决定就绪队列中哪个进程获得处理机;

调度方式:

可剥夺和不可剥夺方式

调度时机:

进程退出,阻塞,创建,中断发生,时钟中断;

调度算法:

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.解除:

①撤销所有死锁的进程;
②恢复到前面的某个未死锁的检查点,重新运行;
③有选择的撤销死锁进程,每撤销一个,死锁检测一次,直至不存在死锁;
④基于最小代价原则剥夺资源,直至不死锁,每撤销一个,死锁检测一次,直至不存在死锁;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值