進程間通信

進程間通信方式

在這裏插入圖片描述在計算機中,每個進程都有自己獨立的內存地址空間,其他進程並不能直接訪問屬於某個進程的地址空間,是爲了確保系統數據的安全性。
但舉個例子,我們使用圖片時,點擊分享按鈕,可以通過微信將其分享出去,因此此時就需要實現進程之間的相互通信。

進程之間的相互通信方式分爲三種:

  1. 共享存儲
  2. 管道通信
  3. 消息傳遞

1. 共享存儲

一個進程是不能去訪問另一個進程的私有空間的,因此操作系統會爲這兩個進程提供一塊共享內存空間。但是在使用這塊共享空間時,是進程互斥的,即當一個進程訪問完了出來以後,另一個進程才能訪問,修改。
共享存儲又有兩種方式,一種是基於數據結構的共享,比如在共享空間裏只能存放一個長度爲10的數組,這種共享方式速度慢,限制多,是一種低級通信的方式。另一種是基於存儲區的共享,在內存中劃出一塊共享存儲區,數據的形式、存放的位置都由進程控制,而不是操作系統,這種共享方式速度更快,是一種高級通信的方式。

在這裏插入圖片描述

2.管道通信

“管道”是指用於連接讀寫進程的一個共享文件,其實就是在內存中開闢一個大小固定的緩衝區,比如Linux系統中的管道大概爲4KB。
數據通過管道來進行傳輸,但需要注意管道通信是一種半雙工的通信方式,即在同一個時間只能進行單向的數據傳輸。如果需要同時進行雙向傳輸的話,就需要建立兩條管道。管道沒有被寫完時,讀進程是被阻塞的,只有寫滿纔可以讀。同樣只有管道被讀空時才能被寫。管道的數據讀完了就會被拋棄,因爲這個特性,管道的讀進程只有一個,如果在讀的過程中出現了兩個進程,一個進程讀到了其他進程的數據,發現自己讀錯了,會立即拋棄該數據,這樣就會導致另一個進程始終無法讀到自己想要的數據。

在這裏插入圖片描述

3. 消息傳遞

進程間的數據交換以格式化的消息爲單位,進程通過操作系統提供的發送消息/接收消息兩個原語來進行數據交換。
原語其實有點類似於計算機網絡中的報文,包括消息頭和消息體。消息頭裏面又包括髮送進程ID,接收進程ID,消息類型,消息長度等格式化的信息。
消息傳遞有兩種方式:直接通信方式,將消息直接掛到接收進程的消息緩衝隊列上;間接通信方式:一個進程發送原語到信箱中,信箱在把該消息轉發給接收進程。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章