




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计报告 目录目录第1章 实验目的和实验要求11.1 实验目的11.2 实验要求11.3 课程设计题目1第2章 实验内容22.1题目分析22.1.1 问题的描述22.1.2 问题的解决方法22.2 算法分析32.2.1 读者优先算法分析32.2.2 写者优先算法分析82.2.3 无优先算法分析112.3 函数设计13第3章 程序实现153.1 程序功能及界面设计153.2 实现程序流程153.2.1 读者优先算法实现153.2.2 写者优先算法实现163.2.3 无优先算法实现173.3 程序流程图183.3.1 读者优先算法流程图183.3.2 写者优先算法流程图183.3.3 无优先算法流程图19心得体会21参考文献22附录1 源代码23第1章 实验目的和实验要求第1章 实验目的和实验要求1.1 实验目的理解临界区和进程互斥的概念,掌握用信号量和PV操作实现进程互斥的方法。1.2 实验要求在windows或者linux环境下编写一个控制台应用程序,该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。请用信号量和PV操作实现读者/写者问题。1.3 课程设计题目本课程设计共包括3个题目,内容覆盖了操作系统原理的关键知识点,包括进程调度、内存管理、进程同步、死锁、进程通讯、文件系统及嵌入式操作系统。题目1:进程调度算法。模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点题目2:动态异长分区的存储分配与回收算法。编写一个程序,模拟操作系统对动态异长分区的存储分配与回收算法。题目3:读者/写者问题与进程同步。理解临界区和进程互斥的概念,掌握用信号量和PV操作实现进程互斥的方法。要求学生用信号量和PV操作实现读者/写者问题的读者优先算法、写者优先算法和无优先算法。我们小组选择题目3,即读者/写者问题与进程同步。以下是该题目的实验报告。28第2章 实验内容第2章 实验内容2.1题目分析2.1.1 问题的描述有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程(reader)和一些只往数据区中写数据的进程(writer)。以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读读允许;读写互斥;写写互斥。这些条件具体来说就是:(1)任意多的读进程可以同时读这个文件;(2)一次只允许一个写进程往文件中写;(3)如果一个写进程正在往文件中写,禁止任何读进程或写进程访问文件;(4)写进程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。2.1.2 问题的解决方法(1)读者优先除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对随后到达的读者和写者,要首先满足读者,阻塞写者。这说明只要有一个读者活跃,那么随后而来的读者都将被允许访问文件,从而导致写者长时间等待,甚至有可能出现写者被饿死的情况。(2)写者优先除了上述四个规则外,还增加写者优先的规定,即当有读者和写者同时等待时,首先满足写者。当一个写者声明想写文件时,不允许新的读者再访问文件。(3)无优先除了上述四个规则外,不再规定读写的优先权,谁先等待谁就先使用文件。2.2 算法分析2.2.1 读者优先算法分析对于相继到达的一批读者,并不是每个读者都需要执行P(r_w_w)和V(r_w_w)。在这批读者中,只有最先到达的读者才需要执行P(r_w_w),与写者竞争对文件的访问权,若执行P(r_w_w)成功则获得了文件的访问权,其他的读者可直接访问文件;同理,只有最后退出临界区的读者需要执行V(r_w_w)来归还文件访问权。为了记录正在读文件的一批读者的数量,需要设置一个整型变量read_count,每一个读者到达时都要将read_count加1,退出时都要将read_count减1。由于只要有一个读者在读文件,便不允许写者写文件,所以,仅当read_count=0时,即尚无读者在读文件时,读者才需要执行P(r_w_w)操作。若P(r_w_w)操作成功,读者便可去读文件,相应地,read_count+1。同理,仅当在执行了read_count减1操作后其值为0时,才需要执行V(r_w_w)操作,以便让写者写文件。又因为read_count是一个可被多个读者访问的临界资源,所以应该为它设置一个互斥信号量h_mutex_read_count。每个读者在访问read_count之前执行P(h_mutex_read_count),之后执行V(h_mutex_read_count)。通过上述分析得到图2-1所示的算法描述,其中的数字表示语句对应的行号。01 semaphore r_w_w=1;02 semaphore h_mutex_read_count=1;03 int read_count=0; 04 reader()05 P(h_mutex_read_count);06 if(read_count=0) P(r_w_w);07 read_count+;08 V(h_mutex_read_count);09 读文件;10 P(h_mutex_read_count);11 read_count-;12 if(read_count=0) V(r_w_w);13 V(h_mutex_read_count);14 1516 writer()17 P(r_w_w);18 写文件;19 V(r_w_w);20 图2-1 读者优先算法下面对该算法的调度效果进行分析。假设最初没有进程在访问文件。过了一会,就会有很多读者和写者到达。对它们可能有两种调度情形。l 情形1 最先调度写者写者执行P(r_w_w)操作成功,将r_w_w的值变为0,获得文件的访问权;其它的写者执行P(r_w_w)将r_w_w的值变为负数,从而阻塞在信号量r_w_w上;第一个读者执行P(h_mutex_read_count)成功,将信号量h_mutex_read_count的值变为0,然后判断read_count是0,所以执行P(r_w_w),将r_w_w的值减1后仍然为负数从而阻塞在信号量r_w_w上,其它的读者执行P(h_mutex_read_count)将信号量h_mutex_read_count的值变为负数,从而阻塞在信号量h_mutex_read_count上。例如,对于请求序列w1,w2,r1,w3,r2,r3,我们用图表形象地刻画进程的活动,图表中包括读者计数器的值、信号量h_mutex_read_count和r_w_w的值和队列以及访问文件的进程。初始状态。没有进程使用文件,计数器read_count的值是0,信号量h_mutex_read_count和r_w_w的值都是1,队列都是空,参见图2-2;w1请求写文件,所以执行语句17,将信号量r_w_w的值减1后变成0,w1获得文件使用权,执行语句18,开始写文件,参见图2-3;在w1尚未写完时,w2提出写请求,所以执行语句17,将信号量r_w_w的值减1后变成负1,w2被阻塞在信号量r_w_w上,参见图2-4;同时r1提出读请求,所以执行语句5,将信号量h_mutex_read_count的值减1后变成0,接着执行语句6,判断read_count的值是0,所以执行P(r_w_w),将信号量r_w_w的值减1后变成-2,r1被阻塞在信号量r_w_w上,参见图2-5;初始状态read_count=0h_mutex_read_count1NULLr_w_w1NULL访问文件者:无图2-2w1请求read_count=0h_mutex_read_count1NULLr_w_w0NULL访问文件者:w1图2-3同时w3提出写请求,所以执行语句17,将信号量r_w_w的值减1后变成-3,w3被阻塞在信号量r_w_w上,参见图2-6;同时r2提出读请求,所以执行语句5,将信号量h_mutex_read_count的值减1后变成-1,r2被阻塞在信号量h_mutex_read_count上,参见图2-7;w2请求read_count=0h_mutex_read_count1NULLr_w_w-1 w2访问文件者:w1图2-4r1请求read_count=0h_mutex_read_count0NULLr_w_w-2 w2,r1访问文件者:w1图2-5同时r3提出读请求,所以执行语句5,将信号量h_mutex_read_count的值减1后变成-2,r3被阻塞在信号量h_mutex_read_count上,参见图2-8;w1写完文件,执行语句19,将信号量r_w_w的值加1后变成-2,并唤醒w2,w2接着执行语句18,开始写文件,参见图2-9;w2写完文件,执行语句19,将信号量r_w_w的值加1后变成-1,并唤醒r1,r1接着执行语句7,将read_count的值加1后变成1,执行语句8,将信号量h_mutex_read_count的值加1后变成-1,并唤醒r2,r1执行语句9,开始读r2请求read_count=0h_mutex_read_count-1 r2r_w_w-3 w2,r1,w3访问文件者:w1图2-7w3请求read_count=0h_mutex_read_count0NULLr_w_w-3 w2,r1,w3访问文件者:w1图2-6文件;被唤醒的r2执行语句6,判断read_count的值不是0,所以执行语句7,将read_count的值加1后变成2,执行语句8,将信号量h_mutex_read_count的值加1后变成0,并唤醒r3,r2执行语句9,开始读文件;被唤醒的r3执行语句6,判断read_count的值不是0,所以执行语句7,将read_count的值加1后变成3,执行语句8,将信号量h_mutex_read_count的值加1后变成1,r3执行语句9,开始读文件。这样三个读者同时读文件,参见图2-10;当r1、r2和r3读完文件时,都执行语句1014,并由最后一个执行语句1014的读者执行V(r_w_w),将信号量r_w_w的值加1后变成0,并唤醒w3,w3接着执行语句18,开始写文件,参见图2-11;当w3写完文件时,执行语句19,将信号量r_w_w的值加1后变成1,回到初始状态。可见,对于请求序列w1,w2,r1,w3,r2,r3,实际访问文件的顺序是w1,w2,r1,r2,r3,w3。虽然w3比r2、r3先提出请求,但是由于在此之前已经有r1在读文件,所以优先响应读者r2、r3,阻塞写者w3。如果在w3之后不断有新的读者到达,则w3将一直被阻塞,直至被饿死。r3请求read_count=0h_mutex_read_count-2 r2,r3r_w_w-3 w2,r1,w3访问文件者:w1图2-8w1结束,唤醒w2read_count=0h_mutex_read_count-2 r2,r3r_w_w-2 r1,w3访问文件者:w2图2-9r1,r2,r3结束,唤醒w3read_count=0h_mutex_read_count1NULL r_w_w0NULL 访问文件者: w3图2-11w2结束,唤醒r1,r1唤醒r2,r2唤醒r3read_count=3h_mutex_read_count1NULL r_w_w-1 w3访问文件者:r1,r2,r3图2-10l 情形2 最先调度读者第一个读者执行P(h_mutex_read_count)成功,将信号量h_mutex_read_count的值变为0,接着该读者判断read_count是0,所以执行P(r_w_w)操作成功,获得文件的访问权,将r_w_w的值变为0,然后将read_count变成1,执行V(h_mutex_read_count),之后开始读文件;随后的写者执行P(r_w_w)将r_w_w的值变为负数,从而阻塞在信号量r_w_w上;其它的读者执行P(h_mutex_read_count)成功,判断read_count不是0,所以直接将read_count的值再加1,执行V(h_mutex_read_count),之后开始读文件。可见多个读者可以同时读文件,并在读文件时阻塞写者。2.2.2 写者优先算法分析通过增加信号量并修改上述程序可以得到写者优先算法。为了实现写者优先算法,需要将写者和读者分开排队,并且第一个读者和其它读者也要分开排队。这样就需要三个队列,一个是写者排队的地方,另一个是第一个读者排队的地方,第三个是其它读者排队的地方。相应地需要设置三个信号量,r_w_w、first_reader_wait和reader_wait。当一个写者声明想写文件时,可以让新的读者中的第一个到first_reader_wait上排队等待;当有读者阻塞在first_reader_wait上时,让其它读者阻塞在reader_wait上;当有一个写者在写文件时,其它写者到r_w_w上排队。只要有活跃的写者或者写者队列不为空,则阻塞新到达的读者。为了记录已经发出声明的写者数量,需要设置一个整数writ_count,以表示声明要写文件的写者数目。由于只要有一个写者到达,就不允许读者去读,因此仅当writ_count=0,表示无写者声明写时,写者才需要执行P(first_reader_wait)操作,若操作成功,写者便可以执行P(r_w_w)去竞争写文件权利。其它写者不需要再向读者声明,可以直接执行P(r_w_w)去竞争写文件 权利。同理仅当写者在执行writ_count减1操作后其值为0时,才需要执行V(first_reader_wait)操作,以便唤醒第一个被阻塞的读者去读文件。又因为writ_count是一个可被多个写者访问的临界资源,所以,应该为它设置一个互斥信号量writer_mutex。通过上述分析得到图2-13的算法描述。下面对该算法的调度效果进行分析。假设最初没有进程在访问文件。过了一会,就会有很多读者和写者到达。对它们可能有两种调度情形。l 情形1 最先调度写者写者执行P(writ_count_mutex),将writ_count_mutex的值变为0,并判断writ_count是0,从而执行P(first_reader_wait),将first_reader_wait的值变为0,成功地向读者声明了写访问意图,接着将writ_count变为1,执行V(writ_count_mutex),将writ_count_mutex的值变为1。然后写者执行P(r_w_w)操作,将r_w_w的值变为0,成功地获得了文件的写访问权利。第一个写者开始写文件;其它的写者执行P(writ_count_mutex),判断writ_count不是0,所以直接将writ_count加1,执行V(writ_count_mutex),然后执行P(r_w_w)操作,将r_w_w的值变为负数,写者依次被阻塞在信号量r_w_w上;第一个读者执行P(reader_wait),将reader_wait的值变为0,接着执行P(first_reader_wait),将first_reader_wait的值变为负1,阻塞在信号量first_reader_wait上;其它读者执行P(reader_wait),将reader_wait的值变为负数,依次阻塞在reader_wait上。当第一个写者写完文件后,执行V(r_w_w),唤醒一个写者并将写者计数器writ_count减1,被唤醒的写者可以写文件,写完后执行V(r_w_w),唤醒下一个写者并将写者计数器writ_count减1,直到最后一个写者将writ_count减为0,才执行V(first_reader_wait)唤醒第一个阻塞的读者。被唤醒的读者执行P(h_mutex_read_count),然后判断read_count是0,从而执行 P(r_w_w),由于最后一个写者写完文件后,r_w_w的值已经还原为1,所以被唤醒的读者执行P(r_w_w)成功,将r_w_w的值变为0,获得文件的读访问权。接着将read_count的值加到1,执行V(h_mutex_read_count),再执行V(reader_wait),唤醒第二个等待的读者,第一个读者执行V(first_reader_wait),将first_reader_wait的值还原到1。第一个读者可以读文件了。若没有新的写者到达,则第二个读者执行P(first_reader_wait)成功,执行P(h_mutex_read_count)并判断read_count不是0,将read_count加到2,执行V(h_mutex_read_count),再执行V(reader_wait)唤醒第三个读者,再执行V(first_reader_wait),第二个读者也可以读文件了。01 semaphore r_w_w=1;02 semaphore reader_wait=1;03 semaphore first_reader_wait=1;04 semaphore h_mutex_read_count=1;05 semaphore writ_count_mutex=1;06 int writ_count=0;07 int read_count=0; 08 reader()09 P(reader_wait);10 P(first_reader_wait);11 P(h_mutex_read_count);12 if(read_count=0) P(r_w_w);13 read_count+;14 V(h_mutex_read_count);15 V(reader_wait);16 V(first_reader_wait);17 读文件;18 P(h_mutex_read_count);19 read_count-;20 if(read_count=0) V(r_w_w);21 V(h_mutex_read_count);22 23 writer()24 P(writ_count_mutex);25 if(writ_count=0) P(first_reader_wait);26 writ_count+;27 V(writ_count_mutex);28 P(r_w_w);29 写文件;30 V(r_w_w);31 P(writ_count_mutex);32 writ_count-;33 if(writ_count=0) V(first_reader_wait);34 V(writ_count_mutex);35 图2-12 写者优先算法l 情形2 最先调度读者第一个读者执行P(reader_wait),将reader_wait的值变为0,执行P(first_reader_wait),将first_reader_wait的值变为0,向写者声明有读者要读文件,接着执行P(h_mutex_read_count),并判断read_count是0所以执行P(r_w_w),将r_w_w的值变为0,成功地获得了文件的读访问权,将读者计数器read_count加到1,执行V(h_mutex_read_count),V(reader_wait),V(first_reader_wait),将reader_wait和first_reader_wait的值依次还原为1。之后,第一个读者开始读文件。若在第一个读者读文件的过程中没有写者到达,则其它读者可以同时读文件;若在读者读文件时,有写者到达,则第一个到达的写者执行P(writ_count_mutex),将writ_count_mutex的值变为0,并判断writ_count是0,从而执行P(first_reader_wait),将first_reader_wait的值变为0,成功地向读者声明了写访问意图,接着将writ_count变为1,执行V(writ_count_mutex),将writ_count_mutex的值变为1。然后写者执行P(r_w_w)操作,(由于有读者在读文件,所以)将r_w_w的值变为负1,写者被阻塞在信号量r_w_w上;当在读文件的所有读者都读完文件后,由最后一个退出的读者执行V(r_w_w)唤醒写者。第一个写者开始写文件。2.2.3 无优先算法分析除了在读者优先时需要的信号量r_w_w和h_mutex_read_count之外,还需要设置一个信号量wait供读者和写者排队。读者和写者都排在wait队列上。若有读者在读文件,则第一个写者阻塞在r_w_w上,其它的写者和读者阻塞在wait上;若有一个写者在写文件,则其它写者和读者都阻塞在wait上。无优先的算法描述如图2-13所示。01 semaphore r_w_w=1;02 semaphore wait=1;03 semaphore h_mutex_read_count=1;04 int read_count=0; 05 reader()06 P(wait);07 P(h_mutex_read_count);08 if(read_count=0) P(r_w_w);09 read_count+;10 V(h_mutex_read_count);11 V(wait);12 读文件;13 P(h_mutex_read_count);14 read_count-;15 if(read_count=0) V(r_w_w);16 V(h_mutex_read_count);17 18 writer()19 P(wait);20 P(r_w_w);21 写文件;22 V(r_w_w);23 V(wait);24 图2-13 无优先算法下面对该算法的调度效果进行分析。最初没有进程在访问文件。过了一会,就会有很多读者和写者到达。对它们可能有两种调度情形。l 情形1 最先调度写者写者执行P(wait)操作成功,将wait的值变为0,再执行P(r_w_w)操作成功,将r_w_w的值变为0,获得文件的访问权,写者可以写文件了。其它的写者或者读者执行P(wait)操作,将wait的值变为负数,从而依次阻塞在信号量wait上;第一个写者写完文件后,执行V(r_w_w),将r_w_w的值还原为1,再执行V(wait)唤醒排在wait队列最前面的一个进程,可能是读者,也可能是写者。l 情形2 最先调度读者第一个读者执行P(wait)操作成功,将wait的值变为0,再执行P(h_mutex_read_count)成功,将信号量h_mutex_read_count的值变为0,接着该读者判断read_count是0,所以执行P(r_w_w)操作成功,获得文件的访问权,将r_w_w的值变为0,然后将read_count变成1,执行V(h_mutex_read_count),V(wait),将信号量h_mutex_read_count和wait的值还原为1,之后开始读文件;若随后到达的仍然是读者,则这些读者将read_count各加1之后也开始读文件;若随后到达的是写者,则写者执行P(wait)操作成功,将wait的值变为0,再执行P(r_w_w)操作将r_w_w的值变为负数,从而阻塞在r_w_w上。这使得在它之后到达的读者和写者相继阻塞在wait上。当第一批读者读完文件后,由最后一个退出的读者执行执行V(r_w_w),从而唤醒第一个被阻塞的写者。 2.3 函数设计实现读者/写者问题的源程序名称是reader_and_writer.cpp。该程序共包括10个函数。这些函数可以分成4组。各组包含的函数及其功能如表2-1。 表2-1 函数功能简述组别包括函数函数功能一main()显示主菜单,接收用户的选择并执行相应的功能。二RF_reader_thread()RF_writer_thread()reader_first()读者优先算法的读者线程函数读者优先算法的写者线程函数读者优先算法的初始化函数:创建10个线程并等待它们结束三WF_reader_thread()WF_writer_thread()writer_first()写者优先算法的读者线程函数写者优先算法的写者线程函数写者优先算法的初始化函数:创建10个线程并等待它们结束四FIFO_reader_thread()FIFO_writer_thread()first_come_first_serverd()无优先算法的读者线程函数无者优先算法的写者线程函数无者优先算法的初始化函数:创建10个线程并等待它们结束程序开始部分定义了宏MAX_THREAD,表示程序中创建的线程数。还定义了测试数据的结构体TEST_INFO,该结构体包含三个数据项:线程名称;提出请求的时刻;操作持续时间。接着定义了全局变量,这些全局变量的作用如下:数组test_data保存了10个线程的测试数据;整数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_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章 程序实现3.1 程序功能及界面设计该程序采用简单的控制台应用程序界面,在主界面上显示程序的功能。该程序的功能如下:1) 演示读者优先算法;2) 演示写者优先算法;3) 演示无优先算法;4) 退出。3.2 实现程序流程3.2.1 读者优先算法实现对于相继到达的一批读者,并不是每个读者都需要执行P(r_w_w)和V(r_w_w)。在这批读者中,只有最先到达的读者才需要执行P(r_w_w),与写者竞争对文件的访问权,若执行P(r_w_w)成功则获得了文件的访问权,其他的读者可直接访问文件;同理,只有最后退出临界区的读者需要执行V(r_w_w)来归还文件访问权。为了记录正在读文件的一批读者的数量,需要设置一个整型变量read_count,每一个读者到达时都要将read_count加1,退出时都要将read_count减1。由于只要有一个读者在读文件,便不允许写者写文件,所以,仅当read_count=0时,即尚无读者在读文件时,读者才需要执行P(r_w_w)操作。若P(r_w_w)操作成功,读者便可去读文件,相应地,read_count+1。同理,仅当在执行了read_count减1操作后其值为0时,才需要执行V(r_w_w)操作,以便让写者写文件。又因为read_count是一个可被多个读者访问的临界资源,所以应该为它设置一个互斥信号量h_mutex_read_count。每个读者在访问read_count之前执行P(h_mutex_read_count),之后执行V(h_mutex_read_count)。读优先操作结果截图如下图3-1:图3-1 读优先操作截图3.2.2 写者优先算法实现为了实现写者优先算法,需要将写者和读者分开排队,并且第一个读者和其它读者也要分开排队。这样就需要三个队列,一个是写者排队的地方,另一个是第一个读者排队的地方,第三个是其它读者排队的地方。相应地需要设置三个信号量,r_w_w、first_reader_wait和reader_wait。当一个写者声明想写文件时,可以让新的读者中的第一个到first_reader_wait上排队等待;当有读者阻塞在first_reader_wait上时,让其它读者阻塞在reader_wait上;当有一个写者在写文件时,其它写者到r_w_w上排队。只要有活跃的写者或者写者队列不为空,则阻塞新到达的读者。为了记录已经发出声明的写者数量,需要设置一个整数writ_count,以表示声明要写文件的写者数目。由于只要有一个写者到达,就不允许读者去读,因此仅当writ_count=0,表示无写者声明写时,写者才需要执行P(first_reader_wait)操作,若操作成功,写者便可以执行P(r_w_w)去竞争写文件权利。其它写者不需要再向读者声明,可以直接执行P(r_w_w)去竞争写文件 权利。同理仅当写者在执行writ_count减1操作后其值为0时,才需要执行V(first_reader_wait)操作,以便唤醒第一个被阻塞的读者去读文件。又因为writ_count是一个可被多个写者访问的临界资源,所以,应该为它设置一个互斥信号量writer_mutex。写优先操作结果截图如下图 3-2:图3-2 写优先操作截图3.2.3 无优先算法实现不仅需要的信号量r_w_w和h_mutex_read_count之外,还需要设置一个信号量wait供读者和写者排队。读者和写者都排在wait队列上。若有读者在读文件,则第一个写者阻塞在r_w_w上,其它的写者和读者阻塞在wait上;若有一个写者在写文件,则其它写者和读者都阻塞在wait上。无优先操作结果截图如下图3-3:图3-3 无优先操作截图3.3 程序流程图3.3.1 读者优先算法流程图根据定义的函数名称和功能画读者优先算法的函数流程图如下图3-4所示:图3-4 读者优先算法函数流程图3.3.2 写者优先算法流程图根据定义的函数名称和功能画写者优先算法的函数流程图如下图3-5所示:图3-5 写者优先算法函数流程图3.3.3 无优先算法流程图根据定义的函数名称和功能画无优先算法的函数流程图如下图3-6所示:图3-6 无优先算法函数流程图心得体会心得体会这一次课程设计,我们组完成了题目3即“读者-写者问题与进程同步”问题,更加系统地理解和掌握了临界区和进程互斥的概念掌握用信号量和PV操作实现进程互斥的方法。要求学生用信号量和PV操作实现读者/写者问题的读者优先算法、写者优先算法和无优先算法。经过读者写者问题的编写,我对同步机构应用有了深入的了解,懂得了运用信号量实现进程间的互斥,实现了不让共享资源同时修改。用信号量上的原语操作使临界段问题的解决比较简单明了了。读者写者问题的编写,花的时间很多,也学到很多东西。了解在支持多道程序的并发操作系统设计中,如何解决资源共享时进程间的同步与互斥的信号量机制。课程设计提高了我们对所学知识的综合应用能力,全面检查并掌握所学的内容,培养独立思考、刻苦钻研的精神,在分析问题、解决问题的过程中,更是获得一种成功的喜悦,进而增加学习和应用的兴趣。同时也要督促自己在学习的过程中不断的完善自我,加强自己的动手操作能力,培养我的独立思考的那种思维方式。总之,这一次课程设计我们深刻的理解操作系统,而且锻炼了实际编程能力和思维方式,虽然有难度过程中遇到很多问题,经过深刻细致的理解问题、剖析问题、解决问题使我们深刻的认识理解了读者/写者问题与进程同步。参考文献参考文献1 刘肄卓 著.操作系统实验教程-2 百度百科 /3 左万历 等著.计算机操作系统教程(第三版). 北京:高等教育出版社,2010.7附录1 源代码附录1 源代码 #include #include #include #include #include #include #define MAX_THREAD 10 /待测试的线程数typedef struct /表示测试数据格式char thread_name3; /线程名unsigned int require_moment; /请求操作时刻unsigned int persist_time; /操作持续时间TEST_INFO;TEST_INFO test_dataMAX_THREAD= /测试数据表r1,0,15, / r表示读者线程r2,1, 15, /w表示写者线程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 read_count=0; /记录正在读文件的读者数int write_count=0; /在写者优先算法中记录声明要写文件的写者数CRITICAL_SECTION CS_DATA; /用于保护文件的临界区变量HANDLE h_mutex_read_count=CreateMutex(NULL,FALSE,mutex_read_count);/读者计数器互斥体HANDLE h_mutex_write_count=CreateMutex(NULL,FALSE,mutex_write_count);/写者计数器互斥体HANDLE h_mutex_reader_wait=CreateMutex(NULL,FALSE,mutex_reader_wait);/在写者优先算法中用于阻塞读者的互斥体HANDLE h_mutex_first_reader_wait=CreateMutex(NULL,FALSE,mutex_first_reader_wait);/在写者优先算法中用于阻塞第一个读者的互斥体HANDLE h_mutex_wait=CreateMutex(NULL,FALSE,mutex_wait);/无优先时用于阻塞读者和写者的互斥体/读者优先时的读者线程void RF_reader_thread(void *data)char thread_name3; /存放线程名称strcpy(thread_name,(TEST_INFO *)data)-thread_name);Sleep(TEST_INFO *)data)-require_moment*1000);WaitForSingleObject(h_mutex_read_count,-1);/申请进入关于读者计数器的临界区相当于P操作read_count+;if(read_count=1)EnterCriticalSection(&CS_DATA); /申请进入关于文件的临界区相当于P操作ReleaseMutex(h_mutex_read_count);/离开关于读者计数器的临界区相当于V操作printf(%s ,thread_name);Sleep(TEST_INFO *)data)-persist_time*1000); /用延迟相应秒来模拟读文件操作WaitForSingleObject(h_mutex_read_count,-1);read_count-;if(read_count=0)LeaveCriticalSection(&CS_DATA); /离开关于文件的临界区相当于V操作ReleaseMutex(h_mutex_read_count);/读者优先时的写
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年贵州云岩区第十六幼儿园教师招聘考试试题(含答案)
- 2025年大连市属国有企业招聘考试笔试试题(含答案)
- 2024年体育教师编制考试体育专业基础知识必考题库和答案
- 2025中药治疗执业药师继续教育试题及参考答案
- 2024新 公司法知识竞赛题库与答案
- 120急救考试题及答案
- 2024年公路养护工、检修工职责技能及理论知识考试题与答案
- 脑卒中吞咽障碍护理技能培训试题及答案
- 标准化沟通课件
- 化肥品牌知识培训课件
- 底泥资源化利用研究进展
- 医院节能培训课件
- 大企业税收风险分析典型案例汇编
- 混凝土质量保证措施
- 烟气CEMS在线比对验收调试报告附表D.1-12计算公式(HJ-75-2017)
- 学生请假安全协议书
- 隐形眼镜项目风险管理分析
- 砍伐桉树合同范文
- 过敏性休克应急处置流程
- GB/T 3520-2024石墨细度试验方法
- 桥梁真石漆施工方案
评论
0/150
提交评论