学 号:
课 程 设 计
题 目
实现读者写者 (ReaderWriter Problem) 问题
学 院
计算机科学技术
专 业
软件工程
班 级
软件
姓 名
指导教师
2010
年
X
月
X
日
目 录
1.概述 …………………………………………4
11设计题目 ………………………………………………4
12设计目 ………………………………………………4
13设计时间 ………………………………………………4
14开发环境 ………………………………………………4
15设计求 ………………………………………………4
2.数结构模块说明 ………………………5
21设计概述 ……………………………………………5
22设计流程图 ……………………………………………6
3.具体编程实现 ………………………………7
4.运行结果测试 ……………………………8
5 课程设计总结体会 ………………………11
6.参考文献 ……………………………………11
课程设计务书
学生姓名: 专业班级: 软件
指导教师: 工作单位: 计算机科学技术学院
题目 实现读者写者 (ReaderWriter Problem) 问题
初始条件:
1 操作系统:Linux
2 程序设计语言:C语言
3 设20连续存储单元写入读出数项增序设定1-2020字符
求完成务 (包括课程设计工作量技术求说明书撰写等具体求)
1.技术求:
1)读者/写者产生线程设计正确步算法
2)读者写者该存储区进行操作时显示该存储区全部容前指针位置读者写者线程定义标识符
3)读者应3写者应两
4)读者写者间须享存储区进行操作函数代码
2. 设计说明书容求:
1)设计题目求
2)总设计思想系统台语言工具等
3)数结构模块说明(功流程图)
4)运行结果运行情况
(提示 (1)连续存储区数组实现
(2)编译命令: cc lpthread o 目标文件名 源文件名
(3)线程编程方法参见附件)
3 调试报告:
1) 调试记录
2) 评析总结
机时间安排:
18周 ~ 五 08:0 - 12:00
指导教师签名: 年 月 日
系(责教师)签名: 年 月 日
实现读者写者 (ReaderWriter Problem) 问题
1 概述
11 设计题目
实现读者写者 (ReaderWriter Problem) 问题
12 设计目
通操作系统核实现代码阅读修改设计理解掌握复杂操作系统工作原理
通研究Linux线程机制信号量实现读者写者(ReaderWriter)问题发控制
13设计时间
消化资料系统调查 1天
系统分析 1天
总体设计实施计划 2天
撰写课程设计报告书 1天
第18周周周五
14开发环境
次课程设计操作系统:Linux编程语言C语言
15 设计求
1)读者/写者产生线程设计正确步算法
2)读者写者该存储区进行操作时显示该存储区全部容前指针位置读者写者线程定义标识符
3)读者应3写者应两
4)读者写者间须享存储区进行操作函数代码
2数结构模块说明
21设计概述
谓读者写着问题指保证writer进程必须进程互斥访问享象步问题
读者写者问题样描述群写者群读者写者写书读者读书读者时读书写者写书读者必写者优先说读者写者时提出请求时读者优先读者提出请求时需互斥操作外需信号量S前否操作
信号量机制支持道程序发操作系统设计中解决资源享时进程间步互斥重机制读者写者机制典范例
记录型信号量解决读者—写者问题信号量机制增加限制允许RN读者时读引入信号量L赋予初值RN通执行wait(L11)操作控制读者数目读者进入时执行wait(L11)操作L值减1RN读者进入读L便减0第RN+1 读者进入读时必然会wait(L11)操作失败堵塞利信号量解决读者—写者问题描述:
Var RN integerLmxsemaphore RN1
Begin
Parbegin
Reader begin
Repeat
Swait(L11)
Swait(mx10)
Perform reader operation
Ssignal(L1)
Until false
End
Writer :begin
Repeat
Swait(mx 11lRN0)
Perform writer operation
Ssignal(mx1)
Until false
End
Parend
End
中Swait(mx10)语句起着开关作Writer进程进入mx1reader进程进入读旦Writer进程进入写时MX0reader进程法进入读Swait(mx 11lRN0)语句表示仅Write进程写(mx1)reader进程读(LRN)时writer进程进入界区写
22设计流程图
程序()
读者()
写者()
控()
3 具体编程实现
读者写者读写限制(包括读者优先写者优先)
1)写写互斥两写者时进行写操作
2)读写互斥时读者读时写者写
3)读读允许2读者时读
读者写者分放进两等队列中读允许时读者队列释放读者写允许时释放第写者操作读者写者问题定义:许进程享数区数区文件者存块空间读取数区进程(Reader)数区写数进程(Writer)外需满足条件:
1)意读进程时读文件
2) 次写进程文件中写
3)果写进程正进行操作禁止读进程度文件
需分两种情况实现该问题:
读优先:求指读者试图进行读操作时果时正读者进行操作直接开始读操作需等
写优先:读者试图进行读操作时果写者等进行写操作正进行写操作等该写者完成写操作开始读操作
程序三部分组成:
1. 读者模块:包括系统调接口读者活动描述程序系统接口功通道父进程发送系统调命令读取父进程送返回值
2. 写者模块:包括系统调接口写者活动描述程序
读者写者活动程序根界资源享互斥原编制
3 控模块:控模块实现系统初始化系统调命令接收解释执行系统调功实现(包括信号量机制)读者写者活动程记录显示
4运行结果测试
测试数文件包括n 行测试数分描述创建n 线程读者写者读写操作开始时间持续时间行测试数包括四字段字段间空格分隔第字段正整数表示线程序号第二字段表示相应线程角色R 表示读者W 表示写者第三字段正数表示读写操作开始时间线程创建延时相应时间(单位秒)发出享资源读写申请第四字段正数表示读写操作持续时间线程读写申请成功开始享资源读写操作该操作持续相应时间结束释放享资源面测试数文件例子:
1 W4 5
2 W 16 4
3 R 5 2
4 W 6 5
5 R 4 3
读者写者时队列中等申请资时读者优先调资源果读者申请进行读操作时已读者正进行读操作该读者直接开始读操作读读允许
进程1W操作时间4时进入队列运行时间5进入时没进程占资源占资源直释放资源等候进程345
进程截图示
5课程设计总结心体会
次课程设计完成题目读者写者问题实现更加系统理解掌握C语言基概念语言特点编程技巧应C语言程序设计方面系统锻炼C进行软件开发良基础程序设计思想较清晰印象程序设计奠定定心理技术准备总感觉学知识特linux全面接触解开始linux产生兴趣开放源码确学计算机志提供台读者写者问题典线程步问题模型读者写者问题编写步机构应深入解懂运信号量实现进程间互斥实现享资源时修改信号量原语操作界段问题解决较简单明读者写者问题编写花时间学东西解支持道程序发操作系统设计中解决资源享时进程间步互斥信号量机制天试验然难度点花时间学会攻克困难
课程设计提高学知识综合应力全面检查掌握学容培养独立思考刻苦钻研精神分析问题解决问题程中更获种成功喜悦进增加学应兴趣时督促学程中断完善加强动手操作力培养独立思考种思维方式
总次课程设计仅学机会锻炼实际动手力台然难度东西总会抵触课设程中郁闷时候错误心花午时间程中够磨练意志耐心感谢老师指导监督
6参考文
[1] Operating System Concepts(Sixth Edition)(操作系统概念)影印版 编:Abraham Silberschatz
出版社:高等教育出版社
[2] 操作系统原理(第三版) 编: 张尧学
出版社:清华学出版社
[3]操作系统实验教程 编:张丽芬刘利雄
出版社:清华学出版社
科生课程设计成绩评定表
班级:软件工程 姓名: 学号:
序号
评分项目
满分
实分
1
学态度认真遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性行性创造性
20
4
设计结果正确性
40
5
设计报告规范性
10
6
设计验收
10
总分等级
评语:
注:终成绩五级分制记优(90100分)良(8089分)中(7079分)
格(6069分)60分格
指导教师签名:
2010 年 月 日
源代码
#include
#include
#include
#include
#include
#include
#define MAX_PERSON 100
#define READER 0 读者
#define WRITER 1 写者
#define END 1
#define R READER
#define W WRITER
typedef struct _Person
{
HANDLE m_hThread定义处理线程句柄
int m_nType进程类型(读写)
int m_nStartTime开始时间
int m_nWorkTime运行时间
int m_nID进程号
}Person
Person g_Persons[MAX_PERSON]
int g_NumPerson 0
long g_CurrentTime 0基时间片数
int g_PersonLists[] {进程队列
1 W 4 5 2 W 16 4 3 R 5 2
4 W 6 5 5 R 4 3
END
}
int g_NumOfReading 0
int g_NumOfWriteRequest 0申请写进程数
HANDLE g_hReadSemaphore读者信号
HANDLE g_hWriteSemaphore写者信号
bool finished false 读完成
bool wfinished false 写完成
void CreatePersonList(int *pPersonList)
bool CreateReader(int StartTimeint WorkTimeint ID)
bool CreateWriter(int StartTimeint WorkTimeint ID)
DWORD WINAPI ReaderProc(LPVOID lpParam)
DWORD WINAPI WriterProc(LPVOID lpParam)
int main()
{
g_hReadSemaphore CreateSemaphore(NULL1100NULL) 创建信号灯前资源数
g_hWriteSemaphore CreateSemaphore(NULL1100NULL) 创建信号灯前资源数
CreatePersonList(g_PersonLists) Create All the reader and writers
printf(Created all the reader and writer\n\n)
g_CurrentTime 0
while(true)
{
g_CurrentTime++
Sleep(300) 300 ms
printf(CurrentTime d\ng_CurrentTime)
if(finished) return 0
system (pause)
} return 0
}
void CreatePersonList(int *pPersonLists)
{
int i0
int *pList pPersonLists
bool Ret
while(pList[0] END)
{
switch(pList[1])
{
case R
Ret CreateReader(pList[2]pList[3]pList[0])351w452523654
break case W
Ret CreateWriter(pList[2]pList[3]pList[0])
break
}
if(Ret)
printf(Create Person d is wrong\npList[0])
pList + 4 move to next person list
}
}
DWORD WINAPI ReaderProc(LPVOID lpParam)读程
{
Person *pPerson (Person*)lpParam
wait for the start time
while(g_CurrentTime pPerson>m_nStartTime)
{ }
printf(Reader d is Requesting \npPerson>m_nID)
printf(\n\n************************************************\n)
wait for the write request
WaitForSingleObject(g_hReadSemaphoreINFINITE) if(g_NumOfReading 0)
{
WaitForSingleObject(g_hWriteSemaphoreINFINITE) }
g_NumOfReading++
ReleaseSemaphore(g_hReadSemaphore1NULL)
pPerson>m_nStartTime g_CurrentTime
printf(Reader d is Reading the Shared Buffer\npPerson>m_nID)
printf(\n\n************************************************\n)
while(g_CurrentTime < pPerson>m_nStartTime + pPerson>m_nWorkTime)
{}
printf(Reader d is Exit\npPerson>m_nID)
printf(\n\n************************************************\n)
WaitForSingleObject(g_hReadSemaphoreINFINITE)
g_NumOfReading
if(g_NumOfReading 0)
{ReleaseSemaphore(g_hWriteSemaphore1NULL)时没读者写
}
ReleaseSemaphore(g_hReadSemaphore1NULL)
if(pPerson>m_nID 4) finished true 读写完成
ExitThread(0)
return 0
}
DWORD WINAPI WriterProc(LPVOID lpParam)
{
Person *pPerson (Person*)lpParam
wait for the start time
while(g_CurrentTime pPerson>m_nStartTime)
{}
printf(Writer d is Requesting \npPerson>m_nID)
printf(\n\n************************************************\n)
WaitForSingleObject(g_hWriteSemaphoreINFINITE)
modify the writer's real start time
pPerson>m_nStartTime g_CurrentTime
printf(Writer d is Writting the Shared Buffer\npPerson>m_nID)
while(g_CurrentTime < pPerson>m_nStartTime + pPerson>m_nWorkTime)
{}
printf(Writer d is Exit\npPerson>m_nID)
printf(\n\n************************************************\n)
g_NumOfWriteRequest
ReleaseSemaphore(g_hWriteSemaphore1NULL)
if(pPerson>m_nID 4) finished true读写完成
ExitThread(0)
return 0
}
bool CreateReader(int StartTimeint WorkTimeint ID)
{
DWORD dwThreadID
if(g_NumPerson > MAX_PERSON)
return false
Person *pPerson &g_Persons[g_NumPerson]
pPerson>m_nID ID
pPerson>m_nStartTime StartTime
pPerson>m_nWorkTime WorkTime
pPerson>m_nType READER
g_NumPerson++
Create an New Thread
pPerson>m_hThread CreateThread(NULL0ReaderProc(LPVOID)pPerson0&dwThreadID)
if(pPerson>m_hThread NULL)
return false
return true
}
bool CreateWriter(int StartTimeint WorkTimeint ID)
{
DWORD dwThreadID
if(g_NumPerson > MAX_PERSON)
return false
Person *pPerson &g_Persons[g_NumPerson]
pPerson>m_nID ID
pPerson>m_nStartTime StartTime
pPerson>m_nWorkTime WorkTime
pPerson>m_nType WRITER
g_NumPerson++
Create an New Thread
pPerson>m_hThread CreateThread(NULL0WriterProc(LPVOID)pPerson0&dwThreadID)
if(pPerson>m_hThread NULL)
return false
return true
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档