课程设计。
2 0 1 2 ——2 0 1 3 学年第二学期。
目录。一、 设计题目与要求1
二、 总的设计思想及系统平台、语言、工具等1
问题简介1初始条件1
总的设计思想2
三、数据结构与模块说明(功能与流程图2
算法与数据结构2
功能模块描述4
四、运行结果与运**况7
五、调试记录8
六、自我评价与总结9
七、参考文献9
八、源程序10
本科生课程设计成绩评定表17
一、 设计题目与要求。
题目:通过研究linux的线程机制和信号量实现读者写者(reader-writer)问题并发控制。
要求:每人一台与linux主机联网的windows主机,普通用户权限。
课程设计进度安排:
二、 总的设计思想及系统平台、语言、工具等。
问题简介。读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。
读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量s来当前是否可操作。
信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典范例。
与记录型信号量解决读者—写者问题不同,信号量机制它增加了一个限制,即最多允许rn个读者同时读。为此,又引入了一个信号量l,并赋予初值为rn,通过执行wait(l,1,1)操作,来控制读者的数目,每当有一个读者进入时,就要执行wait(l,1,1)操作,使l的值减1。当有rn个读者进入读后,l便减为0,第rn+1 个读者要进入读时,必然会因wait(l,1,1)操作失败而堵塞。
初始条件。操作系统:windows
程序设计语言:c++语言。
设有20个连续的存储单元,写入/读出的数据项按增设定为1-20这20个字符。为每个读者/写者产生一个线程,设计正确的同步算法,使得每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。同时,需满足读者应有3个以上,写者应有两个以上。
多个读者/写者之间须共享对存储区进行操作的函数**。
总的设计思想。
读者-写者的读写限制(包括读者优先和写者优先)
1)写-写互斥,即不能有两个写者同时进行写操作;
2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写;
3)读读允许,即可以有2个以上的读者同时读。
将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(reader)和一些只往数据区写数据的进程(writer),此外还需要满足以下条件:
1)任意多个读进程可以同时读这个文件;
2) 一次只有一个写进程可以往文件中写;
3)如果一个写进程正在进行操作,禁止任何读进程度文件。
分两种情况实现该问题:
读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。
写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。
程序由三部分组成:
1)读者模块:包括系统调用接口,读者活动描述主程序。系统接口主要功能是通过管道向父进程发送系统调用命令,并读取父进程送来的返回值。
2)写者模块:包括系统调用接口,写者活动描述主程序。
读者-写者活动程序根据临界资源的共享,互斥原则编制。
3)主控模块:主控模块实现系统初始化系统调用命令接收与解释执行,系统调用功能的实现(包括信号量机制),及读者-写者活动过程记录与显示。
三、数据结构与模块说明(功能与流程图)
算法与数据结构。
创建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;
beginparbegin
reader :begin
repeat
swait(l,1,1);
swait(mx,1,0);
perform reader operation;
ssignal(l,1);
until false;
endwriter :begin
repeat
swait(mx ,1,1,l,rn,0);
perform writer operation;
ssignal(mx,1);
until false;
endparend
end其中,swait(mx,1,0)语句起着开关作用,只要无writer进程进入些,mx=1,reader进程就都可以进入读。但是要一旦有writer进程进入写时,其mx=0,则任何reader进程就都无法进入读。swait(mx ,1,1,l,rn,0)语句表示仅当既无write进程在写(mx=1),又无reader进程在读(l=rn)时,writer进程才能进入临界区写。
功能模块描述。
void createpersonlist(int *ppersonlists)
int i=0;
int *plist = ppersonlists;
bool ret;
while(plist[0] !end)
switch(plist[1])
case r:
ret = createreader(plist[2],plist[3],plist[0]);351,w452,523,654
break; case w:
ret = createwriter(plist[2],plist[3],plist[0]);
break;
读者优先:dword winapi readerproc(lpvoid lpparam)//读过程。
person *pperson = person*)lpparam;
/ wait for the start time
while(g_currenttime !=pperson->m_nstarttime)
写者优先:waitforsingleobject(g_hwritesemaphore,infinite);
/ modify the writer's real start time
pperson->m_nstarttime = g_currenttime;
dword winapi writerproc(lpvoid lpparam)
person *pperson = person*)lpparam;
/ wait for the start time
while(g_currenttime !=pperson->m_nstarttime)
四、运行结果与运**况。
图1、写者6申请资源,读者申请资源。
图2、写者4申请资源而写者1退出。
图3、读者3和5依次推出,写者2申请资源。
图4、读者6申请资源,写者4退出。
五、调试记录。
虽然在做实验时已经练习过相关编程,但是在课程设计上还是犯了许多错误。现挑几条分享,其余错误犯得有点低级,在此不再赘述。
1)在定义person结构体时,有些变量没有考虑到,比如处理线程的句柄以及进程类型。
2)问题:error c2501: 'handle' :missing storage-class or type specifiers
error c2146: syntax error : missing ';before identifier 'g_hreadsemaphore'
解决:这是缺少了头文件而产生的错误,加入头文件#include <>即可。
(3)问题:error c2440: 'initializing' :cannot convert from 'void *'to 'struct _person *'
操作系统课程设计
课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...
操作系统课程设计
银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...
操作系统课程设计
学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....