




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计操作系统课程设计 信息科学与工程学院软件实践实训报告 2 目目 录录 1 1 课程设计目的课程设计目的 3 3 2 2 设计要求设计要求 3 3 3 3 问题具体描述问题具体描述 3 3 4 4 设计分析设计分析 3 3 5 5 设计分工设计分工 4 4 6 6 数据结构说明数据结构说明 4 4 7 7 系统结构说明系统结构说明 4 4 8 8 系统调用说明系统调用说明 4 4 9 9 分工设计说明分工设计说明 5 5 1010 算法流程图算法流程图 5 5 1111 分工代码分工代码 6 6 1212 整体代码整体代码 7 7 1313 程序运行程序运行 1 10 0 1414 总结总结 1 11 1 信息科学与工程学院软件实践实训报告 3 1 课程设计目的课程设计目的 1 内容围绕操作系统原理中最重要的基本概念和基本原理展开 2 巩固对原理知识的学习效果 3 加深对基本概念的理解 4 学习如何将基本原理和实际设计 应用有机结合 5 锻炼本专业的基本能力 2 设计要求设计要求 1 进程间通信 并发 同步 互斥 文件读写 2 内存管理 Dll Windows 消息机制 IO 尚未最终定型 3 问题具体描述问题具体描述 1 完成 N 个生产者和 M 个消费者之间的并发控制 N M 不低于 5 数据发送和接收缓冲 区 大小不小于 10 个 2 某个生产者进程生产的消息供 K 个消费者进程消费 K M 某些消费进程消费多个生 产者生产的消息 生产者和消费者之间的对应关系可以在程序开始有一个文件中读入 也 可以动态调整 3 每个生产进程生产 M 个消息后结束运行 如果一个消费者进程没有对应的生产者进程在 运行后 也结束运行 4 设计分析设计分析 课程设计的主要目的是了解并且掌握进程之间的同步互斥 和进程之间的通信问题 结合课本上的生产者与消费者问题可以从这方面来实现一个多进程的小系统 并且解决多 个进程之间的通信 并发等问题 以此来达到课程设计的目的 理发师问题是将顾客看做 生产者 将理发师作为消费者 设置一定数量的椅子的数目来作为缓存区的大小 顾客来 到的时候坐在椅子上 将自己作为 产品 理发师理发的时候从椅子上叫走顾客 相当于 消费 产品 从而达到了课程设计要求的前一个要求 顾客作为生产者 每到来一个就使计数器 count 增加 1 以便让理发师理发 相当于消 费 至最后一个顾客 相当于产品 并且 第 1 个到来的顾客应负责唤醒理发师 如果不 是第 1 个到达的顾客 则在有空椅子的情况下坐下等待 否则离开理发店 该消息可由计 数器 count 获得 主要有以下一些函数来实现整个问题的实现过程 1 用随机函数 random 来产生进入理发店的顾客 2 定义理发师的理发函数 cuthair 用来实现理发操作 3 定义顾客被理发的函数 gethaircut 用来实现顾客被理发的操作 4 用顾客线程 customer 实现对顾客行为的控制 5 用理发师线程 barber 实现对理发师行为的控制 6 定义主函数 main 实现对两个线程的控制和执行操作 信息科学与工程学院软件实践实训报告 4 5 设计分工设计分工 成员 李宁 侯绍立 分工 理发师进程 信号量的设置 理发师函数 xxx 顾客进程 顾客函数 主函数 xx 6 数据结构说明数据结构说明 本程序用到了数据结构中的队列 理发的顾客由随机函数产生 顾客遵从先到先理发 的原则 但队列的长度限制为输入的理发店中的椅子的个数 当理发店的椅子没有空位的 时候 到来的顾客主动退出加入队列 理发师对队列中的顾客进行先到先服务的原则理发 7 系统结构说明系统结构说明 一 头文件声明 include windows h include iostream h include math h 二 定义各种变量 int long waiting 0 int chairs char open door char close door int count 0 int finish 0 三 信号量的定义 HANDLE Mutex CreateMutex NULL FALSE Mutex HANDLE barbers CreateSemaphore NULL 1 1 barbers HANDLE customers CreateSemaphore NULL 0 3 customers 8 系统调用说明系统调用说明 1 CreateThread 创建线程 2 CreateMutex 找出当前系统是否已经存在指定进程的实例 如果没有则创 建一个互斥体 用来同步 如果一个线程获取了互斥体 则要获取该互斥体的第二个线程 将被挂起 直到第一个线程释放该互斥体 CreateMutex 函数可用来创建一个有名或 无名的互斥量对象 3 CreateSemaphore CreateSemaphore 是系统提供的 API 包含在 Windows h 中 应用在同步的处理中 作用是创建一个新的信号机 执行成功 返回信号机对象的句柄 信息科学与工程学院软件实践实训报告 5 零表示出错 一旦不再需要 一定记住用 CloseHandle 关闭信号机的句柄 它的所有句柄 都关闭以后 对象自己也会删除 一旦值大于零 信号机就会触发 发出信号 Semaphore 是一个同步问题机制 不论是 Event 或 Mutex 其他 Process 在执 WaitForSingleObject 时 就看当时的物件是 Signal 或 UnSignal 而决定是否等待 而 Semaphore 也相同 但是它要变成 Signal UnSignal 的状态 却有些不同 它是提供一个计 数值 它允许在这个计数值之内 任何执行到 WaitForSingleObject 的 Thread 都不会停下来 而且每执行 WaitForSingleObject 一次 计数值就减一 当计数值变成 0 时 该 Semaphore 才会处於 UnSignal 的状态 而某个 Thread ReleaseSemaphore 时 便会将计数值增加 以便 其他的 Thread 或本身可得 Signal 的讯号 而使 WaitForSingleObject 停止等待 4 ReleaseSemaphore ReleaseSemaphore 函数的作用是增加信号机的计数 如 果成功 就调用信号机上的一个等待函数来减少它的计数 5 WaitForSingleObject 函数用来检测 hHandle 事件的信号状态 在某一线程中调 用该函数时 线程暂时挂起 如果在挂起的 dwMilliseconds 毫秒内 线程所等待的对象变 为有信号状态 则该函数立即返回 如果超时时间已经到达 dwMilliseconds 毫秒 但 hHandle 所指向的对象还没有变成有信号状态 函数照样返回 参数 dwMilliseconds 有两个 具有特殊意义的值 0 和 INFINITE 若为 0 则该函数立即返回 若为 INFINITE 则线程 一直被挂起 直到 hHandle 所指向的对象变为有信号状态时为止 6 ResumeThread 线程恢复函数 使用该函数能激活线程的运行 使 CPU 分配资源 让线程恢复运行 7 ReleaseMutex 释放由线程拥有的一个互斥体 8 Sleep 睡眠等待 9 分工设计说明分工设计说明 需要用到的信号量 HANDLE Mutex CreateMutex NULL FALSE Mutex 实现顾客与理发师对公用缓存区的互斥操作 HANDLE barbers CreateSemaphore NULL 1 1 barbers HANDLE customers CreateSemaphore NULL 0 3 customers WaitForSingleObject customers INFINITE 等待顾客进程的 V customer 操作 WaitForSingleObject Mutex INFINITE 申请操作顾客与理发师公用的缓存区 ReleaseSemaphore barbers 1 NULL 释放信号量 barbers ReleaseMutex Mutex 释放信号量 Mutex 允许顾客操作缓存区 10 算法流程图算法流程图 程序开始 键入店中 的椅子数 信息科学与工程学院软件实践实训报告 6 尚未营 业 Mutex 理发师 线程 True 顾客 线程 False 椅 等待 是 离开 有顾客等待休息 否 理发师在睡觉则唤醒理发 否则 继续 是 11 分工代码分工代码 include windows h include iostream h include math h int long waiting 0 等待理发的顾客人数 int chairs 店中椅子的总数目 char open door 开门 char close door 关门 int count 0 顾客的序号 int finish 0 已经理完发的顾客人数 DWORD a HANDLE Mutex CreateMutex NULL FALSE Mutex 用来实现进程的互斥 HANDLE barbers CreateSemaphore NULL 1 1 barbers 定义信号量来进行线程间的 是否开始接 待顾客 信息科学与工程学院软件实践实训报告 7 同步 HANDLE customers CreateSemaphore NULL 0 3 customers 定义信号量来进行线程间 的同步 int random 定义随机函数来产生顾客 并使两个顾客间的时间少于 15 秒 return rand 15000 RAND MAX void cuthair 理发师的理发函数 用时 15 秒 Sleep 15000 cout 理发结束 endl DWORD WINAPI barber LPVOID pParm1 理发师线程 while true WaitForSingleObject customers INFINITE p customers 等待顾客 WaitForSingleObject Mutex INFINITE 等待互斥量 waiting 等待的人数减 1 ReleaseSemaphore barbers 1 NULL 释放信号量 ResumeThread barbers 唤醒顾客进程 ReleaseMutex Mutex v mutex cuthair finish return 0 12 整体代码整体代码 include windows h include iostream h include math h int long waiting 0 等待理发的顾客人数 int chairs 店中椅子的总数目 char open door 开门 char close door 关门 信息科学与工程学院软件实践实训报告 8 int count 0 顾客的序号 int finish 0 已经理完发的顾客人数 DWORD a HANDLE Mutex CreateMutex NULL FALSE Mutex 用来实现进程的互斥 HANDLE barbers CreateSemaphore NULL 1 1 barbers 定义信号量来进行线程间的 同步 HANDLE customers CreateSemaphore NULL 0 3 customers 定义信号量来进行线程间 的同步 int random 定义随机函数来产生顾客 并使两个顾客间的时间少于 15 秒 return rand 15000 RAND MAX void cuthair 理发师的理发函数 用时 15 秒 Sleep 15000 cout 理发结束 endl void gethaircut 顾客被理发的函数 Sleep 15001 顾客被理发的函数 为了和理发师之间有所区别 比理发 师理发时间长 1 毫秒 cout 第 finish 个顾客理发完毕 离开 endl DWORD WINAPI customer LPVOID pParm2 顾客线程 WaitForSingleObject Mutex INFINITE P mutex 来进行互斥操作 count 来的是第几个顾客 cout 顾客敲门 第 count 个顾客到来 endl if waiting chairs 如果有空椅子 if waiting 0 cout 现在有 waiting 个人在等待理发 endl else cout 无人在等待理发 endl 输出有多少人在等待 waiting 信息科学与工程学院软件实践实训报告 9 cout 剩余 chairs waiting 1 个座位 endl cout 有空位 顾客已坐下 endl ReleaseSemaphore customers 1 NULL V customer ResumeThread customers 唤醒理发师进程 ReleaseMutex Mutex 释放互斥量 以便其他线程使用 WaitForSingleObject barbers INFINITE 等待理发 gethaircut else cout 没有空椅子 第 count 个顾客离开理发店 endl 没有椅子 顾客 直接离开 ReleaseMutex Mutex return 0 DWORD WINAPI barber LPVOID pParm1 理发师线程 while true WaitForSingleObject customers INFINITE p customers 等待顾客 WaitForSingleObject Mutex INFINITE 等待互斥量 waiting 等待的人数减 1 ReleaseSemaphore barbers 1 NULL 释放信号量 ResumeThread barbers 唤醒顾客进程 ReleaseMutex Mutex v mutex cuthair finish return 0 int main int argc char argv 实现线程的操作 cout chairs cout 店中有 chairs 把椅子 endl 设置椅子数目 cout 是否开始接待顾客 Y N open door while open door y cout endl 尚未营业 endl 信息科学与工程学院软件实践实训报告 10 cout 是否开始接待顾客 Y N open door HANDLE hThread1 HANDLE hThread2 hThread2 CreateThread NULL 0 barber NULL 0 NULL 产生一个理发师进程 while close door y Sleep random 函数实现顾客随机到来 hThread1 CreateThread NULL 0 customer NULL a NULL cout endl 正在营业 请进 8 return close door if close door y cou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南省中甸县2025年上半年事业单位公开遴选试题含答案分析
- 毛织品行业透视
- 河北省新河县2025年上半年事业单位公开遴选试题含答案分析
- 河北省无极县2025年上半年事业单位公开遴选试题含答案分析
- 2025版商场电工系统调试与验收服务合同
- 2025年度水泥产品质量保证与售后服务合同
- 2025年充电桩安装与电力系统接入合同模板
- 2025版影视动画设计费合作协议书下载
- 2025年度企业员工劳动合同绩效评估与薪酬调整合同
- 2025版石膏制品批发采购合同范本
- 中医病证诊断疗效标准
- 施工总平面布置图及说明及施工现场平面布置图
- 数独课件完整版
- GA 568-2022警服夏执勤短袖衬衣
- 淮扬菜-淮安淮扬菜名单大全
- 炼油厂生产准备工作纲要(终)
- 静脉输注药物临床合理应用与注意事项课件
- 屈光不正处方案例分析课件
- 2021年秋期新人教版部编本六年级语文上册教材解读
- 标准化考核办法
- 高处吊篮使用审批表
评论
0/150
提交评论