实验1-进程同步_第1页
实验1-进程同步_第2页
实验1-进程同步_第3页
实验1-进程同步_第4页
实验1-进程同步_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验1进程同步一、实验要求模拟生产者与消费者问题分析代码,给出注释给出实验结果二、实验内容

数据结构:

每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程系统号、进程状态(本程序未用)、进程产品(字符)、进程链指针等等。

系统开辟了一个缓冲区,大小由buffersize指定。

程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程

本程序通过函数模拟信号量的原子操作。

算法的文字描述:

①由用户指定要产生的进程及其类别,存入进入就绪队列。

②调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源不存在则进入响应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为空。

③程序询问是否要继续?如果要转直①开始执行,否则退出程序。源程序代码部分:#include<stdio.h>#include<malloc.h>

//Canonlybeusedinindependentsituation;

//#definegetmem(type)(type*)malloc(sizeof(type))#definebuffersize5

intprocessnum=0;//thenumofprocessesstructpcb{/*定义进程控制块PCB*/

intflag;//flag=1denoteproducer;flag=2denoteconsumer;

intnumlabel;

charproduct;

charstate;

structpcb*processlink;

}*exe=NULL,*over=NULL;

typedefstructpcbPCB;PCB*readyhead=NULL,*readytail=NULL;

PCB*consumerhead=NULL,*consumertail=NULL;

PCB*producerhead=NULL,*producertail=NULL;//产品数量

intproductnum=0;

intfull=0,empty=buffersize;//semaphore

charbuffer[buffersize];//缓冲区

intbufferpoint=0;//缓冲区指针voidlinkqueue(PCB*process,PCB**tail);

PCB*getq(PCB*head,PCB**tail);

boolhasElement(PCB*pro);

voiddisplay(PCB*p);

voidlinklist(PCB*p,PCB*listhead);

voidfreelink(PCB*linkhead);

boolprocessproc();

boolwaitempty();

boolwaitfull();

voidsignalempty();

voidsignalfull();

voidproducerrun();

voidcomsuerrun();

boolhasElement(PCB*pro);voidlinklist(PCB*p,PCB*listhead)

{

PCB*cursor=listhead;

while(cursor->processlink!=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=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;

}

else

returnNULL;

returnp;

}boolprocessproc()

{

inti,f,num;

charch;

PCB*p=NULL;

PCB**p1=NULL;

printf("\n请输入希望产生的进程个数?");

scanf("%d",&num);

getchar();

//

if(num>=100){

//

printf("您怎么要产生这么多进程!DemandsDenied!");

//

returnfalse;

//

}

for(i=0;i<NUM;I++){

printf("\n请输入您要产生的进程:输入1为生产者进程;输入2为消费者进程\n");

scanf("%d",&f);

getchar();

p=(PCB*)malloc(sizeof(PCB));

if(!p){

printf("内存分配失败");

returnfalse;

}

p->flag=f;

processnum++;

p->numlabel=processnum;

p->state='w';

p->processlink=NULL;

if(p->flag==1){

printf("您要产生的进程是生产者,它是第%d个进程。请您输入您要该进程产生的字符!\n",processnum);

scanf("%c",&ch);

getchar();

p->product=ch;

productnum++;

printf("您要该进程产生的字符是%c\n",p->product);

}

else{

printf("您要产生的进程是消费者,它是第%d个进程。\n",p->numlabel);

}

linkqueue(p,&readytail);

}

returntrue;

}boolwaitempty()

{

if(empty<=0)

{

printf("进程%d:缓冲区存数,缓冲区满,该进程进入生产者等待队列\n",exe->numlabel);

linkqueue(exe,&producertail);

returnfalse;

}

else{

empty--;

returntrue;

}

}voidsignalempty()

{

PCB*p;

if(hasElement(producerhead)){

p=getq(producerhead,&producertail);

linkqueue(p,&readytail);

printf("等待中的生产者进程进入就绪队列,它的进程号是%d\n",p->numlabel);

}

empty++;

}

boolwaitfull()

{

if(full<=0)

{

printf("进程%d:缓冲区取数,缓冲区空,该进程进入消费者等待队列\n",exe->numlabel);

linkqueue(exe,&consumertail);

returnfalse;

}

else{

full--;

returntrue;}

}voidsignalfull()

{

PCB*p;

if(hasElement(consumerhead)){

p=getq(consumerhead,&consumertail);

linkqueue(p,&readytail);

printf("等待中的消费者进程进入就绪队列,它的进程号是%d\n",p->numlabel);

}

full++;

}voidproducerrun()

{

if(!waitempty())

return;

printf("进程%d开始向缓冲区存数%c\n",exe->numlabel,exe->product);

buffer[bufferpoint]=exe->product;

bufferpoint++;

printf("进程%d向缓冲区存数操作结束\n",exe->numlabel);

signalfull();

linklist(exe,over);

}voidcomsuerrun()

{

if(!waitfull())

return;

printf("进程%d开始向缓冲区取数\n",exe->numlabel);

exe->product=buffer[bufferpoint-1];

bufferpoint--;

printf("进程%d向缓冲区取数操作结束,取数是%c\n",exe->numlabel,exe->product);

signalempty();

linklist(exe,over);

}voiddisplay(PCB*p)

{

p=p->processlink;

while(p!=NULL){

printf("进程%d,它是一个",p->numlabel);

p->flag==1?printf("生产者\n"):printf("消费者\n");

p=p->processlink;

}

}boolhasElement(PCB*pro)

{

if(pro->processlink==NULL)

returnfalse;

else

returntrue;

}voidmain()

{

charterminate;

boolelement;

printf("你想开始程序吗?(y/n)");

scanf("%c",&terminate);

getchar();

//Queueinitialize;

readyhead=(PCB*)malloc(sizeof(PCB));

if(readyhead==NULL)return;

readytail=readyhead;

readyhead->flag=3;

readyhead->numlabel=processnum;

readyhead->state='w';

readyhead->processlink=NULL;

consumerhead=(PCB*)malloc(sizeof(PCB));

if(consumerhead==NULL)return;

consumertail=consumerhead;

consumerhead->processlink=NULL;

consumerhead->flag=4;

consumerhead->numlabel=processnum;

consumerhead->state='w';

consumerhead->processlink=NULL;

producerhead=(PCB*)malloc(sizeof(PCB));

if(producerhead==NULL)return;

producertail=producerhead;

producerhead->processlink=NULL;

producerhead->flag=5;

producerhead->numlabel=processnum;

producerhead->state='w';

producerhead->processlink=NULL;

over=(PCB*)malloc(sizeof(PCB));

if(over==NULL)return;

over->processlink=NULL;

while(terminate=='y')

{

if(!processproc())

break;

element=hasElement(readyhead);

while(element){

exe=getq(readyhead,&readytail);

printf("进程%d申请运行,它是一个",exe->numlabel);

exe->flag==1?printf("生产者\n"):printf("消费者\n");

if(exe->flag==1)

producerrun();

else

comsuerrun();

element=hasElement(readyhead);

}

printf("就绪队列没有进程\n");

if(hasElement(consumerhead))

{

p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论