基于Linux的进程同步与通信的模拟1.docx

上传人:b****6 文档编号:15694924 上传时间:2023-07-06 格式:DOCX 页数:11 大小:379.09KB
下载 相关 举报
基于Linux的进程同步与通信的模拟1.docx_第1页
第1页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第2页
第2页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第3页
第3页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第4页
第4页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第5页
第5页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第6页
第6页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第7页
第7页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第8页
第8页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第9页
第9页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第10页
第10页 / 共11页
基于Linux的进程同步与通信的模拟1.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于Linux的进程同步与通信的模拟1.docx

《基于Linux的进程同步与通信的模拟1.docx》由会员分享,可在线阅读,更多相关《基于Linux的进程同步与通信的模拟1.docx(11页珍藏版)》请在冰点文库上搜索。

基于Linux的进程同步与通信的模拟1.docx

基于Linux的进程同步与通信的模拟1

中北大学

操作系统课程设计

说明书

 

学院、系:

软件学院

专业:

软件工程

学生姓名:

于雨桐

学号:

0921010209

设计题目:

基于Linux的进程同步与通信的模拟实现

起迄日期:

2011年12月22日-2012年1月7日

指导教师:

贾美丽

 

 2012年1月7日

1需求分析

该软件需要利用银行家算法判断系统是否处于安全状态,同时根据银行家算法得出的安全序列进行临界资源的分配。

软件设计的目的是要对输入的进程进行安全性判断模拟分配资源。

首先先创建进程:

手动创建几个进程,都在界面上完成;其中包括每个进程已分配的资源、最大需求资源、系统还剩资源以及进程执行时间。

假设创建5个进程。

其次采用银行家算法,判断是否可以进行资源的分配。

最后,按照银行家算法得出的安全序列,对临界资源进行分配。

2总体设计

软件由两个模块组成,分别是银行家算法判断安全序列模块以及临界资源分配模块。

2.1银行家算法模块

这个模块中有如下功能:

初始化allocation矩阵,初始化max矩阵,初始化available矩阵,初始化need矩阵,初始化finished矩阵,初始化进程执行时间,用银行家算法判断是否安全,计算缓冲区数目,输出缓冲区资源数目。

其中设置了多个线性单链表结构存储矩阵中的数据,已分配allocation矩阵、最大需求量max矩阵、可用资源数available矩阵、需要资源数need矩阵、path矩阵、finish矩阵、ti矩阵。

银行家算法:

设进程i提出请求Request[n],则银行家算法按如下规则进行判断。

(1)如果Request[n]>Need[i,n],则报错返回。

(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。

(3)假设进程i的申请已获批准,于是修改系统状态:

Available=Available-Request

Allocation=Allocation+Request

Need=Need-Request

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查

(1)设置两个工作向量Work=Available;Finish[M]=False

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

Finish[i]=False

Need<=Work

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+Allocation

Finish=True

GOTO2

(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

2.2临界资源分配模块

这个模块有如下功能:

创建线程、模拟为线程分配资源。

在原来的基础上设置了两个指针数组altemp、ntemp,分别存放每个进程的已分配资源和需要的资源量。

通过比较每类资源的需要资源量和系统可用的资源量之间大小关系,判断系统是否能给进程分配资源。

如果能分配,则利用sleep函数等待进程执行完毕,然后在释放进程利用的资源,执行完毕。

如果不能分配,则利用sleep函数等待一度啊时间,再进行循环判断,直到判断出资源量能够满足进程的要求。

运行时,首先先新建一个终端,然后用gcc命令编译和链接,运行程序,如下

图1(编译和链接文件)

创建三类资源,五个进程,并写出每个进程的已分配资源、最大需求量、系统现在可用的资源、进程执行时间。

如下。

图2(已分配资源)

图3(最大需求量)

图4(系统可用资源)

图5(进程执行时间)

输出系统所有资源量,用银行家算法判断是否安全,如果安全得出安全序列,分配资源如下。

图6(分配临界资源1)

图7(分配临界资源2)

程序流程图

图8(程序流程图)

3.详细设计

我负责的是临界资源分配,以下是我做的代码。

分配临界资源函数

voidProducer(intlp)

{intm=lp;

intj;

int*ntemp,*altemp;

needtemp=needhead;

alloctemp=allochead;

worktemp=avahead;

for(j=0;j

{needtemp=needtemp->next;

alloctemp=alloctemp->next;

}

ntemp=(int*)malloc(sizeof(int));

altemp=(int*)malloc(sizeof(int));

for(j=0;j

{ntemp[j]=needtemp->value;

altemp[j]=alloctemp->value;

needtemp=needtemp->next;

alloctemp=alloctemp->next;

}

while

(1)

{intflag=0;

intprocesstest=0;

alloctemp=allochead;

worktemp=avahead;

for(j=0;j

{if(ntemp[j]<=worktemp->value)

{worktemp=worktemp->next;

}

else

{

printf("processp%d's%ctypesourceisbiggerthanavaliable,pleasewaiting.....\n",m,worktemp->type);

flag=1;

sleep

(1);

break;

}

}

if(flag==1)

{continue;

}

else

{

worktemp=avahead;

for(j=0;j

{

worktemp->value=worktemp->value-ntemp[j];

worktemp=worktemp->next;

}

printf("p%dsuccess,time%drunning.....\n",m,tim[m]);

sleep(tim[m]);

worktemp=avahead;

for(j=0;j

{

worktemp->value=worktemp->value+ntemp[j]+altemp[j];

worktemp=worktemp->next;

}

return;

}

}

}

主函数

intmain()

{pthread_create(&p0,NULL,(void*)Producer,(void*)p);

p++;

pthread_create(&p1,NULL,(void*)Producer,(void*)p);

p++;

pthread_create(&p2,NULL,(void*)Producer,(void*)p);

p++;

pthread_create(&p3,NULL,(void*)Producer,(void*)p);

p++;

pthread_create(&p4,NULL,(void*)Producer,(void*)p);

sleep(30);

return0;

}

4.心得体会

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。

在编程的过程中,我们尝试着用if条件语句编写可变长的创建线程语句,可是不能成功,所以我们改用只能创建五个线程的语句编写,调用系统创建线程函数pthread_create。

利用sleep函数休眠30秒钟后结束。

在linux中sleep函数中的参数是以秒为单位的,而不是像在windows中以毫秒为单位的。

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

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2