討論三個(gè)問題:
1、進(jìn)程間如何通信呢,如何來相互傳遞信息呢?
(1)、低級(jí)通信:只能傳遞狀態(tài)和整數(shù)值(控制信息)
–信號(hào)量(semaphore)
–信號(hào)(signal)
(2)、高級(jí)通信:能夠傳送任意數(shù)量的數(shù)據(jù)
–共享內(nèi)存(shared memory)
–消息傳遞(message passing)
–管道(pipe)
剪貼板:
基本機(jī)制是:系統(tǒng)預(yù)留的一塊全局共享內(nèi)存,可用于被各進(jìn)程暫時(shí)存儲(chǔ)數(shù)據(jù)。寫入進(jìn)程首先創(chuàng)建一個(gè)全局內(nèi)存塊,并將數(shù)據(jù)寫到該內(nèi)存塊;接受數(shù)據(jù)的進(jìn)程通過剪貼板機(jī)制獲取此內(nèi)存塊的句柄,并完成對(duì)該內(nèi)存塊數(shù)據(jù)的讀取。
管道包括三種:
管道(Pipe)實(shí)際是用于進(jìn)程間通信的一段共享內(nèi)存,創(chuàng)建管道的進(jìn)程稱為管道服務(wù)器,連接到一個(gè)管道的進(jìn)程為管道客戶機(jī)。一個(gè)進(jìn)程在向管道寫入數(shù)據(jù)后,另一進(jìn)程就可以從管道的另一端將其讀取出來。匿名管道(Anonymous Pipes)是在父進(jìn)程和子進(jìn)程間單向傳輸數(shù)據(jù)的一種未命名的管道,只能在本地計(jì)算機(jī)中使用,而不可用于網(wǎng)絡(luò)間的通信。
1)
普通管道PIPE, 通常有種限制,一是半雙工,只能
單向傳輸; 二是只能在
父子或者兄弟進(jìn)程間使用.
2)
流管道s_pipe: 去除了第一種限制,可以
雙向傳輸.
3)
命名管道:name_pipe, 去除了第二種限制,
可以在許多并不相關(guān)的進(jìn)程之間進(jìn)行通訊.
郵件槽:
郵件槽(Mailslots)提供進(jìn)程間
單向通信能力,任何進(jìn)程都能建立郵件槽成為郵件槽服務(wù)器。其它進(jìn)程,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽服務(wù)器進(jìn)程發(fā)送消息。進(jìn)來的消息一直放在郵件槽中,直到服務(wù)器進(jìn)程讀取它為止。一個(gè)進(jìn)程既可以是郵件槽服務(wù)器也可以是郵件槽客戶,因此可
建立多個(gè)郵件槽實(shí)現(xiàn)進(jìn)程間的雙向通信。 通過郵件槽可以給本地計(jì)算機(jī)上的郵件槽、其它計(jì)算機(jī)上的郵件槽或指定網(wǎng)絡(luò)區(qū)域中所有計(jì)算機(jī)上有同樣名字的郵件槽發(fā)送消息。廣播通信的消息長(zhǎng)度不能超過400字節(jié),非廣播消息的長(zhǎng)度則受郵件槽服務(wù)器指定的最大消息長(zhǎng)度的限制。
郵件槽與命名管道相似,不過它傳輸數(shù)據(jù)是
通過不可靠的數(shù)據(jù)報(bào)(如TCP/IP協(xié)議中的UDP包)完成的,一旦網(wǎng)絡(luò)發(fā)生錯(cuò)誤則無法保證消息正確地接收,而命名管道傳輸數(shù)據(jù)則是建立在可靠連接基礎(chǔ)上的。不過郵件槽有簡(jiǎn)化的編程接口和給指定網(wǎng)絡(luò)區(qū)域內(nèi)的所有計(jì)算機(jī)廣播消息的能力,所以郵件槽不失為應(yīng)用程序發(fā)送和接收消息的另一種選擇。
優(yōu)缺點(diǎn):
郵槽最大的一個(gè)缺點(diǎn)便是只允許從客戶機(jī)到服務(wù)器,建立一種不可靠的單向數(shù)據(jù)通信。
而另一方面,郵槽最大的一個(gè)優(yōu)點(diǎn)在于,它們使客戶機(jī)應(yīng)用能夠非常容易地將廣播消息發(fā)送給一個(gè)或多個(gè)服務(wù)器應(yīng)用。
共享內(nèi)存:
存在于內(nèi)核級(jí)別的一種資源,共享內(nèi)存指在多處理器的計(jì)算機(jī)系統(tǒng)中,可以被不同中央處理器(CPU)訪問的大容量?jī)?nèi)存。由于多個(gè)CPU需要快速訪問存儲(chǔ)器,這樣就要對(duì)存儲(chǔ)器進(jìn)行緩存(Cache)。任何一個(gè)緩存的數(shù)據(jù)被更新后,由于其他處理器也可能要存取,共享內(nèi)存就需要立即更新,否則不同的處理器可能用到不同的數(shù)據(jù)。共享內(nèi)存 (shared memory)是 Unix下的多進(jìn)程之間的通信方法 ,這種方法通常用于一個(gè)程序的多進(jìn)程間通信,實(shí)際上多個(gè)程序間也可以通過共享內(nèi)存來傳遞信息。
2、當(dāng)兩個(gè)或者多個(gè)進(jìn)程訪問共享資源時(shí),如何確保他們不會(huì)相互妨礙-----進(jìn)程互斥問題。
原因:
進(jìn)程宏觀上并發(fā)執(zhí)行,依靠時(shí)鐘中斷來實(shí)現(xiàn)微觀上輪流執(zhí)行。當(dāng)兩個(gè)或者多個(gè)進(jìn)程對(duì)同一個(gè)共享內(nèi)存訪問,結(jié)果不能預(yù)測(cè)。在同一時(shí)刻,只允許一個(gè)進(jìn)程訪問該共享數(shù)據(jù),即如果當(dāng)前已有一個(gè)進(jìn)程正在使用該數(shù)據(jù),那么其他進(jìn)程暫時(shí)不能訪問。這就是互斥的概念。
實(shí)現(xiàn)互斥訪問的四個(gè)條件:
(1)、任何兩個(gè)進(jìn)程都不能同時(shí)進(jìn)入臨界區(qū);
(2)、不能事先假定CPU的個(gè)數(shù)和運(yùn)行速度;
(3)、當(dāng)一個(gè)進(jìn)程運(yùn)行在它的臨界區(qū)外面時(shí),不能妨礙其他的進(jìn)程進(jìn)入臨界區(qū);
(4)、任何一個(gè)進(jìn)程進(jìn)入臨界區(qū)的要求應(yīng)該在有限時(shí)間內(nèi)得到滿足。
(解決辦法)
(1)、用標(biāo)志位加鎖。
lock的初始值為0,當(dāng)一個(gè)進(jìn)程想進(jìn)入臨界區(qū)時(shí),先查看lock的值,若為1,說明已有進(jìn)程在臨界區(qū)內(nèi),只好循環(huán)等待。等它變成了0,才可進(jìn)入。
程同步1.jpg)
缺點(diǎn)是:lock也是一個(gè)共享資源,當(dāng)進(jìn)程競(jìng)爭(zhēng)lock時(shí),可能會(huì)出現(xiàn)問題。加鎖標(biāo)志位法的缺點(diǎn)在于可能出現(xiàn)針對(duì)共享變量 lock 的競(jìng)爭(zhēng)狀態(tài)。例如,當(dāng)進(jìn)程 0 執(zhí)行完循環(huán)判斷語句后,被時(shí)鐘中斷打斷,從而可能使多個(gè)進(jìn)程同時(shí)進(jìn)入臨界區(qū)。
是一種不安全的做法、
(2)、強(qiáng)制輪流法
基本思想:每個(gè)進(jìn)程嚴(yán)格地按照輪流的順序來進(jìn)入臨界區(qū)。
優(yōu)點(diǎn):保證在任何時(shí)刻最多只有一個(gè)進(jìn)程在臨界區(qū)
缺點(diǎn):違反了互斥訪問四條件中的第三個(gè)條件,當(dāng)一個(gè)進(jìn)程運(yùn)行在它的臨界區(qū)外面時(shí),不能妨礙其他的進(jìn)程進(jìn)入臨界區(qū)
程同步2.jpg)
(3)、Peterson方法。
當(dāng)一個(gè)進(jìn)程想進(jìn)入臨界區(qū)時(shí),先調(diào)用enter_region函數(shù),判斷是否能安全進(jìn)入,不能的話等待;當(dāng)它從臨界區(qū)退出后,需調(diào)用leave_region函數(shù),允許其它進(jìn)程進(jìn)入臨界區(qū)。兩個(gè)函數(shù)的參數(shù)均為進(jìn)程號(hào)。程同步5.jpg)

小結(jié):
當(dāng)一個(gè)進(jìn)程想要進(jìn)入它的臨界區(qū)時(shí),首先檢查一下是否允許它進(jìn)入,若允許,就直接進(jìn)入了;若不允許,就在那里循環(huán)地等待,一直等到允許它進(jìn)入。
缺點(diǎn):
1)浪費(fèi)CPU時(shí)間;
2)可能導(dǎo)致預(yù)料之外的結(jié)果(如:一個(gè)低優(yōu)先級(jí)進(jìn)程位于臨界區(qū)中,這時(shí)有一個(gè)高優(yōu)先級(jí)的進(jìn)程也試圖進(jìn)入臨界區(qū))
3、當(dāng)進(jìn)程間存在某種依存關(guān)系時(shí),如何來調(diào)整他們運(yùn)行的先后次序-----進(jìn)程同步問題。
用P,V原語操作實(shí)現(xiàn)同步(略)
另外:上述的問題也適合線程嗎??
posted on 2011-10-07 15:44
Yu_ 閱讀(1385)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Windows程序設(shè)計(jì)