1、基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3中北大学操作系统课程设计说 明 书学 院、系:软件学院专 业:软件工程学 生 姓 名:1121011042学 号:段俊伟设 计 题 目:基于Linux的实现进程的信号量互斥申请 起 迄 日 期:2013年11月22日- 2013年12月6日指 导 教 师:康珺2013 年 11月 6 日1 需求分析 基于Linux的进程同步与通信的模拟实现需要完成以下功能:(1)创建进程:手动创建几个进程,或者随即创建几个进程,都在界面上完成;要求包括进程的名称(不能重复)、执行时间和申请资源的等待时间等。在同一时刻可能有多个进行在内存申请某资源
2、,即可以输入多个进程的资源申请。(2)3类临界资源的管理,包括申请以及分配等。分别通过信号量实现或者管程实现。 (3)银行家算法,判断是否可以进行资源的分配。基于以上的功能,可以使用户选择操作,模拟临界资源的管理和银行家算法。 目的:实现临界资源的管理及死锁的避免。2 总体设计 进程同步与模拟实现系统分为4个模块:输入输出,进程对资源的随机申请及分配,临界资源管理,银行家算法避免死锁。 输入输出:包括系统运行所需要的进程的名称,执行时间,申请资源的等待时间,进程对资源的需要量等信息以及系统所要显示出的进程的创建信息,资源的分配信息,进行执行信息,进行动态申请资源信息等。 进程对资源的随机申请及
3、分配:根据所输入的进程、资源、以及进程对资源的最大申请情况,随机产生进程当前对资源的申请,输出相应的分配信息与进程执行信息并调用银行家算法对进程的资源申请进行判断。 临界资源的管理:创建相应个数的进程,完成进程的并发执行,使用互斥信号量使各进程互斥的进入各自的临界区对资源进行申请,进程执行完毕后,互斥的对资源进行恢复。 银行家算法避免死锁:对当前进程对资源的申请利用银行家算法进行判断,看系统分配后是否处于安全状态,若处于安全状态,则将资源分配给进程,并输出分配信息,否则对不予以分配。3详细设计在该系统中我主要实现了银行家算法避免死锁的模块,该模块中主要使用了数组的数据结构.3.1银行家算法:设
4、Requesti是进程i的请求向量,如果Requestij=k,表示进程i需要k各j类型的资源。当i发出资源请求后,系统按下述步骤进行检查:(1) 如果Requestij=Needij,便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2) 如果Requestij=Availableij,便转向步骤(3);否则表示尚无足够资源,进程i需要等待。(3) 系统试探着把资源分配给进程i,并修改下面数据结构中的数值: Availablej=Availablej-Requesttrj; Allocationtrj=Allocationtrj+Requesttrj; Needt
5、rj=Needtrj-Requesttrj;(4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态,若安全,才正式将资源分配给进程I,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让i等待。安全性算法步骤如下:(1)设置两个向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m各元素,在执行安全算法开始时,Work:=Available;Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finishi:=false;当有足够自语啊分配给进程是,再令Finishi:=true.(2)从进程集合中找到一个能满足
6、下述条件的进程:Finishi=false;Needij=Workj;若找到,执行步骤(3),否则,执行步骤(4)。(3)当进程i获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Workj:=Workj+Allocationij;Finishi:=true;Go to step 2;(4)如果所有进程的Finishi=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。3.2数据结构int AvailableNUM; /可使用资源向量int Max10NUM; /最大需求矩阵int Allocation10NUM; /分配矩阵int Need10NUM; /需
7、求矩阵int WorkNUM; /工作向量int FinishNUM; /状态标志int Request10NUM; /进程申请资源向量3.3核心代码int request(int tr,int z,int r) /进程提出新申请的代码部分 int p=0,q=0,i,j,f=0,b,l,t=0,k=0;/g记录进程序号 if(u=0|a=0) printf(请先输入信息!n); return 0; else for(i=0;iNeedtri) p+; if(RequesttriAvailablei) q+; if(p) printf(n出错!进程申请的资源数多于它自己申报的最大量n); pr
8、int1(); if(z!=-1)/手动输入时不执行 for(i=0;ia;i+) if(Needtri=0) for(t=0;tz;t+) if(Yrt.index=i) Yrt.flag1=1; return 0; else if(q) printf(n进程%c必须等待n,JCtr.name); print1(); if(z!=-1) for(i=0;ia;i+) if(Needtri=0) for(t=0;tz;t+) if(Yrt.index=i) Yrt.flag1=1; return 0; else for(j=0;ja;j+) /以下是预分配 Availablej=Availab
9、lej-Requesttrj; Allocationtrj=Allocationtrj+Requesttrj; Needtrj=Needtrj-Requesttrj; Workj=Availablej; for(i=0;ia;i+) Worki=Availablei;/ Work i只是一个暂时寄存的中间变量,为防止在下面 /安全性检查时修改到Availablei而代替的一维数组 Finishi=0; for(k=0;ku;k+) for(i=0;iu;i+) b=0; /计数器初始化,记录进程中满足条件的资源数 for(j=0;ja;j+) if(Needij= Workj) b=b+1;
10、if(Finishi=0&b=a) for(l=0;la;l+) Workl= Workl+Allocationil; Finishi=1; printf($ %c ,JCi.name);/依次输出进程安全序列之一中每个元素 printf(n); for(i=0;iu;i+) if(Finishi=1) f=f+1;/统计Finishi1的个数 if(f=u) printf(安全性算法检查预分配后系统处于安全状态,以上为安全序列!可以将资源分配给进程%c,JCtr.name); f=0;/将计数器f重新初始化,为下一次提出新的进程申请做准备 print1(); if(z!=-1) for(i=
11、0;ia;i+) Requesttri=0; if(Needtri=0) for(t=0;tz;t+) if(Yrt.index=i) Yrt.flag1=1; Availablei=ZYi.n; for(i=0;ia;i+) Availablei=ZYi.n; else printf(安全性算法检查预分配后系统处于不安全状态,不能进行分配!);/以下代码为当系统被判定为不安全状态时 /返回提出申请前的状态 for(i=0;ia;i+) Availablei=Availablei+Requesttri; Allocationtri=Allocationtri-Requesttri; Needt
12、ri=Needtri+Requesttri; print1(); return 1;3.4运行结果图3.4.1图3.4.2图3.4.3图3.4.4图3.4.54.心得体会 经过这次的操作系统课程设计,让我经历了一次有意义的项目开发过程,让我了解了团队合作的重要性,起初我们只是在不停的各干各的,发现根本不可能完成预期的任务,后来我们坐下来讨论了系统的功能,然后各司其职,发现效果真的不一样,虽然在这两周的时间里我们做了很多,中间也遇到了一些问题,比如说临界资源管理模块和银行家模块怎样结合起来,起初是将两个交叉起来,可是效果不是很好,最后还是决定将它们分开,慢慢地其他问题也同样得到了解决,这就是团队合作的力量,这个系统需要完善的内容还有很多,我们以后还会在一起讨论完善并改进,在此过程中,我也发现了编程是需要绝对的耐心与细心的,不然会造成一些难以修改的错误,导致整个项目进展出现问题。这对我们真的是一次很好的锻炼。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1