進程是分配系統資源的單位(包括內存地址空間),因此各進程擁有的內存地址空間相互獨立。如下圖所示,進程1可以訪問進程1的地址空間,進程2可以訪問進程2的地址空間,但進程1不可以訪問進程2的地址空間。
爲了保證安全,一個進程不能直接訪問另一個進程的地址空間。但是進程之間的信息交換又是必須實現的(例如:在QQ裏看到一張有趣的表情包想要分享給微信好友)。爲了保證進程間的安全通信,操作系統提供了一些方法:
- 共享存儲
- 消息傳遞
- 管道通信
一、共享存儲
操作系統爲兩個進程提供一塊共享空間。兩個進程對共享空間的訪問必須是互斥的(互斥訪問通過操作系統提供的同步互斥工具P、V操作實現)。如下圖所示:
分類:
- 基於數據結構的共享:比如共享空間裏只能存放一個長度爲10的數組。這種共享方式速度慢、限制多,是一種低級通信方式。
- 基於存儲區的共享:在內存中畫出一塊共享存儲區,數據的形式、存放位置都由進程控制,而不是操作系統。相比之下,這種共享方式速度更快,是一種高級通信方式。
二、管道通信
管道是指用於連接讀寫進程的一個共享文件,又名pipe文件。其實就是在內存中開闢一個大小固定的緩衝區,緩衝區的大小一般和內存頁面一致。
注:
- 管道只能採用半雙工通信,某一時間段內只能實現單向傳輸。如果要實現雙向同時通信,則需要設置兩個管道。如圖所示:
- 各進程要互斥地訪問管道
- 數據以字符流的形式寫入管道 ,當管道寫滿時,寫進程的write()系統調用將會被阻塞,等待讀進程將數據取走。當讀進程將數據全部取走後,管道變空,此時讀進程的read()系統調用將會被阻塞。
- 如果沒寫滿,就不允許讀;如果沒讀空,就不允許寫。
- 數據一旦被讀出,就從管道中被拋棄,這就意味着讀進程最多只能有一個,否則可能會有讀錯數據的情況。
三、消息傳遞
進程間的數據交換以格式化的消息爲單位(如圖所示,消息頭包括:發送進程ID、接受進程ID、消息類型、消息長度等格式化的信息。(計算機網絡中發送的報文其實就是一種格式化的消息))。進程通過操作系統提供的**“發送消息/接收消息”兩個原語**進行數據交換。
分類:
- 直接通信方式
消息直接掛到接受進程的消息緩衝隊列
- 間接通信方式
消息要先發送到中間實體(信箱)中,因此,也稱信箱通信方式。如計算機網絡中的電子郵件系統。