資源描述:
《Linux內(nèi)核與編程課件.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、提綱結(jié)束進(jìn)程間通信概述目標(biāo)問題——哲學(xué)家進(jìn)餐問題問題描述錯(cuò)誤與不好的解法并行度較高的解法Linux高級(jí)IPC機(jī)制概述SystemV信號(hào)燈SystemV共享內(nèi)存區(qū)實(shí)現(xiàn)的其他問題實(shí)習(xí)題進(jìn)程間通信概述(1):引子#include#includeintresult;main(){pid_tpid;result=0;pid=fork();if(pid<0)exit(-1);if(pid){pid=fork();if(pid<0)exit(-1);if(pid==0){sleep(3);result=result+20;ex
2、it(0);}}else{sleep(3);result=result+10;exit(0);}while(wait((int*)0)!=-1);printf("%d",result);exit(0);}輸出結(jié)果是什么?進(jìn)程間通信概述(2)進(jìn)程是相互獨(dú)立的,進(jìn)程間的通信需要專門的機(jī)制。進(jìn)程之間的通信可以經(jīng)由文件系統(tǒng),但實(shí)際使用較為復(fù)雜(例如,需要鎖機(jī)制)。UNIXIPC(InterProcessCommunication)機(jī)制是各種進(jìn)程通信方式的統(tǒng)稱。Linux下的進(jìn)程通信手段基本上是從Unix平臺(tái)上的進(jìn)程通信手段繼承而來的。進(jìn)程間通信概述(3)對(duì)于UNIX的發(fā)
3、展,貝爾實(shí)驗(yàn)室和BSD在進(jìn)程間通信方面的側(cè)重點(diǎn)有所不同:貝爾實(shí)驗(yàn)室對(duì)Unix早期的進(jìn)程間通信手段進(jìn)行了系統(tǒng)的改進(jìn)和擴(kuò)充,形成了“SystemVIPC”,通信進(jìn)程局限在單個(gè)計(jì)算機(jī)內(nèi);BSD則主要考慮跨計(jì)算機(jī)的進(jìn)程間通信,形成了基于套接口(socket)的進(jìn)程間通信機(jī)制。進(jìn)程間通信概述(4)返回最初的UNIXIPCSystemVIPC基于Socket的IPCLinuxIPCPOSIXIPC最初的UnixIPC:信號(hào)、管道、FIFO;SystemVIPC:消息隊(duì)列、信號(hào)量、共享內(nèi)存區(qū);POSIXIPC:消息隊(duì)列、信號(hào)量、共享內(nèi)存區(qū)。哲學(xué)家進(jìn)餐問題的描述五個(gè)哲學(xué)家圍坐在一張圓桌周圍,每個(gè)哲學(xué)家
4、面前都有一碗米飯,相鄰的兩碗之間有一支筷子(如圖)。哲學(xué)家的生活包含兩種活動(dòng):即吃飯和思考。當(dāng)一個(gè)哲學(xué)家覺得餓時(shí),他就試圖分兩次去取他左邊和右邊的筷子,每次拿起一支,但不分次序。如果成功地獲得了一雙筷子,他就開始吃飯,吃完以后放下筷子繼續(xù)思考。這樣,問題就是,為每個(gè)哲學(xué)家寫一段程序來描述其行為,要求不死鎖。返回錯(cuò)誤與不好的解法(1)解法一:可能進(jìn)入“死鎖”狀態(tài)#defineN5voidphilosopher(inti){while(TRUE){think();take-chopstick(i);take-chopstick((i+1)%N);eat();put-chopstick(i)
5、;put-chopstick((i+1)%N);}}若每個(gè)哲學(xué)家進(jìn)程都運(yùn)行到此句后發(fā)生進(jìn)程切換,則進(jìn)入死鎖。錯(cuò)誤與不好的解法(2)#defineN5voidphilosopher(inti){while(TRUE){think();do{take-chopstick(i);if(can-take-chopstick((i+1)%N))break;elseput-chopstick(i);}while(TRUE);eat();put-chopstick(i);put-chopstick((i+1)%N);}}解法二:可能進(jìn)入“饑餓”狀態(tài)不妨假設(shè)此函數(shù)能做到“測(cè)試且設(shè)置”。這種解法可能會(huì)造
6、成下面情況:哲學(xué)家們不斷地重復(fù)“拿起各自左邊的筷子又放下”的動(dòng)作,誰也不能進(jìn)餐。注意:這時(shí)和解法一的狀態(tài)不同,這時(shí)進(jìn)程都沒有阻塞。錯(cuò)誤與不好的解法(3)#defineN5typedefintsemaphore;semaphoremutex=1;voidphilosopher(inti){while(TRUE){think();down(mutex);take-chopstick(i);take-chopstick((i+1)%N);eat();put-chopstick(i);put-chopstick((i+1)%N);up(mutex);}}返回解法三:可行但效率低下本解法從理論上
7、可行,但從實(shí)際角來看,有一局限性:同一時(shí)刻只能有一位哲學(xué)家進(jìn)餐。而這里有五支筷子,實(shí)際上應(yīng)能允許兩位哲學(xué)家同時(shí)進(jìn)餐。并行度較高的解法(1)#defineN5#defineLEFT(i+N-1)%N#defineRIGHT(i+1)%N#defineTHINKING0#defineHUNGRY1#defineEATING2typedefintsemaphore;intstate[N];semaphoremutex=1;semaphores[N];