基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx
- 文档编号:4913465
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:552.33KB
基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx
《基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx》由会员分享,可在线阅读,更多相关《基于Linux的实现进程的信号量互斥申请操作系统课程设计说明书3.docx(11页珍藏版)》请在冰豆网上搜索。
基于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("安全性算法检查预分配后系统处于不安全状态,不能进行分配! ");//以下代码为当系统被判定为不安全状态时 //返回提出申请前的状态
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Linux 实现 进程 信号量 申请 操作系统 课程设计 说明书