2022年实验3--读者-写者问题与进程同步.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年实验3--读者-写者问题与进程同步.docx》由会员分享,可在线阅读,更多相关《2022年实验3--读者-写者问题与进程同步.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品学习资源试验 3读者/ 写者问题与进程同步3.1 试验目的懂得临界区和进程互斥的概念,把握用信号量和PV 操作实现进程互斥的方法;3.2 试验要求在 linux 环境下编写一个掌握台应用程序,该程序运行时能创建N 个线程或者进程 , 其中既有读者线程又有写者线程,它们根据事先设计好的测试数据进行读写操作;请用信号量和 PV 操作实现读者 /写者问题;读者 /写者问题的描述如下:有一个被很多进程共享的数据区,这个数据区可以是一个文件, 或者主存的一块空间 比方一个数组或一个变量 ,甚至可以是一组处理器寄存器;有一些只读取这个数据区的进程reader和一些只往数据区中写数据的进程writer
2、;以下假设共享数据区是文件;这些读者和写者对数据区的操作必需满意以下条件:读 读答应; 读 写互斥; 写 写互斥;这些条件详细来说就是:1任意多的读进程可以同时读这个文件;2一次只答应一个写进程往文件中写;3假如一个写进程正在往文件中写,禁止任何读进程或写进程拜访文件;4写进程执行写操作前,应让已有的写者或读者全部退出;这说明当有读者在读文件时不答应写者写文件;对于读者 -写者问题,有三种解决方法:1、读者优先除了上述四个规章外, 仍增加读者优先的规定, 当有读者在读文件时, 对随后到达的读者和写者, 要第一满意读者,堵塞写者;这说明只要有一个读者活跃,那么随后而来的读者都将被答应拜访文件,从
3、而导致写者长时间等待,甚至有可能显现写者被饿死的情形;2、写者优先除了上述四个规章外, 仍增加写者优先的规定, 即当有读者和写者同时等待时,第一满意写者;当一个写者声明想写文件时,不答应新的读者再拜访文件;3、无优先除了上述四个规章外,不再规定读写的优先权,谁先等待谁就先使用文件;试验步骤算法分析1、错误的解法图 3-1错误的解法semaphorer_w_w=1; readerPr_w_w ; 读文件; Vr_w_w ;writerPr_w_w ; 写文件; Vr_w_w ;有同学认为,可以将文件视为临界资源, 使用临界资源的代码就构成临界区,为了对临界区进行治理,只需设置一个互斥信号量r_w
4、_w ,读或者写之前执行 Pr_w_w ,之后执行 Vr_w_w 即可,从而得到图 3-1 所示的算法描述;该方法虽然能满意读 写互斥和写 写互斥, 但是不满意读 读答应, 只要有一个读者欢迎下载精品学习资源在读文件,其他的读者都被堵塞了;可见,单纯使用互斥信号量不能解决读者/写者问题,仍需要引入计数器对读者进行记数;2、读者优先如何订正上述解法中存在的错误呢?其实,对于相继到达的一批读者,并不是每个读者都需要执行Pr_w_w 和 Vr_w_w ;在这批读者中,只有最先到达的读者才需要执行Pr_w_w ,与写者竞争对文件的拜访权, 假设执行Pr_w_w 胜利就获得了文件的拜访权,其他的读者可直
5、接拜访文件;同理,只有最终退出临界区的读者需要执行Vr_w_w 来归仍文件拜访权;为了记录正在读文件的一批读者的数量,需要设置一个整型变量readercount,每一个读者到达时都要将 readercount 加 1,退出时都要将 readercount 减 1;由于只要有一个读者在读文件,便不答应写者写文件,所以,仅当readercount=0 时, 即尚无读者在读文件时,读者才需要执行Pr_w_w 操作;假设 Pr_w_w 操作胜利,读者便可去读文件,相应地, readercount+1;同理,仅当在执行了readercount 减 1 操作后其值为 0 时,才需要执行 Vr_w_w 操作
6、,以便让写者写文件;又由于readercount 是一个可被多个读者拜访的临界资源,所以应当为它设置一个互斥信号量readercount_mutex.;每个读者在拜访 readercount 之前执行 Preadercount_mutex ,之后执行 Vreadercount_mutex ;01 semaphore02 semaphore图 3-2r_w_w=1; readercount_mutex=1;读者优先算法通过上述分析得到图3-2 所示的算法描述,其中的数字表示语句对应的行号;03int readercount=0;04reader16writer05Preadercount_mut
7、ex;17Pr_w_w;06ifreadercount=0 Pr_w_w;18写文件 ;07readercount+;19Vr_w_w;08Vreadercount_mutex;2009读文件 ;10Preadercount_mutex;11readercount-;12ifreadercount=0 Vr_w_w;13Vreadercount_mutex;14153、写者优先通过增加信号量并修改上述程序可以得到写者优先算法;为了实现写者优先算法, 需要将写者和读者分开排队,并且第一个读者和其它读者也要分开排队;这样就需要三个队列,一个是写者排队的地方,另一个是第一个读者排队的地方,第三个是其
8、它读者排队的地方;相应地需要设置三个信号量,r_w_w 、first_reader_wait 和 reader_wait ;当一个写者声明想写文件时,可以让新的读者中的第一个到first_reader_wait上排队等待;当有读者堵塞在first_reader_wait 上时,让其它读者堵塞在reader_wait 上;当有一个写者在写文件时,其它写者到 r_w_w 上排队;只要有活跃的写者或者写者队列不为空,就堵塞新到达的读者;为了记录已经发出声明的写者数量,需要设置一个整数writercount ,以表示声明要写文件的写者数目;由于只要有一个写者到达,就不答应读者去读,因此仅当writer
9、count=0 ,表示无写者声明写时,写者才欢迎下载精品学习资源需要执行 Pfirst_reader_wait 操作,假设操作胜利,写者便可以执行Pr_w_w 去竞争写文件权益;其它写者不需要再向读者声明,可以直接执行Pr_w_w 去竞争写文件权益;同理仅当写者在执行writercount 减 1 操作后其值为 0 时,才需要执行 Vfirst_reader_wait 操作,以便唤醒第一个被堵塞的读者去读文件;又由于writercount是一个可被多个写者拜访的临界 资源,所以,应当为它设置一个互斥信号量writer_mutex ;4、无优先无优先的算法描述如图3-3 所示;01 semaph
10、ore02 semaphore03 semaphore图 3-3r_w_w=1; wait=1;readercount_mutex=1;无优先算法3.3.2程序功能及界面设计该程序采纳简洁的掌握台应用程序界面,在主界面上显示程序的功能;该程序的功能如下:1.2.3.4.演示读者优先算法;演示写者优先算法;演示无优先算法; 退出;3.3.3函数设计实现读者 / 写者问题的源程序名称是reader_and_writer.cpp ;该程序共包括 10 个函数; 这些函数可以分成 4 组;各组包含的函数及其功能如图3-4;组别一包括函数二main RF_reader_thread RF_writer_
11、thread reader_firstWF_reader_thread函数功能显示主菜单,接收用户的挑选并执行相应的功能;读者优先算法的读者线程函数读者优先算法的写者线程函数10 个线程并等待它们终止三读者优先算法的初始化函数:创建写者优先算法的读者线程函数除了在读者优先时需要的信号量r_w_w 和 readercount_mutex 之外,仍需要设置一个信号量 wait 供读者和写者排队;读者和写者都排在wait 队列上;假设有读者在读文件,就第一个写者堵塞在 r_w_w 上,其它的写者和读者堵塞在wait 上;假设有一个写者在写文件, 就其它写者和读者都堵塞在wait 上;04int re
12、adercount=0;05reader18writer06Pwait;19Pwait;07Preadercount_mutex;20Pr_w_w;08ifreadercount=0 Pr_w_w;21写文件 ;09readercount+;22Vr_w_w;10Vreadercount_mutex;23Vwait;11Vwait;2412读文件 ;13Preadercount_mutex;14readercount-;15ifreadercount=0 Vr_w_w;16Vreadercount_mutex;17欢迎下载精品学习资源WF_writer_thread writer_first
13、FIFO_reader_thread FIFO_writer_threadfirst_come_first_serverd写者优先算法的写者线程函数写者优先算法的初始化函数:创建无优先算法的读者线程函数无者优先算法的写者线程函数无者优先算法的初始化函数:创建10 个线程并等待它们终止四10 个线程并等待它们终止图 3-4函数功能简述程序开头部分定义了宏MAX_THREAD,表示程序中创建的线程数;仍定义了测试数据的结构体TEST_INFO ,该结构体包含三个数据项:线程名称;提出恳求的时刻;操作连续时间;接着定义了全局变量,这些全局变量的作用如下:数组 test_data 储存了 10 个线程
14、的测试数据;整数 read_count 记录一段时间内同时对文件进行读操作的线程数;整数 write_count 记录一段时间内提出写操作恳求的线程数,该整数只在写者优先算法中使用;CS_DATA 是临界区变量,用来爱护文件,实现对文件的读写互斥和写 写互斥相当于算法描述中的r_w_w ;互斥体 h_mutex_read_count 用来爱护整数 read_count,以保证多个读者对read_count 的互斥拜访;互斥体 h_mutex_write_count用来爱护整数 write_count ,以保证多个写者对write_count的互斥拜访,该互斥体只在写者优先算法中使用;互斥体 h
15、_mutex_first_reader_wait和 h_mutex_reader_wait 只在写者优先算法中使用,当有写者在写文件时,提出读恳求的第一个读者堵塞在h_mutex_first_reader_wait上,其余的读者堵塞在 h_mutex_reader_wait 上;互斥体 h_mutex_wait只在无优先算法中使用,当文件被使用时,后继的读恳求和写恳求依次堵塞在h_mutex_wait 上;3.3.4 参考源程序3.3.4.1 Linux 下的参考源程序1 编译命令gcc reader_and_writer .cpp o reader_and_writer.o lcurses
16、lpthread2 程序清单 #include #include #include #include #include #define MAX_THREAD 10typedef structchar thread_name3; unsigned int require_moment; unsigned int persist_time;TEST_INFO;TEST_INFO test_dataMAX_THREAD=r1,0,15,r2,1, 15,w1,3,3,欢迎下载精品学习资源r3,4, 2,w2,5,6,w3,6,10,r4,7,8,r5,9,2,w4,10,18,w5,12,2;int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 实验 读者 问题 进程 同步
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内