资源描述:
《高响应比算法.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#include#definebuffersize5//5个缓冲区intprocessnum=0;//初始化产品数量structpcb//定义进程控制块PCB{intflag;intnumlabel;charproduct;charstate;structpcb*processlink;}*exe=NULL,*over=NULL;typedefstructpcbPCB;PCB*readyhead=NULL,*readytail=NULL;PCB*consu
2、merhead=NULL,*consumertail=NULL;PCB*producerhead=NULL,*producertail=NULL;intproductnum=0;//产品数量intfull=0,empty=buffersize;//信号量charbuffer[buffersize];//缓冲区intbufferpoint=0;//缓冲区指针voidlinklist(PCB*p,PCB*listhead){//创建就绪队列PCB*cursor=listhead;while(cursor->pro
3、cesslink!=NULL){cursor=cursor->processlink;}cursor->processlink=p;}voidfreelink(PCB*linkhead){PCB*p;while(linkhead!=NULL){p=linkhead;linkhead=linkhead->processlink;free(p);}}voidlinkqueue(PCB*process,PCB**tail)//初始化队列{if((*tail)!=NULL){(*tail)->processlink=
4、process;(*tail)=process;}else{printf("队列序列化!");}}PCB*getq(PCB*head,PCB**tail){PCB*p;p=head->processlink;if(p!=NULL){head->processlink=p->processlink;p->processlink=NULL;if(head->processlink==NULL)(*tail)=head;}elsereturnNULL;returnp;}boolprocessproc()//初始化进
5、程{inti,f,num;charch;PCB*p=NULL;PCB**p1=NULL;printf("请输入希望产生的进程个数:");scanf("%d",&num);getchar();for(i=0;ifla
6、g=f;processnum++;p->numlabel=processnum;p->state='w';p->processlink=NULL;if(p->flag==1){printf("您要产生的进程是生产者,它是第%d个进程。请您输入您要该进程产生的字符:",processnum);scanf("%c",&ch);getchar();p->product=ch;productnum++;printf("您要该进程产生的字符是%c",p->product);}else{printf("您要生产的
7、进程是消费者,它是第%d个进程。",p->numlabel);}linkqueue(p,&readytail);}returntrue;}boolhasElement(PCB*pro)//判断队列中是否有进程存在{if(pro->processlink==NULL)returnfalse;elsereturntrue;}boolwaitempty()//判断生产者等待队列是否为空{if(empty<=0){printf("进程%d:缓存区存数,缓存区满,该进程进入生产者等待序列",exe->numla
8、bel);linkqueue(exe,&producertail);returnfalse;}else{empty--;returntrue;}}voidsignalempty()//唤醒生产者进程{PCB*p;if(hasElement(producerhead)){p=getq(producerhead,&producertail);linkqueue(p,&readytail);printf(