- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统课程设计说明书
学
院、
系:
软件学院
专
业:
软件开发与测试
学
生
名:
学号:
设
计
题
目:
基于Linux的实现进程的信号量互斥申请
起
迄
日
期:
指
导
教
师:
2012年1月7日
1需求分析
基于Linux的进程同步与通信的模拟实现需耍完成以下功能:
(1) ?创建进程:手动创建儿个进程,或者随即创建儿个进程,都在界面上完成;要求 包插进程的名称(不能重复)、执行时间和屮请资源的等待时间等。在同一时刻可能有多个 进行在内存申请某资源,即可以输入多个进程的资源申请。
(2) .3类临界资源的管理,包括申请以及分配等。分别通过信号量实现或者管程实现。
(3) .银行家算法,判断是否可以进行资源的分配。
基于以上的功能,可以使用户选择操作,模拟临界资源的管理和银行家算法。
目的:实现临界资源的管理及死锁的避免。
2 总体设计
进程同步与模拟实现系统分为4个模块:输入输出,进程对资源的随机申请及分配, 临界资源管理,银行家算法避免死锁。
输入输出:包括系统运行所需要的进程的名称,执行时问,申请资源的等待时I可,进程对 资源的需要量等信息以及系统所要显示出的进程的创建信息,资源的分配信息,进行执行信 息,进行动态申请资源信息等。
进程对资源的随机申请及分配:根据所输入的进程、资源、以及进程对资源的最大申请情 况,随机产生进程当前对资源的申请,输出相应的分配信息与进程执行信息并调用银行家算 法对进程的资源申请进行判断。
临界资源的管理:创建相应个数的进程,完成进程的并发执行,使用互斥信号量使各进程 互斥的进入各自的临界区对资源进行申请,进程执行完毕后,互斥的对资源进行恢复。
银行家算法避免死锁:对当前进程对资源的申请利用银行家算法进行判断,看系统分配后 是否处于安全状态,若处于安全状态,则将资源分配给进程,并输出分配信息,否则对不予 以分配。
详细设计
在该系统中我主要实现了银行家算法中随机分配的模块,该模块中主耍使用了数组的 数据结构.
3.1随机分配算法:
3. 1. 1首先:定义了一个结构体y其中放置了 Max数组中申请资源量大于0的资源。(包 括进程下标,资源下标,进程是否对资源屮请过的信号量,该资源是否已经被屮请完
的信号量)。再定义一个数组col[]o用來存放第m个进程中过滤(去除申请资源量为
0)的资源数。
3. 1.2 (1)遍历Max数组对二维Y数组和一维col数组进行初始化:生成一个去除了
申请量为0的新的二维结构体数组(记录有进程下标和资源下标)。col中放置新的Y
数组对应的信息(每个进程中请资源数)。
\开始/
和可以进行遍历,筛选并记录各进程对所有资源的最大申请量大于0的元素信息3.2
数据结构
struct zy {
char type; //资源的名称
int n; //资源的数量
};
struct jc {
char name; //名称
int runtime; //执行时间
int wait time; 〃等待时间
int typenum; //进程所申请的资源数
struct zy r[5]; 〃所申请资源的信息
};
struct y {
int flag; //标志,0:未出现过的资源,(进程a申请资源B 1个资源B 1个)1: 该资源已申请
int index; 〃资源下标
int tr; //进程的下标
int flagl; //I:该资源不能再申请;0:该资源还可以申请
} Y[10][NUM];
struct jc JC[5];
struct zy ZY[NUM]; //每种资源的名称及数量
3. 3核心代码
//对整个二维数组Y进行遍历
int judge_pro(int m, int p[10]) {
int i, j;
for (i = 0; i m; i卄){
for (j = 0; j p[i]; j++) {
if (!(Y[i][j].flagl)) {
return 1;
} //只要有1个进程的1种资源未申请完,则返回1
return 0; //仅当所有进程对资源的申请都达到所需量时才返回0 }
//对二维数组中的某一行(对应某种进程)进行遍历
int panduanl(int tr, int p[10]) {
int i;
for (i = 0; i p[tr]; i++) {
if (!(Y[tr][i].flagl))
return 0; //该进程只要有1个资源未申请完,则返回0
return 1; //仅当该进程所有资源都申请完时返冋1
//产生随机进程和进程所申请的资源,并调用银行家算法
int ra() {
int col[10];
int i, j, k = 0, w = 0, m = 0, n二0, q =
文档评论(0)