- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验三
实验三 P、V原语的模拟实现
一、实验目的
1) 理解信号量相关理论;
2) 掌握记录型信号量结构;
3) 掌握 P、V 原语实现机制。
二、实验内容
本实验针对操作系统中信号量相关理论进行实验,要求实验者输入实验指导书提供的代码并进行测试。代码主要模拟信号量的 P 操作(down)和 V 操作(up)。
1) 信号量
信号量也称为信号锁,主要应用于进程间的同步和互斥,在用于互斥时,通常作为资源锁。信号量通常通过两个原子操作 dwon(P)和 up(V)来访问。dwon 操作使信号量的值+1,up 操作使信号量的值-1。
2) 记录型信号量
记录型信号量采用了“让权等待”的策略,存在多个进程等待访问同一临界资源的情况,所以记录型信号量需要一个等待链表来存放等待该信号量的进程控制块或进程号。在本实验中,使用记录型信号量。
三、实验要求
1) 输入给定代码;
2) 进行功能测试并得出正确结果。
3) 分析 dwon 和 up 函数功能模块;
4) 在实验报告中画出 dwon 和 up 函数流程图;
5) 撰写实验报告。
四、程序清单
#include basic.h
semphore sem[5]; //deinfe 5 semphores
pnode * pr[20]; //define 0-19 total 20 process
//down operation
void down(char * sname,int pid)
{
int fflag,pflag;
pnode *p,*p1;
semphore *s;
fflag=0;
pflag=0;
for(int i=0;i5;i++)
if(!strcmp(sem[i].name,sname))//find semaphore by name根据名字找到信号量
{
s=sem[i]; //将找到的信号量存入s
fflag=1; //设置信号量标志位fflag为1,表示找到了信号量
break;
}
for(i=0;i20;i++) //find pcb by pid根据pid找到pcb进程
if(pr[i]-node-pid == pid)
{
p1 = pr[i]; //存入p1
pflag=1; //设置进程标志位pflag为1,表示找到了pcb
break;
}
if(!fflag) //semaphore is not exist如果找不到资源信号量
{
printf(the semphore %s is not exist!\n,sname); //输出没有该信号量
return;
}
if(!pflag) //pid is not exist如果找不到pcb进程
{
printf(the process %d is not exist!\n,pid); //输出没有该pcb进程
return;
}
s-count--; //semaphore! s value -1被该pcb进程占用的资源信号量减1
if(s-count=0) //this pcb get the semaphore如果当前资源信号量没有被用完
s-curpid = p1-node-pid; //当前pcb进程就占用该信号量
else
{
if(s-wlist) //the link is not NULL, add the pcb to the last如果等待链表不为空,就去//找等待链表的尾部插入;若当前pcb进程所占用的信号量没有了,就将该进程放到该进程//链表的尾部去等待
{
for(p=s-wlist;p-next;p=p-next);
p-next=p1;
}
else //this pcb is the first pcb be added to the down list若等待链表为空,则该pcb进
//程是一个等待的pcb进程,直接插入
s-wlist=p1;
}
}
//up operation
void up(char *sname) //释放资源信号量
{
int fflag=0;
for(int i=0;i5;i++)
if(!strcmp(sem[i].name,sname)) //find the semaphore by name由名字找到要释放的资源信号量
{
fflag=1; //将资源
文档评论(0)