操作系统课程设计进程同步模拟设计生产者和消费者问题0905林琪琛.docx
《操作系统课程设计进程同步模拟设计生产者和消费者问题0905林琪琛.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计进程同步模拟设计生产者和消费者问题0905林琪琛.docx(14页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计进程同步模拟设计生产者和消费者问题0905林琪琛.docx](https://file1.bdocx.com/fileroot1/2023-4/16/b4d97928-a1e6-476b-9582-7ba9cf4b6d90/b4d97928-a1e6-476b-9582-7ba9cf4b6d901.gif)
操作系统课程设计进程同步模拟设计生产者和消费者问题0905林琪琛
学号:
0120910680527
课程设计
题目
进程同步模拟设计
——生产者和消费者问题
学院
计算机科学与技术学院
专业
软件工程
班级
0905
姓名
林琪琛
指导教师
刘军
2011
年
12
月
25
日
课程设计任务书
学生姓名:
林琪琛专业班级:
软件0905
指导教师:
刘军工作单位:
计算机科学与技术学院
题目:
进程同步模拟设计——生产者和消费者问题
初始条件:
1.预备内容:
阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟用信号量机制实现生产者和消费者问题。
2.设计报告内容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
进程同步模拟设计
——生产者和消费者问题
1课设任务
本课程设计的任务在于,通过编写一个具体的有关操作系统进程同步互斥的经典问题,加强对操作系统实现进程间同步与互斥的机制的理解。
同时培养提出问题、发现知识、使用工具、解决问题的能力。
2“生产者—消费者”问题
问题描述:
一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。
规则:
◆对于生产者进程:
产生一个数据,当要送入缓冲区时,要检查缓冲区是否已满,若未满,则可将数据送入缓冲区,并通知消费者进程;否则,等待;
◆对于消费者进程:
当它去取数据时,要看缓冲区中是否有数据可取,若有则取走一个数据,并通知生产者进程,否则,等待。
◆缓冲区是个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,所以,还有个互斥的问题。
问题分析:
该问题涉及到操作系统进程管理当中的两个重要概念——同步和互斥。
同步,表现在生产者和消费者需要协同工作,步调不能拉开太大(由缓冲区大小n决定,n越大,缓冲空间越大,步调可以拉得越开;n=1时,必须是生产一个,消费一个,生产者和消费者就完全同步了)。
当步调差距超过极限时,走在前面的当前进程(生产者)调用P原语时由于资源耗尽,被阻塞;步调靠后的继续向前推进。
由此实现同步。
互斥,表现在生产者与消费者、生产者与生产者、消费者与消费者任何两个成员之间必须互斥地使用缓冲区。
当有一个成员进入缓冲区存/取产品时,其他成员将被关在门外排队等候(被阻塞);当完毕时,通知队首成员进入。
由操作系统理论可知,我们需要三个信号量,分别命名full,empty,mutex,来分别代表消费者的可用资源数、生产者的可用资源数、缓冲区是否可用。
初值:
full=0(消费者无资源可用),empty=N(生产者有N个资源可用,N代表缓冲区大小),mutex=1(缓冲区可用)。
3程序流程图:
4程序运行截图
5程序源代码
//comproDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"compro.h"
#include"comproDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
//GlobalVariable
charbuffer[10];
intbuf_size;
HANDLEhFull;
HANDLEhEmpty;
HANDLEhMutex;
voidshow(CDC*pDC)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CBrushbrush(RGB(100,250,100));
pDC->Rectangle(150,20,300,320);
pDC->SelectObject(brush);
pDC->Rectangle(150,320-30*buf_size,300,320);
}
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CComproDlgdialog
CComproDlg:
:
CComproDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CComproDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CComproDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
hEmpty=CreateSemaphore(NULL,10,10,"Empty");
hFull=CreateSemaphore(NULL,0,10,"Full");
hMutex=CreateMutex(NULL,1,"Mutex");
ReleaseMutex(hMutex);
buf_size=0;
memset(buffer,0,10);
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCComproDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CComproDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CComproDlg,CDialog)
//{{AFX_MSG_MAP(CComproDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_PRODUCER,OnProducer)
ON_BN_CLICKED(IDC_COMSUMER,OnComsumer)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CComproDlgmessagehandlers
BOOLCComproDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
CDC*pDC=GetDC();
show(pDC);
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCComproDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCComproDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCComproDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCComproDlg:
:
OnProducer()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CDC*pDC=this->GetDC();
HANDLEhThread=CreateThread(NULL,0,Producer,(LPVOID)pDC,0,NULL);
CloseHandle(hThread);
}
voidCComproDlg:
:
OnComsumer()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CDC*pDC=this->GetDC();
HANDLEhThread=CreateThread(NULL,0,Comsumer,(LPVOID)pDC,0,NULL);
CloseHandle(hThread);
}
DWORDWINAPICComproDlg:
:
Producer(LPVOIDpDC)
{
WaitForSingleObject(hEmpty,INFINITE);
WaitForSingleObject(hMutex,INFINITE);
buffer[buf_size]='s';
buf_size+=1;
Sleep(3000);
show((CDC*)pDC);
ReleaseSemaphore(hFull,1,NULL);
ReleaseMutex(hMutex);
return0;
}
DWORDWINAPICComproDlg:
:
Comsumer(LPVOIDpDC)
{
WaitForSingleObject(hFull,INFINITE);
WaitForSingleObject(hMutex,INFINITE);
buffer[buf_size]=0;
buf_size-=1;
Sleep(3000);
show((CDC*)pDC);
ReleaseSemaphore(hEmpty,1,NULL);
ReleaseMutex(hMutex);
return0;
}
6参考文献
【1】汤子瀛等.计算机操作系统.西安电子科技大学出版社.2007年2月
【2】张尧学等编著,计算机操作系统教程,清华出版社。
2002.2
【3】严蔚敏,吴伟民编著,数据结构,清华大学出版社。
2002
【4】陈向群编著,操作系统教程,北京大学出版社,2001.07
【5】郑莉等编著,C++语言设计。
北京:
清华大学出版社.2000
7个人小结
本次实验比较仓促,各门考试课程设计蜂拥而至,忙的焦头烂额,但是这段时间的忙碌让我学到了很多很多东西,尤其是做操作系统的课设,开始的时候一点头绪都没有,然后不停得看书看课件,问同学,上网查资料,然后是用VC代码实现,学到的东西不可谓不多,通过一个学期的操作系统学习,我越来越觉得计算机不是个什么神秘的东西,它只是个很复杂的机器,各种各样的机制算法让计算机实现它的功能,同时每个机制和算法都是有它的用途和方法的,我们学计算机的人,就是要掌握这些东西,会个C,会个VC,会弄几个小程序都不是我们学习目标,我觉得应该从深层去挖掘计算机,去了解计算机,这才是我们要做到的。
同时我也向老师认错,上课有好多次都没有认真听,现在有蛮多操作系统的知识都蛮模糊。
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
20年 月 日