实验三P、V原语的模拟实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三 P、V原语的模拟实现一、实验实现与测试
创建的信号量显示。
将信号量s0分配给进程0,等待队列为空。
进程1申请信号量s0,s0被进程0占用,则进程1进入等待队列
进程号2也申请信号量s0,将进入等待队列。
将信号量s0释放后,进程号1将占用信号量s0。
当进程号3申请不存在的信号量s5时,显示信号量不存在的提示。
当一个不存在的进程号申请信号时,显示进程号不存在的提示。
三、主要函数功能说明:
down(char* sname, int pid)函数功能说明如下:
传入第一个参数为信号量名,第二个参数为申请该信号量的进程号,首先检查要申请的信号量是否存在,如果不存在,显示提示信息;如果存在,则再检查进程号是否存在,如果不存在,显示提示信息;如果存在,检查信号量是否被占用,如果被占用,则将进程号加入等待队列;如果没有被占用,则将该信号量分配给等待队列的下一个进程。
up(char* sname)函数:
将被占用信号量释放,如果该信号量存在等待队列,则将其继续分配给等待队列的下一个进程。
四、代码实现
void down(char * sname,int pid)
{
int fflag,pflag;
pnode *p,*p1;
semphore *s;
fflag=0;
pflag=0;
int i;
for(i=0; i<5; i++)
if(!strcmp(sem[i].name,sname))//find semaphore by name
{
s=&sem[i];
fflag=1;
break;
}
for(i=0; i<20; i++) //find pcb by pid
if(pr[i]->node->pid == pid)
{
p1 = pr[i];
pflag=1;
break;
}
if(!fflag) //semaphore is not exist
{
cout<<"The senphore "<<sname<<" is not exist!"<<endl;
return;
}
if(!pflag) //pid is not exist
{
cout<<"The process "<<pid<<" is not exist!"<<endl;
return;
}
s->count--; //semaphore! s value -1
if(s->count>=0) //this pcb get the semaphore
s->curpid = p1->node->pid;
else
{
if(s->wlist) //the link is not NULL, add the pcb to the last {
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 s->wlist=p1;
}
}
void up(char *sname)
{
int fflag=0;
int i;
for(i=0; i<5; i++)
if(!strcmp(sem[i].name,sname)) //find the semaphore by name {
fflag=1;
break;
}
if(fflag) //find it
{
sem[i].count++;
if(sem[i].wlist) //there are processes in the down list
{
sem[i].curpid = sem[i].wlist->node->pid;
sem[i].wlist = sem[i].wlist->next;
}
}
else
cout<<"The semphore "<<sname<<" is not exist!"<<endl;
}
void showdetail()
{
int i;
pnode *p;
cout<<endl;
for(i=0; i<5; i++)
{
if(sem[i].count<=0)
{
cout<<sem[i].name<<"(current_process"<<sem[i].curpid<<")";
p=sem[i].wlist;
cout<<" 等待进程队列:";
while(p)
{
cout<<p->node->pid<<" ";
p=p->next;
}
cout<<endl;
}
else
cout<<sem[i].name<<endl; }
}。