版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 臨界區(qū)管理實(shí)現(xiàn)</b></p><p><b> 0 引言</b></p><p> 隨著多處理機(jī)體系結(jié)構(gòu)的演變和分布式與并行系統(tǒng)的發(fā)展,并發(fā)多任務(wù)的程序設(shè)計(jì)技術(shù)已愈來愈顯得重要,多線程設(shè)計(jì)模式在這些技術(shù)的發(fā)展中起著重要作用。在現(xiàn)代操作系統(tǒng)中,利用進(jìn)(線)程間的并發(fā)性實(shí)現(xiàn)程序中并發(fā)成分的并行執(zhí)行,可大大提高系統(tǒng)的
2、處理能力和效率,但也可能帶來諸如執(zhí)行結(jié)果的不確定性等不良現(xiàn)象,因此并發(fā)系統(tǒng)中處理好進(jìn)(線)程間的互斥與同步就顯得至關(guān)重要。C++語言中的多線程機(jī)制是解決線程間的互斥與同步問題的重要工具,其應(yīng)用(如網(wǎng)絡(luò)多媒體應(yīng)用、工業(yè)自動(dòng)化控制等)很廣泛,很復(fù)雜且常易出錯(cuò)。因此在應(yīng)用程序設(shè)計(jì)過程中,要考慮多個(gè)線程如何同步使用進(jìn)程的共享資源,如何讓一個(gè)線程與另一個(gè)線程協(xié)調(diào)合作,以免產(chǎn)生線程間的訪問沖突。語言提供的多線程機(jī)制能有避免同一共享互斥資源被多個(gè)線程
3、同時(shí)訪問,維護(hù)數(shù)據(jù)的一致性、安全性。生產(chǎn)者/消費(fèi)者問題可作為并發(fā)進(jìn)程的同步和互斥問題的一個(gè)抽象模型,廣泛應(yīng)用于通信和控制系統(tǒng)中。本文基于C++語言中的多線程機(jī)制,實(shí)現(xiàn)操作系統(tǒng)中生產(chǎn)者/消費(fèi)者問題,以助人們更好地透解同步概念及其實(shí)現(xiàn)方法。</p><p><b> 1 課程設(shè)計(jì)目的</b></p><p> 通過模擬操作者生產(chǎn)者經(jīng)典問題的實(shí)現(xiàn),以及關(guān)于信號(hào)量和互斥鎖
4、對(duì)于多線程的運(yùn)用,深入理解操作系統(tǒng)中多線程同步法的理論知識(shí), 加深對(duì)教材中的重要算法的理解。同時(shí)通過編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識(shí)的能力。</p><p> 2 課程設(shè)計(jì)題目和要求</p><p> 2.1 課程設(shè)計(jì)題目</p><p> 題目: 臨界區(qū)管理實(shí)現(xiàn).</p><p> 2.
5、2課程設(shè)計(jì)目的與要求</p><p><b> 初始條件:</b></p><p> 1.操作系統(tǒng):Windows</p><p> 2.程序設(shè)計(jì)語言:C++語言</p><p> 3.有界緩沖區(qū)內(nèi)設(shè)有20個(gè)存儲(chǔ)單元,其初值為0。放入/取出的數(shù)據(jù)項(xiàng)按增序設(shè)定為1-20這20個(gè)整型數(shù)。</p><
6、;p><b> 技術(shù)要求:</b></p><p> 1、 生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。多個(gè)生產(chǎn)者或</p><p> 多個(gè)消費(fèi)者之間須有共享對(duì)緩沖區(qū)進(jìn)行操作</p><p> 的函數(shù)代碼。每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖</p><p> 區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的全部內(nèi)</p>&l
7、t;p><b> 容,當(dāng)前指針位置。</b></p><p> 2、 編寫多線程同步方法解決生產(chǎn)者-消費(fèi)者的程</p><p> 序,并完成對(duì)進(jìn)程進(jìn)行模擬同步和互斥的控制。</p><p><b> 2 設(shè)計(jì)總體思路</b></p><p> 2.1 多線程編程思想</p>
8、;<p> 編寫Windows下的多線程程序,需要使用頭文件pthread.h以及windows.h.在LINUX下進(jìn)行多線程編程首先要用到CreateThread()這個(gè)函數(shù).函數(shù)CreateThread()用來創(chuàng)建一個(gè)線程,它的原型為:</p><p> HANDLE CreateThread(</p><p> LPSECURITY_ATTRIBUTES lpTh
9、readAttributes, </p><p> // pointer to security attributes</p><p> DWORD dwStackSize,</p><p> // initial thread stack size</p><p> LPTHREAD_START_ROUTINE lpStar
10、tAddress, </p><p> // pointer to thread function</p><p> LPVOID lpParameter,</p><p> // argument for new thread</p><p> DWORD dwCreationFlags,</p><p>
11、 // creation flags</p><p> LPDWORD lpThreadId);</p><p> // pointer to receive thread ID</p><p> 第一個(gè)參數(shù)是指向SECURITY_ATTRIBUTES型態(tài)的結(jié)構(gòu)的指針。在Windows 98中忽略該參數(shù)。在Windows NT中,它被設(shè)為NULL。第二個(gè)參數(shù)
12、是用于新線程的初始堆棧大小,默認(rèn)值為0。在任何情況下,Windows根據(jù)需要?jiǎng)討B(tài)延長堆棧的大小。第三個(gè)參數(shù)是指向線程函數(shù)的指標(biāo)。函數(shù)名稱沒有限制,但是必須以下列形式聲明:DWORD WINAPI ThreadProc (PVOID pParam) ;第四個(gè)參數(shù)為傳遞給ThreadProc的參數(shù)。這樣主線程和從屬線程就可以共享數(shù)據(jù)。第五個(gè)參數(shù)通常為0,但當(dāng)建立的線程不馬上執(zhí)行時(shí)為旗標(biāo)CREATE_SUSPENDED。線程將暫停直到
13、呼叫ResumeThread來恢復(fù)線程的執(zhí)行為止。第六個(gè)參數(shù)是一個(gè)指標(biāo),指向接受執(zhí)行緒ID值的變量。</p><p><b> 2.1.1線程數(shù)據(jù)</b></p><p> 在單線程的程序里,有兩種基本的數(shù)據(jù):全局變量和局部變量。但在多線程程序里,還有第三種數(shù)據(jù)類型:線程數(shù)據(jù)。它和全局變量很象,在線程內(nèi)部,各個(gè)函數(shù)可以象使用全局變量一樣調(diào)用它,但它對(duì)線程外部的其
14、它線程是不可見的。這種數(shù)據(jù)的必要性是顯而易見的。例如我們常見的變量errno,它返回標(biāo)準(zhǔn)的出錯(cuò)信息。它顯然不能是一個(gè)局部變量,幾乎每個(gè)函數(shù)都應(yīng)該可以調(diào)用它;但它又不能是一個(gè)全局變量,否則在A線程里輸出的很可能是B線程的出錯(cuò)信息。</p><p> ThreadHandle[0]=CreateThread(NULL,0,Producer,NULL,0,&producer1)其六個(gè)參數(shù)分別表示為安全設(shè)置,堆
15、棧大小,入口函數(shù),函數(shù)參數(shù),啟動(dòng)選項(xiàng),輸出線程 ID,返回線程句柄。</p><p><b> 2.1.2 互斥鎖</b></p><p> 互斥鎖用來保證一段時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行一段代碼,必要性顯而易見:假設(shè)各個(gè)線程向同一個(gè)文件順序?qū)懭霐?shù)據(jù),最后得到的結(jié)果一定是災(zāi)難性的.函數(shù)mutex = CreateMutex(NULL,FALSE,NULL);用來生成一
16、個(gè)互斥鎖.NULL參數(shù)表明使用默認(rèn)屬性.如果需要聲明特定屬性的互斥鎖,須調(diào)用函數(shù) CreateMutex(NULL,FALSE,NULL)</p><p> WaitForSingleObject(mutex,INFINITE)聲明開始用互斥鎖上鎖,直至調(diào)用ReleaseMutex(mutex)為止,均被上鎖,</p><p> 即同一時(shí)間只能被一個(gè)線程調(diào)用執(zhí)行.當(dāng)一個(gè)線
17、程執(zhí)行到pthread_mutex_lock處時(shí),如果該鎖此時(shí)被另一個(gè)線程使用,那么此線程被阻塞,即程序?qū)⒌却搅硪粋€(gè)線程釋放此互斥鎖.</p><p><b> 2.1.3 信號(hào)量</b></p><p> 信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來控制對(duì)公共資源的訪問。當(dāng)公共資源增加時(shí),調(diào)用函數(shù)aitForSingleObject(empty,INFINIT
18、E)增加信號(hào)量。只有當(dāng)信號(hào)量值大于0時(shí),才能使用公共資源,使用后,函數(shù)WaitForSingleObject(full,INFINITE)減少信號(hào)量。</p><p> 函數(shù) ReleaseSemaphore(full,1,NULL)用來增加信號(hào)量的值。當(dāng)有線程阻塞在這個(gè)信號(hào)量上時(shí),調(diào)用這個(gè)函數(shù)會(huì)使其中的一個(gè)線程不在阻塞,選擇機(jī)制同樣是由線程的調(diào)度策略決定的。函數(shù)ReleaseSemaphor()用來釋放信號(hào)量
19、。</p><p><b> 2.2 設(shè)計(jì)原理</b></p><p> 生產(chǎn)者線程和消費(fèi)者線程共享同一個(gè)緩沖隊(duì)列,生產(chǎn)者線程向緩沖區(qū)中寫數(shù)據(jù),消費(fèi)者線程從緩沖區(qū)中取數(shù)據(jù)。但兩者必須在使用緩沖隊(duì)列資源時(shí)保持互斥,否則可能會(huì)導(dǎo)致在寫入時(shí)產(chǎn)生數(shù)據(jù)覆蓋,在讀出時(shí)得到錯(cuò)誤數(shù)據(jù)。因而要在程序中設(shè)置一個(gè)互斥鎖或公用信號(hào)量,用于保證線程間的互斥執(zhí)行。同時(shí)生產(chǎn)者線程和消費(fèi)者線程必
20、須保持同步關(guān)系,因?yàn)樯a(chǎn)者線程的執(zhí)行為消費(fèi)者線程提供了需要的數(shù)據(jù),是其執(zhí)行的前提。反之,消費(fèi)者線程的執(zhí)行為生產(chǎn)者線程騰出了空閑的緩沖單元,為寫數(shù)據(jù)提供了條件。即消費(fèi)者線程執(zhí)行的前提:緩沖隊(duì)列中至少有一個(gè)單元有數(shù)據(jù);生產(chǎn)者線程執(zhí)行的前提:緩沖隊(duì)列中至少有一個(gè)單元是空的。在設(shè)計(jì)過程中,利用信號(hào)量和wait 、signal原語操作來實(shí)現(xiàn)。如圖1所示:</p><p> 圖1 生產(chǎn)者、消費(fèi)者共享有界緩沖區(qū)</p&
21、gt;<p> 2.3 原語操作實(shí)現(xiàn)</p><p> The structure of the producer process</p><p><b> do {</b></p><p><b> // 生產(chǎn)產(chǎn)品</b></p><p> wait (empty);<
22、;/p><p> wait (mutex);</p><p> // 往Buffer中放入產(chǎn)品</p><p> signal (mutex);</p><p> signal (full);</p><p> } while (true);</p><p> The structur
23、e of the consumer process</p><p><b> do {</b></p><p> wait (full);</p><p> wait (mutex);</p><p> // 從Buffer中取出產(chǎn)品</p><p> signal (mutex);&l
24、t;/p><p> signal (empty);</p><p><b> // 消費(fèi)產(chǎn)品</b></p><p> } while (true);</p><p><b> 3 開發(fā)環(huán)境與工具</b></p><p> 系統(tǒng)平臺(tái):Windows環(huán)境</p>
25、;<p> 實(shí)現(xiàn)語言:C++語言</p><p> 開發(fā)工具:Vs2012</p><p><b> 4 概要設(shè)計(jì)</b></p><p> 4.1 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</p><p> 通過分析課程設(shè)計(jì)要求,具體設(shè)計(jì)出如下數(shù)據(jù)結(jié)構(gòu):</p><p> 1. int buffe
26、r[20]={0};//定義緩沖區(qū)空間大小</p><p> 2.包含數(shù)據(jù)結(jié)構(gòu)pthread_t 它記錄一個(gè)線程的號(hào),主要包括下面幾個(gè)函數(shù),完成不同的功能:</p><p> ThreadHandle[0]=CreateThread(NULL,0,Producer,NULL,0,&producer1); //創(chuàng)建一個(gè)線程。</p><p> Exit
27、Thread(0);</p><p> CloseHandle(ThreadHandle[0]);</p><p> //等待一個(gè)線程結(jié)束。</p><p> 4.2 程序模塊實(shí)現(xiàn)</p><p> 4.2.1 生產(chǎn)者(Producer)模塊 </p><p> 生產(chǎn)者線程向一緩沖區(qū)中寫入數(shù)據(jù),且寫入緩沖區(qū)的
28、數(shù)目不能超過緩沖區(qū)容量。當(dāng)生產(chǎn)者產(chǎn)生出數(shù)據(jù),需要將其存入緩沖區(qū)之前,首先檢查緩沖區(qū)中是否有“空”存儲(chǔ)單元,若緩沖區(qū)存儲(chǔ)單元全部用完,則生產(chǎn)者必須阻塞等待,直到消費(fèi)者取走一個(gè)存儲(chǔ)單元的數(shù)據(jù),喚醒它。若緩沖區(qū)內(nèi)有“空”存儲(chǔ)單元,生產(chǎn)者需要判斷此時(shí)是否有別的生產(chǎn)者或消費(fèi)者正在使用緩沖區(qū),若是有,則阻塞等待,否則,獲得緩沖區(qū)的使用權(quán),將數(shù)據(jù)存入緩沖區(qū),釋放緩沖區(qū)的使用權(quán),其流程圖如圖2所示:</p><p><b&
29、gt; 圖2 生產(chǎn)者流程圖</b></p><p><b> //生產(chǎn)者線程</b></p><p> DWORD WINAPI Producer(LPVOID lpPara)</p><p><b> {</b></p><p><b> do{</b>
30、</p><p> WaitForSingleObject(empty,INFINITE); //空緩沖區(qū)減1</p><p> WaitForSingleObject(mutex,INFINITE); //信號(hào)量上鎖</p><p> buffer[in]=in+1; //往Buffer中放入產(chǎn)品</p>&l
31、t;p> in=(in+1)%BUFFER_SIZE; </p><p> //放入指針調(diào)整,為下次送出做準(zhǔn)備</p><p> printAll();</p><p> ReleaseMutex(mutex); //信號(hào)量解鎖</p><p> ReleaseSemaphore(full,1,NULL);
32、 </p><p> //滿緩沖區(qū)加1,即當(dāng)公共資源增加時(shí),調(diào)用函數(shù)ReleaseSemaphore()增加信號(hào)量</p><p> }while(1);</p><p><b> }</b></p><p> 4.2.2 消費(fèi)者(Consumer)模塊 </p><p> 消費(fèi)者線程
33、從緩沖區(qū)中讀取數(shù)據(jù),且消費(fèi)者讀取的數(shù)目不能超過生產(chǎn)者寫入的數(shù)目。消費(fèi)者取數(shù)據(jù)之前,首先檢查緩沖區(qū)中是否存在裝有數(shù)據(jù)的存儲(chǔ)單元,若緩沖區(qū)為“空”,則阻塞等待,否則,判斷緩沖區(qū)是否正在被使用,若正被使用,若正被使用,則阻塞等待,否則,獲得緩沖區(qū)的使用權(quán),進(jìn)入緩沖區(qū)取數(shù)據(jù),釋放緩沖區(qū)的使用權(quán)。其執(zhí)行流程如圖3所示:</p><p><b> 圖3 消費(fèi)者流程圖</b></p>&l
34、t;p><b> //消費(fèi)者線程</b></p><p> DWORD WINAPI Consumer(LPVOID lpPara)</p><p><b> {</b></p><p><b> do{</b></p><p> WaitForSingleOb
35、ject(full,INFINITE); //滿緩沖區(qū)減1</p><p> WaitForSingleObject(mutex,INFINITE); //信號(hào)量上鎖</p><p> buffer[out]=0; //從Buffer中取出產(chǎn)品</p><p> out=(out+1)%BUFFER_SIZE; //取
36、指針調(diào)整,為下次取做準(zhǔn)備</p><p> printAll();</p><p> ReleaseMutex(mutex); //信號(hào)量解鎖</p><p> ReleaseSemaphore(empty,1,NULL); //空緩沖區(qū)加1</p><p> }while(1);</p><p&g
37、t;<b> }</b></p><p><b> 5 詳細(xì)設(shè)計(jì)</b></p><p><b> 5.1 源程序代碼</b></p><p> #include<iostream></p><p> #include <stdio.h><
38、;/p><p> #include <pthread.h></p><p> #include <semaphore.h></p><p> #include <windows.h></p><p> using namespace std;</p><p> DWORD WI
39、NAPI Producer(LPVOID);</p><p> DWORD WINAPI Consumer(LPVOID);</p><p> #define WINAPI_stdcall </p><p> #define THREAD_NUM 20</p><p> #define BUFFER_SIZE 20 //20
40、個(gè)緩沖區(qū)</p><p> int buffer[20]={0};</p><p> HANDLE empty;</p><p> HANDLE full;</p><p> HANDLE mutex; //for mutual exclusion進(jìn)程信號(hào)量</p><p> int in=0
41、; //point to the next free positon</p><p> int out=0; //point to the first full positon</p><p> //把所有的緩沖區(qū)輸出到屏幕上</p><p> void printAll(){</p><p>&l
42、t;b> int i;</b></p><p> for(i=0;i<20;i++)</p><p> cout<<i<<" ";</p><p> cout<<endl;</p><p> cout<<"current produ
43、cer pointer:"<<in<<endl;</p><p> cout<<"current consumer pointer:"<<out<<endl;</p><p><b> }</b></p><p><b> //生產(chǎn)者線程&
44、lt;/b></p><p> DWORD WINAPI Producer(LPVOID lpPara)</p><p><b> {</b></p><p><b> do{</b></p><p> WaitForSingleObject(empty,INFINITE);
45、 //空緩沖區(qū)減1</p><p> WaitForSingleObject(mutex,INFINITE); //信號(hào)量上鎖</p><p> buffer[in]=in+1; //往Buffer中放入產(chǎn)品</p><p> in=(in+1)%BUFFER_SIZE; </p><p> //放
46、入指針調(diào)整,為下次送出做準(zhǔn)備</p><p> printAll();</p><p> ReleaseMutex(mutex); //信號(hào)量解鎖</p><p> ReleaseSemaphore(full,1,NULL); </p><p> //滿緩沖區(qū)加1,即當(dāng)公共資源增加時(shí),調(diào)用函數(shù)ReleaseSemaphore
47、()增加信號(hào)量</p><p> }while(1);</p><p><b> }</b></p><p><b> //消費(fèi)者線程</b></p><p> DWORD WINAPI Consumer(LPVOID lpPara)</p><p><b>
48、; {</b></p><p><b> do{</b></p><p> WaitForSingleObject(full,INFINITE); //滿緩沖區(qū)減1</p><p> WaitForSingleObject(mutex,INFINITE); //信號(hào)量上鎖</p><p
49、> buffer[out]=0; //從Buffer中取出產(chǎn)品</p><p> out=(out+1)%BUFFER_SIZE; //取指針調(diào)整,為下次取做準(zhǔn)備</p><p> printAll();</p><p> ReleaseMutex(mutex); //信號(hào)量解鎖</p><p>
50、 ReleaseSemaphore(empty,1,NULL); //空緩沖區(qū)加1</p><p> }while(1);</p><p><b> }</b></p><p><b> //主線程</b></p><p> int main()</p><p&g
51、t; { //創(chuàng)建進(jìn)程</p><p> DWORD producer[THREAD_NUM],consumer[THREAD_NUM];</p><p> mutex = CreateMutex(NULL,FALSE,NULL); // 用默認(rèn)屬性初始化一個(gè)互斥變量mutex</p><p> HANDLE ThreadHandle[
52、THREAD_NUM];</p><p><b> // 初始化信號(hào)量</b></p><p> full=CreateSemaphore(NULL,0,10,NULL);</p><p> empty=CreateSemaphore(NULL,10,10,NULL);</p><p> //CreateThre
53、ade函數(shù)用來創(chuàng)建生產(chǎn)者和消費(fèi)者進(jìn)程,其六個(gè)參數(shù)分別表示為安全設(shè)置,堆棧大小,入口函數(shù),函數(shù)參數(shù),啟動(dòng)選項(xiàng),輸出線程 ID,返回線程句柄</p><p> for(int i=0;i<THREAD_NUM;i++)</p><p><b> {</b></p><p> ThreadHandle[i] = CreateThread(
54、NULL,0,Producer,NULL,0,&producer[i]);</p><p> ThreadHandle[i] = CreateThread(NULL,0,Consumer,NULL,0,&consumer[i]);</p><p> ThreadHandle[i+1] = CreateThread(NULL,0,Producer,NULL,0,&
55、producer[i+1]);</p><p> ThreadHandle[i+1] = CreateThread(NULL,0,Consumer,NULL,0,&consumer[i+1]);</p><p><b> }</b></p><p><b> }</b></p><p>
56、; 6 程序運(yùn)行結(jié)果及分析</p><p><b> 6.1 運(yùn)行結(jié)果</b></p><p> 進(jìn)入Windows開發(fā)環(huán)境后,通過Vs2012編輯器在其中編寫。進(jìn)入Vs2012的命令,對(duì)程序執(zhí)行編譯運(yùn)行命令后,即可在屏幕上顯示出程序運(yùn)行的結(jié)果,其運(yùn)行結(jié)果如下圖5所示:</p><p><b> 7 總結(jié)</b>&
57、lt;/p><p> 其實(shí)在做這道題目時(shí)花費(fèi)了好長時(shí)間,第一點(diǎn)是書上大多介紹的是關(guān)于UNIX系統(tǒng)下的消費(fèi)者生產(chǎn)者線程問題,因此一開始調(diào)試不出來,后來查閱了有一些資料知道要在windows平臺(tái)下運(yùn)行必須要導(dǎo)入<pthread.h>以及<windows.h>兩個(gè)庫。</p><p> 通過這次課程設(shè)計(jì),不但加深了對(duì)操作系統(tǒng)這們課程的認(rèn)識(shí),而且還了解了操作系統(tǒng)中使用信號(hào)量
58、解決生產(chǎn)者—消費(fèi)者問題算法的實(shí)現(xiàn)。比如:用信號(hào)量解決生產(chǎn)者—消費(fèi)者問題時(shí),可以通過一個(gè)有界緩沖區(qū)(用數(shù)組來實(shí)現(xiàn),類似循環(huán)隊(duì)列)把生產(chǎn)者和消費(fèi)者聯(lián)系起來。假定生產(chǎn)者和消費(fèi)者的優(yōu)先級(jí)是相同的,只要緩沖區(qū)未滿,生產(chǎn)者就可以生產(chǎn)產(chǎn)品并將產(chǎn)品送入緩沖區(qū)。類似地,只要緩沖區(qū)未空,消費(fèi)者就可以從緩沖區(qū)中去走產(chǎn)品并消費(fèi)它。為了解決生產(chǎn)者/消費(fèi)者問題,應(yīng)該設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示空緩沖區(qū)的數(shù)目,用full表示,其初始值為有界緩沖區(qū)的大??;另一個(gè)表
59、示緩沖區(qū)中產(chǎn)品的數(shù)目,用empty表示,其初始值為0。另外,由于有界緩沖區(qū)是一個(gè)臨界資源,必須互斥使用,所以還需要再設(shè)置一個(gè)互斥信號(hào)量mutex,起初值為1。在生產(chǎn)者/消費(fèi)者問題中,信號(hào)量實(shí)現(xiàn)兩種功能。首先,它是生產(chǎn)產(chǎn)品和消費(fèi)產(chǎn)品的計(jì)數(shù)器,計(jì)數(shù)器的初始值是可利用的資源數(shù)目(有界緩沖區(qū)的長度)。其次,它是確保產(chǎn)品的生產(chǎn)者和消費(fèi)者之間動(dòng)作同步的同步器。</p><p> 生產(chǎn)者要生產(chǎn)一個(gè)產(chǎn)品時(shí),首先對(duì)資源信號(hào)量fu
60、ll和互斥信號(hào)量mute進(jìn)行操作,申請(qǐng)資源。如果可以通過的話,就生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品送入緩沖區(qū)。然后對(duì)互斥信號(hào)量mutex和資源信號(hào)量empty進(jìn)行操作,釋放資源。消費(fèi)者要消費(fèi)一個(gè)產(chǎn)品時(shí),首先對(duì)資源信號(hào)量empty和互斥信號(hào)量mutex進(jìn)行操作,申請(qǐng)資源。如果可以通過的話,就從緩沖區(qū)取出一個(gè)產(chǎn)品并消費(fèi)掉。然后對(duì)互斥信號(hào)量mutex和資源信號(hào)量full進(jìn)行操作,釋放資源。</p><p> 另外,使我們體會(huì)最深
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)---操作系統(tǒng)之文件管理部分的設(shè)計(jì)與實(shí)現(xiàn)
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-- geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---文件管理系統(tǒng)設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--資源管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬實(shí)現(xiàn)可變分區(qū)存儲(chǔ)管理
評(píng)論
0/150
提交評(píng)論