操作系统实习报告Word文件下载.docx
- 文档编号:22164298
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:31
- 大小:167.96KB
操作系统实习报告Word文件下载.docx
《操作系统实习报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
a.进程P2请求资源(0,3,4)
b进程P4请求资源(1,0,1)
c.进程P1请求资源(2,0,1)
d.进程P3请求资源(0,0,2)
【实现提示】
(1)将各部分设计成子函数,然后调用,可以使结构清晰。
(2)将向量和矩阵存储在一维数组和二维数组中。
一、需求分析
1.将向量和矩阵存储在一维数组和二维数组中。
2.用户输入数据,并且可以决定测试的数据数量。
3.安全性算法可以决定拟分配是否实行。
4.要求测试四组数据。
二、设计
1.设计思想
1.银行家算法
(1)存储结构:
用数组来存储向量和矩阵。
(2)主要算法基本思想:
(4)系统执行安全性算法,设置两个向量:
从进程集合中找到满足下述条件的进程:
若找到执行(5),否则执行(6);
(5)当进程Pi获得资源后,顺序执行直到完成,并释放它的资源,执行:
gotostep(6);
(6)若所有进程的finish[i]=true,则系统处于安全状态,否则,处于不安全状态。
检查此次资源分配后,系统是否处于安全状态,若安全,才正式将资源分配给Pi进程,完成本次分配;
2、安全性算法
2.设计表示
(1)函数调用关系图
main->
Bijiao
safe
(2)函数接口规格说明
intBijiao(inti)/*比较请求与需求矩阵*/
intsafe(inth)/*安全性算法*/
3.实现注释
(1)根据输入的进程号和所申请的资源数来对向量进行比较;
(2)符合要求则进行拟分配,否则输出进程阻塞;
(3)进行安全性算法检测,不安全则撤销分配,否则实行分配;
4.详细设计
#define
n
5
//进程个数
m
3
//资源种类
int
Available[m],Alloc[n][m],Need[n][m];
main()
{
intrequest[m];
input();
while
(1)
{
read_req();
if
(请求结束)
break;
(1)if(!
(requesti<
=Needi))
表示非法请求;
(2)if(!
=Availablei))则Pi阻塞;
(3)试探性分配
Available=Available-Requesti;
Alloci=Alloci+Requesti;
Needi=Needi-Requesti;
(4)若新状态安全,则实际分配资源给Pi,否则取消试探性分配。
}
}
安全状态判别算法:
(1)设置Finish=(false,...,false)work=Available
(2)循环查找满足下列条件的进程pi
//最多循环n次
Finish[i]=false且Needi<
=work
(3)若找到则
Finish[i]=true;
work=work+Alloci;
转
(2)
(4)若Finish=(true,...,true)则安全,否则不安全。
测试数据:
m=3:
种类型的资源(A,B,C,);
进程个数n=5;
Available=(2,3,3);
已分配资源数量
资源需求量
ABC
ABC
P1
212
347
P2
402
134
P3
305
003
P4
204
221
P5
314
110
5.流程图
是
否
否是
三、调试分析
遇到的问题:
在测试数据时,一直显示的是进程阻塞。
解决办法:
产生这一现象的原因是在安全性算法失败时,没有撤销拟分配的资源,只要加上撤销资源的步骤就可以解决这一问题。
四、用户手册
点击运行程序会显示如下提示:
根据提示依次输入进程号,会有如下显示:
按照提示输入进程所申请的资源量:
则第一个进程的处理就完成了:
五、运行结果
六、源程序清单
#include<
string.h>
#include<
stdio.h>
#definen5//总进程数
#definem3//总资源数
#defineFALSE0
#defineTRUE1
intMax[n][m];
intAvailable[m]={2,2,3};
//系统可用资源数
intAllocation[n][m]={{2,1,2},{4,0,2},{3,0,5},{2,0,4},{3,1,4}};
//n个进程已经得到N类资源的资源量
intNeed[n][m]={{3,4,7},{1,3,4},{0,0,3},{2,2,1},{1,1,0}};
//n个进程还需要m类资源的资源量
intRequest[m];
//请求矩阵
intBijiao(inti);
intsafe();
voidmain()
{
inta,b,c,d;
inti=0,j=0,k;
while
(1)
{
printf("
请输入需申请资源的进程号:
"
);
scanf("
%d"
&
i);
请输入进程%d申请的资源数"
i);
%d%d%d"
Request[0],&
Request[1],&
Request[2]);
a=Bijiao(i);
if(a)
{
for(k=0;
k<
m;
k++)
Available[k]=Available[k]-Request[k];
Allocation[i-1][k]=Allocation[i-1][k]+Request[k];
Need[i-1][k]=Need[i-1][k]-Request[k];
}
safe(i);
}
intBijiao(inti)//比较请求与需求矩阵
intj;
intm=0,n=0;
for(j=0;
j<
j++)
if((Request[j]<
=Need[i-1][j]))
m++;
=Available[j]))
n++;
if(m==3&
&
n==3)
return1;
else
该进程阻塞!
\n"
return0;
}
intsafe(inth)
intwork[m],Finish[n];
inti=0,j,k=0;
for(i=0;
i<
n;
i++)
Finish[i]=FALSE;
work[j]=Available[j];
//i=s;
while(i<
n+120)
k=0;
for(j=0;
j++)
{
if(Finish[j]==FALSE&
Need[j][0]<
=work[0]&
Need[j][1]<
=work[1]&
Need[j][2]<
=work[2])
{
Finish[j]=TRUE;
work[0]=Allocation[j][0];
work[1]=Allocation[j][1];
work[2]=Allocation[j][2];
}
}
if(Finish[j]=TRUE)
k++;
if(k==n)
break;
else
i++;
k=0;
i++)
if(Finish[i]==TRUE)
k++;
if(k!
=n)
printf("
for(j=0;
{
Available[j]=Available[j]+Request[j];
Allocation[h-1][j]=Allocation[h-1][j]-Request[j];
Need[h-1][j]=Need[h-1][j]+Request[j];
}
新状态稳定,资源实际分配!
实习二多级队列调度算法
设RQ分为RQ1和RQ2,RQ1采用轮转法,时间q=7.RQ1>
RQ2,RQ2采用短进程优先调度算法。
RQ1:
P1-P5,RQ2:
P6-P10。
测试数据如下:
P6-P10
进程
P6
P7
P8
P9
P10
运行时间
16
11
14
13
15
21
18
10
7
已等待时间
6
5
4
3
2
1
1.将p1-p5、p6-p10做成链表,并把各个进程的运行时间和已等待时间保存到节点中;
2.当RQ1中的进程没有结束时,将进程排到队列末尾;
3.对于RQ2中的进程需要按照运行时间由小到大的顺序排序;
4.运行程序,输出结果。
单链表
(2)主要算法基本思想:
对单链表的指针进行操作。
2.详细设计
typedef
struct
tag_pcb
{
char
name[8];
intneed;
//须运行的时间
intturn;
//周转时间
tag_pcb
*next;
}PCB;
PCB
*RQ1,*RQ2;
intclock=0;
//时钟
main()
输入RQ1;
输入RQ2;
(最好从文件读入)
while(RQ1!
=NULL)
{
从RQ1中选取一进程Pi准备运行;
计算其运行的时间t;
clock+=t;
//表示Pi运行t;
if(Pi完成)
计算其turn;
否则
Pi加入到队尾;
while(RQ2!
{
从RQ2中选取一进程Pi准备运行;
clock+=Pi.need;
计算Pi的turn;
输出进程的周转时间;
3.流程图
否
是
否
当在vs2008上调试时,出现了结果一闪而过的问题,而在vc6.0上则没有此现象,上网查阅资料得知这是因为我使用的是程序调试,也就是按的F5键,要想显示dos下运行的结果,只需要按CTRL+F5直接运行就可以了。
问题解决之后,程序运行无误,结果也能正常显示了。
点击运行程序,直接显示结果。
五、运行结果
stdlib.h>
typedefstructtag_pcb
charname[8];
intwait;
structtag_pcb*next;
}PCB;
PCB*RQ1,*RQ2;
intListInitiate()
PCB*l,*p;
inti;
if((l=(PCB*)malloc(sizeof(PCB)))==NULL)
内存不足!
return0;
RQ1=l;
p=l;
printf("
请输入循环队列进程的名称、运行时间和已等待的时间:
scanf("
%s%d%d"
p->
name,&
p->
need,&
wait);
4;
if((l=(PCB*)malloc(sizeof(PCB)))==NULL)
return0;
p->
next=l;
p=l;
RQ2=l;
p=RQ2;
5;
p=p->
next;
请输入采用最短作业法进程的名称、运行时间和已等待的时间:
scanf("
p->
next=NULL;
return1;
voidmain()
intm=5;
intn=5;
intq=7;
PCB*p,*s,*l,*s1,*p1;
inta[100];
inti=0,j=0,t;
t=ListInitiate();
if(t)
p=RQ1;
for(i=0;
a[i]=p->
need;
p=p->
i++)//RQ1的周转时间
while(a[j]==0&
n)
{
j++;
p=p->
}
while(p!
=RQ2->
next&
a[j]!
=0&
if(a[j]>
q)
{
a[j++]=a[j]-q;
clock+=q;
p=p->
}
else
clock+=a[j];
p->
turn=clock+p->
wait;
a[j++]=0;
j=0;
p=RQ1;
l=RQ2;
s=RQ2->
s1=l;
p1=s;
p=p1->
while(s->
next!
=NULL)
=NULL)//找到运行时间最短的进程
if(s->
need>
need)
s=p;
s1=p1;
p1=p1->
p=p->
s1->
next=s->
s->
next=l->
l->
next=s;
l=l->
s1=s;
s=s->
p1=s;
p=s->
p=RQ2->
while(p!
=NULL)//RQ2的周转时间
clock+=p->
p->
next)
%s的周转时间为%d\n"
name,p->
turn);
next;
elseprintf("
Error!
心得体会
通过这次课程设计,不仅让我更加深入的了解了银行家算法、安全性算法、多级队列调度算法,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。
开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原由的基础上我进行了改正,终于调试成功了,虽然这个过程还是经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。
做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。
我们应该认真找到自己的缺点并且及时改正。
此时此刻,我心里多了些成就感。
这是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实习 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)