基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx

上传人:b****3 文档编号:4913465 上传时间:2022-12-11 格式:DOCX 页数:11 大小:552.33KB
下载 相关 举报
基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx_第1页
第1页 / 共11页
基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx_第2页
第2页 / 共11页
基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx_第3页
第3页 / 共11页
基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx_第4页
第4页 / 共11页
基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx

《基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx》由会员分享,可在线阅读,更多相关《基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx(11页珍藏版)》请在冰豆网上搜索。

基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx

基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3

中北大学

操作系统课程设计

说明书

 

学院、系:

软件学院

专业:

软件工程

学生姓名:

1121011042

学号:

段俊伟

设计题目:

基于Linux的实现进程的信号量互斥申请

起迄日期:

2013年11月22日-2013年12月6日

指导教师:

康珺

 

 

 

 2013年11月6日

1需求分析

基于Linux的进程同步与通信的模拟实现需要完成以下功能:

(1)创建进程:

手动创建几个进程,或者随即创建几个进程,都在界面上完成;要求包括进程的名称(不能重复)、执行时间和申请资源的等待时间等。

在同一时刻可能有多个进行在内存申请某资源,即可以输入多个进程的资源申请。

(2)3类临界资源的管理,包括申请以及分配等。

分别通过信号量实现或者管程实现。

(3)银行家算法,判断是否可以进行资源的分配。

基于以上的功能,可以使用户选择操作,模拟临界资源的管理和银行家算法。

目的:

实现临界资源的管理及死锁的避免。

2总体设计

进程同步与模拟实现系统分为4个模块:

输入输出,进程对资源的随机申请及分配,临界资源管理,银行家算法避免死锁。

输入输出:

包括系统运行所需要的进程的名称,执行时间,申请资源的等待时间,进程对资源的需要量等信息以及系统所要显示出的进程的创建信息,资源的分配信息,进行执行信息,进行动态申请资源信息等。

进程对资源的随机申请及分配:

根据所输入的进程、资源、以及进程对资源的最大申请情况,随机产生进程当前对资源的申请,输出相应的分配信息与进程执行信息并调用银行家算法对进程的资源申请进行判断。

临界资源的管理:

创建相应个数的进程,完成进程的并发执行,使用互斥信号量使各进程互斥的进入各自的临界区对资源进行申请,进程执行完毕后,互斥的对资源进行恢复。

银行家算法避免死锁:

对当前进程对资源的申请利用银行家算法进行判断,看系统分配后是否处于安全状态,若处于安全状态,则将资源分配给进程,并输出分配信息,否则对不予以分配。

3.详细设计

在该系统中我主要实现了银行家算法避免死锁的模块,该模块中主要使用了数组的数据结构.

3.1银行家算法:

设Request[i]是进程i的请求向量,如果Request[i][j]=k,表示进程i需要k各j类型的资源。

当i发出资源请求后,系统按下述步骤进行检查:

(1)如果Request[i][j]<=Need[i][j],便转向步骤

(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request[i][j]<=Available[i][j],便转向步骤(3);否则表示尚无足够资源,进程i需要等待。

(3)系统试探着把资源分配给进程i,并修改下面数据结构中的数值:

Available[j]=Available[j]-Request[tr][j];

Allocation[tr][j]=Allocation[tr][j]+Request[tr][j];

Need[tr][j]=Need[tr][j]-Request[tr][j];

(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态,若安全,才正式将资源分配给进程I,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让i等待。

安全性算法步骤如下:

(1)设置两个向量:

工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m各元素,在执行安全算法开始时,Work:

=Available;Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。

开始时先做Finish[i]:

=false;当有足够自语啊分配给进程是,再令Finish[i]:

=true.

(2)从进程集合中找到一个能满足下述条件的进程:

Finish[i]=false;

Need[i][j]<=Work[j];若找到,执行步骤(3),否则,执行步骤(4)。

(3)当进程i获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work[j]:

=Work[j]+Allocation[i][j];

Finish[i]:

=true;

Gotostep2;

(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

3.2数据结构

intAvailable[NUM];//可使用资源向量

intMax[10][NUM];//最大需求矩阵

intAllocation[10][NUM];//分配矩阵

intNeed[10][NUM];//需求矩阵

intWork[NUM];//工作向量

intFinish[NUM];//状态标志

intRequest[10][NUM];//进程申请资源向量

3.3核心代码

intrequest(inttr,intz,intr)//进程提出新申请的代码部分

{

intp=0,q=0,i,j,f=0,b,l,t=0,k=0;//g记录进程序号

if(u==0||a==0)

{

printf("请先输入信息!

\n");return0;

}

else{

for(i=0;i

{

if(Request[tr][i]>Need[tr][i])

p++;

if(Request[tr][i]>Available[i])

q++;

}

if(p)

{

printf("\n出错!

进程申请的资源数多于它自己申报的最大量\n");

print1();

if(z!

=-1)//手动输入时不执行

{

for(i=0;i

{

if(Need[tr][i]==0)

{

for(t=0;t

{

if(Y[r][t].index==i)

Y[r][t].flag1=1;

}

}

}

}

return0;

}

elseif(q)

{

printf("\n进程%c必须等待\n",JC[tr].name);

print1();

if(z!

=-1)

{

for(i=0;i

{

if(Need[tr][i]==0)

{

for(t=0;t

{

if(Y[r][t].index==i)

Y[r][t].flag1=1;

}

}

}

}

return0;

}

else

{

for(j=0;j

{//以下是预分配

Available[j]=Available[j]-Request[tr][j];

Allocation[tr][j]=Allocation[tr][j]+Request[tr][j];

Need[tr][j]=Need[tr][j]-Request[tr][j];

Work[j]=Available[j];

}

for(i=0;i

{

Work[i]=Available[i];//Work[i]只是一个暂时寄存的中间变量,为防止在下面

//安全性检查时修改到Available[i]而代替的一维数组

Finish[i]=0;

}

for(k=0;k

{

for(i=0;i

{

b=0;//计数器初始化,记录进程中满足条件的资源数

for(j=0;j

{

if(Need[i][j]<=Work[j])

{

b=b+1;

}

if(Finish[i]==0&&b==a)

{

for(l=0;l

{

Work[l]=Work[l]+Allocation[i][l];

}

Finish[i]=1;

printf("$$%c",JC[i].name);//依次输出进程安全序列之一中每个元素

}

}

}

}

printf("\n");

for(i=0;i

{

if(Finish[i]==1){f=f+1;}//统计Finish[i]==1的个数

}

if(f==u)

{

printf("安全性算法检查预分配后系统处于安全状态,以上为安全序列!

可以将资源分配给进程%c",JC[tr].name);

f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备

print1();

if(z!

=-1)

{

for(i=0;i

{

Request[tr][i]=0;

if(Need[tr][i]==0)

{

for(t=0;t

{

if(Y[r][t].index==i)

Y[r][t].flag1=1;

}

}

Available[i]=ZY[i].n;

}

}

for(i=0;i

{

Available[i]=ZY[i].n;

}

}

else

{

printf("安全性算法检查预分配后系统处于不安全状态,不能进行分配!

");//以下代码为当系统被判定为不安全状态时

//返回提出申请前的状态

for(i=0;i

{

Available[i]=Available[i]+Request[tr][i];

Allocation[tr][i]=Allocation[tr][i]-Request[tr][i];

Need[tr][i]=Need[tr][i]+Request[tr][i];

}

print1();

}

}

return1;

}

}

 

3.4运行结果

图3.4.1

图3.4.2

图3.4.3

图3.4.4

图3.4.5

 

4.心得体会

经过这次的操作系统课程设计,让我经历了一次有意义的项目开发过程,让我了解了团队合作的重要性,起初我们只是在不停的各干各的,发现根本不可能完成预期的任务,后来我们坐下来讨论了系统的功能,然后各司其职,发现效果真的不一样,虽然在这两周的时间里我们做了很多,中间也遇到了一些问题,比如说临界资源管理模块和银行家模块怎样结合起来,起初是将两个交叉起来,可是效果不是很好,最后还是决定将它们分开,慢慢地其他问题也同样得到了解决,这就是团队合作的力量,这个系统需要完善的内容还有很多,我们以后还会在一起讨论完善并改进,在此过程中,我也发现了编程是需要绝对的耐心与细心的,不然会造成一些难以修改的错误,导致整个项目进展出现问题。

这对我们真的是一次很好的锻炼。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1