武汉理工 操作系统 课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
题目实现读者写者(Reader-Writer Problem)
问题
学院计算机科学与技术学院
专业软件工程
班级
姓名
指导教师刘军
2 0 1 2 ——2 0 1
3 学年第二学期
目录
一、设计题目与要求 (1)
二、总的设计思想及系统平台、语言、工具等 (1)
2、1问题简介 (1)
2、2初始条件 (1)
2、3总的设计思想 (2)
三、数据结构与模块说明(功能与流程图) (2)
3、1算法与数据结构 (2)
3、2功能模块描述 (4)
四、运行结果与运行情况 (7)
五、调试记录 (8)
六、自我评价与总结 (9)
七、参考文献 (9)
八、源程序 (10)
本科生课程设计成绩评定表 (17)
一、设计题目与要求
题目:通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
要求:每人一台与Linux主机联网的Windows主机,普通用户权限。
二、总的设计思想及系统平台、语言、工具等
2、1问题简介
读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。
读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。
信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典范例。
与记录型信号量解决读者—写者问题不同,信号量机制它增加了一个限制,即最多允许RN个读者同时读。为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait(L,1,1)操作,来控制读者的数目,每当有一个读者进入时,就要执行wait(L,1,1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN+1 个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。
2、2初始条件
操作系统:Windows
程序设计语言:C++语言
设有20个连续的存储单元,写入/读出的数据项按增设定为1-20这20个字
符。为每个读者/写者产生一个线程,设计正确的同步算法,使得每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。同时,需满足读者应有3个以上,写者应有两个以上。多个读者/写者之间须共享对存储区进行操作的函数代码。
2、3总的设计思想
读者-写者的读写限制(包括读者优先和写者优先)
(1)写-写互斥,即不能有两个写者同时进行写操作;
(2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写;
(3)读读允许,即可以有2个以上的读者同时读。
将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:
(1)任意多个读进程可以同时读这个文件;
(2)一次只有一个写进程可以往文件中写;
(3)如果一个写进程正在进行操作,禁止任何读进程度文件。
分两种情况实现该问题:
读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。
写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。
程序由三部分组成:
(1)读者模块:包括系统调用接口,读者活动描述主程序。系统接口主要功能是通过管道向父进程发送系统调用命令,并读取父进程送来的返回值。
(2)写者模块:包括系统调用接口,写者活动描述主程序。
读者-写者活动程序根据临界资源的共享,互斥原则编制。
(3)主控模块:主控模块实现系统初始化系统调用命令接收与解释执行,系统调用功能的实现(包括信号量机制),及读者-写者活动过程记录与显示。三、数据结构与模块说明(功能与流程图)
3、1算法与数据结构
创建Person结构体
typedef struct _Person
{
HANDLE m_hThread; //定义处理线程的句柄
int m_nType; //进程类型(读写)
int m_nStartTime; //开始时间
int m_nWorkTime; //运行时间
int m_nID; //进程号
}Person;
int g_PersonLists[] = { //进程队列
1, W, 4, 5, 2, W, 16, 4, 3, R, 5, 2,
4, W, 6, 5, 5, R, 4, 3,
END,
};
Var RN integer;L,mx:semaphore: =RN,1;
Begin
Parbegin
Reader :begin
Repeat
Swait(L,1,1);
Swait(mx,1,0);
.
Perform reader operation;
Ssignal(L,1);
Until false;
End
Writer :begin
Repeat
Swait(mx ,1,1,l,RN,0);
Perform writer operation;
Ssignal(mx,1);
Until false;
End
Parend
End
其中,Swait(mx,1,0)语句起着开关作用,只要无Writer进程进入些,mx=1,reader进程就都可以进入读。但是要一旦有Writer进程进入写时,其MX=0,则