信号量读者写者问题

上传人:小** 文档编号:90969659 上传时间:2019-06-20 格式:DOC 页数:10 大小:578KB
返回 下载 相关 举报
信号量读者写者问题_第1页
第1页 / 共10页
信号量读者写者问题_第2页
第2页 / 共10页
信号量读者写者问题_第3页
第3页 / 共10页
信号量读者写者问题_第4页
第4页 / 共10页
信号量读者写者问题_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《信号量读者写者问题》由会员分享,可在线阅读,更多相关《信号量读者写者问题(10页珍藏版)》请在金锄头文库上搜索。

1、成绩:实 验 报 告课程名称:Unix下C实验项目:读者写者问题姓 名:专 业:网络工程班 级:网络学 号:指导老师:计算机科学与技术学院实验教学中心2013 年 12 月 22 目 录一 课程设计目的及意义1二 课程设计内容 1三 总体设计 1四 详细设计 2五 系统实现 3六 总结 5七 源代码 6一、 课程设计目的及意义l.用信号量来实现读者写者问题。2.理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。3.通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。二、 课程设计内容在windows或者linux环境下编写一个控制台应用程序,本

2、次课程设计在操作系统:Linux下,使用的编程语言为C语言。该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。用信号量和PV操作实现读者/写者问题。三、 总体设计读者/写者问题的描述如下:有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读读允许;读写互斥;写写互斥。这些条件具体来说就是:(1)任意多的读进程可以同时读这个文件;(

3、2)一次只允许一个写进程往文件中写;(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。四、 详细设计读者-写者的读写限制1)写-写互斥,即不能有两个写者同时进行写操作2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写3)读读允许,即可以有2个以上的读者同时读将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空

4、间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多的读进程可以同时读这个文件;(2)一次只允许一个写进程往文件中写;(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。程序由二部分组成:1 读者模块:包括系统调用接口,读者活动描述主程序。系统接口主要功能是读取内容并且使用共享锁2 写者模块:包括系统调用接口,写者活动描述主程序,写入内容并且使用互斥锁。读者-写者活动程序根据临界资源的共享,互斥原则编制。

5、初始化系统环境建立信号量启动信号量的PV原语读取或写入数据提示当前读取或写入情况五、 系统实现1. 多个进程同时读取2. 多个进程读取,写进程不能执行3. 一个写进程,其他进程不能写也不能读六、 总结这一次课程设计,让我体会很深刻。读者-写者问题经典的线程同步问题的一个模型。经过读者写者问题的编写,我对同步机构应用有了深入的了解。懂得了运用信号量实现进程间的互斥。实现了不让共享资源同时修改。用信号量上的原语操作使临界段问题的解决比较简单明了了。读者写者问题的编写,花的时间很多,也学到很多东西。了解支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。几天的试验,虽然难度

6、有点大,但只要自己花时间去学习,还是会攻克困难的。总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督。附录A:代码#include#include#include#include#includeint main() FILE *fp; int semid; int choose; char ch; struct sembuf sb4; unsigned short array=0,0; se

7、mid=semget(0x1234,2,0666|IPC_CREAT); semctl(semid,0,SETALL,array); sb0.sem_num=0; sb0.sem_op=1; sb1.sem_num=0; sb1.sem_op=-1; sb2.sem_num=1; sb2.sem_op=1; sb3.sem_num=1; sb3.sem_op=-1; void show() printf(当前的读者数为%dn,semctl(semid,0,GETVAL); printf(当前的写者数为%dn,semctl(semid,1,GETVAL); void reader() if(se

8、mctl(semid,1,GETVAL)=0) semop(semid,&sb0,1); printf(添加一个读者n); show(); sleep(50); semop(semid,&sb1,1); printf(减少一个读者n); else show(); printf(写者数不为0,不能读!n); void writer() if(semctl(semid,0,GETVAL)=0 & semctl(semid,1,GETVAL)=0) semop(semid,&sb2,1); printf(添加一个写者n); show(); if(fp=fopen(/root/writerfile.t

9、xt,w)=NULL) printf(cannot open file n); exit(0); printf(输入内容:); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); putchar(10); fclose(fp); sleep(1); semop(semid,&sb3,1); printf(写者写入结束n); else show(); printf(读者或写者数不为0,不能写!n); int flag=1; do printf(n*利用信号量机制解决读者写者问题*n); printf(*主菜单*n); printf( * 1.查看读者、写者人数n); printf( * 2.增加一位读者n); printf( * 3.增加一位写者(#结束)n); printf( * 4.退出程序n); printf(*n); printf(请输入相应数字:); scanf(%d,&choose); printf(*n); switch(choose) case 1:show();break; case 2:reade

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

当前位置:首页 > 商业/管理/HR > 管理学资料

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