操作系统大题概述(上)

操作系统大题概述(上)

简答题在这篇文章里就不叙述了,如果有读者需要会考虑再开一篇文章写简答或者是选择
因为例题容易懂,直接上例题和解题步骤,除了必要的一些概念,不多赘述原理和课本内容

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:篇幅有点长了,就分开上下了,先发上看看)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值