進程同步與通訊html
操做系統教程:http://c.biancheng.net/cpp/html/2592.html數據庫
進程的同步與互斥是指進程在推動時的相互制約關係。服務器
#進程同步:它主要源於進程合做,是進程間共同完成一項任務時直接發生相互做用的關係。爲進程之間的直接制約關係。如生產者-消費者問題,哲學家進餐問題。網絡
#進程互斥:它主要源於資源共享,是進程之間的間接制約關係。在多道系統中,每次只容許一個進程訪問的資源稱爲臨界資源,進程互斥就是保證每次只有一個進程使用臨界資源。如訪問控制檯、打印機。數據結構
爲禁止兩個進程同時進入臨界區,同步機制應遵循如下準則:併發
空閒讓進:臨界區空閒時,能夠容許一個請求進入臨界區的進程當即進入臨界區。app
忙則等待:當已有進程進入臨界區時,其餘試圖進入臨界區的進程必須等待。函數
有限等待:對請求訪問的進程,應保證能在有限時間內進入臨界區。工具
讓權等待:當進程不能進入臨界區時,應當即釋放處理器,防止進程忙等待。this
進程同步和互斥在不一樣的系統中有不一樣的實現。
Windows中的進程同步方法有信號量、事件,互斥方法有臨界區、互斥鎖。
Linux中的進程同步方法有?? 互斥方法有??
信號量是一種功能較強的機制,可用來解決互斥與同步的問題,它只能被兩個標準的原語wait(S)和signal(S)來訪問,也能夠記爲「P操做」和「V操做」。
Wait原語的實現
|
Signal 原語實現
|
//生產者-消費者的信號量實現(包含同步和互斥) semaphore mutex=1; //臨界區互斥信號量 semaphore empty=n; //空閒緩衝區 semaphore full=0; //緩衝區初始化爲空 producer () { //生產者進程 while(1){ produce an item in nextp; //生產數據 P(empty); //獲取空緩衝區單元 P(mutex); //進入臨界區. add nextp to buffer; //將數據放入緩衝區 V(mutex); //離開臨界區,釋放互斥信號量 V(full); //滿緩衝區數加1 } }
consumer () { //消費者進程 while(1){ P(full); //獲取滿緩衝區單元 P(mutex); // 進入臨界區 remove an item from buffer; //從緩衝區中取出數據 V (mutex); //離開臨界區,釋放互斥信號量 V (empty) ; //空緩衝區數加1 consume the item; //消費數據 } }
|
進程通訊:
進程通訊是指進程之間的信息交換。PV操做是低級通訊方式(進程同步互斥也是一種進程通訊方式),髙級通訊方式是指以較高的效率傳輸大量數據的通訊方式。高級通訊方法主要有如下三個類:
共享存儲:
在通訊的進程之間存在一塊可直接訪問的共享空間,經過對這片共享空間進行寫/讀操做實現進程之間的信息交換。在對共享空間進行寫/讀操做時,須要使用同步互斥工具(如 P操做、V操做),對共享空間的寫/讀進行控制。共享存儲又分爲兩種:低級方式的共享是基於數據結構的共享;高級方式則是基於存儲區的共享。
對應Windows中文件映射、剪貼板、共享內存、
對應Linux中的???
消息傳遞:
在消息傳遞系統中,進程間的數據交換是以格式化的消息(Message)爲單位的。若通訊的進程之間不存在可直接訪問的共享空間,則必須利用操做系統提供的消息傳遞方法實現進程通訊。進程經過系統提供的發送消息和接收消息兩個原語進行數據交換。
1) 直接通訊方式:發送進程直接把消息發送給接收進程,並將它掛在接收進程的消息緩衝隊列上,接收進程從消息緩衝隊列中取得消息。Windows下實現方式有?? Linux下實現方式有??, 。
2) 間接通訊方式:發送進程把消息發送到某個中間實體中,接收進程從中間實體中取得消息。這種中間實體通常稱爲信箱,這種通訊方式又稱爲信箱通訊方式。該通訊方式普遍應用於計算機網絡中,相應的通訊系統稱爲電子郵件系統。Windows下實現方式有郵件槽,Linux下實現方式有??
管道通訊:
管道通訊是消息傳遞的一種特殊方式。所謂「管道」,是指用於鏈接一個讀進程和一個寫進程以實現它們之間通訊的一個共享文件,又名pipe文件。向管道(共享文件)提供輸入的發送進程(即寫進程),以字符流形式將大量的數據送入(寫)管道;而接收管道輸出的接收進程(即讀進程),則從管道中接收(讀)數據。爲了協調雙方的通訊,管道機制必須提供如下三方面的協調能力:互斥、同步和肯定對方的存在, Windows 和Linux下均有相應實現。
Socket:不在多說。
Windows下的進程同步互斥機制有:
http://blog.csdn.net/jannet262/article/details/576445
http://blog.csdn.net/chainsmoker2010/article/details/6038678
臨界區、互斥區、事件、信號量
臨界區(Critical Section)、互斥量(Mutex)、信號量(Semaphore)、事件(Event)的區別
一、臨界區:線程間的互斥機制,速度快,佔用資源少;
二、互斥量:進程級的互斥機制,相對臨界區代價更大。
三、信號量:進程同步機制,它容許多個線程在同一時刻訪問同一資源,可是須要限制在同一時刻訪問此資源的最大線程數目 .信號量對象對線程的同步方式與前面幾種方法不一樣,信號容許多個線程同時使用共享資源,這與操做系統中的PV操做相同。它指出了同時訪問共享資源的線程最大數目。它容許多個線程在同一時刻訪問同一資源,可是須要限制在同一時刻訪問此資源的最大線程數目。例如:對數據庫最多n個併發訪問。信號燈對象能夠說是一種資源計數器。
四、事件:進程同步機制,相對於信號量的資源共享功能,事件主要用於進程間的協做。事件對象能夠由兩種方式建立,一種爲自動重置,在其餘線程使用WaitForSingleObject等待到事件對象變爲有信號後該事件對象自動又變爲無信號狀態,一種爲人工重置在其餘線程使用WaitForSingleObject等待到事件對象變爲有信號後該事件對象狀態不變。例若有多個線程都在等待一個線程運行結束,咱們就可使用人工重置事件,在被等待的線程結束時設置該事件爲有信號狀態,這樣其餘的多個線程對該事件的等待都會成功
Windows下進程通訊(IPC)的幾種方式:
http://blog.csdn.net/weiwangchao_/article/details/7104940
http://blog.csdn.net/sszgg2006/article/details/8508882
進程間通訊主要包括管道, 系統IPC(包括消息隊列,信號量,共享存儲), SOCKET.
# 匿名管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
# 命名管道 (named pipe) : 命名名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
#文件映射((Memory-Mapped Files)):共享存儲區的一種。文件映射能使進程把文件內容看成進程地址區間一塊內存那樣來對待。所以,進程沒必要使用文件I/O操做,只需簡單的指針操做就可讀取和修改文件的內容
#郵件槽(Mailslots):屬於消息傳遞。郵件槽提供進程間單向通訊能力,任何進程都能創建郵件槽成爲郵件槽服務器。其它進程,稱爲郵件槽客戶,能夠經過郵件槽的名字給郵件槽服務器進程發送消息。進來的消 息一直放在郵件槽中,直到服務器進程讀取它爲止。一個進程既能夠是郵件槽服務器也能夠是郵件槽客戶,所以可創建多個郵件槽實現進程間的雙向通訊。
#剪貼板:屬於共享內存。剪貼板是一個很是鬆散的交換媒介,能夠支持任何數據格式,每一格式由一無符號整數標識,對標準(預約義)剪貼板格式,該值是Win32 API定義的常量;對非標準格式可使用Register Clipboard Format函數註冊爲新的剪貼板格式。利用剪貼板進行交換的數據只需在數據格式上一致或均可以轉化爲某種格式就行。但剪貼板只能在基於Windows的程序中使用,不能在網絡上使用。
#Socket,DDE等其餘方式;
Linux下的進程通訊與同步(待完成)。
<script>alert("gao")</script>