操作系统大题概述(上)
简答题在这篇文章里就不叙述了,如果有读者需要会考虑再开一篇文章写简答或者是选择
因为例题容易懂,直接上例题和解题步骤,除了必要的一些概念,不多赘述原理和课本内容
1、信号量机制问题
例:某博物馆允许500人同时参观,有一个出入口。该出入口一次仅允许一个人通过,参观者的活动描述如下,请使用信号量和P(wait())、V(signal())操作实现其互斥和同步。
cobegin
参观者进程i:
{
进门
…
参观
…
出门
…
}
coend
解:
semphore empty = 500; (博物馆可以容纳的人数)
semphore mutex = 1; (用于控制参观者互斥的访问出入口)
注意:信号量的设置是看题目中有几个需要互斥访问的资源,如果此题目修改为出口和入口不是同一个,那么就需要设mutex_in和mutex_out。
cobegin
参观者进程i:
{
wait(empty);(首先对empty减1,empty=499)
wait(mutex);(mutex减去1,mutex=0时代表有一个游客在使用出入口)
进门
signal(mutex);(mute=1,代表游客已经进入,不再占用出入口)
参观
wait(mutex);(游客正在使用出入口准备出门)
出门
signal(mutex);(游客已经出门)
signal(empty);(这名游客出门后,博物馆可容纳数又恢复到500)
}
coend
2、作业调度算法
注意:不仅要学会算法,还要记住他们的英文缩写,因为有的题目不写中文算法名
公式:
周转时间=完成时刻-到达时刻
周转时间 = 完成时间 - 到达时刻
带权周转时间 = 周转时间 / 服务时间
平均周转时间 = 周转时间 / 进程数
平均带权周转时间 = 带权周转时间 / 进程数
(1)先来先服务算法(FCFS)
思路:按到达时间来排序调度
①根据作业进入的时刻从先到后排序:A、B、C、D
②算出各个作业的周转时间和平均周转时间
A:
完成时间=0+1=1
周转时间=1-0=0
带权周转时间=1/1=1
B:
完成时间= 1(上一个作业A的完成时间)+ 100 = 101
周转时间= 101 - 1 = 100
带权周转时间= 100 / 100 = 1
以下省略
…
…
(2)短作业优先算法(SJF)
思路:根据作业所需服务时间来决定调度顺序
①作业A最先到达所以A为第一个
A:
完成时间=0+1=1
周转时间=1-0=0
带权周转时间=1/1=1
②此时的时间为1,只有B进来,所以只能调度B
B:
完成时间= 1 + 100 = 101
周转时间= 101 - 1 = 100
带权周转时间= 100 / 100 = 1
③这时的时间为101,作业C和D都已经进入,因为C的服务时间比D小,所以优先调度C,最后调度D
计算省略
(3)高响应比调度算法(HRRN)
思路:根据作业的优先级来决定调度顺序
优先级 :
= 响应时间 / 服务时间
=(等待时间 + 服务时间)/ 服务时间
①第一个还是A
②第二个开始使用优先级判断
B:(1 - 1 + 100)/ 100 = 1
C:(1 - 2 + 1)/ 1 = 0
D:(1 - 3 + 100)/ 100 = 0.98
因为B的优先权最大所以调度B,接下来步骤同上
3、死锁
变量:
Avaliable[]:表示当前系统剩余资源数
Allocation[i][j]:表示已经分配给进程Pi的Rj类资源数
Need[i][j]:表示进程Pi还需要的Rj类资源数目
Max:表示进程最多需要多少资源数
(1)银行家算法
设Requesti[j] = x:表示进程Pi向系统申请x个Rj类资源。
当Pi发出资源请求后,系统按照下述步骤进行检查:
①如果Request i[j]<=Need [i][j],便转向步骤②;否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。
②如果Request i[j]<=Available[j],便转向步骤③;否则,表示尚无足够资源,Pi须等待。
③系统试探着把资源分配给进程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];
④系统执行安全性算法
(2)安全性算法
①设置两个向量
a、Work:表示系统可以供给进程继续运行所需的各种资源数目,它含有m个元素,在执行安全算法开始时,Work = Avaliable;
b、Finish:它表示系统是否有足够的资源分配给进程,使之完成运行。开始时候先做Finish[i] = false;当有足够资源时,再令Finish[i] = true;
②从进程集合中找到一个能满足下述条件的进程:
a、Finish[i] =false;
b、Need[i][j]<=Work[j];
若找到,执行步骤③,否则执行步骤④。
③当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[j]+Allocation[i,j];
Finish[i]=true;
go to step ②;
④如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态;
(PS:说实话犹豫这么一长串要不要打下来,可能好多人都不愿意看,不打我觉得又不行,这个光看例题可能看不懂,想了想万一有一个人看而且用得上也算是没白打)
例:
(1)
①此时的Work = Available { 3 3 2 };随后查找Need[i][j]<=Work[j];
发现P1满足要求
当P1结束后,Work与Allocation相加得到的和就是新的Work { 5 3 2 },结果如下图:
②继续查找Need[i][j]<=Work[j];找到后步骤同上
…
省略步骤
最后结果为:
注意:安全序列不唯一,如果自己与答案不统一,不一定是错误的
(2)
①当发出请求向量时,首先判断是否Requesti[j] {1 0 2}<=Available {3 3 2};
如果满足,Available { 2 3 0}= Available {3 3 2} - Requesti[j] { 2 3 0}
②找到满足Request i[j]<=Need [i][j]的进程P1
执行以下公式:
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];
③随后的步骤就是照搬例题(1)银行家算法
最后结果如图:
(PS:篇幅有点长了,就分开上下了,先发上看看)