基于Linux的进程同步与通信的模拟1.docx
《基于Linux的进程同步与通信的模拟1.docx》由会员分享,可在线阅读,更多相关《基于Linux的进程同步与通信的模拟1.docx(11页珍藏版)》请在冰点文库上搜索。
基于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中以毫秒为单位的。