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

缺點是:lock也是一個共享資源,當進程競爭lock時,可能會出現問題。加鎖標志位法的缺點在于可能出現針對共享變量 lock 的競爭狀態。例如,當進程 0 執行完循環判斷語句后,被時鐘中斷打斷,從而可能使多個進程同時進入臨界區。
是一種不安全的做法、
(2)、強制輪流法
基本思想:每個進程嚴格地按照輪流的順序來進入臨界區。
優點:保證在任何時刻最多只有一個進程在臨界區
缺點:違反了互斥訪問四條件中的第三個條件,當一個進程運行在它的臨界區外面時,不能妨礙其他的進程進入臨界區

(3)、Peterson方法。
當一個進程想進入臨界區時,先調用enter_region函數,判斷是否能安全進入,不能的話等待;當它從臨界區退出后,需調用leave_region函數,允許其它進程進入臨界區。兩個函數的參數均為進程號。

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