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