生產(chǎn)者消費者課程設(shè)計實驗報告11頁_第1頁
生產(chǎn)者消費者課程設(shè)計實驗報告11頁_第2頁
生產(chǎn)者消費者課程設(shè)計實驗報告11頁_第3頁
生產(chǎn)者消費者課程設(shè)計實驗報告11頁_第4頁
生產(chǎn)者消費者課程設(shè)計實驗報告11頁_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、操作系統(tǒng)課程設(shè)計實驗報告實驗名稱: 生產(chǎn)者消費者問題 姓名/學號: 一、實驗目的1.學習和掌握操作系統(tǒng)中進程之間的通信;2.理解和掌握使用信號量機制來實現(xiàn)進程之間的同步和互斥;3.學習使用創(chuàng)建共享內(nèi)存區(qū),并利用共享內(nèi)存區(qū)來實現(xiàn)數(shù)據(jù)通信。二、實驗內(nèi)容 一個大小為3的緩沖區(qū),初始為空 2個生產(chǎn)者 隨機等待一段時間,往緩沖區(qū)添加數(shù)據(jù), 若緩沖區(qū)已滿,等待消費者取走數(shù)據(jù)后再添加 重復6次 3個消費者 隨機等待一段時間,從緩沖區(qū)讀取數(shù)據(jù) 若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)后再讀取 重復4次說明:顯示每次添加和讀取數(shù)據(jù)的時間及緩沖區(qū)的狀態(tài)生產(chǎn)者和消費者用進程模擬,緩沖區(qū)用共享內(nèi)存來實現(xiàn)三、實驗環(huán)境CPU:

2、Inter 2 2.10GHzRAM: 3.00GBWindows 7 旗艦版四、程序設(shè)計與實現(xiàn)4.1程序中使用的數(shù)據(jù)結(jié)構(gòu)及主要符號說明HANDLE SEM_FULL; /記錄已使用的緩沖區(qū)數(shù)目的信號量HANDLE SEM_EMPTY;/記錄空的緩沖區(qū)數(shù)目的信號量HANDLE SEM_MUTEX;/確保生產(chǎn)者和消費者互斥訪問緩沖區(qū)的信號量int CreateShareMemory(); /建立共享內(nèi)存,即緩沖區(qū)/創(chuàng)建一個克隆的進程,返回進程和線程信息PROCESS_INFORMATION StartClone(int nCloneID); void Producer(int nClone);

3、/生產(chǎn)者void Consumer(int nClone); /消費者五、實驗結(jié)果和分析由上圖可以看到生產(chǎn)者和消費者的添加或讀取數(shù)據(jù)的時間,并且能看到添加或讀取后緩沖區(qū)的狀態(tài)。狀態(tài)圖中1代表已經(jīng)被使用,0代表未被使用。五、源程序代碼#include#include#include#includeusing namespace std;#define BUF_SIZE 256HANDLE hMapFile =NULL; /內(nèi)存映射文件對象的句柄HANDLE CurrentProcess; /當前進程的句柄int *pBuf,*input,*output =NULL; /共享內(nèi)存的指針HANDLE

4、 SEM_FULL; /記錄已使用的緩沖區(qū)數(shù)目的信號量HANDLE SEM_EMPTY; /記錄空的緩沖區(qū)數(shù)目的信號量HANDLE SEM_MUTEX; /確保生產(chǎn)者和消費者互斥訪問緩沖區(qū)的信號量int CreateShareMemory(); /建立共享內(nèi)存,即緩沖區(qū)PROCESS_INFORMATION StartClone(int nCloneID); /創(chuàng)建一個克隆的進程,返回進程和線程信息void Producer(int nClone); /生產(chǎn)者void Consumer(int nClone); /消費者int main(int argc, char* argv)int i,n

5、Clone=0;/PROCESS_INFORMATION hp5; HANDLE np5; /保存5個進程的句柄/從第二個參數(shù)中提取克隆IDif(argc 1)sscanf(argv1,%d,&nClone);if( nClone = 0) /ID=0是主進程,執(zhí)行以下代碼/創(chuàng)建信號量SEM_FULL = CreateSemaphore(NULL, /信號量的安全屬性,NULL即使用默認安全屬性0, /初始化的信號量3, /許信號量增加到最大值FULL); /信號量的名稱SEM_EMPTY = CreateSemaphore(NULL,3,3,EMPTY);SEM_MUTEX = Create

6、Semaphore(NULL,1,1,MUTEX);if( CreateShareMemory()= -1 ) /創(chuàng)建共享內(nèi)存return 0;/創(chuàng)建5個進程,先創(chuàng)建兩個生產(chǎn)者,再創(chuàng)建兩個消費者for(i=0;i5;i+) npi = StartClone(+nClone).hProcess;/等待子進程結(jié)束WaitForMultipleObjects(5,np,true,INFINITE);/for(i=0;i5;i+)/WaitForSingleObject(hpi.hProcess,INFINITE);/運行結(jié)束后關(guān)閉子進程的句柄for (i=0;i0 & nClone2 & nClon

7、e6) /nClone=3、4或5的代表消費者Consumer(nClone);return 0;/建立共享內(nèi)存,即緩沖區(qū)int CreateShareMemory()CurrentProcess = GetCurrentProcess();hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, /使用分頁文件,創(chuàng)建一個使用來自頁文件而非指定磁盤文件存儲器的文件映射對象NULL, /使用默認安全屬性PAGE_READWRITE, /允許讀寫操作0, /在DWORD的高位中存放大小 BUF_SIZE, /在DWORD的低位中存放大小buffer);

8、/緩沖區(qū)的名字if (hMapFile = NULL) printf(無法創(chuàng)建內(nèi)存映射文件對象(File Mapping Object)n);return -1;pBuf = (int*)MapViewOfFile(hMapFile, /內(nèi)存映射文件對象的句柄FILE_MAP_ALL_ACCESS, /允許讀寫操作0, 0, BUF_SIZE); if (pBuf = NULL) printf(無法映射文件視圖n);CloseHandle(hMapFile);return -1;elseZeroMemory(pBuf,BUF_SIZE); /內(nèi)存清零input = pBuf;return 1;

9、/創(chuàng)建一個克隆的進程,返回進程和線程信息PROCESS_INFORMATION StartClone(int nCloneID)/獲得用于當前可執(zhí)行文件的文件名TCHAR szFilenameMAX_PATH;GetModuleFileName(NULL,szFilename,MAX_PATH);/創(chuàng)建子進程命令行的格式化,獲得應用程序的EXE文件名/和克隆進程的ID值TCHAR szCmdLineMAX_PATH;sprintf(szCmdLine,%s %d,szFilename,nCloneID);STARTUPINFO si;/用于子進程的STARTUPINFO結(jié)構(gòu)ZeroMemory

10、(reinterpret_cast(&si),sizeof(si);/reinterpret_cast是C+里的強制類型轉(zhuǎn)換符,只修改了/操作數(shù)的類型,但僅是重新解釋了給出的對象的比特模型/而沒有進行二進制轉(zhuǎn)換si.cb = sizeof(si);PROCESS_INFORMATION pi; /說明一個用于記錄子進程的相關(guān)信息的結(jié)構(gòu)變量/利用同樣的可執(zhí)行文件和命令行創(chuàng)建進程BOOL bCreateOK = CreateProcess(szFilename, /可執(zhí)行的應用程序的名稱szCmdLine, /指定創(chuàng)建一個子進程的符號標識NULL, /缺省了進程安全性NULL, /缺省了線程安全性

11、FALSE, /不繼承打開文件的句柄NULL, /不使用新的控制臺NULL, /新的環(huán)境NULL, /當前目錄&si, /啟動信息&pi); /返回進程和線程的信息return pi;/生產(chǎn)者void Producer(int nClone)int i,j,time; /等待的時間for(i=0; i6; i+)/打開信號量SEM_FULL=OpenSemaphore(SEMAPHORE_ALL_ACCESS, /安全屬性,NULL,/不繼承FULL);/打開的信號量名稱SEM_EMPTY=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,EMPTY);SEM_M

12、UTEX=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,MUTEX);hMapFile = OpenFileMapping(FILE_MAP_WRITE,/安全屬性FALSE,/不繼承buffer);/緩沖區(qū)的名稱pBuf = (int*)MapViewOfFile(hMapFile,FILE_MAP_WRITE,0,0,BUF_SIZE);input = pBuf;/等待信號量,相對于P(SEM_MUTEX),P(SEM_EMPTY)WaitForSingleObject(SEM_EMPTY,INFINITE);WaitForSingleObject(SEM

13、_MUTEX,INFINITE);/向緩沖區(qū)添加產(chǎn)品,將0置為1while(*input=1)input+;*input=1;/獲得系統(tǒng)時間SYSTEMTIME curtime;GetSystemTime(&curtime);printf(生產(chǎn)者%d往緩沖區(qū)中添加數(shù)據(jù),添加時間為:%02d:%02d:%02d:%03dn,nClone,curtime.wHour+8,curtime.wMinute,curtime.wSecond,curtime.wMilliseconds);printf(此時,緩沖區(qū)的狀態(tài)為:n);printf(n);printf(%2d%2d%2dn,*(pBuf),*(p

14、Buf+1),*(pBuf+2);printf(n);/釋放信號量,相當于V(SEM_MUTEX),V(SEM_FULL)ReleaseSemaphore(SEM_MUTEX,1,NULL);ReleaseSemaphore(SEM_FULL,1,NULL);/關(guān)閉句柄CloseHandle(SEM_MUTEX);CloseHandle(SEM_EMPTY);CloseHandle(SEM_FULL);CloseHandle(hMapFile);/隨機等待一段時間time = rand()%1000*5;Sleep(time);/取消文件映射UnmapViewOfFile(pBuf);retu

15、rn;/消費者void Consumer(int nClone)int i,time; /等待的時間for(i=0; i4; i+)/打開信號量SEM_FULL=OpenSemaphore(SEMAPHORE_ALL_ACCESS, /安全屬性,NULL,/不繼承FULL);/打開的信號量名稱SEM_EMPTY=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,EMPTY);SEM_MUTEX=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,MUTEX);hMapFile = OpenFileMapping(FILE_MAP_WRI

16、TE,/安全屬性FALSE,/不繼承buffer);/緩沖區(qū)的名稱pBuf = (int*)MapViewOfFile(hMapFile,FILE_MAP_WRITE,0,0,BUF_SIZE);output = pBuf;/等待信號量,相對于P(SEM_MUTEX),P(SEM_EMPTY)WaitForSingleObject(SEM_FULL,INFINITE);WaitForSingleObject(SEM_MUTEX,INFINITE);/在緩沖區(qū)中取出產(chǎn)品,將1置為0while(*output=0)output+;*output=0;/獲得系統(tǒng)時間SYSTEMTIME curtime;GetSystemTime(&curtime);printf(消費者%d往緩沖區(qū)中讀取數(shù)據(jù),讀取時間為:%02d:%02d:%02d:%03dn,nClone-2,curtime.wHour+8,curtime.wMinute,curtime.wSecond,curtime.wMilliseconds);printf(此時,緩沖區(qū)的狀態(tài)為:n);printf(n);printf(%2d%2d%2dn,*(pBuf),*(pBuf+1),*(pBuf+2);printf(n);/釋放信號量,相當于V(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論