操作系统 课程设计

上传人:cn****1 文档编号:421946546 上传时间:2023-12-14 格式:DOCX 页数:26 大小:225.73KB
返回 下载 相关 举报
操作系统 课程设计_第1页
第1页 / 共26页
操作系统 课程设计_第2页
第2页 / 共26页
操作系统 课程设计_第3页
第3页 / 共26页
操作系统 课程设计_第4页
第4页 / 共26页
操作系统 课程设计_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《操作系统 课程设计》由会员分享,可在线阅读,更多相关《操作系统 课程设计(26页珍藏版)》请在金锄头文库上搜索。

1、课程设计报告课程名称操作系统课题名称利用多线程模拟实专 业通信工程班 级学 号姓 名指导教师田娟秀、谭小兰20 年 月 日湖南工程学院课程设计任务书课程名称操作系统课 题利用多线程模拟实现生产者/消费者问题.任务书下达日期20 年 6 月 日任 务 完成日 期20 年 6 月 日、设计内容与设计要求1设计内容:课题4:利用多线程模拟实现生产者/消费者问题。 生产者/消费者问题是一个多线程同步问题的经典案例。该问题描述了两个共享固定大 小缓冲区的线程即所谓的“生产者”和“消费者”在实际运行时会发生的问题。 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消 费者也在缓冲

2、区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入 数据,消费者也不会在缓冲区中空时消耗数据。要解决该问题,就必须让生产者在缓冲区满时休眠,等到下次消费者消耗缓 冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以 让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费 者。通常采用进程间通信的方法解决该问题,如采用信号量方法。如果解决方法不 够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方 唤醒自己。2 选题方案:所选题目根据学号确定,学号模 7 加 1,即(学号%7+1)。如你的学号为 9,则 所选题目号为:9%7

3、+1=(题目3)。3 设计要求:3.1 课程设计报告规范( 1 )需求分析a. 程序的功能。b. 输入输出的要求。( 2 )概要设计a. 程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模 块的功能。b. 课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样 的结构,它们之间有什么关系等。(3)详细设计a.采用C语言定义相关的数据类型。b写出各模块的类C码算法。c. 画出各函数的调用关系图、主要函数的流程图。(4)调试分析以及设计体会a. 测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。b. 程序调试中遇到的问题以及解决

4、问题的方法。c. 课程设计过程经验教训、心得体会。(5)使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。(6)书写格式a. 设计报告要求用 A4 纸打印成册:b. 一级标题用 3 号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。(7)附录源程序清单(带注释)3.2 考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新 精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出 每位同学的课程设计成绩。具体考核标准包含以下几个部分:(1)平时出勤 (占 10%)(2)系统需求分析、功能设计、数据结构设计及程序总

5、体结构合理与否(占 10%)(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占 40%)(4)设计报告(占 30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。(5)独立完成情况(占 10%)。3.3 课程验收要求(1)运行所设计的系统。(2)回答有关问题。(3)提交课程设计报告。(4)提交软盘(源程序、设计报告文档)。(5)依内容的创新程度,完善程序情况及对程序讲解情况打分二、 进度安排15 周:星期五8 : 00 12:00上机星期六19 : 00-2200上机星期天14 : 30 18:30上机附:课程设计报告装订顺序:封面、任务书、目录、正文、评分表、

6、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3 号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为 22。正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要 有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释) 正文总字数要求在4500 字以上(不含程序原代码)。目录一、需求分析 11.1 程序的功能 11.2 输入输出的要求 1二、概要设计 12.1 设计原理 12.2 模块设计 22.3 数据结构分析 3三 、详细设计 43.1 生产者 43.2 缓冲区 53.3 消

7、费者 73.4 程序总体流程图 9四、程序调试 9五、总结 11六、运行结果 11七、附件 13利用多线程模拟实现生产者/消费者问题一、需求分析1.1 程序的功能利用VC+编写程序,模拟多线程生产者和消费者问题1、在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放 置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区 可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。2、消费者线程从缓冲区中获得物品,然后释放缓冲区。当消费者线程消费物品时, 如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。3、保证生产者不会在缓冲区满时加入

8、数据,消费者也不会在缓冲区中空时消耗数据。 也就是说,生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生 产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休 眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。1.2 输入输出的要求因为生产者和消费者个数在程序代码当中已经设定,所以不要求输入。对于输出的 要求:1、输出当前状态,是生产还是消费;2、输出生产者生产产品的产品号;3 、输出缓冲区状态;4、输出消费者消费的产品号。二、概要设计2.1 设计原理生产者线程和消费者线程共享同一个缓冲队列, 生产者线程向缓冲区中写数 据,消费者线程从缓冲区中取数据。但

9、两者必须在使用缓冲队列资源时保持互斥, 否则可能会导致在写入时产生数据覆盖,在读出时得到错误数据。因而要在程序 中设置一个互斥锁或公用信号量,用于保证线程间的互斥执行。同时生产者线程 和消费者线程必须保持同步关系,因为生产者线程的执行为消费者线程提供了需 要的数据,是其执行的前提。反之,消费者线程的执行为生产者线程腾出了空闲 的缓冲单元,为写数据提供了条件。即消费者线程执行的前提:缓冲队列中至少 有一个单元有数据;生产者线程执行的前提:缓冲队列中至少有一个单元是空的。 如图 2-1 所示:7肖费者2n个大小相等的缓冲区.毎 个缓3呕可存放个消息图 2-1 原理图2.2 模块设计2.2.1 函数

10、模块首先,应该设计生产者 DWORD WINAPI Producer(LPVOID lpPara)和消费者模块 DWORD WINAPI Consumer(LPVOID lpPara)。然后,设计生产一个产品的函数 void Produce() 和消费一个产品的函数 void Consume() 。最后,设计缓冲区相关的函数。例如,将一个新产品放入缓冲区,然后显示缓存区 的状态的函数void Append()和从缓冲区当中取出一个产品然后显示缓冲区的状态的函 数 void Take() 。2.2.2 模块调用关系在生产者模块 DWORD WINAPI Producer(LPVOID lpPar

11、a)当中,调用了 void Append。 函数和void Produce(),用来生产一个产品,然后这个产品放入缓冲区。消费者模块 DWORD WINAPI Consumer(LPVOID lpPara)中,调用了 void Take()函 数和void Consume()函数,用来从缓冲区取出一个产品,然后消费掉。调用结构如图 2-2 所示消费者DWORD WINAPIConsumer。生产者DWORD WINAPIProducer()生产一个产品void Produce。将一个新产品放入 缓冲区并显示缓冲 区的状态oid Append。丿 *将产品从缓冲区取出,并显示缓冲区的状态void

12、 Take()消费一个产品void Consume()图 2-2 模块调用关系2.3 数据结构分析(1)生产者与消费者实现:其中主要是通过多线程,来实现生产者和消费者之间的协调问题。(2)生产者(producer)消费者(consumer):通过一些记录性变量,来记录模拟实现生产者的行为,通过输入语句的提示程序采用面向对象设计模式,缓存区采用数组结构存储。unsigned shortconst unsigned shortDWORD WINAPI定义整形类的指针无符号短整型常量返回 DWORD(32 位数据)的 API 函数CreateThread 原型:HANDLE CreateThread

13、LPSECURITY_ATTRIBUTES lpThreadAttributesSIZE_T dwStackSize;LPTHREAD_START_ROUTINE lpStartAddress;LPVOID lpParameter;DWORD dwCreationFlags;LPDWORD lpThreadId ;三 、详细设计3.1 生产者3.1.1 生产一个产品简单模拟了一下,仅输出新产品的ID号void Produce()std:cerr n生产一个产品产品 ID 号为: +ProductID .7std:cerr std:endl;3.1.2 生产者DWORD WINAPI Produ

14、cer(LPVOID lpPara)while(g_continue)WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;3.1.3 生产者流程图图 3-1 生产者流程图3.2 缓冲区3.2.1 把新生产的产品放入缓冲区void Append()std:cerr 把新产品放入缓冲区 . ;g_bufferin = ProductID;in = (in+1)%SIZE_OF_BUFFER;st d:cerr n缓冲区状态:n st d:endl;std:cerr n 缓冲区编号产品编号 n std/输出缓冲区当前的状态for (int i=0;iSIZE_OF_BUFFER;+i)std:co

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号