操作系统课程设计报告
完整課程設計CSDN下載:https://download.csdn.net/download/eseszb/10503175
代碼下載:https://download.csdn.net/download/eseszb/10506006
操作系統課程設計報告
?
?
?
?
?
題目:???進程同步實現—生產者和消費者的問題????????????????????????????
學號:???????????????????????????
姓名:????????????????????????
任課教師:???????????????????????????
?
?
?
?
?
?
?
?
2017年12月
摘 要
本課程設計利用模擬用信號量機制實現生產者和消費者問題:通過用戶控制取進程和放進程,反應生產者和消費者問題中所涉及的進程的同步與互斥。在理解和分析了生產者消費者問題的核心問題以及狀態的本質涵義的前提下,對進程同步的實現在總體上進行了設計,包括在對算法分模塊設計,并對各個模塊的算法思想通過流程圖表示,分塊編寫代碼,并進行測試,最后進行程序的測試,在設計思路上嚴格按照軟件工程的思想執行,確保了設計和實現的可行,可信。代碼實現采用C++語言。
?
?
?
?
?
?
?
?
關鍵詞:生產者、消費者、進程同步、臨界資源、緩沖區
???目錄
?
第一章?緒論 1
1.1 課程設計的目的 1
1.2 課程設計的內容 1
1.3 相關知識 1
1.4章節安排 2
1.5 本章小結 3
第二章?生產者消費者問題的需求分析 4
2.1 環境需求 4
2.2 功能需求 4
2.3 性能需求 4
2.4 本章小結 5
第三章?實現進程同步的設計 6
3.1 總體設計 6
3.2 功能模塊設計 6
3.3 本章小結 7
第四章?算法的實現 9
4.1 開發環境介紹 9
4.2 主要功能模塊的實現 9
4.3 本章小結 16
第五章?測試及成果展示 17
5.1 測試環境 17
5.2 測試用例和結果 17
5.3 成果展示 25
5.4 本章小結 29
第六章?總結與展望 30
附錄 31
參考文獻 38
第一章 緒論
1.1 課程設計的目的
“操作系統”是計算機專業的核心專業課,“操作系統課程設計”是理解和鞏固操作系統基本理論、原理和方法的重要實踐環節。
通過實驗模擬生產者和消費者之間的關系,了解并掌握他們之間的關系及其原理。由此增加對進程同步的問題的了解。具體如下:
????1)掌握基本的同步互斥算法,理解生產者和消費者模型;
?2)了解windows中多線程(多進程)的并發執行機制,線程(進程)間的同步和互斥;
????3)學習使用windows中基本的同步對象,掌握相應的API。
本課程通過設計實現一個綜合作業,加深對操作系統原理的理解,提高綜合運用所學知識的能力,培養學生獨立工作和解決問題的能力,取得設計與調試的實踐經驗,為今后進一步從事計算機系統軟件和應用軟件的分析、研制和開發打下良好的基礎。
?
1.2 課程設計的內容
本次課程設計主要通過C++模擬信號量制中各個進程,及各進程之間的互斥、同步關系,來實現生產者和消費者問題。
生產者消費者問題(英語:Producer-consumer problem),也稱有限緩沖問題(英語:Bounded-buffer problem),是一個多線程同步問題的經典案例。該問題描述了兩個共享固定大小緩沖區的線程——即所謂的“生產者”和“消費者”——在實際運行時會發生的問題。生產者的主要作用是生成一定量的數據放到緩沖區中,然后重復此過程。與此同時,消費者也在緩沖區消耗這些數據。該問題的關鍵就是要保證生產者不會在緩沖區滿時加入數據,消費者也不會在緩沖區中空時消耗數據。
要解決該問題,就必須讓生產者在緩沖區滿時休眠(要么干脆就放棄數據),等到下次消費者消耗緩沖區中的數據的時候,生產者才能被喚醒,開始往緩沖區添加數據。同樣,也可以讓消費者在緩沖區空時進入休眠,等到生產者往緩沖區添加數據之后,再喚醒消費者。如果解決方法不夠完善,則容易出現死鎖的情況。出現死鎖時,兩個線程都會陷入休眠,等待對方喚醒自己。該問題也能被推廣到多個生產者和消費者的情形。
1.3 相關知識
(1)生產者、消費者:兩個共享固定大小緩沖區的線程
(2)進程間的同步:異步環境下的一組并發進程因直接制約而互相發送消息、進行互相合作、互相等待,使得各進程按一定的速度執行的過程。
(3)緩沖區:暫時置放輸入或輸出資料的內存
(4)臨界資源:一次僅允許一個進程使用的資源。
?
1.4章節安排
本文的組織結構為:第一章為緒論,第二章需求分析內容,第三章是進程同步問題的實現,第四章是算法的具體實現,第五章是軟件實現后的測試,包過測試用例和測試結果,第六章節為本次論文的總結,最后是附錄為軟件源代碼和參考文獻。
第一章緒論,主要是介紹本次課程設計的目的、內容等。
第二章需求分析,主要介紹算法應該實現的功能需求,以及算法應該改滿足的性能要求。
第三章是算法的設計,本次實現進程同步
第四章是算法的實現,根據第三章的設計,畫出每個模塊的流程圖,很據設計和流程圖編程實現每一個模塊的功能。
第五章是測試,主要是進行軟件的測試,選擇測試用例,看軟件是否滿足所有的需求分析。
第六章是總結,總結本次設計的結果,意義以及對未來的展望。
1.5 本章小結
本章的主要是對于此次進程同步問題的背景、意義以及設計安排的進行概述,使讀者能夠大體了解本課程設計主要實現目標與構成要素,對于接下來的章節的論述有著系統導向作用。
?
?
?
?
?
?
第二章 生產者消費者問題的需求分析
?
2.1環境需求:
???????Windows7系統、Microsoft visual VC++ 6.0
?
2.2功能需求:
n?對于生產者進程:產生一個數據,當要送入緩沖區時,要檢查緩沖區是否已滿,若未滿,則可將數據送入緩沖區,并通知消費者進程;否則,等待;
n?對于消費者進程:當它去取數據時,要看緩沖區中是否有數據可取,若有則取走一個數據,并通知生產者進程,否則,等待。
n?緩沖區是個臨界資源,因此,諸進程對緩沖區的操作程序是一個共享臨界區,所以,還有個互斥的問題。
?
2.3性能需求 :
1.生產者、消費者將會進行生產和消費動作,并顯示當前的狀態。
2.程序能夠一直進行生產消費活動,直到人為結束(在本程序里為按下回車鍵)。
3.執行過程中不會出現爭奪資源而中止。
?
2.4本章小結:
本章的主要是對于此次設計并且實現生產者消費者問題的需求進行分析,包括環境需求、功能需求和性能需求進行詳細的分析,確定了此次設計并且實現生產者消費者問題的運行測試環境,以及設計并且生產者消費者問題的功能要求和性能要求,為后面的實現生產者消費者問題確定了明確的目標。
?
?
?
?
?
?
?
?
?
?
?
?
第三章 生產者消費者問題的設計
?
3.1 總體設計
利用模擬用信號量機制實現生產者和消費者問題:通過用戶控制取進程和放進程,反應生產者和消費者問題中所涉及的進程的同步與互斥。
?
3.2 功能模塊設計
3.2.1數據流程圖:
1、生產者
?
?
?
?
2、消費者
?
?
3.2.2模塊說明:
const???unsigned???short???SIZE_OF_BUFFER ??= ??10; ??//緩沖區長度
??unsigned???short???ProductID ??= ??0; ????????//產品號 ?
??unsigned???short???ConsumeID ??= ??0; ????????//將被消耗的產品號
??unsigned???short???in ??= ??0; ????????????//產品進緩沖區時的緩沖區下標 ?
??unsigned???short???out ??= ??0; ????????????//產品出緩沖區時的緩沖區下標 ??
????
??int???g_buffer[SIZE_OF_BUFFER]; ????????//緩沖區是個循環隊列 ??
??bool???g_continue ??= ??true; ????????????//控制程序結束 ??
??HANDLE ??g_hMutex; ??????????????//用于線程間的互斥 ??
??HANDLE ??g_hFullSemaphore; ??????????//當緩沖區滿時迫使生產者等待
??HANDLE ??g_hEmptySemaphore; ??????????//當緩沖區空時迫使消費者等待 ?
????
??DWORD ??WINAPI ??Producer(LPVOID); ????????//生產者線程
??DWORD ??WINAPI ??Consumer(LPVOID); ????????//消費者線程 ?
?
3.3本章小結
本章主要講述了生產者消費者問題的設計,包括生產者、消費者的數據流程圖、以及一些模塊說明。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
第四章 算法的實現
?
4.1 開發環境介紹
1.window XP或window 7系統。
2. Microsoft visual VC++ 6.0
?
4.2 算法原理介紹
本課程設計利用模擬用信號量機制實現生產者和消費者問題,即在生產一個產品之前添加P1操作,在其后添加V1操作;在消費一個產品之前添加P2操作,在其后添加V2操作。
?
而本算法則用
WaitForSingleObject(g_hFullSemaphore,INFINITE);實現資源信號量的P操作,WaitForSingleObject(g_hMutex,INFINITE);實現互斥信號量的P操作,
ReleaseMutex(g_hMutex)實現互斥信號量的V操作,ReleaseSemaphore(g_hEmptySemaphore,1,NULL);實現資源信號量的V操作。
Take();??????//從緩沖區中取出一個產品
Consume();???//消費一個產品
Produce();????//生產一個產品
Append();????//把新生產的產品放入緩沖區
?
4.3 主要功能模塊的實現
4.2.1生產一個產品,輸出其ID號
void Produce()
{
std::cout<<std::endl;
std::cerr<<"生產一個產品: "<<++ProductID;
std::cout<<std::endl;
}
?
4.2.2把新生產的產品放入緩沖區
void Append()
{
std::cerr<<"把生產的產品送入緩沖區";
g_buffer[in]=ProductID;
in=(in+1)%SIZE_OF_BUFFER;
std::cerr<<std::endl;
std::cout<<"緩沖區 ?產品 ?生產者/消費者"<<std::endl;
//新產品放入緩沖區后,輸出緩沖區當前的狀態
for(int i=0;i<SIZE_OF_BUFFER;++i)
{
//輸出緩沖區下標
if (i<10)
std::cout<<i<<" ??????"<<g_buffer[i];
else
std::cout<<i<<" ?????"<<g_buffer[i];
if(i==in)
{
if(g_buffer[i]<10)
std::cout<<" ???";
else
std::cout<<" ??";
std::cout<<" <-- 生產者";//輸出生產者的指針位置
}
if(i==out)
{
if(g_buffer[i]<10)
std::cout<<" ???";
else
std::cout<<" ??";
std::cout<<" <-- 消費者";//輸出消費者的指針位置
}
std::cout<<std::endl;
}
}
?
4.2.3消費一個產品
void Consume()//消費一個產品
{
std::cout<<std::endl;
std::cerr<<"消費一個產品: "<<ConsumeID;
std::cout<<std::endl;
}
?
4.2.4從緩沖區中取出一個產品
void Take()
{
std::cout<<std::endl;
std::cerr<<"從緩沖區取出一個產品";
ConsumeID=g_buffer[out];
out=(out+1)%SIZE_OF_BUFFER;
std::cerr<<std::endl;
std::cout<<std::endl;
std::cout<<"緩沖區 ?產品 ?生產者/消費者"<<std::endl;
//取出一個產品后,輸出緩沖區當前的狀態
for(int i=0;i<SIZE_OF_BUFFER;++i)
{
//輸出緩沖區下標
if(i<10)
std::cout<<i<<" ??????"<<g_buffer[i];
else
std::cout<<i<<" ?????"<<g_buffer[i];
if(i==in)
{
if(g_buffer[i]<10)
std::cout<<" ???";
else
std::cout<<" ??";
std::cout<<" <-- 生產者";//輸出生產者的指針位置
}
if(i==out)
{
if(g_buffer[i]<10)
std::cout<<" ???";
else
std::cout<<" ??";
std::cout<<" <-- 消費者";//輸出消費者的指針位置
}
std::cout<<std::endl;
}
}
總結
以上是生活随笔為你收集整理的操作系统课程设计报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于RIA的知识
- 下一篇: 前端学习(1690):前端系列javas