進程通信概念簡介 多線程上篇(六)


進程通信指的是進程間的信息交換 ,IPC(Inter-Process Communication,進程間通信)
之前說到:
進程通信就相當於一種工作方式、溝通形式比如你給我一個SVN標簽號並且告知我意圖,我去庫中檢索指定標簽修改的指定內容,就完成了一個任務的協作。
進程同步中,也有信息的交換,比如互斥量訪問,再比如生產者和消費者,共享緩沖池,但是這些通常被稱之為低級的進程通信。
以信號量為例,如果你說我在塔頂點亮燈表示危險,否則表示安全,這沒問題,如果你想用燈亮燈滅來像QQ一樣,大段大段的傳遞訊息可能么?
多搞幾盞燈?然后用編碼?即使那樣你依然是很費力的。
 
所以說盡管比如信號量機制作為同步工具是卓有成效的,但作為通信工具,則不夠方便
首先是效率低,另外共享數據結構的設置、數據的傳送、進程的互斥與同步等,都必須由程序員自己去實現
所以,對於進程間的通信,我們迫切的渴望有“封裝好的方法”
進程通信主要指的就是操作系統提供的進程通信工具(“封裝好的方法”)用來進程間的信息交換。

進程通信類型

主要有四種通信方式
image_5c5ba6a9_4162

共享存儲器系統

共享存儲系統關鍵在於共享
主要兩種:
  • 共享數據結構
  • 共享存儲區
image_5c5ba6a9_38d2

管道通信

這種方式首創於UNIX 系統由於它能有效地傳送大量數據,因而又被引入到許多其它的操作系統中
管道指用於連接一個讀進程和一個寫進程以實現它們之間通信的一個共享文件,這個文件又被叫做pipe文件
管道可以理解為一種比較特殊的“共享存儲器系統”的通信方式
image_5c5ba6a9_5578

消息傳遞系統

在該機制中,進程不必借助任何共享存儲區或數據結構,而是以格式化的消息(message)為單位,將通信的數據封裝在消息中
並利用操作系統提供的一組通信命令(原語),在進程間進行消息傳遞,完成進程間的數據交換
計算機網絡中的報文就是一種message  

 

消息傳遞系統中的消息,其實也是“共享數據結構”的一種形式,是一種特殊的形式
因為被共享的數據結構而不是隨便自定義的,而是大家共同設計好的,認可的,一致的一種格式。
基於這種一致性的格式,然后操作系統對他提供了支持
所以,他就是共享數據結構的一個特例,這個特例使用更加方便簡單。
簡單說,計算機報文是一種message,那么操作系統對整個TCP/IP協議棧的實現,這就是通信命令,封裝了底層的傳輸細節,對開發者來說是透明的

客戶服務器系統

客戶機一服務器系統的通信機制,在網絡環境的各種應用領域已成為當前主流的通信實現機制
BS架構的系統本質也是包裝演化的CS,瀏覽器難道不是客戶端軟件么
主要有三種:
  • 套接字
  • 遠程過程調用
  • 遠程方法調用
遠程過程調用 RPC(Remote Procedure Call),RPC采用客戶機/服務器模式,請求程序就是一個客戶機,而服務提供程序就是一個服務器
RPC允許你 透明的 調用遠程服務器上提供的服務
對於面向對象的編程中,遠程過程調用通常也被稱為遠程方法調用
比如java1.1中實現的Remote Method Invocation,RMI,可以認為是RPC的Java版本,RMI大大增強了Java開發分布式應用的能力。
概括地說的話:
遠程過程調用RPC是一種協議概念,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。
RPC不依賴於具體的網絡傳輸協議,tcp、udp等都可以。
協議必然需要被實現才能使用,他只是一種協議與標准,RMI就相當於是sun對RPC的一個Java實現
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,是更加底層的通信工具,所以可以認為RPC是socket的上層建築
一個或許不是很合適的比喻:如果RPC是議論文格式,那么RMI可能是漢語的議論文,socket可能是漢字

 

套接字原理步驟

雙方進程運行在不同主機的網絡環境下,被分配了一對套接字,一個屬於接收進程(或服務器端),一個屬於發送進程(或客戶端)。
發送進程(或客戶端)發出連接請求時,隨機申請一個套接字,主機為之分配一個端口,與該套接字綁定,不再分配給其它進程。
接收進程(或服務器端)擁有全局公認的套接字和指定的端口(如ftp服務器監聽端口為21,Web或http服務器監聽端口為80),並通過監聽端口等待客戶請求。因此,任何進程都可以向它發出連接請求和信息請求,以方便進程之間通信連接的建立。
接收進程(或服務器端)一旦收到請求,就接受來自發送進程(或客戶端)的連接,完成連接,即在主機間傳輸的數據可以准確地發送到通信進程,實現進程間的通信;
當通信結束時,系統通過關閉接收進程(或服務器端)的套接字撤銷連接。

遠程過程原理步驟

負責RPC的調用的進程有兩個,一個是本地客戶進程,另一個是遠程服務進程,這兩個進程也被稱之為網絡守護進程,主要負責網絡之間的消息傳遞
通常處於阻塞之中,等待消息。
而遠程過程調用的透明化核心就是所謂的存根,也叫做樁stub
所以說兩個進程和兩個存根是RPC的根本

樁的原理

image_5c5ba6a9_6f8b
樁類似代理者、轉換器一類的角色
舉一個例子:在一些與底層硬件芯片等交互的軟件層,軟件層依賴底層芯片的處理,如何更方便的進行代碼測試?
也就是相當於A類中有方法functionA,B類中有方法functionB(假定functionB 是硬件處理部分,測試並不方便,需要依賴設備)
functionA(){
functionB();
}
我們就可以編寫一個新的類C,提供樁方法:functionStubC,所有調用functionB的地方全部使用functionStubC,也就是
functionA(){
functionStubC();
而functionStubC的返回值,永遠是functionB成功的返回值。
這就是一個打樁的概念。
 
RPC也是通過這個樁的概念來實現透明的遠程過程調用
對本地調用來說,他看到的只是客戶端存根(stub)
就如同我們上面的functionStubC,當然比functionStubC要更加復雜,所有的處理都在他背后被執行
所以對本地調用來說是透明的
image_5c5ba6a9_3654

RPC過程步驟

image_5c5ba6a9_4644
  1. 本地過程調用者以一般方式調用遠程過程在本地關聯的客戶存根,傳遞相應的參數,然后將控制權轉移給客戶存根;
  2. 客戶存根執行,完成包括過程名和調用參數等信息的消息建立,將控制權轉移給本地客戶進程;
  3. 本地客戶進程完成與服務器的消息傳遞,將消息發送到遠程服務器進程;
  4. 遠程服務器進程接收消息后轉入執行,並根據其中的遠程過程名找到對應的服務器存根,將消息轉給該存根;
  5. 該服務器存根接到消息后,由阻塞狀態轉入執行狀態,拆開消息從中取出過程調用的參數,然后以一般方式調用服務器上關聯的過程;
  6. 在服務器端的遠程過程運行完畢后,將結果返回給與之關聯的服務器存根;
  7. 該服務器存根獲得控制權運行,將結果打包為消息,並將控制權轉移給遠程服務器進程:
  8. 遠程服務器進程將消息發送回客戶端;
  9. 本地客戶進程接收到消息后,根據其中的過程名將消息存入關聯的客戶存根,再將控制權轉移給客戶存根;
  10. 客戶存根從消息中取出結果,返回給本地調用者進程,並完成控制權的轉移。

總結

進程通信的一些核心思想與基本形式就是上面的這些簡介
這些是最純粹基本的理論知識,而對於我們實際的開發中,面對的總是各種各樣的對於現存的理論的實現版本
核心仍舊是依賴操作系統以及語言本身的實現以及一些框架等
但是理解這些概念是必要的,能讓你后續的學習路線越來越明朗,技術是層不出窮的,你僅僅學習招式,永遠也無法窮盡,還導致自己沒有底蘊。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM