燕山大学操作系统课程设计报告说明书.docx
- 文档编号:5859136
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:129.31KB
燕山大学操作系统课程设计报告说明书.docx
《燕山大学操作系统课程设计报告说明书.docx》由会员分享,可在线阅读,更多相关《燕山大学操作系统课程设计报告说明书.docx(19页珍藏版)》请在冰豆网上搜索。
燕山大学操作系统课程设计报告说明书
燕山大学课程设计说明书
课程设计名称:
操作系统
题目:
多道程序缓冲区协调操作
〔模拟生产者消费者问题〕
课题负责人:
学院:
信息科学与工程学院
班级:
:
学号:
课题开发日期:
2021年1月13日
自评成绩:
A
1概述--------------------------------------------------------------------------------------3
1.1目的--------------------------------------------------------3
1.2主要完成的任务----------------------------------------------3
1.3使用的开发工具、开发语言------------------------------------3
1.4本软件解决的主要问题---------------------------------------4
2设计的根本理念、概念和原理------------------------------------------------4
2.1设计的根本理念----------------------------------------------4
2.2根本概念----------------------------------------------------4
2.3根本原理----------------------------------------------------5
3总体设计----------------------------------------------------5
3.1根本的技术路线:
面向对象--------------------------------------------------------5
3.2模块关系及总体流程-------------------------------------------5
4详细设计----------------------------------------------------7
4.1变量设计----------------------------------------------------7
4.2线程的设计--------------------------------------------------7
4.3button按钮的设计-------------------------------------------8
5编码设计----------------------------------------------------9
5.1开发环境----------------------------------------------------9
5.2考前须知----------------------------------------------------9
5.3主要代码设计------------------------------------------------9
PUTTER线程的设计---------------------------------------------------9
MOVER1线程的设计---------------------------------------------------10
GETTER1线程的设计--------------------------------------------------11
“开场〞按钮的设计--------------------------------------------------12
“完毕〞按钮的设计--------------------------------------------------14
5.4解决的主要难题----------------------------------------------16
6测试出现的问题及其解决方案-------------------------------16
7工程总结----------------------------------------------------16
8参考文献----------------------------------------------------16
多道程序缓冲区协调操作演示程序设计说明书
1概述
1.1目的
计算机操作系统是计算机系统中最不可缺少的,最常用的软件,也是核心的,最接近于计算机硬件的软件。
其特点是容繁多,概念抽象,因此造成理解困难,掌握不易。
本软件的主要目的是通过直观的演示,使学生能够感性的明白掌握多道程序及其进程同步和互斥的程序设计的根本方法。
1.2主要完成的任务
(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已消费的产品数、总消费的产品数。
1.3使用的开发工具、开发语言
开发工具:
VS2021
开发语言:
C++
C++是面向对象的一种编程语言,窗口程序设计中MFC已经将windows最底层的API函数以类的形式封装好,使用方便。
其特点有:
1.面向对象;
2.平台无关性;
3.平安性;
4.强健性;
1.4本软件解决的主要问题
对Buffer操作的多线程同步问题,利用操作系统的P、V原语操作和C++语言的Thread线程对put、move、get等多线程进展协调处理,实现了多线程并发执行的原理。
用程序演示了操作系统中经典的生产者和消费者问题。
2设计的根本理念、概念和原理
2.1设计的根本理念
使用VS2021创立了一个根本对话框类,并在对话框中添加了根本需要的所有控件:
(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根本概念
面向对象,进程,线程,线程的同步,线程的互斥,多道程序。
2.3根本原理
经典的生产者与消费者同步原理,通过互斥体和互斥信号来实现线程的等待,线程间的同步问题,线程之间的协调的问题。
3.总体设计
3.1根本的技术路线:
面向对象
运用面向对象的设计理念,设计所要求的PUTTER,MOVER1,MOVER2,GETTER1,GETTER2五个线程,到达信号量的控制,变量的值确定,实现BUFFER一次只能操作一个动作,实现线程的同步,阻塞以及他们之间的协调问题。
3.2模块关系及总体流程
图1.模块关系
图2.总体流程
4.详细设计
4.1变量设计
g_hMutex1,g_hMutex2,g_hMutex3:
三个互斥体,分别控制一次只能对buffer实现一次操作。
g_hFullItems1,g_hFullItems2,g_hFullItems3
g_hEmptyItems1,g_hEmptyItems2,g_hEmptyItems3:
六个信号量,分别控制buffer中是否有空闲空间以及是否有数据可供移动,并进展互斥操作。
clock_t类型的start,finish变量,通过调用clock〔〕函数得到线程运行的总时间。
structPThread{
intptid;
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中的字符数据容。
4.2线程的设计
PUTTER线程产生随机字符,并放入buffer1中,实现生产者的生产过程。
DWORDWINAPIPUTTER(LPVOIDpara)//PUT线程
其参数为LPVOIDpara,在创立线程时通过
P_hThreads[i]=CreateThread(NULL,0,PUTTER,(LPVOID)&pthread0,0,&putID[i]);
语句,第四个参数传递了构造体参数,将当前对话框窗口类指针传递给线程函数,通过
PThread*pthread=(PThread*)para;//规化参数
CpacDlg*dlg=pthread->dlg;
语句来实现对当前对话框窗口中所有参数的调用。
MOVER1,MOVER2,GETTER1,GETTER2线程与PUTTER线程类似。
4.3button按钮的设计
“开场〞按钮:
创立每个互斥体,互斥信号以及线程。
voidCpacDlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData
(1);
g_hMutex1=:
:
CreateMutex(NULL,FALSE,NULL);//buff1互斥锁
g_hFullItems1=:
:
CreateSemaphore(NULL,0,SIZE_1,NULL);//buff1信号量
g_hEmptyItems1=:
:
CreateSemaphore(NULL,SIZE_1,
SIZE_1,NULL);
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
//创立PUT线程
for(inti=0;i { pthread0.dlg=this; pthread0.ptid=i; P_hThreads[i] =CreateThread(NULL,0,PUTTER,(LPVOID)&pthread0,0,&putID[i]);////////////////// if(P_hThreads[i]==NULL)MessageBox(TEXT("线程创立错误! ")); } 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 } “完毕〞按钮: 完毕每一个线程,并进展数据汇总显示到对话框上。 voidCpacDlg: : OnBnClickedButton2() { //TODO: 在此添加控件通知处理程序代码 //UpdateData (1); DWORDKP_Thread[10]; for(inti=0;i { TerminateThread(P_hThreads[i],KP_Thread[i]); } 。 。 。 。 。 。 。 。 。 。 } 5编码设计 5.1开发环境 Windows7,已安装了VS2021。 由于本软件是用C++语言开发,所以跨平台性能比拟好。 本程序使用的主要类、函数,都是自己的写的,用到windowsbuilder插件,用于设计界面。 5.2考前须知 1.编写代码要有良好的格式,有良好的注释,此程序要特别注意 2.注意变量的使用,防止地址引用错误的产生 5.3主要代码设计 PUTTER线程的设计: DWORDWINAPIPUTTER(LPVOIDpara)//PUT线程 { PThread*pthread=(PThread*)para;//规化参数 CpacDlg*dlg=pthread->dlg; inti=pthread->ptid; intj=dlg->SPEED; intspeed=1000*j; LARGE_INTEGERnFrequency;//设置随机数的种子 if(: : QueryPerformanceFrequency(&nFrequency)) { //如果支持高性能精度计数器,那么使用其初始化随机种子(微秒级) LARGE_INTEGERnStartCounter; : : QueryPerformanceCounter(&nStartCounter); : : srand((unsigned)nStartCounter.LowPart); } else//否那么使用当前系统时间初始化随机种子(毫秒级) { : : srand((unsigned)time(NULL)); } while(true) { CStringbuf; WaitForSingleObject(g_hEmptyItems1,INFINITE);//进展P操作 WaitForSingleObject(g_hMutex1,INFINITE); //产生随机字符〔A-Z〕 charch; ch=char((rand()%26)+65); buf.Format(_T("put-->%c"),ch); dlg->buffer1.InsertString(0,buf); dlg->Pro_Num++;//确定生产总数量 intbuf1c;//确定当前buffer1中的产品数量 CStringstr; buf1c=dlg->buffer1.GetCount(); str.Format(_T("%d个"),buf1c); dlg->Buffer_C.SetWindowTextW(str);//在窗口中显示当前buffer1的数据数量 : : Sleep(speed);//速度设置 ReleaseMutex(g_hMutex1);//进展V操作 ReleaseSemaphore(g_hFullItems1,1,NULL); } return0; } MOVER1线程的设计: DWORDWINAPIMOVER1(LPVOIDpara)//MOVE1线程 { PThread*pthread=(PThread*)para;//规化参数 CpacDlg*dlg=pthread->dlg; inti=pthread->ptid; intj=(dlg->SPEED); intspeed=1000*j; while(true) { WaitForSingleObject(g_hFullItems1,INFINITE);//进展P操作 WaitForSingleObject(g_hEmptyItems2,INFINITE); WaitForSingleObject(g_hMutex1,INFINITE); WaitForSingleObject(g_hMutex2,INFINITE); //将buffer1中的数据移至buffer2中 CStringcs; intn; n=dlg->buffer1.GetCount(); dlg->buffer1.GetText(n-1,cs); dlg->buffer1.DeleteString(n-1); CStringcc; cc.Format(_T("move1--")); cs=cc+cs; dlg->buffer2.InsertString(0,cs); intbuf1c;//确定当前buffer1中的产品数量 CStringstr; buf1c=dlg->buffer1.GetCount(); str.Format(_T("%d个"),buf1c); dlg->Buffer_C.SetWindowTextW(str);//显示当前buffer1中的产品数量 intbuf2c;//确定当前buffer2中的产品数量 CStringstr1; buf2c=dlg->buffer2.GetCount(); str1.Format(_T("%d个"),buf2c); dlg->Buf_C1.SetWindowTextW(str1);//显示当前buffer2中的产品数量 : : Sleep(speed);//设置速度 ReleaseMutex(g_hMutex2);//进展V操作 ReleaseMutex(g_hMutex1); ReleaseSemaphore(g_hFullItems2,1,NULL); ReleaseSemaphore(g_hEmptyItems1,1,NULL); } return0; } GETTER1线程的设计: DWORDWINAPIGETTER1(LPVOIDpara)//GET1线程 { PThread*pthread=(PThread*)para;//规化参数 CpacDlg*dlg=pthread->dlg; inti=pthread->ptid; intj=(dlg->SPEED); intspeed=1000*j; while(true) { WaitForSingleObject(g_hFullItems2,INFINITE);//进展P操作 WaitForSingleObject(g_hMutex2,INFINITE); //移出buffer2中的数据 CStringcs; intn; n=dlg->buffer2.GetCount(); dlg->buffer2.GetText(n-1,cs); dlg->buffer2.DeleteString(n-1); dlg->Con1_Num=dlg->Con1_Num+1;//消费者1消费的产品数量加1 intbuf2c;//确定当前buffer2中的产品数量 CStringstr1; buf2c=dlg->buffer2.GetCount(); str1.Format(_T("%d个"),buf2c); dlg->Buf_C1.SetWindowTextW(str1); : : Sleep(speed);//设置速度 ReleaseMutex(g_hMutex2);//进展V操作 ReleaseSemaphore(g_hEmptyItems2,1,NULL); } return0; } “开场〞按钮的设计: voidCpacDlg: : OnBnClickedButton1() { //TODO: 在此添加控件通知处理程序代码 UpdateData (1); g_hMutex1=: : CreateMutex(NULL,FALSE,NULL);//buff1互斥锁 g_hFullItems1=: : CreateSemaphore(NULL,0,SIZE_1,NULL);//buff1信号量 g_hEmptyItems1=: : CreateSemaphore(NULL,SIZE_1, SIZE_1,NULL); g_hMutex2=: : CreateMutex(NULL,FALSE,NULL); g_hFullItems2=: : CreateSemaphore(NULL,0,SIZE_2,NULL);//buff2互斥锁 g_hEmptyItems2=: : CreateSemaphore(NULL,SIZE_2, SIZE_2,NULL); g_hMutex3=: : CreateMutex(NULL,FALSE,NULL); g_hFullItems3=: : CreateSemaphore(NULL,0,SIZE_3,NULL);//buff3互斥锁 g_hEmptyItems3=: : CreateSemaphore(NULL,SIZE_3, SIZE_3,NULL); start=clock();//获得线程开场时间 //创立PUT线程 for(inti=0;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 燕山 大学 操作系统 课程设计 报告 说明书