


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、長春理工大學大學學生實驗報告書學生用表實驗名稱緩沖池的模擬實現課程名稱 操作系統 課程號 學院(系)軟件學院 專業 軟件工程 班級學生姓名 學號 實驗地點 實驗日期一、實驗目的1掌握緩沖池的結構2 掌握緩沖池的使用方法二、實驗內容1、實現輸入、計算、輸出進程并發執行2、實現getBuf和putBuf函數。三、實驗步驟1、整體設計包括三個線程的模擬設計三個隊列的鏈表設計還有三個隊列的同步與互斥的設計等2、由于本次實驗沒有需要太多的數據結構因此數據結構的設計就只有三個緩沖隊列的設計先構造一個空的緩沖隊列該隊列是一個實體即是一個確定的有結點的鏈表它是模擬緩沖池的載體輸入與輸出隊列在構造時只有它的頭尾
2、指針而沒有它的實體這是因為它可以從空緩沖區里獲得例如當計算線程要數據計算時便可從空隊列里獲取一個緩沖區作為輸入緩沖使用再把它掛載到輸入隊列的隊尾中去算法流程圖實驗內容如下/緩沖隊列類型的定義#defi ne EMQ 0 / 空緩沖隊列#defi ne INQ 1 / 輸入緩沖隊列#defi ne OUTQ 2 / 輸出緩沖隊列const int bufferpoolsize = 50; / 緩沖池大小 ,默認設置為 50 個/ 結束運行標志short int m_end ; GDOU-B-11-112/ 緩沖結構體的定義typedef struct Bufferint BufNo; / 緩沖區
3、號int buf; / 緩沖內容Buffer *next; / 緩沖指向下一個指針 buffer;/ 線程函數聲明DWORD WINAPI InputThreadFunc(LPVOID lpPara); / 輸入線程函數DWORD WINAPI OutputThreadFunc(LPVOID lpPara); /輸出線程函數DWORD WINAPI CalThreadFunc(LPVOID lpPara); / 計算線程函數/ 加入與摘取隊列函數聲明void putBuf(int type , buffer *buf); /掛載到隊列尾buffer* getBuf(int type); / 從
4、隊列頭中摘取一個緩沖區/ 構造緩沖池函數的聲明void ConstructBuffer();/ 線程的句柄HANDLE hInputT; / 輸入線程HANDLE hOutputT; / 輸出線程HANDLE hCalculateT; / 計算線程/ 線程的 IDDWORD InputTid; / 輸入線程DWORD OutputTid; / 輸出線程DWORD CalculateTid; / 計算線程/ 三個互斥量信號句柄HANDLE hmutexEMQ; / 空隊列的互斥信號量HANDLE hmutexOUTQ; / 裝滿輸出隊列的互斥信號量HANDLE hmutexINQ; / 裝滿輸入
5、隊列的互斥信號量/ 三個同步信號量HANDLE hsemINQ;HANDLE hsemOUTQ;HANDLE hsemEMQ;#include "windows.h" #include "iostream"#include "stdlib.h"#include "time.h"#include "Main1.h"using namespace std;/ 三個緩沖隊列頭與尾指針buffer *hemq , *hinq , *houtq; /隊頭指針buffer *lemq , *linq , *
6、loutq; /隊尾指針/ 主函數int main()cout<<show1<<endl<<show2<<endl<<show3<<endl<<endl;m_end = 1 ; / 運行結束標志ConstructBuffer(); / 構造緩沖池/ 創建互斥對象hmutexEMQ = CreateMutex(NULL,FALSE,NULL);hmutexOUTQ = CreateMutex(NULL,FALSE,NULL);hmutexINQ = CreateMutex(NULL,FALSE,NULL);/ 創
7、建信號量對象hsemINQ = CreateSemaphore(NULL,0,bufferpoolsize,NULL);hsemOUTQ = CreateSemaphore(NULL,0,bufferpoolsize,NULL);hsemEMQ = CreateSemaphore(NULL,bufferpoolsize,bufferpoolsize,NULL);/ 創建線程hInputT = CreateThread(NULL,0,InputThreadFunc,NULL,0,&InputTid);Sleep(10);hCalculateT = CreateThread(NULL,0,
8、CalThreadFunc,NULL,0,&CalculateTid);Sleep(10);hOutputT = CreateThread(NULL,0,OutputThreadFunc,NULL,0,&OutputTid);/Sleep(10000);/system("pause");if(getchar() / 按回車后終止程序運行m_end = 0 ;cout<<" 程序已經終止 !"<<endl;/ 等待三個線程的結束返回 WaitForSingleObject(hInputT,INFINITE);Wait
9、ForSingleObject(hCalculateT,INFINITE);WaitForSingleObject(hOutputT,INFINITE);/ 釋放線程的資源CloseHandle(hInputT);CloseHandle(hCalculateT);CloseHandle(hOutputT);return 0;/ 輸入線程函數的實現DWORD WINAPI InputThreadFunc(LPVOID lpPara) / 輸入線程函數int nRandom;buffer* getbuf;srand(time(0); / 保證每次運行時產生的隨機數獨立while(m_end)Sle
10、ep(100);nRandom = rand()%100 + 1 ; /產生 1 到 100 的隨機數/ 同步與互斥的控制WaitForSingleObject(hsemEMQ,INFINITE);WaitForSingleObject(hmutexEMQ,INFINITE);getbuf = getBuf(EMQ); / 訪問空隊列收容輸入getbuf->buf = nRandom ;cout<<" 輸入線程從 "<<" 緩沖單元 "<<getbuf->BufNo<<"->&q
11、uot;<<"data= "<<getbuf->buf<<endl;ReleaseMutex(hmutexEMQ); / 釋放互斥對象信號/ 控制訪問輸入隊列的互斥量WaitForSingleObject(hmutexINQ,INFINITE);putBuf(INQ,getbuf) ; / 將輸入的緩沖區掛載到輸入隊列的隊尾ReleaseMutex(hmutexINQ);ReleaseSemaphore(hsemINQ,1,NULL);return 0;輸出/輸出線程函數的實現 DWORD WINAPI OutputThreadFu
12、nc(LPVOID lpPara) / 線程函數buffer* Outputbuf ; / 一個臨時交換區while(m_end)Sleep(100);/ 同步與互斥的控制WaitForSingleObject(hsemOUTQ,INFINITE);WaitForSingleObject(hmutexOUTQ,INFINITE);提取輸Outputbuf = getBuf(OUTQ) ; / 從輸出隊列中提取一個提取輸出緩沖cout<<" 輸出線程從 "<<" 緩沖單元 "<<Outputbuf->BufNo&l
13、t;<"-出 ->"<<"data= "<<Outputbuf->buf<<endl;/Outputbuf->buf = -1 ; /提取完成后將該緩沖區回收ReleaseMutex(hmutexOUTQ);WaitForSingleObject(hmutexEMQ,INFINITE);putBuf(EMQ,Outputbuf) ; / 回收的把它掛載到空隊列的隊尾ReleaseMutex(hmutexEMQ);ReleaseSemaphore(hsemEMQ,1,NULL);return 0;
14、/計算線程函數的實現DWORD WINAPI CalThreadFu nc(LPVOID lpPa ra) /計算線程函數buffer* Calbuf1 = NULL;buffer* Calbuf2 =NULL;int nCal;while(m_e nd)Sleep(10); /因為計算線程的速度遠遠快于輸入與輸出線程所以它的休眠時間應很小/同步與互斥的控制WaitForSi ngleObject(hsemlNQ,INFINITE);WaitForSi ngleObject(hmutexlNQ,INFINITE);Calbuf1 = getBuf(INQ); /從輸入隊列中提取一個收容輸入緩沖
15、區n Cal = Calbuf1->buf; /提取數據coutvv"計算線程從"<<"緩沖單元"vvCalbuf1->BufNovv"-提取輸入-_>"vv"data= "v<Calbuf1->bufv<e ndl;Calbuf->buf = -1 ; /系統將收回此緩沖區表示該緩沖區已空ReleaseMutex(hmutexINQ);WaitForSi ngleObject(hmutexEMQ,INFINITE);putBuf(EMQ,Calbuf1);Re
16、leaseMutex(hmutexEMQ);ReleaseSemaphore(hsemEMQ,1,NULL);nCal = nCal + 10000 ; / 模擬輸入數據的處理WaitForSingleObject(hsemEMQ,INFINITE);WaitForSingleObject(hmutexEMQ,INFINITE);Calbuf2 = getBuf(EMQ); / 得到一個空的緩沖區作為收容輸出Calbuf2->buf = nCal ; / 存入運算結果cout<<" 計算線程從 "<<" 緩沖單元 "<
17、<Calbuf2->BufNo<<"-收容輸出->"<<"data= "<<Calbuf2->buf<<endl;ReleaseMutex(hmutexEMQ);WaitForSingleObject(hmutexOUTQ,INFINITE); / 把收容輸出緩沖區掛載到輸出隊列的隊尾 putBuf(OUTQ,Calbuf2);ReleaseMutex(hmutexOUTQ);ReleaseSemaphore(hsemOUTQ,1,NULL);return 0 ;/ 從隊列中得到隊頭
18、結點函數 (實際相當于刪除一個結點操作 )buffer* getBuf(int type)buffer* Returnbuf = NULL;switch(type)case 0 :/判斷該隊列的緩沖個數是否還只有一個if(hemq != lemq && hemq->n ext->n ext != NULL)Retur nbuf = hemq->n ext ; /取得隊列頭hemq->n ext = Retur nbuf->n ext; /修正隊列鏈表頭指針的指向Returnbuf->n ext = NULL;return Returnbuf;
19、else/假如該緩沖隊列的個數只有一個的話則使得隊頭指針與隊尾指針相等級/這樣的話就可以防止隊尾指針的丟失Returnbuf = hemq->next ;hemq->next = Returnbuf->next;Returnbuf->next = NULL;lemq = hemq ;return Returnbuf;break;case 1:if(hinq != linq && hinq->next->next != NULL)Returnbuf = hinq->next;hinq->next = Returnbuf->ne
20、xt;Returnbuf->next =NULL;return Returnbuf;elseReturnbuf =hinq->next ;hinq->next= Returnbuf->next;Returnbuf->next = NULL;linq = hinq;return Returnbuf;break;case 2:if(houtq != loutq && houtq->next->next !=NULL )Returnbuf = houtq->next ;houtq->next = Returnbuf->nex
21、t; Returnbuf->next = NULL;return Returnbuf;elseReturnbuf = houtq->next;houtq->next = Returnbuf->next ;Returnbuf->next = NULL;loutq = houtq;return Returnbuf;break;/把某一類型的緩沖區掛載到隊尾函數/(實際相當于插入一個結點操作)void putBuf(i nt type , buffer* buf)switch(type)case 0:才執行因if(buf != NULL) / 該參數(buf)不為空的時候為插入一個空的緩沖區是沒有意義的lemq-> next = buf; /修正隊列尾指針lemq = buf ; / 隊尾指針的跟蹤lem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐廳食品安全培訓
- 派出所消防幫扶課件
- 注冊稅務師課件2018
- (2025年)貴州省六盤水市【輔警協警】筆試預測試題含答案
- 2025-2030自卸汽車行業市場發展分析及投融資與風險研究報告
- 警務輔助考試試題及答案
- 月餅美食活動策劃方案
- 服務群眾健康活動方案
- 服裝公司運營活動方案
- 來賓元旦活動方案
- 壓力管道年度檢查報告(空白)
- DB52∕T 1067-2015 地理標志產品 興仁薏(苡)仁米
- 設備采購運輸安裝調試售后服務方案投標方案
- 高速列車傾斜控制系統分析與綜合設計
- 中藥藥劑學智慧樹知到期末考試答案章節答案2024年湖南中醫藥大學
- 電纜橋架技術規范
- 肝硬化門靜脈高壓食管胃靜脈曲張出血的防治指南( 2022)
- 初中英語《反義疑問句》優質課件
- 農田水利學專業課程設計
- 子宮脫垂病例護理討論
- vte病人的健康宣教
評論
0/150
提交評論