燕山大学课程设计说明书课程设计名称:操作系统题目:多道程序缓冲区协调操作(模拟生产者消费者问题)课题负责人:学院:信息科学与工程学院班级:姓名:学号:课题开发日期:2014年1月13日自评成绩: A目录1概述--------------------------------------------------------------------------------------3目的--------------------------------------------------------3主要完成的任务----------------------------------------------3使用的开发工具、开发语言------------------------------------3本软件解决的主要问题 ---------------------------------------42 设计的基本理念、概念和原理------------------------------------------------4设计的基本理念----------------------------------------------4基本概念----------------------------------------------------4基本原理----------------------------------------------------53 总体设计----------------------------------------------------5基本的技术路线:面向对象--------------------------------------------------------5模块关系及总体流程-------------------------------------------54 详细设计----------------------------------------------------7变量设计----------------------------------------------------7线程的设计--------------------------------------------------7button按钮的设计-------------------------------------------85编码设计----------------------------------------------------9开发环境----------------------------------------------------9注意事项----------------------------------------------------9主要代码设计------------------------------------------------9 PUTTER线程的设计---------------------------------------------------9MOVER1线程的设计---------------------------------------------------10GETTER1线程的设计--------------------------------------------------11“开始”按钮的设计--------------------------------------------------12“结束”按钮的设计--------------------------------------------------14解决的主要难题----------------------------------------------166测试出现的问题及其解决方案-------------------------------167工程总结----------------------------------------------------168参考文献----------------------------------------------------16多道程序缓冲区协调操作演示程序设计说明书1概述目的计算机操作系统是计算机系统中最不可缺少的,最常用的软件,也是核心的,最接近于计算机硬件的软件。
其特点是内容繁多,概念抽象,因此造成理解困难,掌握不易。
本软件的主要目的是通过直观的演示,使学生能够感性的明白掌握多道程序及其进程同步和互斥的程序设计的基本方法。
主要完成的任务(1)可随机产生字符数据,由生产者的put操作不断将生产的字符数据放入容器1(Buffer1)中。
(2)通过搬运者的Move1操作要不断地将容器1(Buffer1)的数据取到容器2(Buffer2)中。
(3)通过搬运者的Move2操作要不断地将容器1(Buffer1)的数据取到容器3(Buffer3)中。
(4)通过消费者1的GET操作不断的从容器2(buffer2)中取出数据(5)通过消费者2的GET操作不断地从容器3(Buffer3)中取出数据。
(6)生产者,搬运者,消费者的数目,buffer容量可自己设定,但数目不宜过多;默认为生产者5,消费者1为5,消费者2为5,Move1为2,Move2为2,buffer1容量为10,buffer2容量为10,buffer3容量为10。
(7) PUT、 Move1、Move2、 GET1,GET2每次操作一个数据,在操作的过程中数据不丢失,每个Buffer每次只能接受一个PUT或一个Move或一个Get,多个操作不能同时操作同一BUFFER。
(8)能够实时显示Buffer的操作过程,以及每个Buffer的当前放入的数据,每个buffer中的数据的个数。
(9)能够对生产者,搬运者,消费者的速度进行自由控制。
(10)当程序运行开始后,计时器就开始计时,直到运行结束,显示运行的总时间。
(11)运行结束后,能够汇总总运行时时间、已生产产品数、消费者1已消费产品数、消费者2已消费的产品数、总消费的产品数。
使用的开发工具、开发语言开发工具:VS2010开发语言:C++C++是面向对象的一种编程语言,窗口程序设计中MFC已经将windows最底层的API函数以类的形式封装好,使用方便。
其特点有:1.面向对象;2.平台无关性;3.安全性;4.健壮性;本软件解决的主要问题对Buffer操作的多线程同步问题,利用操作系统的P、V原语操作和C++语言的Thread线程对put、move、get等多线程进行协调处理,实现了多线程并发执行的原理。
用程序演示了操作系统中经典的生产者和消费者问题。
2 设计的基本理念、概念和原理设计的基本理念使用VS2010创建了一个基本对话框类,并在对话框中添加了基本需要的所有控件:(1)buffer1,buffer2,buffer3三个LISTBOX控件,用于显示各个buffer 中的当前内容。
(2)添加了3个编辑框控件,分别用于对3个容器(buffer)容量的控制。
(3)添加1个编辑框控件用于输入数值确定线程执行速度。
(4)添加5个编辑框控件,用于对生产者,移动物流,消费者数量的控制。
五个线程用于对buffer容器的控制(PUTTER,MOVER1,MOVER2,GETTER1,GETTER2):(1) PUTTER线程产生随机字符,并放入buffer1中,实现生产者的生产过程。
(2) MOVER1,MOVER2线程分别将buffer1中的数据移动至buffer2 和buffer3中。
(3) GETTER1,GETTER2线程分别将buffer2和buffer3中的数据字符移出,实现消费者的消费过程。
多个变量分别统计需要显示的数据:(1)三个变量分别统计buffer1,buffer2,buffer3中的数据并实时显示出来。
(2)五个变量进行数据汇总,显示最后的运行总时间,生产者生产数量,消费者消费数量。
通过MFC的对话框中按钮实现对所有线程的控制:(1)“开始”按钮:开始所有线程,实现多线程程序同步。
(2)“结束”按钮:结束所有线程,并显示数据汇总情况。
2.2基本概念面向对象,进程,线程,线程的同步,线程的互斥,多道程序。
基本原理经典的生产者与消费者同步原理,通过互斥体和互斥信号来实现线程的等待,线程间的同步问题,线程之间的协调的问题。
3.总体设计基本的技术路线:面向对象运用面向对象的设计理念,设计所要求的PUTTER,MOVER1,MOVER2,GETTER1,GETTER2五个线程,达到信号量的控制,变量的值确定,实现BUFFER一次只能操作一个动作,实现线程的同步,阻塞以及他们之间的协调问题。
模块关系及总体流程图1. 模块关系图2.总体流程4.详细设计变量设计g_hMutex1,g_hMutex2,g_hMutex3:三个互斥体,分别控制一次只能对buffer实现一次操作。
g_hFullItems1,g_hFullItems2,g_hFullItems3g_hEmptyItems1,g_hEmptyItems2,g_hEmptyItems3:六个信号量,分别控制buffer中是否有空闲空间以及是否有数据可供移动,并进行互斥操作。
clock_t类型的 start,finish变量,通过调用clock()函数得到线程运行的总时间。
struct PThread{int ptid;CpacDlg * dlg;}; 定义线程的结构体,用于线程通过结构体参数调用窗口类,从而实现线程对窗口的控制。
SIZE_1 , SIZE_2 , SIZE_3:编辑框控件添加的变量,从而实现动态对容器buffer容量的控制。
SPEED:控件添加的变量,实现对线程速度的控制。
Produce_Num ,Consumer1_Num ,Consumer2_Num ,Move1_Num ,Move2_Num:控件添加的变量,实现对生产者,消费者,物流移动数量的控制。
Con1_Num ,Pro_Num ,Con2_Num ,Con_Num:控件添加的变量,实现最终的数据统计汇总显示。
Buffer1,buffer2,buffer3:ListBox控件添加的控制变量,用于显示各个buffer中的字符数据内容。
线程的设计PUTTER线程产生随机字符,并放入buffer1中,实现生产者的生产过程。
DWORD WINAPI PUTTER(LPVOID para) 编写代码要有良好的格式,有良好的注释,此程序要特别注意2.注意变量的使用,防止地址引用错误的产生主要代码设计PUTTER线程的设计:DWORD WINAPI PUTTER(LPVOID para) 考文献【1】汤小丹,汤子瀛等.《计算机操作系统》.西安电子科技大学出版社.2009【2】Stephen Prata著.《C++ Primer Plus》.人民邮电大学出版社.2013。