進程間通信與線程間通信


  以前一直想找個機會總結一下進程和線程的通信機制,但由於技術和平臺的侷限性,一直沒有找準切入點。由於馬上要畢業了,對自己技術的總結和梳理的前提下寫了本篇文章,如有錯誤之處,敬請拍磚和指教。

         操作系統的主要任務是管理計算機的軟件、硬件資源。現代操作系統的主要特點是多用戶和多任務,也就是程序的並行執行,windows如此linux也是如此。所以操作系統就藉助於進程來管理計算機的軟、硬件資源,支持多任務的並行執行。要並行執行就需要多進程、多線程。因此多進程和多線程間爲了完成一定的任務,就需要進行一定的通信。而線程間通信又和進程間的通信不同。由於進程的數據空間相對獨立而線程是共享數據空間的,彼此通信機制也很不同。

         線程間通信:由於多線程共享地址空間和數據空間,所以多個線程間的通信是一個線程的數據可以直接提供給其他線程使用,而不必通過操作系統(也就是內核的調度)。

         進程間的通信則不同,它的數據空間的獨立性決定了它的通信相對比較複雜,需要通過操作系統。以前進程間的通信只能是單機版的,現在操作系統都繼承了基於套接字(socket)的進程間的通信機制。這樣進程間的通信就不侷限於單臺計算機了,實現了網絡通信。

        進程的通信機制主要有:管道、有名管道、消息隊列、信號量、共享空間、信號、套接字。

        管道:它傳遞數據是單向性的,只能從一方流向另一方,也就是一種半雙工的通信方式;只用於有親緣關係的進程間的通信,親緣關係也就是父子進程或兄弟進程;沒有名字並且大小受限,傳輸的是無格式的流,所以兩進程通信時必須約定好數據通信的格式。管道它就像一個特殊的文件,但這個文件之存在於內存中,在創建管道時,系統爲管道分配了一個頁面作爲數據緩衝區,進程對這個數據緩衝區進行讀寫,以此來完成通信。其中一個進程只能讀一個只能寫,所以叫半雙工通信,爲什麼一個只能讀一個只能寫呢?因爲寫進程是在緩衝區的末尾寫入,讀進程是在緩衝區的頭部讀取,他們各自 的數據結構不同,所以功能不同。

        有名管道:看見這個名字就能知道個大概了,它於管道的不同的是它有名字了。這就不同與管道只能在具有親緣關係的進程間通信了。它提供了一個路徑名與之關聯,有了自己的傳輸格式。有名管道和管道的不同之處還有一點是,有名管道是個設備文件,存儲在文件系統中,沒有親緣關係的進程也可以訪問,但是它要按照先進先出的原則讀取數據。同樣也是單雙工的。

        消息隊列:是存放在內核中的消息鏈表,每個消息隊列由消息隊列標識符標識,於管道不同的是,消息隊列存放在內核中,只有在內核重啓時才能刪除一個消息隊列,內核重啓也就是系統重啓,同樣消息隊列的大小也是受限制的。

        信號量:也可以說是一個計數器,常用來處理進程或線程同步的問題,特別是對臨界資源的訪問同步問題。臨界資源:爲某一時刻只能由一個進程或線程操作的資源,當信號量的值大於或等於0時,表示可以供併發進程訪問的臨界資源數,當小於0時,表示正在等待使用臨界資源的進程數。更重要的是,信號量的值僅能由PV操作來改變。

        共享內存:就是分配一塊能被其他進程訪問的內存。共享內存可以說是最有用的進程間通信方式,也是最快的IPC形式。首先說下在使用共享內存區前,必須通過系統函數將其附加到進程的地址空間或說爲映射到進程空間。兩個不同進程A、B共享內存的意思是,同一塊物理內存被映射到 進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新,反之亦然。由於多個進程共享同一塊內存區域,必然需要某種同步機制,互 斥鎖和信號量都可以。採用共享內存通信的一個顯而易 見的好處是效率高,因爲進程可以直接讀寫內存,而不需要任何數據的拷貝。對於像管道和消息隊列等通信方式,則需要在內核和用戶空間進行四次的數據拷貝,而 共享內存則只拷貝兩次數據[1]:一次從輸入文件到共享內存區,另一次從共享內存區到輸出文件。實際上,進程之間在共享內存時,並不總是讀寫少量數據後就 解除映射,有新的通信時,再重新建立共享內存區域。而是保持共享區域,直到通信完畢爲止,這樣,數據內容一直保存在共享內存中,並沒有寫回文件。共享內存 中的內容往往是在解除映射時才寫回文件的。因此,採用共享內存的通信方式效率是非常高的。

         信號:信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一箇中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什麼時候到達。信號是進程間通信機制中唯一的異步通信機制,可以看作是異步通知,通知接收信號的進程有哪些事情發生了。信號機制經過POSIX實時擴展後,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。信號事件的發生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源。信號分爲可靠信號和不可靠信號,實時信號和非實時信號。進程有三種方式響應信號1.忽略信號2.捕捉信號3.執行缺省操作。

        套接字:這一塊在網絡編程那一塊講的 很多,在此就不在說拉。

發佈了43 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章