实验三:生产者与消费者
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:生产者与消费者
一、实验目的
1.学习和掌握操作系统中进程之间的通信;
2.理解和掌握使用信号量机制来是想进程之间的同步和互斥;
3.学习使用创建文件对象,并利用文件映射对象来实现数据通信。
二、实验内容
•一个大小为6的缓冲区,初始为空,每个缓冲区能存放一个长度若为10个字符的字符串。
•2个生产者
–随机等待一段时间,往缓冲区添加数据,
–若缓冲区已满,等待消费者取走数据后再添加
–重复12次
•3个消费者
–随机等待一段时间,从缓冲区读取数据
–若缓冲区为空,等待生产者添加数据后再读取
–重复8次
说明:
•显示每次添加和读取数据的时间及缓冲区的状态
•生产者和消费者用进程模拟,缓冲区用共享内存来实现
三、实验环境
1.Windows下:
Windows8 ,Visual studio 2013
2.Linux下:
Linux Ubuntu 4,gcc
四、程序设计与实现
1.Windows下:
A.主要函数说明:
(1)PROCESS_INFORMATIONStartClone(intnCloneID)
功能:用来创建5个相同的进程,前两个为生产者,后
三两个为消费者,赋予其不同的ID值,返回进程的信
息。
(2)CreateSemaphore();
功能:创建3个信号量:full,empty,mutex。来互斥
的访问缓冲区,实现通信。
(3)CreateFileMapping()
功能:在当前运行的进程中创建文件映射对象,来模拟
共享缓冲区
MapViewOfFile()
功能:在此文件映射上创建视图映射到当前应用程序的
地址空间
B.程序流程图
实验代码如下:
//
#include"stdafx.h"
#include
#include
#include
static HANDLE hMutexMapping=INVALID_HANDLE_VALUE;
int num=0;
HANDLE lpHandle[10];
struct buf
{
int num;
int read;
int write;
int buffer[5];
};
BOOL StartClone()
{
int i;
BOOL bCreateOK;
PROCESS_INFORMATION pi;
TCHAR szFilename[MAX_PATH];
GetModuleFileName(NULL,szFilename,MAX_PATH); TCHAR szCmdLine[MAX_PATH];
for ( i = 0; i < 3; i++)
{
sprintf(szCmdLine,"\"%s\" consumer %d",szFilename,i);
STARTUPINFO si;
ZeroMemory(reinterpret_cast
si.cb=sizeof(si);
bCreateOK=CreateProcess(
szFilename,
szCmdLine,
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&si,
&pi);
if (!bCreateOK)
{
return false;
lpHandle[num]=pi.hProcess;
num++;
}
for ( i = 0; i < 2; i++)
{
sprintf(szCmdLine,"\"%s\" productor %d",szFilename,i);
STARTUPINFO si;
ZeroMemory(reinterpret_cast
si.cb=sizeof(si);
bCreateOK=CreateProcess(
szFilename,
szCmdLine,
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&si,
&pi);
if (!bCreateOK)
return false;
}
lpHandle[num]=pi.hProcess;
num++;
}
return true;
}
void Parent()
{
printf("Creating the child process and waited child process to quit.\n");
hMutexMapping=CreateMutex(NULL,true,"mutex");
HANDLE hMapping=CreateFileMapping(
NULL,
NULL,
PAGE_READWRITE,
0,
sizeof(LONG),
"map");
if (hMapping!=INVALID_HANDLE_VALUE)
{