读者写者问题-操作系统实验报告

上传人:hs****ma 文档编号:477243886 上传时间:2024-03-05 格式:DOC 页数:14 大小:70KB
返回 下载 相关 举报
读者写者问题-操作系统实验报告_第1页
第1页 / 共14页
读者写者问题-操作系统实验报告_第2页
第2页 / 共14页
读者写者问题-操作系统实验报告_第3页
第3页 / 共14页
读者写者问题-操作系统实验报告_第4页
第4页 / 共14页
读者写者问题-操作系统实验报告_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《读者写者问题-操作系统实验报告》由会员分享,可在线阅读,更多相关《读者写者问题-操作系统实验报告(14页珍藏版)》请在金锄头文库上搜索。

1、实验内容 1、定义一个数据缓存buffer及用于实现同步互斥的信号量。 2、定义一个读者函数:l 当有写者在占用buffer时,读者应该等待,直到写者不再使用该buffer。l 当有其他读者在占用buffer时,读者可对buffer进行读取操作。l 当buffer中有数据时,则从其中读取一个数据,并显示然后退出。l 当buffer中没有数据时,应等待,直到buffer中有数据可读。 3、定义一个写者函数l 当有读者在占用buffer时,写者应该等待,直到所有的读者都退出为止。l 当有其他写者占用buffer时,该写者应该等待,直到占用buffer的写者退出为止。l 当buffer有空闲时,写者

2、应该在buffer中写入一个数据并退出。l 当buffer满时,写者应该等待,直到buffer有空闲为止。 4、定义主函数,在其中可以任意创建读者与写者。l 可根据用户输入创建读者或写者进程(线程)。 5、用户界面2. 写者:开始读出的内容:1. 读者:开始结束21读者队列等待结束写出的内容:Hello world !结束实验当堂所要完成事情列表:1. 调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列)2. 根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够

3、读出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读3. 根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式源代码:#include#includeint rcount=0;/正在读的读者数量int wcount=0;/写者队列中等待写操作的写者数量int read_id=0;/读进程号int write_id=0;/写进程号int w=1;/读写互斥信号量char temp300 = 0;int choice; /用户选择读者优先OR写者优先int sign; /标识temp空的信号量 0表示temp空void WFwakeup();void RF

4、wakeup();struct rqueue/读者等待队列int readers200;int index;rq;struct wqueue/写者等待队列int writers200;int index;wq;/*void first() /初始化int i;rq.index = 0;wq.index = 0;for(i = 0;i20;i+)rq.readersi = 0;wq.writersi = 0;*/*读进程读操作void read()int i = 0;read_id+;if(rcount = 0)/当前没有读进程在读 可能有写进程在写 可能CPU空闲if(w=1) /如果CPU空

5、闲,读者拿到CPUw-;/ 相当于一个P操作rcount+;if(temp0 = 0)sign = 0;if(choice = 1)rq.readersrq.index+=read_id;/将读者进程加入等待队列RFwakeup();return;elserq.readersrq.index+=read_id;/将读者进程加入等待队列WFwakeup();return;/ifprintf(读者%d正在读n,read_id);for(i = 0;i 300;i+)/读取temp内容 即写者写的内容if(tempi = 0)printf(n);return;/ifprintf(%c,tempi);

6、/for/ifelse/写者线程正在执行printf(!有写者在写不能读!n);rq.readersrq.index+=read_id;/将读者进程加入等待队列/else/ifelse/rcount !=1 则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读printf(读者%d正在读n,read_id);for(i = 0;i 300;i+) if(tempi = 0)printf(n);return;printf(%c,tempi);/for/else/*写进程写操作void write()write_id+;if(w = 0)if(rcount != 0 )/有读者进程在执

7、行printf(!有读者在读不能写!n);wq.writerswq.index+=write_id;/将写者进程加入等待队列wcount+;return;if(rcount = 0 )/rcount = 0则当前无读者,但w = 0,所以有写者在写printf(!有写者在写不能写!n);wq.writerswq.index+=write_id;/将写者进程加入等待队列wcount+;return;if(w = 1)w-;printf(写者%d正在写n请输入要写的内容,write_id); scanf(%s,temp);/while/if/*读者优先时唤醒进程void RFwakeup()int

8、 i = 0;int j = 0;int m,n;m = rq.index;/n = wq.index;if(rcount = 0)/当前无读进程,是写者在写 -停止运行写进程bool reader_wait=false; w=1;printf(写者已经写完n);sign = 1;/temp中已经有内容 要置1for(i=0;i=m;i+)/index为当前读者队列中的等待进程数if(rq.readersi!=0)reader_wait=true; /确实有读者在等待printf(等待的读者%d正在读n,rq.readersi);w = 0;for(j = 0;j 300;j+)if(temp

9、j = 0)printf(n);break;/ifprintf(%c,tempj);/forrq.readersi=0;rcount+;rq.index-;/if/forif(!reader_wait)/没有读者等待,看是否有写者等待for(int i=0;i=wq.index;i+)/检查写者等待队列if(wq.writersi!=0)w = 0;printf(等待的写者%d正在写n请输入要写入的内容,wq.writersi);scanf(%s,temp);wq.writersi=0;wcount-;break;/if/for/if/return;/ifelse/rcount != 0读者正

10、在读,stop读此时若有等待必为写者rcount=0;w = 1;if(sign = 0)printf(缓冲区空 等待写者n);return;elseprintf(读者已经读完n);for(int i=0;i=wq.index;i+)/检查写者等待队列if(wq.writersi!=0)w = 0;printf(等待的写者%d正在写n请输入要写入的内容,wq.writersi);scanf(%s,temp);wq.writersi=0;wcount-;break;/if/for/else/*写者优先唤醒void WFwakeup()int i = 0;int j = 0;int m,n;m =

11、 rq.index;/n = wq.index;if(rcount = 0)/当前无读进程,是写者在写 -停止运行写进程bool writer_wait=false; w=1;printf(写者已经写完n);sign = 1;/temp中已经有内容 要置1for(i=0;i=wq.index;i+)/index为当前写者队列中的等待进程数if(wq.writersi!=0)writer_wait=true; /确实有写者在等待printf(等待的写者%d正在写n 请输入要写的内容n,wq.writersi);w = 0;scanf(%s,temp);wq.writersi=0;wcount-;break;if(!writer_wait)/没有xie者等待,看是否有du者等待for(int i=0;i=m;i+)/检查写者等待队列if(rq.readersi!=0)w = 0;printf(等待的读者%d正在读n,rq.readersi);for(j = 0;j 300;j+)if(tempj =

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 总结/计划/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号