遠程過程調用(RPC)

分佈式系統的主要特點是能夠將一臺機器上的一個任務分解到系統中其他的機器上運行,實現多個CPU的協同工作。遠程過程調用RPC就是實現這一特點的有效方法之一


1.什麼是RPC

RPC的基本思想

(1984年,Birrell,Nelson)允許程序調用位於其他機器上的過程,當機器A上的一個進程調用機器B上的過程時,在A上調用進程被掛起,在B上執行被調用過程,過程所需的參數以消息的形式從調用進程傳送到被調用過程,被調用過程處理的結果也以消息的形式返回給調用進程。而對程序員來說,根本沒有看出消息傳遞過程和I/O處理過程,這種方式稱為遠程過程調用。remote procedure call---RPC

遠程過程調用(RPC)

2.RPC的透明性(transparent)

RPC透明性

客戶-調用進程所在的機器

服務器-被調用過程所在的機器

RPC透明性的思想使得遠程過程調用盡可能象本地調用一樣,即調用進程應該不知道被調用過程是在另一臺計算機上執行,反過來也是如此,被調用過程也應該不知道是由哪臺機器上的進程調用。

RPC透明性的實現

客戶代理(client stub)

將參數封裝成消息,

請求內核將消息送給服務器

調用receive原語進入阻塞狀態

當消息返回到客戶時,內核找到客戶進程,消息被複制到緩衝區,並且客戶進程解除阻塞

客戶代理檢查消息,從中取出結果,並將結果複製給它的調用進程

服務器代理(server stub)

調用receive原語,處於阻塞狀態,並等待消息的到來當消息到達後,代理被喚醒

將消息分解,並取出參數

以通常方式調用服務器的過程

調用結束並獲得控制後,把結果封裝成消息

調用send原語發送給客戶重新調用receive等待下一個消息

RPC的工作步驟

客戶進程以通常方式調用客戶代理

客戶代理構造一個消息,並自陷進入內核

客戶內核發送消息給遠程內核(服務器)服務器

內核把消息送給服務器代理服務器代理從消息中分解出參數,度調用服務器過程

服務器過程完成其工作,並返回給代理

服務器代理封裝結果,並自陷內核

遠程內核發送消息給客戶內核

客戶內核將消息傳給客戶代理

代理分解消息取出結果,返回給調用進程。

3.參數傳遞(Parameter Passing)

客戶代理的功能之一是取出參數,將它們封裝成消息,然後發送給服務器代理。表面上看,好像很簡單,但實現起來並不是如此。下面我們將討論RPC系統中參數傳遞的有關問題。

參數整理(Parameter Marshaling),將參數封裝成消息的工作,參數傳遞中存在的問題

系統中不同機器的字符集可能不同

分佈式系統中客戶機與服務器可以是不同類型的,例如

IBM工作站EBCDIC字符集IBM PC機ASCii字符集

系統中不同機器的數據存儲方式可能不同

Intel CPU整數從右到左存儲( little endian),SPARC CPU整數從左到右存儲( big endian)

浮點數的位數可能不同

布爾值的表示

網絡傳送按字節

解決方案

設置一個基本類型的標準,正則表(canonical form),描述字符集類型,數據存儲方式及長度(位數)等。過程所需的參數,客戶代理在進行參數整理時按canonical form轉換為標準類型,然後封裝成消息發送。服務器代理收到消息後,也根據該標準映射到本地機器的字符集和數據類型。

4.動態聯編

編譯程序在編譯階段並不能確切知道將要調用的函數,只有在程序運行時才能確定將要調用的函數,為此要確切知道該調用的函數,要求聯編工作要在程序運行時進行,這種在程序運行時進行聯編工作被稱為動態聯編

聯編一個程序,功能:登記(register),查找(lookup),撤銷(unregister)

服務器(export),啟動時 :register/unregister

客戶:lookup

動態性:服務器啟動時,export for register,關閉時,export for unregister

服務器故障時:定期輪詢(客戶代理),對無響應的過程unregister

動態聯編的靈活性:

均衡工作量(load balancing):支持多服務器(support multiple servers),把客戶均衡地分佈於各個服務器上;

容錯性(fault tolerance):定期輪詢服務器(poll the server perodically),對無響應的過程unregister,到達一定程度的容錯性

支持權限:服務器可以指定由那些用戶使用,這樣聯編對非授權的用戶拒絕接受

動態聯編的缺點:

花費系統時間:the extra overhead of exporting and importing interfaces costs time

客戶進程往往執行時間短,但每次每個進程要重新import to binder

瓶頸:use multiple binders

5.RPC表示錯誤的語義(Semantics in the Presence of Failures)

RPC的設計目標是隱藏通信過程,使得遠程過程調用像本地調用一樣,但也有一些另外,如不能處理全局變量,事實上,只要客戶和服務器能正常工作,RPC就應該可以正常工作。下面的問題是當客戶或服務器出錯誤時的處理方法

RPC可能出現的錯誤及處理方法:


5.1.客戶不能找到服務器(client cannot locate the server)

客戶不能找到合適的服務器,可能原因:服務器可能關閉或服務器軟件升級。這種錯誤目前尚無好的辦法,需要指出,我們不能試圖通過返回錯誤代碼來實現,因為代碼可能剛好是一個正常的返回值。從客戶到服務器的消息丟失(lost request)。客戶發出的請求到達服務器之前丟失,服務器根本不能響應。

解決方法:超時重傳機制

5.2.從服務器到客戶的應答丟失(lost reply)

同一有效性(idempotent):服務器上有些操作可以安全地重複執行多次,而對數據不影響,如果某一請求的操作具有這一屬性,則稱為同一有效性(idempotent)。多數請求都不具有同一有效性。

丟失應答非常難以處理,簡明的解決方法是依賴於超時重傳機制,發出的請求在一個合理的時間內沒有應答,就再發送一個請求。這種方法的問題是,客戶內核無法確定為什麼沒有應答,是否請求或應答丟失?或許只是服務器速度慢?

解決方案

客戶內核給每個請求一個序列號,服務器內核則保留每個請求最近接收到的序列號。這樣,服務器就可以通過這個序列號來區別一個請求是重發的還是原來的,對重傳的請求拒絕響應。另外,也可以在消息中增加一個位來提示該請求消息是原來的還是重發的,對於原請求可以安全地進行處理,對於重發的請求,則處理要十分小心(服務器保留一個副本,是一種有效的辦法)。

5.3.服務器接收了請求後崩潰(server crash)

遠程過程調用(RPC)

重傳機制的語義:

至少一次語義(at least once semantice):客戶等等直到服務器重啟並再次執行操作:客戶繼續重試,直到獲得一個應答為止。可保證RPC至少執行一次。

至多一次語義(at most once semantics):立即放棄報告失敗。保證RPC至多執行一次,但可能沒有執行。

僅有一次語義(exactly once semantics):這個方案不可行,思考一下,如果服務器在執行request和記錄執行request時崩潰會發生什麼?在記錄request和執行request這個過程時,你可以使用at-most-once,如果在這個過程中服務器崩潰,然後你將記錄這個錯誤並執行返回,然後你不會再一次嘗試,這就是at-most-once,而at-least-once是崩潰後,如果request是重複應答,那麼你就會繼續攜帶request再次請求,但exactly-once是無法被論證的 http://www.freepatentsonline.com/7162512.html.

5.4.client發送請求後崩潰(client crash)

客戶在發送給服務器請求後而在應答收到之前崩潰

孤報(orphan):a computation is active and no parent is waiting for result.Such unwanted computation is call Orphan


存在的問題:浪費CPU時間,Orphan可能鎖住某些文件或佔用有價值的資源,當客戶機重啟時,來自Orphan的應答造成應答混亂.

孤報(orphan)的解決方法

1981年Nelson提出了四種的解決方法:

消滅(extermination),思想:客戶代理在發送RPC消息後,代理進行事務登錄(log),記錄發送的請求,重啟時,檢查事務登錄,Orphan被撤消。缺點:磁盤空間浪費;orphan可能引起新的RPC導致更多的orphan,客戶重啟後,無法找到它們;網絡分區:網絡被分成兩個獨立的部分,客戶所在的另一個部分中的orphan仍能活動(不是一中可靠的方法)

"再生"(reincarnation),思想:將時間按順序分成時間段,每一段的一個序號,當客戶重啟時,廣播一個消息告訴所有的主機一上新的時間段的開始。機器收到這樣的廣播消息後, 所有的過程計算被撤消。對於已發出的應答,由於消息中含有時間段序號而客戶可以很容易地區別它們。缺點:那些有效的計算也被刪除

gettlereincarnation(合理再生),思想:當機器收到新的時間段的廣播廣消息後,每臺機器檢查是否有遠程計算,如果有則試著找出它們的客戶,若能找到客戶(主人),則繼續它的計算,否則將遠程計算撤消。缺點:系統開銷大。

期滿(expiration),思想:每個RPC都給對方一個標準的時間量T,來作為它的工作期限,如果它在T時間內不能完成工作,客戶必須重新請求,以保證每個RPC就可以在T時間內完成。當有客戶崩潰後,在客戶機重起之前等待一個時間量T,這樣可保證所有的Orphan已發送。缺點:時間量T的取值比較複雜。

6.RPC實現

RPC協議選擇(protocol selection)是選擇面向連接的還是非連接的協議

面向連接的協議的優點:通信實現容易:內核發送消息後,它不必關心它是否會丟失,也無須處理確認,而這些方面都由支持連接的軟件來實現。缺點:性能較差(需要額外的軟件)。在單一建築物和校園內使用的分佈式系統可以採用面向連接的協議。

確認機制(Acknowledgement)

stop-and-wait protocol: 思想:逐包確認。特點:一個包丟失了,可獨立重傳;容易實現。

blast protocol:思想:一個消息的所有包都發送完成後等待一個確認,而不是一個一個確認。特點:報文丟失時,有兩種選擇:

1.全部放棄:等待重傳整個消息的所有包,容易實現;

2. 選擇重傳:請求丟失包重傳,佔用網絡的帶寬少,對局域網這種方法較少使用,廣域網絡上普遍採用)。

臨界路徑(critical path)

分佈式系統是否成功依賴於它的性能的好壞,而系統性能的好壞又依賴於它的通信速度,通信速度與系統的具體實現有關,下面我們進一步討論從客戶到服務器執行一個RPC的過程。

臨界路徑(critical path):每個RPC的指令執行的順序是從客戶調用客戶代理,自陷進入內核,消息傳送,服務器中斷,服務器代理,最後到達進行請求處理並返回應答的服務器。RPC的這一系列步驟稱為(從客戶到服務器的)臨界路徑。

遠程過程調用(RPC)

客戶調用stub procedure

申請一個緩衝區用來整理外出的消息,有些系統有一定數量的緩衝區,也有一些是一個緩衝區池,從中選擇一個合適的供服務器使用。

參數整理:參數整理成適合的格式,並與消息一起插入消息緩衝區中。以備傳送,自陷進入內核。

切換進入內核:內核獲得控制,保存CPU寄存器及內存映像,建立新的內存映像。

拷貝消息到內核:因為用戶和內核是不連接的,內核必須明確地把拷貝到內核緩衝區。

填入目標地址:將其拷貝到網絡接口,到此客戶臨界結束。

原則上,啟動計時器不屬於計算RPC時間的部分,啟動計時機後,系統有兩種方式:忙等待和重新調度。

在服務器端,當字節到達後,被存入板上緩衝區或主存,當消息包的所有字節都到達後,服務器將形成一箇中斷。

檢查消息包的有效性,並決定將其送給一個代理,若沒有等待的代理則放棄或保存至緩衝區。

假定有一個等待的代理,那麼,消息被拷貝到代理並切換到服務器代理,恢復寄存器及主存映像,代理調用receive原語,分解參數,建立服務器的調用環境,進行請求處理。

臨界路徑(critical path)的開銷:拷貝

在考慮臨界路徑的時間開銷問題時,其中最重大的部分是拷貝

copy1:客戶代理->內核

copy2:內核->網絡接口板

copy3:網絡接口板->目標機器

copy4:網絡接口板->內核

copy5:內核->服務器代理

定時管理(timer)

所有的協議都是以通過通信介質交換消息為目的的,而事實上,所有的系統中,消息都有可能丟失,或許是因為噪聲或是超載。所以,多數協議都設置定時器,當消息發送出去後,期待應答(確認)的到來,若沒有消息到來而定時器期滿(expiration),則重發。這個過程可以重複直到發送方放棄。

設置定時器:

建立一個數據結構來指定定時器何時期滿,以及期滿時如何處理

多個進程的定時器組織成列表方式

遠程過程調用(RPC)

當一個確認或應答在超時之前到來,列表中查出對應進程所在的項,將它刪除,實際上,只有少數的進程可能超時,但每一個進程都要進入超時表後再刪除,這些大量的工作多數是多餘的。另外,定時器也不需要精確的時間,但定時太短引起過多的超時,定時太長則對包丟失的情況又過多的等待。

實現方法:在PCB中增加一個字段,稱為定時器,當發出一個RPC時,將允許延遲的時間加上當前的時鐘的值並存於PCB中定時器字段,如果不需要超時重傳的,其值規定為0,這樣,內核定期掃描PCB鏈表,如果定時器值非0且小於當前時間,則該進程超時

7.RPC與消息傳遞通信的比較

RPC結構性好,使用方便;消息傳遞通信更靈活,但結構性差RPC只有一個返回,而消息傳遞通信可以向多個客戶返回。RPC返回的結果或參數的值最好是少量的,消息傳遞通信可適合於大批量數據的傳遞


分享到:


相關文章: