操作系统多线程OS课程设计生产者与消费者模拟.doc

上传人:土8路 文档编号:10175848 上传时间:2021-04-25 格式:DOC 页数:19 大小:964KB
返回 下载 相关 举报
操作系统多线程OS课程设计生产者与消费者模拟.doc_第1页
第1页 / 共19页
操作系统多线程OS课程设计生产者与消费者模拟.doc_第2页
第2页 / 共19页
操作系统多线程OS课程设计生产者与消费者模拟.doc_第3页
第3页 / 共19页
操作系统多线程OS课程设计生产者与消费者模拟.doc_第4页
第4页 / 共19页
操作系统多线程OS课程设计生产者与消费者模拟.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《操作系统多线程OS课程设计生产者与消费者模拟.doc》由会员分享,可在线阅读,更多相关《操作系统多线程OS课程设计生产者与消费者模拟.doc(19页珍藏版)》请在三一文库上搜索。

1、燕山大学课程设计说明书 课程设计名称:操作系统OS 题目:生产者与消费者模拟班级:08级计算机科学二班 开发小组名称:CHN 课题负责人: 课题组成员: 姓名 学号 班级 自评成绩 08级科学二班 A 08级科学二班 B 08级科学二班 B联系电话:课题开发日期:2011-1-102011-1-14生产者与消费者模拟1、概述 1.1 目的:本软件的目的是通过动态演示,模拟多线程生产者消费者及其进程同步和互斥的程序设计的基本方法。1.2 主要完成的任务:有两组生产者maker1,maker2不断循环的产生数据,有两组转移者mover1、mover2不断循环的转移数据。生产者maker1,make

2、r2通过put操作分别向各自的缓冲池buffer1、buffer2输入数据;转移变量通过move操作把仓库buffer1、buffer2中的产品转移到buffer3;消费者通过get操作从消费处进行消费。put、move、get每次操作一个数据,在操作的过程中数据不丢失,每个Buffer每次只能接受一个put或一个move或一个get,多个操作不能同时操作同一buffer。在运行程序之前能够对buffer1,bufer2,buffer3的容量初始化设置,能够设置生产者1和生产者2生产的速度,move1和move2搬运的速度及get的速度,。能够设置put1,put2,move1,move2,G

3、et线程的数量,表示能够有多少个线程在同时运行。在输入对话框内,对用户进行了控制,只容许用户输入正整数,而禁止输入字符,如果是字符就弹出一对话框提示用户必须输入正整数。运行结束后,能够汇总生产者1和生产者2生产的总产品数,搬运者1和搬运者2搬运的总数及消费者消费的总数。1.3 使用的开发工具:Windows 7操作系统,V C+6.0开发工具,C+编程语言。1.4 解决的主要问题:对Buffer的操作的多线程同步问题,利用操作系统的P、V原语操作对put、move、get等多线程进行协调处理,实现了多道程序同时执行的原理。2 、使用的基本概念和原理2.1基本概念 :面向对象:面向对象是当前计算

4、机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。进程:进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源进程组成。一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。动态性是进程最基本的特性。线程:线程是操作系统分时调度分配CPU时间的基本实体,是进程的一个实体,是被系统独立调度和分派的基本单位,线程基本上不拥有自己的资源,只拥有一点点在运行中必不可少的资源(如程序计数器、一组寄

5、存器和栈),但它可与同属于一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一进程中的多个线程之间可以并发执行。线程的同步:同步多线程(SMT)是一种在一个CPU 的时钟周期内能够执行来自多个线程的指令的硬件多线程技术。本质上,同步多线程是一种将线程级并行处理(多CPU)转化为指令级并行处理(同一CPU)的方法。 同步多线程是单个物理处理器从多个硬件线程上下文同时分派指令的能力。同步多线程用于在商用环境中及为周期/指令(CPI)计数较高的工作负载创造性能优势。 处理器采用超标量结构,最适于以并行方式读取及运行指令。同步多线程使您可在同一处理器上同时调度两个应用程序

6、,从而利用处理器的超标量结构性质。线程的互斥:线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。多道程序:多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行。 多道程序运行的特征是: 1多道:即计算机内存中同时存放几道相互独立的程序。 2宏观上并行:同时进入 系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。 3微观上串行:从微观上看,内存中的多道程序轮流地或分时地占有处理机。2.2基本原理:生产者与消费者同步原理,线程的等待,线程的唤醒,线程的

7、休眠,线程间的同步问题,线程之间的协调的问题。生产者与消费者同步,当buffer中有空间是允许向其中放入产品,当buffer中没有空间时阻塞生产者,当buffer中有数据时消费者从中取走数据并且设置buffer有空间标识,唤醒因此阻塞的进程。 3总体设计3.1技术路线:面向对象程序设计 CCan类 进行参数设置Sim 类进行界面设置Sum类 统计数据结果3.2软件的总体结构:3.3 要确立的线程五个线程Maker1,Maker2,CFMove1,CFMove2,User.利用信号量机制,对线程进行等待,唤醒操作,然后利用线程的休眠来模拟放入,取出的速度以及其它线程操作的速度。4、 详细设计 /

8、下面进行第一生产处,第二生产处,搬运1处,搬运2处,消费者的的线程处理函数,任何程序这里基本都一样,UINT fput1(LPVOID lparam)/This function must be declared as follows: UINT MyControllingFunction( LPVOID pParam );CMultithread3Dlg * dlg =(CMultithread3Dlg *) lparam;/if(dlg-buffer1number2) return 0;int i =dlg-current; while(!dlg-bx.bkill)p(dlg-bx.ful

9、l1);/#define p(s) :WaitForSingleObject(s,INFINITE)p(dlg-bx.buffer1);dlg-id_put1=i;dlg-buffer1number+=1;dlg-bx.bput1=TRUE;dlg-n_putnumber1+;:Sleep(dlg-bx.put1_delay); /这里控制线程运行的速度,delay的时间越高,线程运行的时间越慢v(dlg-bx.buffer1);/#define v(s) :ReleaseSemaphore(s,1,NULL) The state of a semaphore object is signal

10、ed when its count is greater than zero and nonsignaled when its count is equal to zerov(dlg-bx.empty1);dlg-bx.bput1=FALSE;return 0;UINT fput2(LPVOID lparam)/controlling function for the worker thread.CMultithread3Dlg * dlg =(CMultithread3Dlg *) lparam; / if(dlg-buffer1number2) return 0;int i =dlg-cu

11、rrent;while(!dlg-bx.bkill)p(dlg-bx.full2);p(dlg-bx.buffer2);dlg-id_put2=i;dlg-buffer2number+=1;dlg-bx.bput2=TRUE;dlg-n_putnumber2+;:Sleep(dlg-bx.put2_delay);v(dlg-bx.buffer2);v(dlg-bx.empty2);dlg-bx.bput2=FALSE;return 0;UINT fmove1(LPVOID lparam)CMultithread3Dlg *dlg = (CMultithread3Dlg *)lparam; /

12、if(dlg-buffer3number3) return 0;int i =dlg-current;while(!dlg-bx.bkill)p(dlg-bx.empty1);p(dlg-bx.full3);p(dlg-bx.buffer1);p(dlg-bx.buffer3);dlg-bx.bmove1=TRUE;dlg-buffer1number-;dlg-buffer3number+; dlg-move1number+;dlg-id_move1=i;:Sleep(dlg-bx.move1_delay);v(dlg-bx.buffer3);v(dlg-bx.buffer1);v(dlg-b

13、x.empty3);v(dlg-bx.full1);dlg-bx.bmove1=FALSE;return 0;UINT fmove2(LPVOID lparam) CMultithread3Dlg *dlg = (CMultithread3Dlg *)lparam;/if(dlg-buffer3number3) return 0;int i =dlg-current;while(!dlg-bx.bkill)p(dlg-bx.empty2);p(dlg-bx.full3);p(dlg-bx.buffer2);p(dlg-bx.buffer3);dlg-bx.bmove2=TRUE;dlg-buf

14、fer2number-;dlg-buffer3number+; dlg-move2number+;dlg-id_move2=i;:Sleep(dlg-bx.move2_delay);v(dlg-bx.buffer3);v(dlg-bx.buffer2);v(dlg-bx.empty3);v(dlg-bx.full2);dlg-bx.bmove2=FALSE;return 0;UINT fget(LPVOID lparam)CMultithread3Dlg * dlg = (CMultithread3Dlg *)lparam;int i =dlg-current;while (!dlg-bx.b

15、kill)p(dlg-bx.empty3);p(dlg-bx.buffer3);dlg-id_get=i;dlg-buffer3number-;dlg-bx.bget=TRUE;dlg-n_getnumber+;:Sleep(dlg-bx.get_delay);v(dlg-bx.buffer3);v(dlg-bx.full3);dlg-bx.bget=FALSE;return 0;5、编码设计5.1开发环境的设置和建立: 图1:安装VC+6.0 打开MFC 建立工程5.2关键代码void CMultithread3Dlg:OnPaint() if (IsIconic()CPaintDC dc(

16、this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Hei

17、ght() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon); /下面进行绿条的绘制,在OnPaint()函数中,else CPaintDC dc(this);COLORREF col;for(int i=1;i=bx.m_mput1;i+)CRect rc(20,55+i*10,120,(i+1)*10+55);if(id_put1=i&bx.bput1)col=RGB(222,0,0); /当线程运行的时候显示为红条,否则显示为绿条elsecol=RGB(0,222,0);DrawArrow(rc,&dc,col); f

18、or(int ii=1;ii=bx.m_mput2;ii+)CRect rc2(20,ii*10+150+55,120,(ii+1)*10+150+55);if(id_put2=ii&bx.bput2)col=RGB(222,0,0);elsecol=RGB(0,222,0,);DrawArrow(rc2,&dc,col);for(int j=1;j=bx.m_mget;j+)CRect rc1(650,j*10+120,750,(j+1)*10+120);if(id_get =j&bx.bget)col=RGB(222,0,0);elsecol=RGB(0,222,0);DrawArrow(

19、rc1,&dc,col);for(int m=1;m=bx.m_mmove1;m+)CRect rc3(330,m*10+55,430,(m+1)*10+55);if(id_move1=m&bx.bmove1)col=RGB(222,0,0);elsecol=RGB(0,222,0);DrawArrow(rc3,&dc,col); for(int mm=1;mm=bx.m_mmove2;mm+) CRect rc4(330,mm*10+205,430,(mm+1)*10+205);if(id_move2=mm&bx.bmove2)col=RGB(222,0,0);elsecol=RGB(0,2

20、22,0);DrawArrow(rc4,&dc,col);CBrush br(RGB(0,0,222),*oldbr;oldbr =dc.SelectObject(&br);/此处选用br颜色,也就是蓝色为画刷颜色,oldbr是原来的颜色。 /绘制蓝色的buffer,DrawBuffer函数用的是默认的画刷来填充颜色 DrawBuffer(170,60,buffer1number,&dc);DrawBuffer(170,205,buffer2number,&dc);DrawBuffer(500,60,buffer3number,&dc);CDialog:OnPaint();5.3 程序运行结果

21、 图2 程序主界面 图3 参数设置界面 图4 运行结果界面图5 统计结果界面6、 总结6.1 未完成的部分 由于时间仓促和能力有限,本软件界面不是很友好,不是很美观,且程序写得比较简单。6.2小组成员分工及评定:主程序设计60%,界面设计10%,实验报告10%; 自我评定:A:主程序设计20%,界面设计80%,实验报告10%; 自我评定:B:主程序设计20%,界面设计10%,实验报告80%; 自我评定:B6.3体会 通过本次课程设计,我们对操作系统的多线程机制以及p、v操作有了更深一步的认识,同时对MFC的多线程的运用更加熟练。我们把这个学期所学的操作系统的课程巩固了一下,将学过的内容形象的展现在计算机上,并且也复习了上学期的C+课程,将理论知识上机实践,尤其是线程部分的并行操作。在这几天里,学到了很多书上学不到的东西,一个环节出错就会影响整个程序的运行,需要细心和耐心来查错,并且需要查阅大量的资料,必要的时候还会请教同学和老师。同时,团队精神也是很重要的,我们三个人组成一组,各司其职,互补长短,明白了合作的重要性。 总之,经过了这个课程设计,我们不仅巩固了知识,还学会了细心、合作的精神,把书上的东西活用,把学到的知识真正能掌握。7、参考文献汤子瀛等,计算机操作系统,西安电子科技大学出版社2001年;申利民等,操作系统课程设计指导书,燕山大学 2007年

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1