实验三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)撰写实验报告。四、程序清单#[5];//deinfe5semphorespnode*pr[20];//define0-19total20process//downoperationvoiddown(char*sname,intpid){intfflag,pflag;pnode*p,*p1;semphore*s;fflag=0;pflag=0;for(inti=0;i<5;i++)if(!strcmp(sem[i].name,sname))//findsemaphorebyname根据名字找到信号量{s=&sem[i];//将找到的信号量存入sfflag=1;//设置信号量标志位fflag为1,表示找到了信号量break;}for(i=0;i<20;i++)//findpcbbypid根据pid找到pcb进程if(pr[i]->node->pid==pid){p1=pr[i];//存入p1pflag=1;//设置进程标志位pflag为1,表示找到了pcbbreak;}if(!fflag)//semaphoreisnotexist如果找不到资源信号量{printf( hesemphore'%s'isnotexist!\n,sname);//输出没有该信号量return;}if(!pflag)//pidisnotexist如果找不到pcb进程{printf( heprocess'%d'isnotexist!\n,pid);//输出没有该pcb进程return;}s->count--;//semaphore!svalue-1被该pcb进程占用的资源信号量减1if(s->count>=0)//thispcbgetthesemaphore如果当前资源信号量没有被用完s->curpid=p1->node->pid;//当前pcb进程就占用该信号量else{if(s->wlist)//thelinkisnotNULL,addthepcbtothelast如果等待链表不为空,就去//找等待链表的尾部插入;若当前pcb进程所占用的信号量没有了,就将该进程放到该进程//链表的尾部去等待{for(p=s->wlist;p->next;p=p->next);p->next=p1;}else//thispcbisthefirstpcbbeaddedtothedownlist若等待链表为空,则该pcb进//程是一个等待的pcb进程,直接插入s->wlist=p1;}}//upoperationvoidup(char*sname)//释放资源信号量{intfflag=0;for(inti=0;i<5;i++)if(!strcmp(sem[i].name,sname))//findthesemaphorebyname由名字找到要释放的资源信号量{fflag=1;//将资源信号量标志设为1break;}if(fflag)//findit如果找到{sem[i].count++;//该资源信号量加1表示释放if(sem[i].wlist)//thereareprocessesinthedownlist若等待链表中有请求该资源信号//量的pcb进程{sem[i].curpid=sem[i].wlist->node->pid;//信号量被在等待链表中的第一个pcb//进程占用sem[i].wlist=sem[i].wlist->next;//等待链表指向下一个等待的pcb进程}}elseprintf( hesemphore'%s'isnotexist!\n,sname);//若找不到该信号量就输出}//showsemphoreinfomationvoidshowdetail(){inti;pnode*p;print
操作系统实验三 来自淘豆网m.daumloan.com转载请标明出处.