您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 读者写者问题-操作系统实验报告
实验内容1、定义一个数据缓存buffer及用于实现同步互斥的信号量。2、定义一个读者函数:当有写者在占用buffer时,读者应该等待,直到写者不再使用该buffer。当有其他读者在占用buffer时,读者可对buffer进行读取操作。当buffer中有数据时,则从其中读取一个数据,并显示然后退出。当buffer中没有数据时,应等待,直到buffer中有数据可读。3、定义一个写者函数当有读者在占用buffer时,写者应该等待,直到所有的读者都退出为止。当有其他写者占用buffer时,该写者应该等待,直到占用buffer的写者退出为止。当buffer有空闲时,写者应该在buffer中写入一个数据并退出。当buffer满时,写者应该等待,直到buffer有空闲为止。4、定义主函数,在其中可以任意创建读者与写者。可根据用户输入创建读者或写者进程(线程)。5、用户界面2.写者:开始读出的内容:1.读者:开始结束21读者队列等待结束写出的内容:Helloworld!结束实验当堂所要完成事情列表:1.调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列)2.根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够读出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读3.根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式源代码:#includestdio.h#includestdlib.hintrcount=0;//正在读的读者数量intwcount=0;//写者队列中等待写操作的写者数量intread_id=0;//读进程号intwrite_id=0;//写进程号intw=1;//读写互斥信号量chartemp[300]={'\0'};intchoice;//用户选择读者优先OR写者优先intsign;//标识temp空的信号量0表示temp空voidWFwakeup();voidRFwakeup();structrqueue{//读者等待队列intreaders[200];intindex;}rq;structwqueue{//写者等待队列intwriters[200];intindex;}wq;/*voidfirst(){//初始化inti;rq.index=0;wq.index=0;for(i=0;i20;i++){rq.readers[i]=0;wq.writers[i]=0;}}*///*******************************************读进程读操作voidread(){inti=0;read_id++;if(rcount==0){//当前没有读进程在读可能有写进程在写可能CPU空闲if(w==1){//如果CPU空闲,读者拿到CPUw--;//相当于一个P操作rcount++;if(temp[0]=='\0'){sign=0;if(choice==1){rq.readers[rq.index++]=read_id;//将读者进程加入等待队列RFwakeup();return;}else{rq.readers[rq.index++]=read_id;//将读者进程加入等待队列WFwakeup();return;}}//ifprintf(读者%d正在读\n,read_id);for(i=0;i300;i++){//读取temp内容即写者写的内容if(temp[i]=='\0'){printf(\n);return;}//ifprintf(%c,temp[i]);}//for}//ifelse{//写者线程正在执行printf(!有写者在写不能读!\n);rq.readers[rq.index++]=read_id;//将读者进程加入等待队列}//else}//ifelse{//rcount!=1则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读printf(读者%d正在读\n,read_id);for(i=0;i300;i++){if(temp[i]=='\0'){printf(\n);return;}printf(%c,temp[i]);}//for}//else}//***************************写进程写操作voidwrite(){write_id++;if(w==0){if(rcount!=0){//有读者进程在执行printf(!有读者在读不能写!\n);wq.writers[wq.index++]=write_id;//将写者进程加入等待队列wcount++;return;}if(rcount==0){//rcount==0则当前无读者,但w=0,所以有写者在写printf(!有写者在写不能写!\n);wq.writers[wq.index++]=write_id;//将写者进程加入等待队列wcount++;return;}}if(w==1){w--;printf(写者%d正在写\n请输入要写的内容,write_id);scanf(%s,temp);//while}//if}//************************读者优先时唤醒进程voidRFwakeup(){inti=0;intj=0;intm,n;m=rq.index;//n=wq.index;if(rcount==0){//当前无读进程,是写者在写--》停止运行写进程boolreader_wait=false;w=1;printf(写者已经写完\n);sign=1;//temp中已经有内容要置1for(i=0;i=m;i++){//index为当前读者队列中的等待进程数if(rq.readers[i]!=0){reader_wait=true;//确实有读者在等待printf(等待的读者%d正在读\n,rq.readers[i]);w=0;for(j=0;j300;j++){if(temp[j]=='\0'){printf(\n);break;}//ifprintf(%c,temp[j]);}//forrq.readers[i]=0;rcount++;rq.index--;}//if}//forif(!reader_wait){//没有读者等待,看是否有写者等待for(inti=0;i=wq.index;i++){//检查写者等待队列if(wq.writers[i]!=0){w=0;printf(等待的写者%d正在写\n请输入要写入的内容,wq.writers[i]);scanf(%s,temp);wq.writers[i]=0;wcount--;break;}//if}//for}//if//return;}//ifelse{//rcount!=0读者正在读,stop读此时若有等待必为写者rcount=0;w=1;if(sign==0){printf(缓冲区空等待写者\n);return;}else{printf(读者已经读完\n);for(inti=0;i=wq.index;i++){//检查写者等待队列if(wq.writers[i]!=0){w=0;printf(等待的写者%d正在写\n请输入要写入的内容,wq.writers[i]);scanf(%s,temp);wq.writers[i]=0;wcount--;break;}//if}//for}}//else}//******************************************写者优先唤醒voidWFwakeup(){inti=0;intj=0;intm,n;m=rq.index;//n=wq.index;if(rcount==0){//当前无读进程,是写者在写--》停止运行写进程boolwriter_wait=false;w=1;printf(写者已经写完\n);sign=1;//temp中已经有内容要置1for(i=0;i=wq.index;i++){//index为当前写者队列中的等待进程数if(wq.writers[i]!=0){writer_wait=true;//确实有写者在等待printf(等待的写者%d正在写\n请输入要写的内容\n,wq.writers[i]);w=0;scanf(%s,temp);wq.writers[i]=0;wcount--;break;}}if(!writer_wait){//没有xie者等待,看是否有du者等待for(inti=0;i=m;i++){//检查写者等待队列if(rq.readers[i]!=0){w=0;printf(等待的读者%d正在读\n,rq.readers[i]);for(j=0;j300;j++){if(temp[j]=='\0'){printf(\n);rq.index--;break;}//ifprintf(%c,temp[j]);}//forrq.readers[i]=0;rcount++;}//if}//for}//if//return;}//ifelse{//rcount!=0读者正在读,stop读此时若有等待必为写者rcount=0;w=1;printf(读者已经读完\n);for(inti=0;i=wq.index;i++){//检查写者等待队列if(wq.writers[i]!=0){w=0;printf(等待的写者%d正在写\n请输入要写入的内容,wq.writers[i]);scanf(%s,temp);wq.writers[i]=0;wcount--;break;}//if}//for}}voidmenu1(){chari;printf(1-创建读者进程\n2-创建写者进程\n3-结束当前执行的进程\n4-退出程序\n);printf(*******************************************\n);do{printf(当前队列中有读者:%d个写者:%d个\n,rq.index,wcount);printf(*******************************************\n);printf(-----);scanf(%s,&i);switch(i){case'1':read();break;case'2':write();break;case'3':RFwakeup();break;case'4':exit(0);default:printf(输入错误请重新输入\n);}}while(true);}voidmenu2(){chari;printf(1-创建读者进程\n2-创建写者进程\n3-结束当前执行的进程\n4-退出程序\n);printf(*******************************************\n);do{printf(当前队列中有读者:%d个写者:%d个\n,rq.index,wcount);printf(*******************************************\n);printf(-----);scanf(%s,&i);switch(i){case'1':read();break;case'2':write();break;case'3':WFwakeup();break;case'4':exit(0);default:printf(输入错误请重新输入\n);}}while(true);}voidmain(){printf(**************************************************************************\n);printf(20092104实验一\n1.读者优先\n2.写者优先\n);sc
本文标题:读者写者问题-操作系统实验报告
链接地址:https://www.777doc.com/doc-5713260 .html