- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实习实验3.
实验三 P、V 原语的模拟实现
周骞 电子商务102班 2010012802
一、实验内容
本实验针对操作系统中信号量相关理论进行实验,要求实验者输入实验指导书提供的代码并进行测试。代码主要模拟信号量的 P 操作(down)和 V 操作(up)。
1)输入代码
2) 进行功能测试并得出正确结果。
截图:
Down操作
1.S1,s2,s3有等待队列的情况
2.没有等待队列的情况
3.S0信号量最大
4.进行up操作之前的信号量与pcb进程
Up操作
1.释放0号pcb进程的信号量;
释放10号进程的信号量
释放11号进程的信号量
释放12号进程的信号量
分析 dwon 和 up 函数功能模块;
文字分析:
void down(char * sname,int pid)
{
int fflag,pflag,i;
pnode *p,*p1;
semphore *s;
fflag=0;
pflag=0;
for(i=0;i5;i++)
if(!strcmp(sem[i].name,sname))//根据名字找到信号量
{
s=sem[i];//将找到的信号量存入s
fflag=1;//设置信号量标志位fflag为1,表示找到了信号量;
break;
}
for(i=0;i20;i++) //根据pid找到pcb进程
if(pr[i]-node-pid == pid)
{
p1 = pr[i];//存入p1
pflag=1;//设置进程标志位pflag为1,表示找到了pcb
break;
}
if(!fflag) //如果找不到资源信号量
{
printf(the semphore %s is not exist!\n,sname);//输出没有该信号量
return;
}
if(!pflag) //如果找不到pcb进程,
{
printf(the process %d is not exist!\n,pid);//输出没有该pcb进程
return;
}
s-count--; //被该pcb进程占用的资源信号量减1
if(s-count=0) //如果当前资源信号量没有被用完
s-curpid = p1-node-pid;//当前pcb进程就占用该资源量;
else
{
if(s-wlist) //如果等待链表不为空,就去找等待链表的尾部插入
//如果当前pcb进程所要占用的资源信号量没有了
//就将该进程pcb放到该进程链表的尾部去等待,
{
for(p=s-wlist;p-next;p=p-next);
p-next=p1;
}
else //如果等待链表为空,则该pcb进程将是第一个等待的pcb进程,直接插入
s-wlist=p1;
}
}
//up operation
void up(char *sname)//释放资源信号量
{
int fflag=0,i;
for( i=0;i5;i++)//根据输入的sname找到要释放的资源信号量
if(!strcmp(sem[i].name,sname))//如果找到
{
fflag=1;//将资源信号量标志置为1
break;
}
if(fflag) //
{
sem[i].count++;//该资源信号量加1表示释放
if(sem[i].wlist) //如果在等待链表中有请求该资源信号量的pcb进程
{
sem[i].curpid = sem[i].wlist-node-pid;//资源信号量被在等待链表中的第一个pcb进程所占用
sem[i].wlist = sem[i].wlist-next;//等待链表指向下一个等待的pcb进程
}
}
else
printf(the semphore %s is not exist!\n,sname);//如果找不到该资源信号量就输出
}
) 在实验报告中画出 dwon 和 up 函数流程图;
流程图分析:
Down()流程图
Up()流程图
实验思考:
读懂down和up操函数,并画出这两个函数的流程。(如上题)
2)如何修改 down 操作,使之能一次申请多个信号量?
修改如下:
假设可一次获取获取3个信号量
Down(s1,s2,s3,1)可以这样改
s1
文档评论(0)