- 分布式多媒體計(jì)算機(jī)系統(tǒng)
- 劉玉貴 楊學(xué)良編著
- 11920字
- 2018-11-08 17:36:49
2.7 遠(yuǎn)程過(guò)程調(diào)用(RPC)
許多分布式系統(tǒng)基于進(jìn)程間的顯式消息交換,然而消息的發(fā)送和接收過(guò)程無(wú)法隱藏通信的存在,而通信的隱藏對(duì)于在分布式系統(tǒng)中實(shí)現(xiàn)訪問(wèn)透明性是極為重要的。使用消息傳遞來(lái)描述通信過(guò)程,比使用基于共享存儲(chǔ)器的原語(yǔ)來(lái)描述要更困難。現(xiàn)代分布式系統(tǒng)常常含有數(shù)千個(gè)進(jìn)程,這些進(jìn)程分散在Internet等不可靠的網(wǎng)絡(luò)中。除非用其他技術(shù)來(lái)代替這種原始的通信功能,否則要開(kāi)發(fā)大規(guī)模分布式應(yīng)用是極為困難的。這個(gè)問(wèn)題由來(lái)已久,但是人們?cè)诤荛L(zhǎng)一段時(shí)間內(nèi)都沒(méi)有找到合適的解決辦法,直到Birrell和Nelson(1984年)在一篇論文中引入了一套與傳統(tǒng)方法截然不同的通信處理手段——遠(yuǎn)程過(guò)程調(diào)用。雖然其中蘊(yùn)含的思想很簡(jiǎn)單,但其中的含義非常復(fù)雜微妙。遠(yuǎn)程過(guò)程調(diào)用作為一種廣泛使用的技術(shù),已成為許多分布式系統(tǒng)的基礎(chǔ)。
最早提出遠(yuǎn)程過(guò)程調(diào)用的是美國(guó)的Birrell和Nelson。其后,遠(yuǎn)程過(guò)程調(diào)用在Xerox工作站上實(shí)現(xiàn),它非常類似于在單機(jī)編程過(guò)程中經(jīng)常使用的過(guò)程調(diào)用(Procedure Call)。在分布式系統(tǒng)中,一個(gè)進(jìn)程請(qǐng)求消息對(duì)遠(yuǎn)程計(jì)算機(jī)的進(jìn)程發(fā)出調(diào)用,然后在遠(yuǎn)程服務(wù)器上執(zhí)行這個(gè)過(guò)程,在這個(gè)過(guò)程完成以后,返回一個(gè)結(jié)果消息,再發(fā)送到請(qǐng)求這個(gè)調(diào)用的進(jìn)程。這就是目前在分布式系統(tǒng)中廣泛應(yīng)用的一種進(jìn)程通信的機(jī)制,稱為遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC),如圖2-28所示。

圖2-28 遠(yuǎn)程過(guò)程調(diào)用
2.7.1 遠(yuǎn)程過(guò)程調(diào)用的特點(diǎn)
遠(yuǎn)程過(guò)程調(diào)用是允許在分布式環(huán)境下的程序設(shè)計(jì)可以調(diào)用遠(yuǎn)程另一臺(tái)機(jī)器上的進(jìn)程而提供服務(wù)的過(guò)程,最主要的特點(diǎn)是,程序不需要知道調(diào)用的過(guò)程是本地還是遠(yuǎn)程。遠(yuǎn)程過(guò)程調(diào)用和傳統(tǒng)的過(guò)程調(diào)用的不同是,調(diào)用者(Caller或Client)和被調(diào)用的進(jìn)程(Server)是在不同的機(jī)器上的不同的進(jìn)程。因此,遠(yuǎn)程過(guò)程調(diào)用更容易出故障。
(1)雖然基于消息傳遞和遠(yuǎn)程過(guò)程調(diào)用是很類似的,但是,兩者的不同是兩個(gè)通信進(jìn)程的關(guān)系。在消息傳遞中,兩個(gè)進(jìn)程的關(guān)系是伙伴關(guān)系;而在遠(yuǎn)程過(guò)程調(diào)用中,兩個(gè)進(jìn)程的關(guān)系是主從關(guān)系。
(2)另外的不同是,在消息傳遞過(guò)程中,所有要求傳遞的值在傳送之前都要明確地賦到消息域中。遠(yuǎn)程過(guò)程調(diào)用所傳送參數(shù)的組裝,即將這些參數(shù)列表匯集在一起組成消息的工作是靠系統(tǒng)完成的。
遠(yuǎn)程過(guò)程調(diào)用發(fā)送一個(gè)調(diào)用(客戶進(jìn)程)或請(qǐng)求到遠(yuǎn)地進(jìn)程(被調(diào)用者)。被調(diào)用者或服務(wù)器進(jìn)程執(zhí)行這個(gè)過(guò)程和發(fā)回一個(gè)結(jié)果(響應(yīng))消息。這種消息交換示意圖如圖2-29所示。遠(yuǎn)程過(guò)程調(diào)用提供了雙向信息流。

圖2-29 消息交換示意圖
遠(yuǎn)程過(guò)程調(diào)用的語(yǔ)義類似本地過(guò)程調(diào)用:
(1)調(diào)用者等待結(jié)果時(shí)被掛起。
(2)調(diào)用者能傳遞參數(shù)到遠(yuǎn)地過(guò)程。
(3)被調(diào)用的過(guò)程執(zhí)行完后給調(diào)用者返回結(jié)果。
但是,由于調(diào)用者和被調(diào)用者是在異地不同機(jī)器上運(yùn)行,這個(gè)過(guò)程不能存取調(diào)用者環(huán)境的數(shù)據(jù)和參數(shù)。
2.7.2 RPC的工作原理
遠(yuǎn)程過(guò)程調(diào)用(RPC)的機(jī)制最早是由美國(guó)的Birrell和Nelson提出的,在Xerox的工作站上實(shí)現(xiàn)了其基本的工作過(guò)程和原理。遠(yuǎn)程過(guò)程調(diào)用執(zhí)行過(guò)程如圖2-30所示。

圖2-30 遠(yuǎn)程過(guò)程調(diào)用執(zhí)行過(guò)程
(1)在調(diào)用過(guò)程中,調(diào)用環(huán)境掛起。參數(shù)的傳遞是跨過(guò)網(wǎng)絡(luò)到這個(gè)被調(diào)用的環(huán)境,過(guò)程的執(zhí)行在被調(diào)用的節(jié)點(diǎn)執(zhí)行,執(zhí)行完以后把結(jié)果再送回到調(diào)用者。
(2)在實(shí)現(xiàn)中引入了Stub結(jié)構(gòu),這種結(jié)構(gòu)的最大特點(diǎn)是,它不要求對(duì)調(diào)用的程序和語(yǔ)言做任何改變。盡管遠(yuǎn)程過(guò)程調(diào)用和過(guò)程調(diào)用有不同的語(yǔ)義,但它們很類似。
圖2-30給出了在遠(yuǎn)程過(guò)程調(diào)用中的下列5個(gè)部件,以及它們之間的相互關(guān)系。
(1)客戶機(jī)。
(2)客戶機(jī)存根。
(3)RPC通信包(也稱為RPC執(zhí)行程序)。
(4)服務(wù)器存根。
(5)服務(wù)器。
遠(yuǎn)程過(guò)程調(diào)用的具體操作步驟如下:
(1)當(dāng)客戶機(jī)(用戶程序)要求調(diào)用一個(gè)遠(yuǎn)地的過(guò)程時(shí),首先發(fā)出一個(gè)通常的本地調(diào)用給客戶機(jī)存根(Client Stub),這個(gè)Stub過(guò)程被鏈接到客戶機(jī)進(jìn)程的地址空間。
(2)Client Stub響應(yīng)執(zhí)行兩個(gè)任務(wù):
① 將目標(biāo)過(guò)程按照規(guī)范把過(guò)程和變量打包成一個(gè)或多個(gè)消息。
② 請(qǐng)求RPC程序(在傳送層)傳送到被調(diào)用者,同時(shí)調(diào)用進(jìn)程掛起等待結(jié)果數(shù)據(jù)包送回。
(3)運(yùn)行RPC調(diào)用程序,通過(guò)網(wǎng)絡(luò)調(diào)用計(jì)算機(jī)將消息送到被調(diào)用的計(jì)算機(jī)中。
(4)被調(diào)用計(jì)算機(jī)運(yùn)行RPC執(zhí)行程序:
① 接收發(fā)來(lái)的消息。
② 給服務(wù)器Stub傳送消息。
(5)服務(wù)器Stub執(zhí)行兩項(xiàng)任務(wù):
① 拆包接收的消息。
② 在服務(wù)器Stub上執(zhí)行一個(gè)本地調(diào)用過(guò)程,用標(biāo)準(zhǔn)的方法把參數(shù)、變量傳送到服務(wù)器。
(6)當(dāng)這個(gè)調(diào)用在服務(wù)器上執(zhí)行完成后,再執(zhí)行一返回結(jié)果從服務(wù)器到服務(wù)器的Stub。用本地調(diào)用返回到掛起的服務(wù)器Stub。
(7)服務(wù)器存根(Server Stub)接到結(jié)果后執(zhí)行兩項(xiàng)任務(wù):
① 把結(jié)果按照規(guī)范進(jìn)行打包,裝配成一個(gè)或多個(gè)消息。
② 請(qǐng)求RPC調(diào)用程序,把它的結(jié)果消息送回到調(diào)用者的RPC中。
(8)服務(wù)器端口RPC調(diào)用程序把裝配好的結(jié)果消息送回到調(diào)用計(jì)算機(jī)。
(9)在調(diào)用計(jì)算機(jī)上,RPC調(diào)用程序執(zhí)行完成兩項(xiàng)任務(wù):
① 接收這些結(jié)果消息。
② 給客戶機(jī)存根(Client Stub)傳送結(jié)果消息。
(10)客戶機(jī)存根執(zhí)行返回結(jié)果的任務(wù):
① 對(duì)發(fā)回的結(jié)果進(jìn)行拆包,還原成結(jié)果。
② 把結(jié)果返回給調(diào)用者和用戶,使最后調(diào)用者得到需要的結(jié)果值。
整個(gè)上述過(guò)程執(zhí)行完畢后,另外的一個(gè)進(jìn)程可以再次要求遠(yuǎn)程過(guò)程調(diào)用。只有客戶機(jī)的Stub知道這個(gè)過(guò)程是遠(yuǎn)程的。RPC調(diào)用程序負(fù)責(zé)重傳、回答和保護(hù)。RPC調(diào)用程序可以基于消息傳遞的通信來(lái)開(kāi)發(fā)。遠(yuǎn)程過(guò)程調(diào)用是可靠的、封鎖的、結(jié)構(gòu)化的Send、Get-Request和Send-Response原語(yǔ)的發(fā)展。它有如下優(yōu)點(diǎn):
(1)它有很簡(jiǎn)潔、清晰的語(yǔ)義,使分布式系統(tǒng)很容易構(gòu)造和實(shí)現(xiàn)。
(2)它是一種有效的在異地兩個(gè)進(jìn)程之間進(jìn)行通信的形式。過(guò)程調(diào)用是非常簡(jiǎn)單快速通信的手段。
(3)它是一種通用的兩個(gè)進(jìn)程之間通信的方法和機(jī)制,在分布式系統(tǒng)中得到廣泛的應(yīng)用。
2.7.3 擴(kuò)展的RPC模型
事實(shí)上,遠(yuǎn)程過(guò)程調(diào)用已經(jīng)成為分布式系統(tǒng)中的通信標(biāo)準(zhǔn)。該模型之所以得以流行,應(yīng)該歸功于它的顯著簡(jiǎn)明性。在本節(jié)中,將對(duì)原始RPC模型的兩種擴(kuò)展形式進(jìn)行簡(jiǎn)要的討論,設(shè)計(jì)這兩種擴(kuò)展形式的目的是克服RPC的某些缺點(diǎn)。
1.門(Door)
原始RPC模型假定調(diào)用者和被調(diào)用者之間通信的惟一手段是通過(guò)網(wǎng)絡(luò)傳遞消息,一般來(lái)說(shuō),這個(gè)假定是正確的。然而,如果客戶機(jī)和服務(wù)器駐留在同一臺(tái)機(jī)器上,通常希望使用本地的進(jìn)程間通信(IPC)功能,該功能由底層操作系統(tǒng)向運(yùn)行在同一臺(tái)機(jī)器上的進(jìn)程提供。例如,在UNIX下,這種功能包括共享內(nèi)存、管道以及消息隊(duì)列。
本地IPC功能與基于網(wǎng)絡(luò)的類似功能相比要高效得多,即使在后者用于同一臺(tái)機(jī)器上的進(jìn)程間通信的情況下也是如此。因此,如果性能方面的要求較高,就需要根據(jù)要處理的進(jìn)程是否位于同一臺(tái)機(jī)器上的具體情況,結(jié)合使用多種進(jìn)程間通信機(jī)制。
作為一種折中的方法,一些操作系統(tǒng)提供一個(gè)與RPC等價(jià)的機(jī)制,供位于同一臺(tái)機(jī)器上的進(jìn)程使用,這種機(jī)制稱為門。門是一類過(guò)程的總稱,這種過(guò)程位于某個(gè)服務(wù)器進(jìn)程的地址空間內(nèi),可由與該服務(wù)器進(jìn)程位于同一臺(tái)機(jī)器上的其他進(jìn)程調(diào)用。門原先是為Spring操作系統(tǒng)設(shè)計(jì)的,Bershad等人于1990年開(kāi)發(fā)了另一種稱為L(zhǎng)ightweight RPC的類似機(jī)制。
要對(duì)門進(jìn)行調(diào)用,必須由本地操作系統(tǒng)提供支持,如圖2-31所示。具體來(lái)說(shuō),首先,服務(wù)器進(jìn)程必須對(duì)門進(jìn)行注冊(cè),隨后其他進(jìn)程才能調(diào)用這個(gè)門。在注冊(cè)一個(gè)門的時(shí)候,系統(tǒng)返回該門的標(biāo)志符,該標(biāo)志符可在以后用來(lái)為門賦予一個(gè)符號(hào)名稱。注冊(cè)是通過(guò)調(diào)用door_create完成的。如果要讓其他進(jìn)程調(diào)用注冊(cè)過(guò)的門,只需給該門取個(gè)名字,并將該名字與該門在注冊(cè)時(shí)得到的標(biāo)志符關(guān)聯(lián)起來(lái)即可。例如,在Solaris中,每個(gè)門都擁有一個(gè)文件名,文件名是通過(guò)調(diào)用fattach而與該門的標(biāo)志符關(guān)聯(lián)起來(lái)的。客戶機(jī)利用系統(tǒng)調(diào)用door_call來(lái)請(qǐng)求對(duì)門進(jìn)行調(diào)用,并在door_call中給出要調(diào)用的門的標(biāo)志符以及其他必需的參數(shù)。操作系統(tǒng)隨后向上調(diào)用注冊(cè)該門的服務(wù)器進(jìn)程。對(duì)服務(wù)器進(jìn)程的向上調(diào)用導(dǎo)致服務(wù)器調(diào)用門。調(diào)用門所得到的結(jié)果通過(guò)系統(tǒng)調(diào)用door_return返回客戶機(jī)進(jìn)程。

圖2-31 門(一種RPC機(jī)制)的使用原理
門的主要優(yōu)點(diǎn)是,它允許在分布式系統(tǒng)的通信中使用一種單一的機(jī)制,即過(guò)程調(diào)用。
不幸的是,在這種情況下,應(yīng)用程序開(kāi)發(fā)人員必須了解哪些調(diào)用是在當(dāng)前進(jìn)程內(nèi)部完成的,哪些調(diào)用是對(duì)本地機(jī)器上的不同進(jìn)程發(fā)出的,而又有哪些調(diào)用是向遠(yuǎn)程進(jìn)程發(fā)出的。
2.異步RPC
與在常規(guī)過(guò)程調(diào)用中的情形一樣,當(dāng)客戶機(jī)調(diào)用遠(yuǎn)程過(guò)程時(shí),客戶機(jī)將會(huì)阻塞,直到有應(yīng)答返回為止。在沒(méi)有結(jié)果要返回的情況下,這種嚴(yán)格的請(qǐng)求—應(yīng)答方式是不必要的,它只會(huì)導(dǎo)致客戶機(jī)過(guò)程向遠(yuǎn)程過(guò)程發(fā)出調(diào)用請(qǐng)求之后處于阻塞狀態(tài),從而無(wú)法進(jìn)行本來(lái)能夠進(jìn)行的其他有用的工作。不需要等待應(yīng)答的例子有:從某個(gè)賬戶向另一個(gè)賬戶進(jìn)行轉(zhuǎn)賬操作、向數(shù)據(jù)庫(kù)添加條目、啟動(dòng)遠(yuǎn)程服務(wù)以及執(zhí)行批處理操作,等等。
針對(duì)以上這些狀況,RPC系統(tǒng)可以提供稱為異步RPC(Asynchronous RPC)的功能。利用該功能,客戶機(jī)可以在發(fā)出RPC請(qǐng)求后立即繼續(xù)執(zhí)行。在異步RPC中,服務(wù)器在接收到RPC請(qǐng)求后立即向客戶機(jī)送回應(yīng)答,之后再調(diào)用客戶機(jī)請(qǐng)求的過(guò)程。應(yīng)答的作用是向客戶機(jī)確認(rèn)服務(wù)器已準(zhǔn)備開(kāi)始處理該RPC請(qǐng)求。客戶機(jī)接收到服務(wù)器的確認(rèn)消息之后,將不會(huì)阻塞,而是繼續(xù)向下執(zhí)行。圖2-32(a)中顯示了異步RPC交互過(guò)程。作為對(duì)比,圖2-32(b)顯示了常規(guī)RPC交互過(guò)程。

圖2-32 RPC中客戶機(jī)與服務(wù)器的交互過(guò)程
如果在應(yīng)答返回時(shí),客戶機(jī)還未做好接收的準(zhǔn)備,從而沒(méi)有做出任何動(dòng)作,在這種情況下異步RPC也很有用。例如,客戶機(jī)可能想預(yù)取一組主機(jī)的網(wǎng)絡(luò)地址,以便隨后與它們進(jìn)行聯(lián)絡(luò)。當(dāng)命名服務(wù)器正在搜集這些地址的時(shí)候,客戶機(jī)可能想做其他事情。在這種情況下,通過(guò)兩個(gè)異步RPC來(lái)進(jìn)行客戶機(jī)與服務(wù)器間的通信是很有意義的,如圖2-33所示。客戶機(jī)首先對(duì)服務(wù)器進(jìn)行調(diào)用,把要查詢的主機(jī)名清單交給服務(wù)器,并且客戶機(jī)在接收到服務(wù)器關(guān)于已收到主機(jī)名清單的確認(rèn)之后繼續(xù)執(zhí)行其他的程序。第二步調(diào)用是由服務(wù)器發(fā)出的,它對(duì)客戶機(jī)進(jìn)行調(diào)用,將查詢到的地址清單交給客戶機(jī)。兩個(gè)異步RPC結(jié)合起來(lái)也稱為延遲的同步RPC(Deferred Synchronous RPC)。

圖2-33 客戶機(jī)和服務(wù)器通過(guò)兩個(gè)異步RPC進(jìn)行交互
需要指出的是,還存在一些異步RPC的變異形式。在這些異步RPC中,客戶機(jī)向服務(wù)器發(fā)送請(qǐng)求之后立即繼續(xù)執(zhí)行其他的程序。也就是說(shuō),客戶機(jī)不等待服務(wù)器返回接受請(qǐng)求的確認(rèn)。這種RPC稱為單向RPC(One-Way RPC)。它的問(wèn)題是,如果無(wú)法確保可靠性,客戶機(jī)就無(wú)法確定它發(fā)出的請(qǐng)求是否將得到處理。
2.7.4 客戶機(jī)/服務(wù)器的聯(lián)編
1.概念
在分布式系統(tǒng)中,客戶機(jī)和服務(wù)器有兩種不同的協(xié)作方式。第一種情況是,假定客戶機(jī)請(qǐng)求一個(gè)暫時(shí)的服務(wù)(Temporary Service);另一種情況是,客戶機(jī)想生成一系列調(diào)用直接指向一個(gè)專門的服務(wù)過(guò)程。這意味著需要一個(gè)運(yùn)行機(jī)制,以便在客戶機(jī)和服務(wù)器之間建立長(zhǎng)期的聯(lián)編(Binding,也稱為綁定)。
所謂的聯(lián)編在不同的應(yīng)用范圍有具體的含義,例如在語(yǔ)言中指如何將數(shù)據(jù)名轉(zhuǎn)換為機(jī)器地址的過(guò)程;而在數(shù)據(jù)庫(kù)中是指把數(shù)據(jù)的一種視圖轉(zhuǎn)換成另一種視圖。在分布式系統(tǒng)中,聯(lián)編主要完成兩個(gè)任務(wù):
(1)確定服務(wù)器主機(jī)的網(wǎng)絡(luò)地址。
(2)在該主機(jī)上確定合適的服務(wù)器進(jìn)程。通過(guò)聯(lián)編可以建立起客戶機(jī)和服務(wù)器的關(guān)系。
確定為客戶機(jī)提供所需服務(wù)的主機(jī)的網(wǎng)絡(luò)地址的方法有下列兩種。
① 由某節(jié)點(diǎn)維護(hù)一個(gè)數(shù)據(jù)庫(kù),記錄其他節(jié)點(diǎn)所提供的服務(wù)。客戶機(jī)進(jìn)程首先和這個(gè)節(jié)點(diǎn)接觸,以獲得有關(guān)主機(jī)的地址。這種方法的最大缺點(diǎn)是,萬(wàn)一這個(gè)節(jié)點(diǎn)癱瘓,整個(gè)系統(tǒng)就無(wú)法使用。另外,當(dāng)多個(gè)客戶機(jī)同時(shí)訪問(wèn)這個(gè)節(jié)點(diǎn)上的服務(wù)器地址列表時(shí),該節(jié)點(diǎn)顯然成為通信瓶頸。
② 各節(jié)點(diǎn)均維護(hù)一張表,以記錄本節(jié)點(diǎn)所能提供的服務(wù)。客戶機(jī)把請(qǐng)求服務(wù)的消息廣播出去,那些能提供這些服務(wù)的主機(jī)就立即把它們的網(wǎng)絡(luò)地址回送給客戶機(jī),客戶機(jī)一般采用首先返回主機(jī)網(wǎng)絡(luò)地址作為服務(wù)主機(jī)的地址。
事實(shí)上,第一種方法是基于名字服務(wù)器的概念。圖2-34是一個(gè)基于名字服務(wù)器的聯(lián)編系統(tǒng)示意圖。

圖2-34 基于名字服務(wù)器的聯(lián)編系統(tǒng)示意圖
一個(gè)服務(wù)器發(fā)送一個(gè)名字給名字服務(wù)器(對(duì)應(yīng)于圖2-34中的1、2),當(dāng)客戶機(jī)進(jìn)程發(fā)出一個(gè)遠(yuǎn)程過(guò)程調(diào)用時(shí)(3),它的存根發(fā)送一個(gè)請(qǐng)求消息到名字服務(wù)器(4)。名字服務(wù)器響應(yīng)請(qǐng)求完成名字與地址的映射后,將服務(wù)器主機(jī)地址回送客戶機(jī)存根(5)。
2.聯(lián)編的實(shí)現(xiàn)和執(zhí)行過(guò)程
(1)靜態(tài)方法:通過(guò)三部分(名字服務(wù)器、客戶機(jī)和服務(wù)器進(jìn)程)來(lái)實(shí)現(xiàn)。
(2)動(dòng)態(tài)方法:聯(lián)編是在客戶機(jī)通道和一個(gè)服務(wù)器進(jìn)程之間,靠服務(wù)器來(lái)控制,服務(wù)器能分配它的服務(wù)器進(jìn)程激活通道。
關(guān)鍵的問(wèn)題是,必須知道什么時(shí)候發(fā)生聯(lián)編,基于RPC的分布式應(yīng)用和構(gòu)造能分成三個(gè)階段。
(1)編譯時(shí)間(Compile Time):
① 客戶機(jī)/服務(wù)器模塊程序設(shè)計(jì),像是被預(yù)期鏈接在一起。
② 客戶機(jī)、服務(wù)器與它們各自的存根緊密聯(lián)系。客戶機(jī)相對(duì)于其存根成為服務(wù)器,而服務(wù)器相對(duì)于其存根成為客戶機(jī)。
③ 存根在聯(lián)編和傳輸過(guò)程中對(duì)客戶機(jī)和服務(wù)器起保護(hù)作用。
④ 理想的存根的生成,靠存根生成器從接口中給出定義。
(2)鏈接時(shí)期(Link Time):
① 一個(gè)服務(wù)器的可利用性,通過(guò)RPC聯(lián)編本身引出或注冊(cè)多個(gè)調(diào)用。
② 一個(gè)客戶機(jī)聯(lián)編它自己和一個(gè)專門服務(wù)器靠引入一個(gè)調(diào)用。
③ 一旦一個(gè)聯(lián)編過(guò)程被完成,調(diào)用才能發(fā)生。
④ 聯(lián)編不像調(diào)用那樣頻繁地被執(zhí)行。
(3)調(diào)用時(shí)期:
① 在OSI表示層提供過(guò)程調(diào)用的語(yǔ)義。存根使用在它以下的傳輸層協(xié)議傳送客戶機(jī)/服務(wù)器之間的變量和可靠的結(jié)果。
② 不同的傳輸層協(xié)議能被應(yīng)用。
③ RPC功能應(yīng)包括若干控制信息。
2.7.5 遠(yuǎn)程過(guò)程調(diào)用設(shè)計(jì)舉例
本節(jié)通過(guò)一個(gè)具體實(shí)例說(shuō)明RPC設(shè)計(jì)和實(shí)現(xiàn)。
1.RPC設(shè)計(jì)應(yīng)解決的問(wèn)題
1)RPC要求網(wǎng)絡(luò)服務(wù)提供支持和ISO、OSI的對(duì)照
如前所述,RPC是用戶直接在高級(jí)語(yǔ)言中使用的一種高層通信機(jī)制,它至少應(yīng)建立在傳輸層協(xié)議之上。因此,一般要求網(wǎng)絡(luò)提供數(shù)據(jù)報(bào)服務(wù)的支持,如圖2-35所示。

圖2-35 RPC環(huán)境和OSI的對(duì)照
2)RPC語(yǔ)義問(wèn)題(Semantics)
RPC和應(yīng)用本地調(diào)用一樣,本地調(diào)用執(zhí)行“恰好一次”語(yǔ)義;而RPC的語(yǔ)義就復(fù)雜多了。一般來(lái)說(shuō),在沒(méi)有節(jié)點(diǎn)癱瘓和延遲太長(zhǎng)時(shí),請(qǐng)求響應(yīng)方式RPC可提供如下兩種語(yǔ)義:
(1)恰好一次調(diào)用語(yǔ)義(Exactly-once)。
(2)至少一次調(diào)用語(yǔ)義(At-least-once)。
調(diào)用的正常結(jié)果意味著服務(wù)器執(zhí)行一次或多次過(guò)程調(diào)用。為避免產(chǎn)生非預(yù)期的結(jié)果,該調(diào)用應(yīng)是冪等的,即多次執(zhí)行該調(diào)用與執(zhí)行一次所得結(jié)果一樣。
如果出現(xiàn)故障,如調(diào)用報(bào)文、響應(yīng)報(bào)文丟失,或服務(wù)器壞了,為使調(diào)用仍能進(jìn)行又引出兩種新的語(yǔ)義:
① 最后一次語(yǔ)義(Last-One),即調(diào)用中止意味著服務(wù)器執(zhí)行一次或多次調(diào)用,但最終的結(jié)果取自最后一次發(fā)出的該調(diào)用的執(zhí)行。前幾次調(diào)用的執(zhí)行實(shí)際上無(wú)用,一般稱為孤兒(Orphan)。對(duì)孤兒處理是RPC中復(fù)雜的問(wèn)題。
② 最多一次調(diào)用語(yǔ)義(At-Most-Once),這種語(yǔ)義保證調(diào)用的執(zhí)行或者成功并返回正確結(jié)果,或者不產(chǎn)生任何結(jié)果。
3)聯(lián)編(Binding)
客戶機(jī)發(fā)請(qǐng)求,首先要解決服務(wù)器定位問(wèn)題。通過(guò)定位和某一專用服務(wù)器建立起聯(lián)系,進(jìn)行一系列的協(xié)同工作和加工處理。
4)在異構(gòu)型分布式系統(tǒng)中的參數(shù)傳遞
在異構(gòu)型分布式系統(tǒng)中,存在機(jī)器異構(gòu)、操作系統(tǒng)異構(gòu)和網(wǎng)絡(luò)異構(gòu)等一系列不兼容問(wèn)題,如RPC的參數(shù)在傳遞前要轉(zhuǎn)換成一種標(biāo)準(zhǔn)代碼(如P碼或M碼),而服務(wù)器把標(biāo)準(zhǔn)碼變成本地機(jī)器的代碼,反之亦然。
5)用戶接口
大多數(shù)RPC采用Birrell和Nelson提出的存根模型(Stub)作為用戶接口,這就涉及存根的生成。一種是設(shè)計(jì)專門的存根產(chǎn)生器,用戶在應(yīng)用程序中對(duì)遠(yuǎn)程過(guò)程調(diào)用加以說(shuō)明,諸如給出所請(qǐng)求的服務(wù)名、參數(shù)、參數(shù)類型,然后在編譯過(guò)程時(shí)由存根產(chǎn)生器自動(dòng)生成相應(yīng)的代碼;另一種采用庫(kù)函數(shù)作為存根,用戶直接在應(yīng)用程序中調(diào)用庫(kù)中的庫(kù)函數(shù)。
2.RPC的設(shè)計(jì)與組成
下面通過(guò)一個(gè)具體例子RTU來(lái)說(shuō)明RPC設(shè)計(jì)。RTU是Masscomp計(jì)算機(jī)上的實(shí)時(shí)UNIX,其中RPC為該系統(tǒng)的網(wǎng)絡(luò)文件系統(tǒng)NFS提供通信支持,使NFS與機(jī)器、操作系統(tǒng)無(wú)關(guān)。
1)RPC的組成
(1)RPC由下列4部分組成。
① 外部數(shù)據(jù)表示(簡(jiǎn)稱為XDR)。它的功能是完成異種機(jī)之間的數(shù)據(jù)轉(zhuǎn)換工作。它有固定的協(xié)議規(guī)范,其主要特點(diǎn)是,任何數(shù)據(jù)類型均以4個(gè)字節(jié)為單位表示數(shù)。
② 身份鑒別(Authentication)。它主要是為網(wǎng)絡(luò)文件系統(tǒng)提供一種服務(wù),用戶鑒別、存取控制、權(quán)限檢查,安全和訪問(wèn)控制都可以建立在此之上。
③ 客戶機(jī)(Client)。這部分提供函數(shù)調(diào)用,使用戶能在程序中發(fā)RPC請(qǐng)求和接收返回結(jié)果。
④ 服務(wù)器(Server)。這部分使服務(wù)器能提供實(shí)現(xiàn)服務(wù)功能,并可接收RPC請(qǐng)求及返回結(jié)果給用戶機(jī)。
(2)三層接口如下。
① 最高層——這一層RPC接口對(duì)程序員是透明的,調(diào)用者不知道使用了RPC還是調(diào)用了本地的一個(gè)函數(shù)。
② 中間層——這一層提供下列三個(gè)函數(shù)。
regesterrpc( ):用于服務(wù)器一方注冊(cè)服務(wù)。
svc-run( ):等待接收RPC請(qǐng)求并執(zhí)行。
call-rpc( ):客戶機(jī)發(fā)出RPC調(diào)用。
③ 最低層——這一層允許程序員改動(dòng)RPC庫(kù)函數(shù)中的所有默認(rèn)值,明顯地使用Socket套接字來(lái)傳遞RPC信息,其編程也是最復(fù)雜的。
(3)對(duì)RPC的兩個(gè)擴(kuò)充。RTU/RPC中還擴(kuò)充增加了廣播RPC和批處理RPC(Broadcast RPC & Batching RPC),只有超級(jí)用戶才能發(fā)廣播RPC。批處理RPC是將RPC報(bào)文放置在一個(gè)對(duì)所希望的服務(wù)器進(jìn)行調(diào)用的“管道”中,并假設(shè):
① 管道中的每個(gè)RPC調(diào)用都不要求從服務(wù)器那里得到響應(yīng),并且服務(wù)器也不發(fā)相應(yīng)信息。
② 調(diào)用的管道是由諸如TCP/IP這樣的可靠字符流傳輸裝置傳送的。
由于服務(wù)器對(duì)每次調(diào)用無(wú)需響應(yīng),所以客戶機(jī)可以在服務(wù)器執(zhí)行以前的調(diào)用時(shí)并行地發(fā)出新的調(diào)用;而且,建立在TCP/IP之上的RPC可以緩沖許多調(diào)用,然后用一次Write( )系統(tǒng)調(diào)用發(fā)給服務(wù)器。這種重疊執(zhí)行可以大大減輕客戶機(jī)和服務(wù)器進(jìn)程IPC的負(fù)擔(dān),以及一系列調(diào)用總開(kāi)銷。
2)RPC的幾個(gè)概念
(1)流(Stream)。流是一塊數(shù)據(jù)存在實(shí)體的抽象,是各種存儲(chǔ)介質(zhì)(內(nèi)存、I/O、外存)的標(biāo)準(zhǔn)接口。RTU/RPC在其XDR部分使用了流,這樣做的好處是,XDR的各種操作只在流上實(shí)現(xiàn),而不必對(duì)每一種介質(zhì)都編一套操作,如圖2-36所示。

圖2-36 流概念
(2)端口(Port)。端口是兩臺(tái)機(jī)器進(jìn)行通信的邏輯通道。
聯(lián)編(Binding)可以通過(guò)端口(Port)進(jìn)行,在RTU/RPC中,所有服務(wù)都注冊(cè)在一張稱為Pmap的表中,并提供一個(gè)網(wǎng)絡(luò)服務(wù)Port Mapper,它為客戶機(jī)提供了從Pmap表上查找任一遠(yuǎn)程過(guò)程的端口號(hào)的標(biāo)準(zhǔn)方法。每臺(tái)機(jī)器上的Port Mapper完成端口號(hào)—程序號(hào)的映射。
客戶機(jī)為了找到某類網(wǎng)絡(luò)服務(wù)所對(duì)應(yīng)的端口號(hào),可以向服務(wù)器一方的Port Mapper發(fā)RPC(Port Mapper的端口號(hào)是共知的),Port Mapper就返回正確的端口號(hào)。
可見(jiàn),RTU/RPC采用動(dòng)態(tài)和靜態(tài)相結(jié)合的方法定位一個(gè)服務(wù),Port Mapper定位是靜態(tài)的,其他的服務(wù)則是動(dòng)態(tài)的。
(3)遠(yuǎn)程過(guò)程。一個(gè)遠(yuǎn)程過(guò)程用下列三個(gè)參數(shù)惟一決定。
① 程序號(hào):定義一類服務(wù)的一組過(guò)程,如NFS程序號(hào)是10003。
② 版本號(hào):允許程序稍加修改不必分配新程序號(hào),并具有兼容性。
③ 過(guò)程號(hào):程序組中的一個(gè)過(guò)程。
(4)套接字(Socket)。它是來(lái)源于UNIX 4.2 BSD可用于同一機(jī)器之間通信,也可用于網(wǎng)絡(luò)間通信的一種通用結(jié)構(gòu)。不管使用什么網(wǎng)絡(luò)(驅(qū)動(dòng)程序)和協(xié)議層使用什么協(xié)議,對(duì)客戶機(jī)和服務(wù)器來(lái)說(shuō),它們對(duì)應(yīng)的是套接字,它們各自的Socket也是兩者之間通信的端點(diǎn),如圖2-37所示。

圖2-37 套接字模型
3)RPC的工作流程
RPC的工作流程圖如圖2-38所示。在圖2-38中,服務(wù)器返回結(jié)果的過(guò)程沒(méi)有表示,具體情況和上述情況相類似,只是把請(qǐng)求報(bào)文改成響應(yīng)報(bào)文而已。

圖2-38 RTU/RPC的工作流程圖
3.RTU/RPC的實(shí)現(xiàn)
1)XDR的實(shí)現(xiàn)(External Data Representation,外部數(shù)據(jù)表示)
(1)XDR操作是在流上進(jìn)行的。XDR句柄的內(nèi)容如圖2-39所示,其中操作類型有下列三種:

圖2-39 XDR句柄的內(nèi)容
ENCODE——由本地?cái)?shù)據(jù)→XDR。
DECODE——由XDR→本地?cái)?shù)據(jù)。
FREE——釋放空間。
① 由本地機(jī)器數(shù)據(jù)表示轉(zhuǎn)換成XDR時(shí),用ENCODE操作。
② 由XDR轉(zhuǎn)換回本機(jī)器數(shù)據(jù)時(shí),用DECODE。
③ FREE把空間釋放。操作向量表含有各種操作的(X-get long)入口地址。私用數(shù)據(jù)區(qū)則對(duì)應(yīng)具體的流,可在創(chuàng)造XDR句柄時(shí)確定。
(2)涉及XDR的庫(kù)函數(shù)有三類:
原始類—char,int,float,int short,double,unsigned int。
復(fù)合類—string array,unsigned + byte array,any array。
指針類—xdr-reference( ),XDR-pointer,…
① 原始類—這類函數(shù)轉(zhuǎn)換C語(yǔ)言中的簡(jiǎn)單類型。每個(gè)函數(shù)具有以下形式:
xdr-xxx (xdrs,datap) XDR*xdrs;/*xdrs為XDR句柄指針*/ XXX*datap;/*datap指向轉(zhuǎn)換對(duì)象*/
其中,xdrs為XDR句柄指針,datap為指向轉(zhuǎn)換對(duì)象的指針,xxx代表轉(zhuǎn)換的數(shù)據(jù)類型。原始類XDR函數(shù)流程圖如圖2-40所示。

圖2-40 原始類XDR函數(shù)流程圖
② 復(fù)合類XDR函數(shù)。這類函數(shù)的轉(zhuǎn)換對(duì)象包括string、bytearray,這類函數(shù)大都由簡(jiǎn)單類型重復(fù)構(gòu)成,因此只要連續(xù)調(diào)用原始類XDR函數(shù)即可完成轉(zhuǎn)換。
③ 指針類,如函數(shù)Xdr-reference( ),定義如下:
xdr-reference(xdrs,PP,size,proc)
其中,PP是欲轉(zhuǎn)換結(jié)構(gòu)指針的地址,size是該結(jié)構(gòu)的大小,proc是轉(zhuǎn)換該結(jié)構(gòu)的XDR函數(shù)的入口,在ENCODE時(shí),直接調(diào)用proc即可轉(zhuǎn)換該結(jié)構(gòu);在DECODE時(shí),則要申請(qǐng)空間以容納轉(zhuǎn)換過(guò)來(lái)的結(jié)構(gòu),并使*PP指向它。
有了以上三類XDR函數(shù),用戶可以編寫轉(zhuǎn)換任意自定義類型的XDR函數(shù)。
2)身份鑒別的實(shí)現(xiàn)
身份鑒別主要為網(wǎng)絡(luò)文件系統(tǒng)和分布式系統(tǒng)提供一種安全訪問(wèn)控制服務(wù),結(jié)構(gòu)opaque-auth是描述身份鑒別信息的框架:
struct opaque-auth{ cnum-t oa-flavor;/*flavor of auth*/ caddr-t oa-base; /*addr of more auth*/ u-int oa-length; /*起始地址*/ }
程序第一項(xiàng)oa-flavor是鑒別的類型,有三類:
enum auth_flavor{ AUTH-NULL=0 (用于調(diào)用者和服務(wù)器都不關(guān)心各自身份) AUTH-UNIX=1 (想從UNIX系統(tǒng)中來(lái)辨認(rèn)身份) AUTH-SHORT=2 (服務(wù)器響應(yīng)時(shí)才啟用,它把與Client身份相匹配的opague-auth 傳送回去) }
第二項(xiàng)oa-base是描述新類型的結(jié)構(gòu)起始地址,描述用于除了上述三種類型以外的鑒別方式。
第三項(xiàng)oa-length是這個(gè)結(jié)構(gòu)的長(zhǎng)度。
Auth是一個(gè)句柄,它是由auth kern-create創(chuàng)建的。它的實(shí)現(xiàn)很簡(jiǎn)單,先為AUTH句柄申請(qǐng)空間,再填上鑒別身份的信息即可。
3)客戶機(jī)的實(shí)現(xiàn)(Client)
(1)RPC報(bào)文。RPC報(bào)文由下面的結(jié)構(gòu)定義:
Struct rpc-msg{ U-long rm_xid;/*transaction id*/ enum msg-type rm-direction;/*報(bào)文類型*/ anion{ Struct call-body RM-cmb /*調(diào)用報(bào)文*/ Struct reply-body RM-rmb; }ru;/*響應(yīng)報(bào)文*/ }
其中,第一項(xiàng)rm_xid的目的是,使服務(wù)器返回結(jié)果能被請(qǐng)求該服務(wù)的客戶機(jī)收到,以與同一機(jī)器上的其他客戶機(jī)加以區(qū)別。方法是,調(diào)用者在其RPC報(bào)文中給rm-xid設(shè)置惟一值,而服務(wù)器從調(diào)用報(bào)文中取出rm-xid,再原封不動(dòng)地放入響應(yīng)報(bào)文中。這樣,調(diào)用者就可以取出與它具有相同rm-xid的響應(yīng)報(bào)文。
第二項(xiàng)是報(bào)文類型,調(diào)用和響應(yīng)時(shí)定義如下:
enum msg-type{ call=0 REPLY=1 }
它還是第三項(xiàng)ru的選擇開(kāi)關(guān)。
當(dāng)rm-direction為Call時(shí),ru為調(diào)用報(bào)文RM-cmb;當(dāng)rm-direction為Reply時(shí),ru為響應(yīng)報(bào)文RM-rmb。
(2)Client句柄。Client句柄有三項(xiàng)(如圖2-41所示)。

圖2-41 Client句柄
cl-ops包含一些操作。最重要的是cl-call( ),顧客就是通過(guò)這個(gè)函數(shù)發(fā)出RPC的。private是私用數(shù)據(jù)區(qū)。
客戶機(jī)的工作進(jìn)程見(jiàn)前面的RPC工作流程圖。客戶機(jī)在創(chuàng)建Client句柄的同時(shí)創(chuàng)建一個(gè)套接字。RPC報(bào)文從這套接字發(fā)出和在這套接字上等待響應(yīng)報(bào)文。
4)服務(wù)器的實(shí)現(xiàn)
服務(wù)器主要有兩部分工作:一是注冊(cè)服務(wù),二是當(dāng)RPC請(qǐng)求到達(dá)時(shí),調(diào)用相應(yīng)的過(guò)程。服務(wù)器的工作流程如圖2-42所示。

圖2-42 服務(wù)器的工作流程
(1)注冊(cè)服務(wù)——服務(wù)器所提供的服務(wù)(即客戶機(jī)調(diào)用的遠(yuǎn)程過(guò)程)注冊(cè)在一個(gè)Pmap表(如圖2-43所示)中,為了將對(duì)應(yīng)于[prognum,versnum]的過(guò)程注冊(cè)在Pmap表中,系統(tǒng)提供一個(gè)函數(shù)svc-register( ),它的流程圖如圖2-44所示。

圖2-43 Pmap表

圖2-44 svc-register( )流程圖
(2)等待并接收RPC請(qǐng)求。系統(tǒng)創(chuàng)建了一個(gè)進(jìn)程svc-run,它不斷查看服務(wù)器端的套接字(Socket)中是否有內(nèi)容。若有,說(shuō)明有RPC報(bào)文到達(dá),則svc-run轉(zhuǎn)去執(zhí)行所請(qǐng)求的過(guò)程,并返回結(jié)果;否則,svc-run等待一段時(shí)間再查看Socket。若有多個(gè)RPC請(qǐng)求到達(dá),則先在Socket保存起來(lái),服務(wù)器按FIFO順序處理。
小結(jié):上面描述了RTU/RPC的具體實(shí)現(xiàn),它是在4.2 BSD基礎(chǔ)上,在Kernel部分,RTU/RPC只實(shí)現(xiàn)把報(bào)文發(fā)到套接字或從套接字接收?qǐng)?bào)文,以后的操作由套接字有關(guān)操作實(shí)現(xiàn)。
RPC的類型:阻塞型發(fā)出調(diào)用掛起,收到結(jié)果再執(zhí)行,也提供廣播和批處理RPC。
服務(wù)器執(zhí)行模型:多個(gè)用戶請(qǐng)求,排隊(duì)按FIFO,單線程。
語(yǔ)義:UDP/IP執(zhí)行一次或多次,無(wú)孤兒處理能力。
服務(wù)器定位:動(dòng)靜相結(jié)合,Port Mapper是固定的,其他由Pmap表來(lái)定位。
用戶接口:庫(kù)函數(shù)分三層。
異構(gòu)數(shù)據(jù)表示:XDR。
RPC交換協(xié)議:采用Request-Reply。
傳輸協(xié)議/接口:采用TCP/IP和UDP/IP。
BSD SOCKET支持NFS。
2.7.6 遠(yuǎn)程過(guò)程調(diào)用的應(yīng)用─—NFS
隨著分布式系統(tǒng)中RPC的研究,目前已有100多種、10萬(wàn)臺(tái)計(jì)算機(jī)運(yùn)用RPC和NFS。美國(guó)Sun公司在工作站基于RPC實(shí)現(xiàn)了NFS網(wǎng)絡(luò)文件系統(tǒng),目前有幾百家計(jì)算機(jī)廠在自己的產(chǎn)品上都采用NFS協(xié)議。IBM、DEC、HP、APPLE、Microsoft都支持NFS,NFS是一個(gè)基于RPC的分布式網(wǎng)絡(luò)環(huán)境,其突出的特點(diǎn)不是文件復(fù)制,而是文件共享。這是NFS和其他UNIX網(wǎng)絡(luò)的不同之處。
1.NFS的主要特點(diǎn)
NFS是一個(gè)在異構(gòu)環(huán)境下共享文件的分布式網(wǎng)絡(luò)協(xié)議。它采用Client /Server服務(wù)方式,其特點(diǎn)如下:
(1)透明信息存取。用戶可以直接獲得遠(yuǎn)程文件的數(shù)據(jù),而不必了解有關(guān)網(wǎng)絡(luò)的信息。對(duì)用戶來(lái)說(shuō),所有NFS安裝的文件系統(tǒng)就和本地文件系統(tǒng)一樣。讀/寫本地和遠(yuǎn)地文件幾乎沒(méi)有區(qū)別,因此NFS使信息在網(wǎng)絡(luò)上真正實(shí)現(xiàn)分布式處理。
(2)異構(gòu)環(huán)境適應(yīng)性。NFS提供靈活的、獨(dú)立于操作系統(tǒng)平臺(tái)、發(fā)揮各家網(wǎng)絡(luò)開(kāi)發(fā)軟件的長(zhǎng)處的一種新型工具,特別適應(yīng)不同機(jī)器和異構(gòu)環(huán)境。XDR是解決異構(gòu)性的好方法。
(3)易擴(kuò)充性。NFS網(wǎng)絡(luò)環(huán)境,擴(kuò)充新的資源或軟件,不需要改變現(xiàn)存的工作環(huán)境。利用RPC在NFS上提供了一組用于數(shù)據(jù)交換的擴(kuò)充協(xié)議。
(4)可靠性。NFS的可靠性來(lái)自UNIX文件系統(tǒng)的安全性。在NFS協(xié)議支持下,當(dāng)文件服務(wù)器協(xié)議設(shè)計(jì)的服務(wù)器壞了,重新啟動(dòng)后,客戶工作站仍可以繼續(xù)工作。因?yàn)檫^(guò)程調(diào)用包含了完成調(diào)用的全部信息,服務(wù)器出故障時(shí),用戶只是感到服務(wù)非常慢而已。
(5)高性能。NFS允許用戶選用各種不同的配置,或利用無(wú)盤工作站,可以使系統(tǒng)獲得好的性價(jià)比。與UNIX的高度兼容也是SUN NFS廣泛應(yīng)用的原因之一。
2.RPC/XDR協(xié)議支持NFS
NFS提供異構(gòu)環(huán)境適用的遠(yuǎn)程存取能力。這與機(jī)器網(wǎng)絡(luò)協(xié)議完全獨(dú)立。它依賴于XDR協(xié)議之上的RPC,按照ISO/OSI的協(xié)議,它屬于第5層(會(huì)話層)。XDR屬于表示層。
NFS是在RPC協(xié)議的基礎(chǔ)上發(fā)展起來(lái)的,當(dāng)系統(tǒng)啟動(dòng)以后,nfsd biod是dacmon,執(zhí)行的命令就是客戶機(jī)的系統(tǒng)調(diào)用。
3.基于NFS的ONC環(huán)境
開(kāi)放網(wǎng)絡(luò)計(jì)算(ONC)包括一組基于NFS網(wǎng)絡(luò)協(xié)議的網(wǎng)絡(luò)服務(wù),提供下列服務(wù)。
(1)NFS服務(wù)提供遠(yuǎn)程文件透明存取。
(2)自動(dòng)安裝或拆卸遠(yuǎn)程目錄Automouter。
(3)Network lock manager提供對(duì)NFS存取文件記錄值,讓用戶協(xié)調(diào)存取公共信息。
(4)NIS網(wǎng)絡(luò)信息系統(tǒng)。
(5)REX在網(wǎng)絡(luò)環(huán)境下存取遠(yuǎn)地資源。
(6)NETDisk保證無(wú)盤工作站支持ONC/NETDISK無(wú)盤的調(diào)頁(yè)對(duì)換服務(wù)。
4.NFS訪問(wèn)一個(gè)文件的流程
客戶機(jī)可訪問(wèn)位于遠(yuǎn)地主機(jī)的UNIX文件系統(tǒng)中的一個(gè)文件。圖2-45是訪問(wèn)一個(gè)遠(yuǎn)程文件的流程示意圖。

圖2-45 訪問(wèn)一個(gè)遠(yuǎn)程文件的流程示意圖
首先,用戶或應(yīng)用程序向統(tǒng)一的文件系統(tǒng)接口發(fā)出一個(gè)系統(tǒng)調(diào)用,內(nèi)核在VFS/VNODE接口中查尋,以便定位所需的文件。如果該文件是一個(gè)遠(yuǎn)程文件,內(nèi)核重指向NFS文件系統(tǒng)由NFS的特定過(guò)程來(lái)實(shí)現(xiàn)。客戶機(jī)NFS文件系統(tǒng)運(yùn)用RPC通信機(jī)制,請(qǐng)求服務(wù)器NFS文件系統(tǒng)來(lái)完成。發(fā)出RPC后,在遠(yuǎn)地主機(jī)上的NFS服務(wù)例程接到這個(gè)請(qǐng)求后執(zhí)行它。服務(wù)例程首先通過(guò)服務(wù)器上的VFS/VNODE來(lái)定位可要求的具體文件系統(tǒng),在這里是一個(gè)UNIX系統(tǒng)。該UNIX文件系統(tǒng)接到請(qǐng)求后,把需要的數(shù)據(jù)傳給NFS服務(wù)例程,結(jié)果再通過(guò)RPC返回給客戶主機(jī),就完成了一個(gè)文件的調(diào)用過(guò)程。
2.7.7 消息傳遞和遠(yuǎn)程過(guò)程調(diào)用的對(duì)比和進(jìn)程通信小結(jié)
1.對(duì)比
對(duì)上述兩種進(jìn)程間通信的機(jī)制進(jìn)行對(duì)比是必要的,以決定哪個(gè)更好和在什么時(shí)候選用哪種進(jìn)程通信的機(jī)制更好。這兩種機(jī)制看起來(lái)很類似。例如,消息傳遞看起來(lái)像RPC,在V-System中(Cheriton,1988年)的消息傳遞現(xiàn)在稱為RPC,而在Amoeba中稱為消息傳遞。
應(yīng)指出:從客戶機(jī)進(jìn)程的觀點(diǎn)來(lái)看,遠(yuǎn)程過(guò)程調(diào)用非常類似于遠(yuǎn)程約會(huì)。因?yàn)閮烧叨季砣胍粋€(gè)封鎖調(diào)用在兩個(gè)方向上的參數(shù)傳送。但是,不同之處在兩個(gè)通信系統(tǒng)中是很明顯的,在機(jī)制的實(shí)現(xiàn)上、在傳送層上和使用模式上都不同。
對(duì)比遠(yuǎn)程過(guò)程調(diào)用和消息傳送,前者的主要的優(yōu)點(diǎn)是,一個(gè)遠(yuǎn)程過(guò)程調(diào)用接口很容易實(shí)現(xiàn)文件化,像是一系列過(guò)程具有參數(shù)和結(jié)果。從接口的規(guī)范看,它可自動(dòng)生成編碼,遮蔽所有程序頁(yè)消息的細(xì)節(jié)。
另外,消息傳遞機(jī)制提供的靈活性在RPC中很難找到。但是,這種靈活性是在消息傳送接口上文件化地傳送的,其成本高。
兩者在分布式系統(tǒng)中都廣泛地應(yīng)用,在不同的系統(tǒng)中都強(qiáng)調(diào)了各自的優(yōu)越性。有一項(xiàng)研究包含了兩種機(jī)制的對(duì)比,即在PDP計(jì)算機(jī)上,StarMod系統(tǒng)和Charlotte系統(tǒng)。
兩者對(duì)比從一個(gè)進(jìn)程到另一進(jìn)程的發(fā)送時(shí)間,RPC端口調(diào)用要求更大的開(kāi)銷,由如下因素造成。
(1)在Charlotte,下層協(xié)議是一個(gè)分層協(xié)議,趨向于引入考慮開(kāi)銷。
(2)Charlotte用C語(yǔ)言寫成,StarMod用Modula語(yǔ)言生成,編碼的效率是一個(gè)因素。
(3)兩個(gè)內(nèi)核KeVnel是不同的,一個(gè)強(qiáng)調(diào)的是高性能,另一個(gè)強(qiáng)調(diào)的是簡(jiǎn)單。
2.進(jìn)程通信小結(jié)
分布式操作系統(tǒng)運(yùn)行在網(wǎng)絡(luò)環(huán)境下的所有計(jì)算機(jī)上而構(gòu)成分布式計(jì)算機(jī)系統(tǒng)。因?yàn)樵谙到y(tǒng)中沒(méi)有共享存儲(chǔ)器,其進(jìn)程通信的機(jī)制靠消息傳遞,這意味著高性能的進(jìn)程間通信是分布式系統(tǒng)的最關(guān)鍵問(wèn)題。因?yàn)樾枰峁└咚俚臄?shù)據(jù)交換,所以這種高速數(shù)據(jù)的交換依靠適當(dāng)?shù)倪M(jìn)程通信原語(yǔ)和支持通信原語(yǔ)的傳送協(xié)議。
下面列出三種遠(yuǎn)程進(jìn)程間通信的原語(yǔ):
(1)消息傳遞和高級(jí)消息傳遞。
(2)遠(yuǎn)程過(guò)程調(diào)用(RPC)。
(3)執(zhí)程或事務(wù)處理(Transaction)。
以上三種原理分別基于不同的基本概念。
消息傳遞是集中式系統(tǒng)進(jìn)程間通信的擴(kuò)展。它的基本原語(yǔ)是從客戶機(jī)進(jìn)程到服務(wù)器進(jìn)程之間實(shí)現(xiàn)單方向的通信。
遠(yuǎn)程進(jìn)程間通信的原語(yǔ)的類型如下。
(1)封鎖執(zhí)行或非封鎖執(zhí)行類型(執(zhí)行調(diào)用不延遲)。
(2)緩沖和非緩沖型。對(duì)于緩沖型原語(yǔ),在發(fā)送和接收之間,消息被緩沖。非緩沖方式有時(shí)也稱為約會(huì)(Rendezvous),有些同步的條件被滿足。
(3)可靠與不可靠型。對(duì)于可靠型原語(yǔ),當(dāng)數(shù)據(jù)提交時(shí),是可靠的;否則或消息未被復(fù)制,或發(fā)生了故障。
構(gòu)造的原語(yǔ)可以是雙向的信息流。發(fā)送者和接收者必須被同步。這種同步依靠發(fā)送操作的語(yǔ)義。
消息發(fā)送能用于單一數(shù)據(jù)報(bào)或多個(gè)數(shù)據(jù)報(bào)。后者要求提供可靠的提交和恢復(fù)。進(jìn)程間通信靠直接發(fā)送消息從一個(gè)進(jìn)程到另一個(gè)進(jìn)程的端口(Port)。鏈接Link也能用來(lái)通信,或是單一鏈接(像是單向通信通路),或是雙向鏈接定義(像是雙向通信路徑)。因?yàn)長(zhǎng)ink是面向鏈接的通信系統(tǒng),所以是有它自己的優(yōu)缺點(diǎn)。
當(dāng)發(fā)送一個(gè)消息時(shí),一個(gè)發(fā)送者必須規(guī)定要發(fā)送的一個(gè)專門的進(jìn)程或一組進(jìn)程,或能指向所有的進(jìn)程。發(fā)送者可能不期待任何響應(yīng),或一個(gè)專門響應(yīng),或一組響應(yīng),或所有目的節(jié)點(diǎn)發(fā)來(lái)的響應(yīng)。
RPC意味著發(fā)送者可將進(jìn)程從一個(gè)計(jì)算機(jī)上自動(dòng)調(diào)用到另一個(gè)計(jì)算機(jī)上,并不需要知道該過(guò)程是在本地還是遠(yuǎn)地,即具有透明性。
RPC支持的通信可以是在一個(gè)客戶機(jī)和一個(gè)服務(wù)器之間或在多個(gè)客戶機(jī)和多個(gè)服務(wù)器之間,因?yàn)橛行┫到y(tǒng)不涉及分布式語(yǔ)言。RPC只是描述傳送的協(xié)議。
遠(yuǎn)程過(guò)程調(diào)用要求的是兩個(gè)遠(yuǎn)地進(jìn)程之間的語(yǔ)言級(jí)數(shù)據(jù)結(jié)構(gòu)的傳送。為了這個(gè)目的,RPC對(duì)參數(shù)進(jìn)行組裝,把參量表匯集在一起形成一個(gè)消息。
用RPC機(jī)制可以屏蔽從客戶機(jī)到服務(wù)器機(jī)制的具體細(xì)節(jié)。這意味著需要在客戶機(jī)和服務(wù)器之間進(jìn)行聯(lián)編。
分布式系統(tǒng)是非常可靠的和很堅(jiān)定的。這是因?yàn)樵诓煌姆植际焦?jié)點(diǎn)上提供冗余資源是可能的。一個(gè)單一通信不能總是用來(lái)提供兩個(gè)進(jìn)程之間的互相作用。在這情況下,執(zhí)程(Transaction)的概念是很方便的。在分布式系統(tǒng)中,基于執(zhí)程模型的消息交換依靠套接字(Socket),它是在網(wǎng)絡(luò)上可尋址的實(shí)體。
如果進(jìn)程通信的能力和存儲(chǔ)管理緊密結(jié)合,會(huì)使分布式系統(tǒng)的性能大為改善。這種進(jìn)程通信提供的性能會(huì)超過(guò)傳統(tǒng)的進(jìn)程通信系統(tǒng)。
- 現(xiàn)代測(cè)控系統(tǒng)典型應(yīng)用實(shí)例
- 蕩胸生層云:C語(yǔ)言開(kāi)發(fā)修行實(shí)錄
- Effective DevOps with AWS
- 模型制作
- 最后一個(gè)人類
- 大數(shù)據(jù)處理平臺(tái)
- Spark大數(shù)據(jù)技術(shù)與應(yīng)用
- 構(gòu)建高性能Web站點(diǎn)
- SMS 2003部署與操作深入指南
- 自動(dòng)化生產(chǎn)線安裝與調(diào)試(三菱FX系列)(第二版)
- 精通LabVIEW程序設(shè)計(jì)
- 中文版AutoCAD 2013高手速成
- Data Analysis with R(Second Edition)
- Windows 7來(lái)了
- 數(shù)據(jù)清洗