实验三:生产者与消费者

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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),sizeof(si));

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),sizeof(si));

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)

{

相关文档
最新文档