版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者實(shí)驗(yàn)?zāi)康? .學(xué)習(xí)和掌握操作系統(tǒng)中進(jìn)程之間的通信;2 .理解和掌握使用信號(hào)量機(jī)制來(lái)是想進(jìn)程之間的同步和互斥;3 .學(xué)習(xí)使用創(chuàng)建文件對(duì)象,并利用文件映射對(duì)象來(lái)實(shí)現(xiàn)數(shù)據(jù)通信。、實(shí)驗(yàn)內(nèi)容? 一個(gè)大小為6 的緩沖區(qū),初始為空,每個(gè)緩沖區(qū)能存放一個(gè)長(zhǎng)度若為10個(gè)字符的字符串。? 2 個(gè)生產(chǎn)者- 隨機(jī)等待一段時(shí)間,往緩沖區(qū)添加數(shù)據(jù),- 若緩沖區(qū)已滿,等待消費(fèi)者取走數(shù)據(jù)后再添加- 重復(fù)12次? 3 個(gè)消費(fèi)者- 隨機(jī)等待一段時(shí)間,從緩沖區(qū)讀取數(shù)據(jù)- 若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)后再讀取- 重復(fù)8次說(shuō)明:? 顯示每次添加和讀取數(shù)據(jù)的時(shí)間及緩沖區(qū)的狀態(tài)? 生產(chǎn)者和消費(fèi)者用進(jìn)程模擬,緩沖區(qū)
2、用共享內(nèi)存來(lái)實(shí)現(xiàn)3、 實(shí)驗(yàn)環(huán)境1. Windows下:Windows8 ,Visual studio 20132. Linux下:Linux Ubuntu 4, gcc4、 程序設(shè)計(jì)與實(shí)現(xiàn)1. Windows 下:A主要函數(shù)說(shuō)明:( 1) PROCESS_INFORMATIONStartClone(intnCloneID) 功能:用來(lái)創(chuàng)建5個(gè)相同的進(jìn)程,前兩個(gè)為生產(chǎn)者,后 三兩個(gè)為消費(fèi)者,賦予其不同的ID值,返回進(jìn)程的信 息。(2) CreateSemaphore();功能:創(chuàng)建3個(gè)信號(hào)量:full, empty, mutex。來(lái)互斥 的訪問(wèn)緩沖區(qū),實(shí)現(xiàn)通信。(3) CreateFileMap
3、ping ()功能:在當(dāng)前運(yùn)行的進(jìn)程中創(chuàng)建文件映射對(duì)象,來(lái)模擬共享緩沖區(qū)MapViewOfFile ()功能:在此文件映射上創(chuàng)建視圖映射到當(dāng)前應(yīng)用程序的地址空間B.程序流程圖開(kāi)始初始化:創(chuàng)建的子進(jìn)程個(gè)數(shù)為0nClone=0;實(shí)驗(yàn)代碼如下:Windows:/實(shí)驗(yàn)三.cpp :定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include "stdafx.h"#include <stdio.h>#include <windows.h>#include <time.h>static HANDLE hMutexMapping= INVALID HANDLE VA
4、LUE int num=0;HANDLE lpHandle10;struct buf int num;int read;int write;int buffer5; IBOOL StartClone() int i;BOOL bCreateOK;PROCESS_INFORMATION pi;TCHAR szFilenameMAX_PATH ;GetModuleFileName(NULL ,szFilename,MAX PATH );TCHAR szCmdLineMAX PATH ; for ( i = 0; i < 3; i+) Isprintf(szCmdLine, "&qu
5、ot;%s" consumer %d” ,szFilename,i); STARTUPINFO si;ZeroMemory (reinterpret cas<void *>(&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;lpHan
6、dlenum=pi.hProcess; num+;for ( i = 0; i < 2; i+)sprintf(szCmdLine, ""%s" productor %d" ,szFilename,i); STARTUPINFO si;ZeroMemory (reinterpret_cas<void *>(&si), sizeof(si); si.cb=sizeof(si);bCreateOK= CreateProcesSszFilename, szCmdLine, NULL , NULL , FALSE, CREATE_DEF
7、AULT_ERROR_MODE , NULL , NULL , &si, &pi); I,if (!bCreateOK)return false;lpHandlenum=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= Create
8、FileMapping(NULL , NULL , PAGE READWRITE , 0, 一 sizeof(LONG), "map");if (hMapping!= INVALID_HANDLE_VALUE ) c_;,LPVOID pData=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS , 0, 0, 0);if (pData!=NULL ) ZeroMemory (pData,sizeof(LONG);struct buf *pnData=reinterpret cas<struct buf *>(pData)
9、; pnData->read=0;pnData->write=0;pnData->num=0;memset(pnData->buffer,0,sizeof(pnData->buffer); UnmapViewOfFile(pData); ICreateSemaphoreNULL ,3,3,"EMPTY");CreateSemaphoreNULL ,0,3,"FULL");BOOL bCreateOK=StartClone();if (!bCreateOK) Iprintf("Create child process
10、 failed.n");elseprintf("Create child process success.n"); I.ReleaseMutex(hMutexMapping);void Productor(int n) I,int j;printf( "Productor is running.n");hMutexMapping= OpenMutex(MUTEX_ALL ACCESS ,true,"mutex"); HANDLE hMapping= OpenFileMapping(FILE_MAP_ALL_ACCESS ,N
11、ULL , "map");if (hMapping= INVALID_HANDLE_VALUE ) Iprintf( "errorn"); .HANDLE semEmpty =OpenSemaphoreSEMAPHORE ALL ACCESS ,FALSE,"EMPTY");HANDLE semFull =OpenSemaphoreSEMAPHORE_ALL_ACCESS ,FALSE,"FULL");for (int i = 0; i < 6; i+)WaitForSingleObject(semEmpty
12、, INFINITE );SYSTEMTIME st;GetSystemTime(&st);srand(unsigned)time(0);Sleep(rand()/6);WaitForSingleObject(hMutexMapping, INFINITE );LPVOID pFile=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS ,0,0, 0);if (pFile!=NULL ) struct buf *pnData=reinterpret_cas<struct buf *>(pFile);pnData->bufferpnD
13、ata->write=1;pnData->write=(pnData->write+1)%3;pnData->num+;printf("%02d:%02d:%02d生產(chǎn)者%d生產(chǎn)成功 緩沖區(qū)中剩余個(gè) ”,st.wHour,st.wMinute,st.wSecond,n,pnData->num);for (j = 0; j < 3; j+) printf( "%d " ,pnData->bufferj);printf( "n"); IUnmapViewOfFile(pFile);pFile=NULL ;R
14、eleaseSemaphore(semFull, 1NULL );ReleaseMutex(hMutexMapping);printf("生產(chǎn)者%d生產(chǎn)完畢n",n);廠void ConsumerQnt n) I,int j; Iprintf( "Consumers running.n");hMutexMapping= OpenMutex(MUTEX_ALL_ACCESS ,true,"mutex"); HANDLE hMapping= OpenFileMapping(FILE_MAP_ALL_ACCESS ,NULL , "
15、;map"); if (hMapping= INVALID_HANDLE_VALUE ) printf( "errorn");HANDLE semEmpty =OpenSemaphoreSEMAPHORE_ALL_ACCESS ,FALSE,"EMPTY");HANDLE semFull =OpenSemaphoreSEMAPHORE ALL ACCESS ,FALSE,"FULL");for (int i = 0; i < 4; i+) IWaitForSingleObject(semFull, INFINITE )
16、; SYSTEMTIME st; GetSystemTime(&st); srand(unsigned)time(0); Sleep(rand()/6); WaitForSingleObject(hMutexMapping, INFINITE ); LPVOID pFile=MapViewOfFile(hMapping,FILE MAP ALL ACCESS ,0,0,0); ,if (pFile!=NULL ) struct buf *pnData=reinterpret_cas<struct buf *>(pFile);pnData->bufferpnData-&
17、gt;read=0;pnData->read=(pnData->read+1)%3;pnData->num-;printf("%02d:%02d:%02d消費(fèi)者%d消費(fèi)成功 緩沖區(qū)中剩余個(gè) ”,st.wHour,st.wMinute,st.wSecond,n,pnData->num);for (j = 0; j < 3; j+) printf( "%d " ,pnData->bufferj); ,printf( "n"); ,UnmapViewOfFile(pFile);pFile=NULL ;Release
18、Semaphore(semEmpty,1NULL );ReleaseMutex(hMutexMapping);printf("消費(fèi)者%d消費(fèi)完畢n",n);口 .int main(int argc,char * argv) Iif (argc>1&&strcmp( argv1, "productor" )=0)Productor(atoi(argv2); Ielseif (argc>1&&strcmp( argv1,"consumer")=0) ' 一.、一 ,£Consu
19、mer(atoi(argv2);elseParent();WaitForMultipleObjects(num,lpHandle, true,INFINITE );return 0;Linux下代碼:/主進(jìn)程#include <unistd.h>#include <stdlib.h>#include "head.h"int main()(int id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);/ 創(chuàng)建信號(hào)量集合/初始化信號(hào)量集合semctl(id, SEM_EMPTY, SETVAL, 3);semctl(id
20、, SEM_FULL, SETVAL, 0);semctl(id, SEM_MUTEX, SETVAL, 1);int shmid = createQueue(); / 創(chuàng)建共享主存if(shmid<0)perror("create shm error.");exit(1);/生成生產(chǎn)者進(jìn)程if(fork()=0)execl("producer", "produced", 0);if(fork()=0)execl("producer", "producer2”, 0);/生成消費(fèi)者進(jìn)程if(fork
21、()=0)execl("consumer", "consumed", 0);if(fork()=0)execl("consumer", "consumer2”, 0);if(fork()=0)execl("consumer", "consumer3”, 0);/等待子進(jìn)程int stat,i;for(i=0;i<5;i+)wait(&stat);removeQueue(shmid);釋放共享主存return 0;/*生產(chǎn)者*/#include "head.h"m
22、ain(int argc,char * argv口)struct queue *buf,*out;int sem_id = semget(SEM_ALL_KEY,3, IPC_CREAT|0660);int i,j;buf = getQueue(); 打開(kāi)共享主存out = buf;for(i=0;i<6;i+)p(sem_id, SEM_EMPTY); /P(EMPTY) , EMPTY開(kāi)始值為3,表明有三個(gè)空余,申請(qǐng)一個(gè) 之后,有兩個(gè)空余,當(dāng)為零時(shí),不再往里面寫數(shù)據(jù)p(sem_id, SEM_MUTEX); /P(MUTEX) , MUTEX開(kāi)始彳直為1 ,表明一次只能運(yùn)行一個(gè)進(jìn)程b
23、uf->buf+;/ 產(chǎn)品數(shù) +1(buf + buf->buf) ->buf = 1;/放入產(chǎn)品后緩沖區(qū)置1/獲取當(dāng)前時(shí)間struct timeval curtime;gettimeofday(&curtime,NULL);/輸出信息printf("No.%s put product %ld:%ld ",argv0,curtime.tv_sec,curtime.tv_usec);printf("Now the buffer is ");for(j=1;j<=3;j+)printf("%4d",(out
24、+j)->buf);printf("n");v(sem_id, SEM_MUTEX);V(MUTEX)v(sem_id, SEM_FULL); /V(FULL),釋放一個(gè) FULL,即往里面寫了一個(gè)數(shù)據(jù)/隨機(jī)sleep 一會(huì)int ran=random()%5;sleep(ran);/*消費(fèi)者*/#include "head.h"main(int argc,char * argv口)struct queue *buf,*out;int sem_id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);int i,j;b
25、uf = getQueue(); 打開(kāi)共享主存out = buf;for(i=0;i<4;i+)p(sem_id, SEM_FULL); /P(FULL) FULL 開(kāi)始值為0,表明開(kāi)始的時(shí)候沒(méi)有數(shù)據(jù),無(wú)法取得, 當(dāng)producer釋放一個(gè)數(shù)據(jù)時(shí),這里開(kāi)始有數(shù)據(jù)p(sem_id, SEM_MUTEX); /P(MUTEX)(buf + buf->buf) ->buf = 0;取出產(chǎn)品后緩沖區(qū)置0buf->buf-; / 產(chǎn)品數(shù)-1/獲取當(dāng)前時(shí)間struct timeval curtime;gettimeofday(&curtime,NULL);/輸出信息prin
26、tf("No.%s get product %ld:%ld ",argv0,curtime.tv_sec,curtime.tv_usec);printf("Now the buffer is ");for(j=1;j<=3;j+)printf("%4d",(out+j)->buf);printf("n");v(sem_id, SEM_MUTEX);/V(MUTEX)v(sem_id, SEM_EMPTY);/V(EMPTY)/隨機(jī)等待一段時(shí)間int ran=random()%5;sleep(ran);W
27、indows運(yùn)行截圖:reading onsumet'the cluld process and waited child process to . is running.nsumek" zls runninsr -_onsumer poduetop poductop_2=47:36 _2:47:362:47:41 =47:41_2=47:41 2:47:46 2:47:4& 2=47=46_2=47=52 B=47=58 2:4?:S2"2=47:5?2;47557 2:48:03"2:48:03 _2:48:03s'i.Z_J_JT-T
28、-_J_JTJ1-TJTJ-J-J_J_JT-J-J n0lslslH200HrlIS2rlL30l W 舒舒舒舒布舒舒斯舒荀司舒ararlr荀 國(guó)產(chǎn)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)覆產(chǎn)贊功功功功功功功功功功功功功功功功止 成成成成成成成45成成45 -工廠產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi) ngng生生區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)TX1TTXAA1TTTTTTTT12121212 1212 1212 11100 111100 110 11IS 0 0Linux 下截圖:produr«rr 上prodiLKer.<:cq localhost: "/下載文件(F)編輯(E
29、)查看(V)搜索(S)終端E幫助似)cq(?loc al host 下教$ ./main Uo .producerl Vo .producer2 slo .consumerl 4o.consumer2 Jo .producerl ducer2 lo .consumerl 4。.consumers ducerl lo .producer2 slo .consume r2 lo .ducerl lo .producer2 4o ,producer2 Uo .consumers lo. consumer! slo .consumer2 Qo .producerl Vo.consumer3 Jo .p roducer2 4o.consumer2 Uo .producer1put product1461724380:23222Now th© bufferisput product1461724380:23349Now the butteri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 邢臺(tái)市企業(yè)產(chǎn)權(quán)交易中心資產(chǎn)轉(zhuǎn)讓合同
- 施工合同“情勢(shì)變更”適用問(wèn)題解析
- 深圳市建設(shè)工程設(shè)計(jì)合同
- 建筑工程施工現(xiàn)場(chǎng)防火安全制度模版(3篇)
- 2025年婦產(chǎn)科護(hù)理個(gè)人工作總結(jié)(2篇)
- 2025年醫(yī)院職工獎(jiǎng)懲辦法實(shí)施細(xì)則(2篇)
- 2025年安全記心間演講稿(3篇)
- 公司現(xiàn)金管理規(guī)定(4篇)
- 銷售業(yè)務(wù)工作崗位職責(zé)說(shuō)明書模版(2篇)
- 2025年初中家長(zhǎng)會(huì)演講稿樣本(5篇)
- 初中動(dòng)點(diǎn)問(wèn)題題目
- 前程無(wú)憂行測(cè)題庫(kù)及答案大全
- 合伙人權(quán)益糾紛解決合同
- 糧食工程技術(shù)專業(yè)人才培養(yǎng)方案(三年制高職)
- 理發(fā)店承包方案
- 機(jī)電材料見(jiàn)證取樣復(fù)試
- 二線干部工作總結(jié)
- 土石方挖運(yùn)工程承包合同范本
- 山東省濟(jì)南市七年級(jí)上學(xué)期期末英語(yǔ)試卷(附答案)
- 心身疾病的心理與康復(fù)治療
- 2024年02月四川省省直機(jī)關(guān)2024年度公開(kāi)遴選和公開(kāi)選調(diào)公務(wù)員筆試參考題庫(kù)附帶答案詳解
評(píng)論
0/150
提交評(píng)論