《2022年程序设计说明书 .pdf》由会员分享,可在线阅读,更多相关《2022年程序设计说明书 .pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、燕山大学操作系统课程设计说明书1 燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作班级:软件工程 2 班开发小组名称:多道程序缓冲区协调操作小组课题负责人:马灿课题组成员:马灿姓名:马灿学号:100120010039 班级:软件工程 2 班自评成绩:A 课题开发日期:2012.01.名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 16 页 -燕山大学操作系统课程设计说明书2 目录1 概述4 1.1.目的4 1.2.主要完成的任务41.3.使用的开发工具5 1.4.解决的主要问题5 2.使用的基本概念和原理5 2.1.基本概念5 2.2.基本原理5 3 总体
2、设计 6 3.1 基本的技术路线63.2 软件的总体结构6 3.3 模块关系6 3.4 总体流程6 3.5 创立的进程、线程6 4.详细设计 7 4.1.线程操作的函数7 4.2.三个缓冲池对应三个空区信号,通用函数7 4.3 三个缓冲池对应三个数据信号7 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 16 页 -燕山大学操作系统课程设计说明书3 4.4 互斥信号7 5.编码设计 8 5.1 开发环境的设置和建立8 5.2 程序设计时要注意的事项85.3 关键控件的特点和使用9 5.4 主要程序的代码设计及注释9 5.5 解决的技术难点、经常犯的错误14 6.测试时出现过的问题
3、及其解决方法14 6.2.问题 2146.1.问题 114 7.软件使用说明.14 7.1 基本功能14 7.2 需要运行的环境14 7.3 运行15 7.4 操作15 8.总结159.参考文献.16 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 16 页 -燕山大学操作系统课程设计说明书4 1 概述1.1.目的通过实现多线程的生产者、消费者问题,掌握对线程、互斥信号及其同步机制的学习,巩固对线程实验的代码的实践能力,加深对相关基本概念的理解,将学习内容与实践有机的结合起来。而本实现界面的目的是通过动态演示,模拟多线程生产者消费者及其进程同步和互斥的程序设计的基本方法。1.2.
4、主要完成的任务有多个 PUT 操作要不断循环地向Buffer1 送字符数据,有Move1 操作不断地将Buffer1的数据取到Buffer2,Move2 操作不断地将Buffer2 的数据取到Buffer3,有多个GET 操作要不断地从Buffer3 中取数据。PUT、MOVE、GET 每次操作一个数据,为了在操作的过程中要保证数据不丢失,每个 Buffer 每次只能接受一个PUT 或一个 Move 或一个 Get,多个操作不能同时操作同一BUFFER。设计一个多道程序完成上述操作。图 1 Buffer 操作基本功能要求(1)可以随机产生字符数据,由put 操作放入Buff1,buffer 中
5、容量单位是字符。(2)提供良好图形界面,显示Buffer 的操作过程。(3)可以设定各Buffer 的容量、PUT、GET、Move 操作的个数;(4)可以设定 PUT、GET、Move 操作的速度;(5)实时显示每个Buffer 中数据的个数和数据的内容,空闲Buffer 的空间的个数;(6)实时显示线程、进程所处于等待(阻塞)状态的个数(7)程序运行结束,显示汇总数据:总的运行时间;Buffer 中数据的个数;已放入 BUFFER 的数据个数;已放已取的数据个数;平均每个buffer 中的数据个数。1.3.使用的开发工具Windows 7 操作系统,V C+6.0 开发工具,C+编程语言P
6、ut Move2 Buff1 Buff2 Buff3 GetMove1 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 16 页 -燕山大学操作系统课程设计说明书5 1.4.解决的主要问题通过对三个Buffer的操作,利用操作系统课程所学的P、V 原语操作对put、move1、move2、get等多线程进行协调处理,实现了多道程序同时执行的原理。并在执行时动态显示每个 Buffer 中数据的个数和数据的内容,空闲Buffer 的空间的个数。2.使用的基本概念和原理2.1.基本概念多道程序:多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插
7、运行。特征:多道,即计算机内存中同时存放几道相互独立的程序;宏观上并行,同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕;微观上串行,从微观上看,内存中的多道程序轮流地或分时地占有处理机。进程:进程是操作系统结构的基础,是一个正在执行的程序,计算机中正在运行的程序实例,可以分配给处理器并由处理器执行的一个实体,由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。线程:线程是进程 中某个单一顺序的控制流。也被称为轻量进程。计算机科学术语,指运行中的程序的调度单位同步:同步主要任务是对多个相关进程在执行次序上进行协调,以使得并发执行的进程间有效
8、的共享资源和相互合作,从而使程序的执行具有再现性。互斥:线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。2.2.基本原理在 put 与 move1、move2 与 get、move1/move2 之间都有n 个公用的缓冲池,这时可以利用三个互斥信号mutex 实现诸进程或线程对缓冲池的互斥使用,然后利用个缓冲池的empty 和 full 信号表示缓冲池中空缓冲区和满缓冲区的数目。只要缓冲池未满即可放数据,缓冲池有数据即可取数据。3 总体设计3.1 基本的技术路线面向过程名师资料总结-精品资料欢迎下载-名师精心整理-
9、第 5 页,共 16 页 -燕山大学操作系统课程设计说明书6 3.2 软件的总体结构图 2 总体结构3.3 模块关系主要分为显示模块、数据模块和线程模块。模块之间的关系显示模块显示的数据模块的内容,而数据模块又影响线程模块,三个模块互相影响,并根据各自的变化,实时显示并协调工作。3.4 总体流程图 3 总体流程3.5 创立的进程、线程进程:四个进程,分别为put、move1、move2、get。线程:与put、move1、move2、get参数设定的值有关,总线程为参数之和。4.详细设计4.1.线程操作的函数(1)ThreadPut 线程(往buffer1里放数据,相当于生产者)。DWORD
10、WINAPI ThreadPut(LPVOID lpParameter)Put Move2 Buff1 Buff2 Buff3 GetMove1 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 16 页 -燕山大学操作系统课程设计说明书7(2)ThreadMove1 线程(从buffer1里取数据并放到buffer2里,相当于搬运者1)。DWORD WINAPI ThreadMove1(LPVOID lpParameter)(3)ThreadMove2 线程(从buffer2里取数据并放到buffer3里,相当于搬运者2)。DWORD WINAPI ThreadMove2(LPV
11、OID lpParameter)(4)GET线程(从buffer3里取数据,相当于消费者)。DWORD WINAPI ThreadGet(LPVOID lpParameter)在界面上可设置各种线程的个数,以及各个buffer的容量。4.2.三个缓冲池对应三个空区信号,通用函数空区信号初始化:SemaphoreEmpty=CreateSemaphore(NULL,m_buffer,m_buffer,NULL);创建缓冲区空的信号量SemaphoreEmpty,该值为true时表示缓冲区为空。申请空区原语:WaitForSingleObject(SemaphoreEmpty,INFINITE);
12、释放空区信号原语:ReleaseSemaphore(SemaphoreEmpty,1,NULL);利 用 此 代 码 函 数,改 变 信 号 角 标,分 别 对 三 个 缓 冲 池 建 立 相 应 的 空 区 信 号SemaphoreEmpty1、SemaphoreEmpty2、SemaphoreEmpty3。4.3 三个缓冲池对应三个数据信号数据信号初始化:SemaphoreFULL=CreateSemaphore(NULL,0,m_buffer,NULL);创建缓冲区满的信号量SemaphoreFULL,值为true 时表示缓冲区已满。四个参数分别为:表示是否允许继承、设置信号机的初始计数
13、、设置信号机的最大计数(即 buffer的容量)、指定信号机对象的名称(-1 是因为计数从开始)。判断是否有数据原语:WaitForSingleObject(SemaphoreFULL,INFINITE);释放数据信号原语:ReleaseSemaphore(SemaphoreFULL,1,NULL);利 用 此 代 码 函 数,改 变 信 号 角 标,分 别 对 三 个 缓 冲 池 建 立 相 应 的 数 据 信 号SemaphoreFULL1、SemaphoreFULL2、SemaphoreFULL3。4.4 互斥信号初始化:mutex=CreateMutex(NULL,false,NULL
14、);创建互斥信号量mutex,表示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。三个参数表示的意义分别为:指向安全属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针。申请对缓冲池的操作原语:WaitForSingleObject(mutex,INFINITE);释放对缓冲池的操作原语:ReleaseMutex(mutex);利用此代码函数,改变信号角标,分别对三个缓冲池建立相应的互斥信号mutex1、mutex2、mutex3。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 16 页 -燕山大学操作系统课程设计说明书8 5.编码设计5.1 开发环境的设置和
15、建立截图 1 开发环境建立5.2 程序设计时要注意的事项申请信号时P、V 原语的顺序。例如:创建move1 线程时,首先要先申请buffer2 的空区,buffer1 的数据,再进行申请互斥信号mutex1、mutex2,否则将产生不可预知的结果。代码如下:WaitForSingleObject(SemaphoreFULL1,INFINITE);WaitForSingleObject(SemaphoreEmpty2,INFINITE);WaitForSingleObject(mutex2,INFINITE);WaitForSingleObject(mutex1,INFINITE);名师资料总结
16、-精品资料欢迎下载-名师精心整理-第 8 页,共 16 页 -燕山大学操作系统课程设计说明书9 5.3 关键控件的特点和使用控件MFC类描述按钮CButton 用来产生某种行为的按钮,以及复选框、单选钮和组框编辑框CEdit 用于键入文本列表CListCtrl 显示文本及其图标列表的窗口列表框CListBox 包括一系列字符串的列表静态文本CStatic 常用于为其它控件提供标签表一关键控件名称、作用5.4 主要程序的代码设计及注释5.4.1 开始执行按钮相关代码void COs1Dlg:Onbegin()/开始执行/TODO:Add your control notification han
17、dler code here /UpdateData(1);m_list1=(CListBox*)GetDlgItem(IDC_LIST1);m_list2=(CListBox*)GetDlgItem(IDC_LIST2);m_list3=(CListBox*)GetDlgItem(IDC_LIST3);/信号初始化 SemaphoreEmpty1=CreateSemaphore(NULL,m_buffer1,m_buffer1,NULL);SemaphoreFULL1=CreateSemaphore(NULL,0,m_buffer1,NULL);mutex1=CreateMutex(NULL
18、,false,NULL);SemaphoreEmpty2=CreateSemaphore(NULL,m_buffer2,m_buffer2,NULL);SemaphoreFULL2=CreateSemaphore(NULL,0,m_buffer2,NULL);mutex2=CreateMutex(NULL,false,NULL);SemaphoreEmpty3=CreateSemaphore(NULL,m_buffer3,m_buffer3,NULL);SemaphoreFULL3=CreateSemaphore(NULL,0,m_buffer3,NULL);mutex3=CreateMute
19、x(NULL,false,NULL);int j=put;toend=1;clock_t pp;pp=clock();start=pp;名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 16 页 -燕山大学操作系统课程设计说明书10 while(j!=0)/创建 put 类线程 Threadpj-1=CreateThread(NULL,0,ThreadPut,NULL,0,&ThreadPj-1);j-;int i=move1;while(i!=0)/创建 move1 类线程 Threadm1i-1=CreateThread(NULL,0,ThreadMove1,NULL,0,&T
20、hreadM1i-1);i-;int k=move2;while(k!=0)/创建 move2 类线程 Threadm2k-1=CreateThread(NULL,0,ThreadMove2,NULL,0,&ThreadM2k-1);k-;int t=get;while(t!=0)/创建 move1 类线程 Threadgt-1=CreateThread(NULL,0,ThreadGet,NULL,0,&ThreadGt-1);t-;m_begin.EnableWindow(false);/对各个按钮可操作不开操作的控制m_stop.EnableWindow(true);m_suspend.E
21、nableWindow(true);m_continue.EnableWindow(true);5.4.2put线程相关代码DWORD WINAPI ThreadPut(LPVOID lpParameter)/put线程 while(toend)Sleep(speed1);CString str;str=rand()%128;/生成随机字符WaitForSingleObject(SemaphoreEmpty1,INFINITE);/申请空间名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 16 页 -燕山大学操作系统课程设计说明书11 WaitForSingleObject(mu
22、tex1,INFINITE);/申请互斥信号m_list1-InsertString(-1,str);b1+;buffernum1+;CString s,s1,buff;s.Format(%d,b1);s1.Format(%d,buffer1-b1);full1_static-SetWindowText(s);empty1_static-SetWindowText(s1);ReleaseMutex(mutex1);/释放信号ReleaseSemaphore(SemaphoreFULL1,1,NULL);buff.Format(%s%d,已放入 BUFFER 的数据个数:,buffernum1)
23、;product_static-SetWindowText(buff);return 1;5.4.3 move1 线程相关代码DWORD WINAPI Threadmove1(LPVOID lpParameter)/move1线程 int n=move1num;move1num+;CString str,str2,str1;while(toend)Sleep(move1speed);WaitForSingleObject(SemaphoreFULL1,INFINITE);WaitForSingleObject(SemaphoreEmpty2,INFINITE);WaitForSingleObj
24、ect(hMutex1,INFINITE);WaitForSingleObject(hMutex2,INFINITE);str2.Format(%s%d%s,数据个数:,list1-GetCount(),个);/动 态 显 示数据个数、空区个数buf1data_num-SetWindowText(str2);str1.Format(%s%d%s,空区个数:,buffer1-list1-GetCount(),个);buf1emp_num-SetWindowText(str1);list1-GetText(0,str);list2-AddString(str);list1-DeleteString
25、(0);str2.Format(%s%d%s,数据个数:,list2-GetCount(),个);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 16 页 -燕山大学操作系统课程设计说明书12 buf2data_num-SetWindowText(str2);str2.Format(%s%d%s,空区个数:,buffer2-list2-GetCount(),个);buf2emp_num-SetWindowText(str2);ReleaseMutex(hMutex1);ReleaseMutex(hMutex2);ReleaseSemaphore(SemaphoreEmpty1,
26、1,NULL);ReleaseSemaphore(SemaphoreFULL2,1,NULL);if(ifend=1)ifend=0;return 1;return 1;5.4.4 move2 线程相关代码DWORD WINAPI Threadmove2(LPVOID lpParameter)/move2线程 int p=move2num;move2num+;while(toend)Sleep(move2speed);CString str,str2;WaitForSingleObject(SemaphoreFULL2,INFINITE);WaitForSingleObject(Semapho
27、reEmpty3,INFINITE);WaitForSingleObject(hMutex2,INFINITE);WaitForSingleObject(hMutex3,INFINITE);list2-GetText(0,str);list3-AddString(str);list2-DeleteString(0);str2.Format(%s%d%s,数据个数:,list2-GetCount(),个);/动态显示空区个数,数据个数buf2data_num-SetWindowText(str2);str2.Format(%s%d%s,空区个数:,buffer2-list2-GetCount()
28、,个);buf2emp_num-SetWindowText(str2);str2.Format(%s%d%s,数据个数:,list3-GetCount(),个);buf3data_num-SetWindowText(str2);名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 16 页 -燕山大学操作系统课程设计说明书13 str2.Format(%s%d%s,空区个数:,buffer3-list3-GetCount(),个);buf3emp_num-SetWindowText(str2);ReleaseMutex(hMutex2);ReleaseMutex(hMutex3);R
29、eleaseSemaphore(SemaphoreEmpty2,1,NULL);ReleaseSemaphore(SemaphoreFULL3,1,NULL);if(ifend=1)ifend=0;return 1;return 1;5.4.5get线程相关代码DWORD WINAPI Threadget(LPVOID lpParameter)/get线程 int m=getnum;getnum+;while(toend)CString str2;Sleep(getspeed);WaitForSingleObject(SemaphoreFULL3,INFINITE);/申请需要的信号WaitF
30、orSingleObject(hMutex2,INFINITE);WaitForSingleObject(hMutex3,INFINITE);list3-DeleteString(0);str2.Format(%s%d%s,数据个数:,list3-GetCount(),个);/动态显示个数buf3data_num-SetWindowText(str2);str2.Format(%s%d%s,空区个数:,buffer3-list3-GetCount(),个);buf3emp_num-SetWindowText(str2);ReleaseMutex(hMutex2);/释放相关信号ReleaseM
31、utex(hMutex3);ReleaseSemaphore(SemaphoreEmpty3,1,NULL);return 1;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 16 页 -燕山大学操作系统课程设计说明书14 5.5 解决的技术难点、经常犯的错误因为四类线程类似,拥有类似代码,所以当重复时有点变量未改角标,导致用到的变量未声明的错误。6.测试时出现过的问题及其解决方法6.1.问题 1 开始按钮开始运行,但是暂停按钮出现问题,停不下开。解决方法:将进程挂起,利用函数SuspendThread();将相应的线程挂起,增设一个继续按钮,利用函数ResumeThread(
32、);继续运行。6.2.问题 2 停止按钮只能停止第一个缓冲的put 操作,不能全部停止。解决方法:利用循环函数将各线程终止for(;i!=0;i-)DWORD j;GetExitCodeThread(Threadpi-1,&j);:TerminateThread(Threadpi-1,j);CloseHandle(Threadpi-1);7.软件使用说明7.1 基本功能设定各Buffer 的容量、PUT、GET、Move 操作的个数;设定PUT、GET、Move 操作的速度;实时显示每个Buffer 中数据的个数和数据的内容,空闲Buffer 的空间的个数;实时显示线程、进程所处于等待(阻塞)
33、状态的个数程序运行结束,显示汇总数据:总的运行时间,Buffer 中数据的个数,已放入BUFFER 的数据个数,已放已取的数据个数;操作功能:开始、暂停、继续、停止。7.2 需要运行的环境Windows 7 操作系统,vc 6.0名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 16 页 -燕山大学操作系统课程设计说明书15 7.3 运行截图 2 界面7.4 操作截图 3 线程参数设置截图 4 buffer容量设置名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 16 页 -燕山大学操作系统课程设计说明书16 截图 5 控制按钮8.总结所要求的功能基本实现,参数设定
34、,实时显示及汇总数据都已经完成。小组成员马灿,界面设计、代码编写、报告都自己完成,成绩自我评定:A。收获、经验、教训和感受等;本次课设时间较短,但是操作系统的课设让我学到了很多很多东西,开始的时候一点头绪都没有,然后不停得看书看课件,问同学,上网查资料,然后是用VC代码实现。通过本次课程设计,我巩固了使用多线程编程的方法,和使用信号量同步进/线程的技巧。本次课程设计的程序的运行结果跟预期的一致,说明该程序能顺利解决生产者消费者问题,实现了本次课程设计的目的。收获:任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效。短短的课程设计就要结束了,不但对专业知识有了更深的理解,更使自己认识到实践的重要性,理论、实践相结合才能达到很好的学习效果,特别是程序语言的学习9.参考文献 1 作者:汤小丹梁红兵哲凤屏 汤子瀛 .书名:计算机操作系统.出版社:西安电子科技大学出版社。,出版年:2011.3 2 百度百科上相关概念介绍,例如:vc+6.0 的界面设计与资源编辑器名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 16 页 -