2020初学者理解的操作系统(3)----银行家算法及分段地址变换

银行家算法

考虑下面的系统快照:
在这里插入图片描述
回答以下问题:
1.计算需求矩阵Need.
2.此状态是否为安全状态,如果是,则找出安全序列.
3.在此基础上P1 申请(0,4,2,0)能否立即分配?为什么?
【解答】
1.这里的最大需求量矩阵我们把它命名为Max,把已分配的资源矩阵命名为Allocation,第一问的需求矩阵Need = Max - Allocation =
A B C D P 0 0 0 0 0 P 1 0 7 5 0 P 2 1 0 0 2 P 3 0 0 2 0 P 4 0 6 4 2 \begin{matrix} & A & B& C & D\\ P0& 0 & 0 & 0 & 0\\ P1 & 0& 7 & 5 & 0 \\ P2& 1 & 0 & 0 & 2\\ P3&0&0&2&0\\ P4&0&6&4&2 \end{matrix} P0P1P2P3P4A00100B07006C05024D00202
2.安全状态就是每一项都能正常合理分配的状态,所以这里第一步:
令Work = Available = (1,5,2,0),Finish[i] = false;
先分配给P0, then Work = (1,5,3,2),Finish[0] = true;
然后分配给P2,then Work = (2,8,8,6),Finish[2] = true;
然后分配给P1,then Work = (3,8,8,6),Finish[1] = true;
然后分配给P3,then Work = (3,14,11,8),Finish[3] = true;
然后分配给P4,then Work = (3,14,12,12),FInish[4] = true;
因为一直都是true,所以{P0,P2,P1,P3,P4}是一个安全序列,当然,安全序列并不是唯一的,一般都是按照顺序一步一步找出来的。
3.P1立即请求(0,4,2,0),
首先需要进行两步判断:

  • 请求向量是否小于A的Max
  • 请求向量是否小于Available

这里我们能看出(0,4,2,0)<(1,7,5,0),同时(0,4,2,0)<(1,5,2,0)
假设可以立即分配,
令Work = Available =(1,1,0,0)Finish [i] = false;
先分配给P0, then Work = (1,1,1,2),Finish[0] = true;
然后分配给P2, then Work = (2,4,6,6),Finish[2] = true;
然后分配给P1, then Work =(3,8,8,6),Finish[1] = true;
然后分配给P3, then Work =(3,14,11,8),Finish[3] = true;
最后分配给P4, then Work =(3,14,12,12),Finish[4] =true;
所以{P0,P2,P1,P3,P4}是一个安全序列,也并不唯一

分段地址变换

已知段表和以下逻辑地址,请计算相应的物理地址:
a.< 0 , 430 >
b.< 1 , 10 >
c.< 2 , 500 >
d.< 3 , 400 >
e.< 4 , 112 >

段号基址长度保护
0219600R
1230014R/W
290100R/W
31327580R
4195296R

【解答】
对a来说,段号为0,430<600,物理地址为430+219= 649
对b来说,段号为1,10<14,物理地址为2300+10 = 2310
对c来说,段号为2,500>100,所以发生越界中断
对d来说,段号为3,400<580,物理地址为1327+400 =1727
对e来说,段号为4,112>96,所以发生越界中断
【总结】
这种题没有啥难的,主要就是用所给的逻辑地址和各段的段长进行比较。
本文到此结束,欢迎大家在评论区探讨~~~

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一、 课程设计目的 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法理解,加强学生的动手能力。 二、课程设计的内容 1、分页方式的地址换算 2、分段方式的地址换算 3、段页式的地址换算 三、程序运行 1、 分页式地址转换: 数据: 逻辑地址:223、页面大小:23 2、 分段式地址转换 数据: 逻辑地址段号:223、段内地址:23 3、 段页式地址换算 逻辑地址的段号:2、页号:3 四、程序源代码 #include #include int page(int A,int L ); int Segment(int sn,int sl); int SegPagt(int sn,int pn,int pd); typedef struct segtable { int segf[256]; int segl[256]; }segtable; struct segtable st; typedef struct segpagt { int segf[256]; int segl[256]; int ptl[256]; int pt[256]; int pf[256]; int pl; }segpagt; struct segpagt sp; int main() { int code; int pl,pa,sn,sd,pd,pn; //const int ptl ; int temp; do{ printf("----------------地址换算过程----------------------------\n\n"); printf(" 1.分页式地址换算\n"); printf(" 2.分段式地址换算\n"); printf(" 3.段页式地址换算\n"); printf(" 4.结束运行\n\n"); printf("----------------------------------------------------------\n"); printf("请输入您的选择:"); scanf("%d",&code); switch(code) { case 1:{ printf("注意:请演示设定页表长度小于\n"); printf("请输入换算的逻辑地址:\n"); scanf("%d",&pa); printf("页面大小(B):\n"); scanf("%d",&pl); page(pa,pl); }break; case 2:{ printf("请演示设定段表长度小于\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("段内地址:\n"); scanf("%d",&sd); Segment(sn,sd); }break; case 3:{ printf("预设定段表长为,页面大小为\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("页号:\n"); scanf("%d",&pn); printf("页内地址:\n"); scanf("%d",&pd); SegPagt(sn,pn,pd); }break; case 4:{}break; } }while (code<4); } int page(int A,int L) { int d,P,kd,i; int WD; int PT[256]; for(i=1;iL) printf("页号大于页表长度,越界中断\n\n");//如果页号大于页表长度,输出越界中段 else { printf("页号=逻辑地址/页面大小=%d,页内地址=逻辑地址%页面大小=%d\n",P,d);//输出页号和页内地址 kd=PT[P];//根据页号随机产生快号 printf("根据页号%d得到块号%d\n",P,kd); WD=kd*L+d;//计算物理地址的公式 printf("物理地址=块号%d*页面大小%d+页内地址%d\n",kd,L,d);//输出物理地址=块号*页面大小+页内地址 printf("逻辑地址%d换算后的物理地址为%d\n\n",A,WD);//输出物理地址的结果 return (0); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值