操作系統:進程通信-進程之間的信息交換

在這裏插入圖片描述
進程是分配系統資源的單位(包括內存地址空間),因此各進程擁有的內存地址空間相互獨立。如下圖所示,進程1可以訪問進程1的地址空間,進程2可以訪問進程2的地址空間,但進程1不可以訪問進程2的地址空間。
在這裏插入圖片描述
爲了保證安全,一個進程不能直接訪問另一個進程的地址空間。但是進程之間的信息交換又是必須實現的(例如:在QQ裏看到一張有趣的表情包想要分享給微信好友)。爲了保證進程間的安全通信,操作系統提供了一些方法:

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

一、共享存儲

操作系統爲兩個進程提供一塊共享空間。兩個進程對共享空間的訪問必須是互斥的(互斥訪問通過操作系統提供的同步互斥工具P、V操作實現)。如下圖所示:
在這裏插入圖片描述
分類:

  1. 基於數據結構的共享:比如共享空間裏只能存放一個長度爲10的數組。這種共享方式速度慢、限制多,是一種低級通信方式。
  2. 基於存儲區的共享:在內存中畫出一塊共享存儲區,數據的形式、存放位置都由進程控制,而不是操作系統。相比之下,這種共享方式速度更快,是一種高級通信方式。

二、管道通信

在這裏插入圖片描述
管道是指用於連接讀寫進程的一個共享文件,又名pipe文件。其實就是在內存中開闢一個大小固定的緩衝區,緩衝區的大小一般和內存頁面一致。
注:

  1. 管道只能採用半雙工通信,某一時間段內只能實現單向傳輸。如果要實現雙向同時通信,則需要設置兩個管道。如圖所示:
    在這裏插入圖片描述
  2. 各進程要互斥地訪問管道
  3. 數據以字符流的形式寫入管道 ,當管道寫滿時,寫進程的write()系統調用將會被阻塞,等待讀進程將數據取走。當讀進程將數據全部取走後,管道變空,此時讀進程的read()系統調用將會被阻塞。
  4. 如果沒寫滿,就不允許讀;如果沒讀空,就不允許寫。
  5. 數據一旦被讀出,就從管道中被拋棄,這就意味着讀進程最多只能有一個,否則可能會有讀錯數據的情況。

三、消息傳遞

進程間的數據交換以格式化的消息爲單位(如圖所示,消息頭包括:發送進程ID、接受進程ID、消息類型、消息長度等格式化的信息。(計算機網絡中發送的報文其實就是一種格式化的消息))。進程通過操作系統提供的**“發送消息/接收消息”兩個原語**進行數據交換。
在這裏插入圖片描述
分類:

  1. 直接通信方式
    消息直接掛到接受進程的消息緩衝隊列
    在這裏插入圖片描述
  2. 間接通信方式
    消息要先發送到中間實體(信箱)中,因此,也稱信箱通信方式。如計算機網絡中的電子郵件系統。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章