分布式操作系統(tǒng)2(2)_第1頁
分布式操作系統(tǒng)2(2)_第2頁
分布式操作系統(tǒng)2(2)_第3頁
分布式操作系統(tǒng)2(2)_第4頁
分布式操作系統(tǒng)2(2)_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、2.4遠(yuǎn)程過程調(diào)用遠(yuǎn)程過程調(diào)用 客戶-服務(wù)器模式為構(gòu)造分布式操作系統(tǒng)提供了一種便利的方法,但它也存在著無法克服的缺陷:即所有通信建立的基礎(chǔ)都是輸入/輸出。用1/0為基礎(chǔ)實現(xiàn)它并不是一個好的辦法。新方法就是允許程序去調(diào)用位于其他機器上的過程。 當(dāng)位于機器1的一進(jìn)程調(diào)用機器2上的某過程時,機器1上的該進(jìn)程被掛起,被調(diào)用的過程在機器2上執(zhí)行。調(diào)用者將消息放在參數(shù)表中傳送給被調(diào)用者,結(jié)果作為過程的返回值返回給調(diào)用者。消息的傳送與I/0操作對于編程人員是不可見的。這種方法稱為遠(yuǎn)程過程調(diào)用(remote procedure call),或簡稱為RPC。 1、由于調(diào)用的進(jìn)程與被調(diào)用的過程運行在不同的機器上,

2、因而在不同的地址空間執(zhí)行,這就導(dǎo)致了問題的復(fù)雜化。 2、調(diào)用者和被調(diào)用者都有可能會崩潰,任何一種可能的失敗都會引起不同的問題。 RPC是廣泛應(yīng)用于分布式操作系統(tǒng)的一種技術(shù)。但有幾個問題: 2.4.1 基本基本RPC操作操作 傳統(tǒng)的(單機上)過程調(diào)用:read(文件句柄,緩沖區(qū)地址,輸入最大字節(jié)數(shù))。例如:count=read(fd,buf,nbytes).這里fd是一個整數(shù),buf是一個字符型數(shù)組,nbytes是另一個整數(shù)。 功能是:從fd所指定的文件中輸入 nbytes個字節(jié)到起始地址為buf的緩沖區(qū)中。函數(shù)返回實際讀入到緩沖區(qū)中的數(shù)據(jù)的字節(jié)數(shù),如果出錯,返回-1,并設(shè)置錯誤號碼errno.

3、在c語言中參數(shù)的調(diào)用分為值參調(diào)用與變參調(diào)用。 1、對被調(diào)用方,值參僅僅是一個初始化了的局部變量,其改變不影響調(diào)用方的初始值 。2、變參是一個指向變量的指針(即變量的地址),而不是變量的值。它的修改影響了調(diào)用方過程中的值。值參調(diào)用和變參調(diào)用的這種區(qū)別對RPC來說是很重要的。 此外有C語言中不使用的參數(shù)傳遞機制,它叫做復(fù)制/恢復(fù)調(diào)用(call-by-copy/restore)。在調(diào)用者將變量拷入堆棧,這一點是與值參調(diào)用一樣。調(diào)用完成后,將棧中變量的值拷回并覆蓋原有的變量值,此方法與變參調(diào)用用效果一樣。 使用哪一種參數(shù)傳遞機制通常是由語言開發(fā)者決定的,它是語言的固有特性。它有時也與傳遞的數(shù)據(jù)類型相關(guān)

4、。例如在C語占中,整型與其他數(shù)值類型常作為值參傳遞,而數(shù)組總是以變參的形式傳遞。 RPC的內(nèi)在思想是使遠(yuǎn)程的過程調(diào)用看上去就像在本地響過程調(diào)用一樣。 RPC使用與本地調(diào)用相似的方法獲得透明性 。主要步驟是: (1)客戶過程以普通方式調(diào)用相應(yīng)的客戶存根: (2)客戶存根建立消息并激活內(nèi)核陷阱: (3)內(nèi)核將消息發(fā)送到遠(yuǎn)程內(nèi)核; (4)遠(yuǎn)程內(nèi)核將消息送到服務(wù)器存根: (5)服務(wù)器存根取出消息中的參數(shù)后調(diào)用服務(wù)器的過程: (6)服務(wù)器完成工作后將結(jié)果返回至服務(wù)器存根; (7)服務(wù)器存根將它打包并激活內(nèi)核陷阱; (8)遠(yuǎn)程內(nèi)核將消息發(fā)送至客戶內(nèi)核; (9)客戶內(nèi)核將消息交給客戶存根: 1O)客戶存根從

5、消息中取出結(jié)果返回給客戶。 最主要是將客戶過程的本地調(diào)用轉(zhuǎn)化為客戶存根再轉(zhuǎn)化為服務(wù)器過程的本地調(diào)用,對客戶與服務(wù)器來說是透明的。242 參數(shù)傳遞參數(shù)傳遞客戶存根的功能是獲取調(diào)用的參數(shù)并將參數(shù)打包放入消息中送往服務(wù)器存根。將參數(shù)打包形成消息的過程稱為參數(shù)組裝(Paralncter Marshaling)。 例如:遠(yuǎn)程調(diào)用函數(shù)sum(i,j),該函數(shù)有兩個整型參數(shù)并返回其代數(shù)和。 客戶存根獲取這兩個參數(shù)并將它們打包入消息中。因為一個服務(wù)器可能支持多個調(diào)用,所以它也將被調(diào)用過程的名字或過程號放入消息中,以確定是哪一個調(diào)用。當(dāng)消息到達(dá)服務(wù)器后,由存根檢查消息以確定需要哪個過程,然后調(diào)用相應(yīng)的進(jìn)程。 服

6、務(wù)器進(jìn)程一結(jié)束,服務(wù)器存根再次取得控制權(quán),它獲取服務(wù)器提供的運行結(jié)果并將其打包形成消息。這條消息被發(fā)送回客戶存根,客戶存根從消息中取出結(jié)果,最終將結(jié)果返回給客戶進(jìn)程。 只要客戶機與服務(wù)器機是同樣的機器,并且參數(shù)與結(jié)果都是像整型、字符型、布爾型這樣的標(biāo)量類型,那么上述模型將工作良好。例如lBM主機中使用的是EBCDlC碼,而IBMPC使用的是ASCII碼,服務(wù)器將會錯誤地解釋所傳送的字符。 如在lntel486中字節(jié)是從右向左編號,而在SPARC中正相反。Lntel的格式為最低有效位優(yōu)先,而SPARC的格式為最高有效字節(jié)優(yōu)先。例如,如果一個服務(wù)器有二個參數(shù),一個整數(shù)和一個四個字符的字符串。每個參

7、數(shù)占一個32位長的字。 (a)說明了intel486機上,整型參數(shù) 5,字符串JILL。(b)說明了消息被SPARC機接收后。 5*2 的整數(shù),“JILL”的字符串。(c)將每個字倒置后,整數(shù)雖然是5,字符串卻成LLIJ。 24 對應(yīng)于有n個參數(shù)的遠(yuǎn)程過程調(diào)用的消息將會有n+l個字段,一個字段標(biāo)識過程,n個字段存放n個參數(shù)??蛻艉头?wù)器共問建立一個表示基本數(shù)據(jù)類型的標(biāo)準(zhǔn),給定一個參數(shù)列表和消息后,它們就可以推斷出哪些字節(jié)屬于哪個參數(shù)。 信息在消息中是如何表示的?一種方法是針對整數(shù)、字符、布爾數(shù)以及浮點數(shù)等設(shè)計一個網(wǎng)絡(luò)標(biāo)準(zhǔn)或規(guī)范化形式,并且要求所有的發(fā)送者在參數(shù)編組時將其所有的數(shù)據(jù)的內(nèi)部表示轉(zhuǎn)換

8、為符合該標(biāo)準(zhǔn)的表示。 第二種方法,客戶使用自己本來的格式,并在消息的第一個字節(jié)中說明它所使用的格式。這方法已經(jīng)知道消息中的參數(shù)是怎樣布局的以及客戶是采用什么格式,剩下的工作就容易了(只要一方轉(zhuǎn)換為另一方的格式)。 243 動態(tài)捆綁動態(tài)捆綁 客戶如何定位服務(wù)器呢?一種方法是將服務(wù)器的網(wǎng)絡(luò)地址固化到客戶機中。但是當(dāng)服務(wù)器移動、復(fù)制或者在改變其接口后,需要重新編譯。為避免這些麻煩,一些分布式系統(tǒng)采用了動態(tài)捆綁的技術(shù),以使客戶能夠定位服務(wù)器。 1、服務(wù)器 的形式說明書 首先應(yīng)該提到的是服務(wù)器的形式說明書 ,說明書指出了服務(wù)器名字叫file_server,版本號為31,提供的服務(wù)器過程有(read,wr

9、ite,create,delete)。 每一過程都給出了參數(shù)類型。每個參數(shù)都被指明為輸入?yún)?shù)、輸出參數(shù)、或者輸入/輸出參數(shù)。 主要用途是作為存根生成器的輸入,以此來產(chǎn)生客戶和服務(wù)器的存根,然后將這兩個存根存放到相應(yīng)的存根庫陣中。 當(dāng)服務(wù)器程序開始執(zhí)行時,main主循環(huán)外的初始化調(diào)用(initialize)輸出服務(wù)器的接口。這意味著服務(wù)器進(jìn)程向一個稱為binder的程序發(fā)送消息,通過binder使其他機器知道該服務(wù)器的存在。 2、 binder 進(jìn)程該進(jìn)程用于服務(wù)器的注冊。在注冊時要登記服務(wù)器的名字、版本號、通常有32位長的唯一標(biāo)識符號以及用于定位的句柄,以便客戶進(jìn)程能尋服務(wù)器進(jìn)程。服務(wù)器進(jìn)程也

10、可通過調(diào)用binder來注銷登記以停止服務(wù)。 P58 表2-3 綁定接口客戶進(jìn)程第一次調(diào)用某個遠(yuǎn)程過程時,客戶存根發(fā)現(xiàn)其未與服務(wù)器捆綁,則向binder發(fā)送消息要求檢查,如果當(dāng)前運行的服務(wù)器不支持這樣的接口,則調(diào)用失敗。另一方面,如果存在合適的服務(wù)器進(jìn)程,binder將它的句柄和唯一標(biāo)識符交給客戶存根??蛻舸娓丫浔鳛榈刂?,向它發(fā)送請求消息。消息包含送往服務(wù)器進(jìn)程的參數(shù)和唯一標(biāo)識符。當(dāng)一臺機器上運行多個服務(wù)進(jìn)程時,服務(wù)器內(nèi)核利用唯一標(biāo)識符把到來的消息發(fā)送到正確的服務(wù)進(jìn)程上。 動態(tài)捆綁: binder可以根據(jù)需要隨機地將客戶進(jìn)程分配給多個服務(wù)器進(jìn)程,以使服務(wù)器負(fù)載均衡。它還可以通過周期性測試,

11、自動注銷任何不能響應(yīng)調(diào)用的服務(wù)器進(jìn)程,以提高容錯性,還可以用來確認(rèn)合法的使用者。 動態(tài)捆綁的不足: 由于客戶進(jìn)程的生存期短,而每個進(jìn)程運行時都要從頭開始,極大地影響了系統(tǒng)的性能。另外,billder會成為瓶頸,因此需要多個binder程序。無論注冊還是注銷接口,都需要有大量的消息傳遞來保持多個binder的同步與更新,這就需要更多的開銷。 我們將討論RPC可能發(fā)生的一些錯誤及其解決方法。RPC系統(tǒng)可能能出現(xiàn)的五類問題: (1) 客戶無法證位服務(wù)器;(2)客戶發(fā)給服務(wù)器的請求消息丟失;(3)服務(wù)器發(fā)給客戶的應(yīng)答消息丟失;(4)服務(wù)器在收到請求后崩潰;(5)客戶機在發(fā)送請求后崩潰??蛻魺o法定位服務(wù)

12、器客戶無法定位服務(wù)器服務(wù)器可能已關(guān)閉。服務(wù)器產(chǎn)生一個新版本的接口,當(dāng)客戶進(jìn)程運行時,binder就無法將客戶進(jìn)程與服務(wù)器進(jìn)程相匹配,只能報出錯。處理錯誤方法: 1、每個過程都有一個返回值,不同的返回值說明各種錯誤類型。加入一條新的錯誤類型無法定位服務(wù)器。 2、一種可能的解決辦法是在出錯時產(chǎn)生一個異常。定義新的信號類型SIGNOSERVER,讓它像其他信號一樣處理錯誤。 客戶內(nèi)核在發(fā)送請求時啟動計時器。如果在計時器時滿之前無應(yīng)答或無確認(rèn)消息返回,內(nèi)核重發(fā)消息。如果請求消息確實丟失了,服務(wù)器是無法區(qū)分收到的請求是原來的還是重發(fā)的,而一切運行良好。當(dāng)然,如果消息被多次重發(fā)而得不到應(yīng)答,客戶會放棄請求

13、并認(rèn)為服務(wù)器已經(jīng)關(guān)閉。 客戶請求消息丟失客戶請求消息丟失服務(wù)器應(yīng)答消息丟失服務(wù)器應(yīng)答消息丟失 根據(jù)計時器重傳即如果在合理的時間內(nèi)未收到應(yīng)答,就重發(fā)請求。是請求丟失還是應(yīng)答丟失,或是服務(wù)器速度太慢? 不同原因,有不問處理方法。 要解決這個問題,一種方法是將每個請求(操作能多次安全地重復(fù)執(zhí)行而不產(chǎn)生危害)構(gòu)造成冪等的。然而,有些請求事實上是非冪等的。 另一種方法是給要發(fā)送的請求消息分配一個序號。服務(wù)器內(nèi)核保留那些最近來自每個客戶的請求序號。這樣服務(wù)器內(nèi)核可以區(qū)別第一次發(fā)送的請求和重發(fā)的請求,排除了兩次執(zhí)行某個請求的可能性。 另一個附加的保護(hù)是在消息頭上增加一位以區(qū)分是原來的還是重發(fā)的消息。服務(wù)器崩

14、潰服務(wù)器崩潰 在(b)中,系統(tǒng)不得不向客戶報告失?。ㄈ纾阂鹨粋€異常中斷),而在(c)中只需重發(fā)請求。但客戶的內(nèi)核不能區(qū)分這兩種情況。它只知道計時器到時。有三種方法可以解決這個問題。1、等待服務(wù)器重新啟動,然后重發(fā)請求。這種方法要求不斷重試直至應(yīng)答消息到來并傳給客戶。這是至少一次語義,RPC至少要執(zhí)行一次,但也有可能執(zhí)行多次。2、立即放棄并報告失敗。這是最多一次語義, RPC最多執(zhí)行一次,但可能沒有執(zhí)行。3、不作任何保證。當(dāng)服務(wù)器崩潰時,客戶得不到任何幫助和保證。RPC可以不被執(zhí)行或執(zhí)行相當(dāng)多次。這種方法最大的優(yōu)點就是易實現(xiàn)。 這三種方法都不是成熟的方法。人們需要的是精確的執(zhí)行一次的語義,但通

15、常它是不容易實現(xiàn)的。簡而言之,服務(wù)器崩潰在很大程度上改變了RPC的性質(zhì)。在單處理機系統(tǒng)中,服務(wù)器的崩潰往往意味著客戶的崩潰。所以恢復(fù)既不可能也沒必要。而分布式系統(tǒng)中則可以采取一些措施來處理這種情況??蛻魴C崩潰客戶機崩潰 如果客戶巳發(fā)出請求但在應(yīng)答到來之前崩潰了,這時會發(fā)生什么?此時已經(jīng)激活了服務(wù)器中的相應(yīng)汁算,但沒有客戶在等待結(jié)果。這樣的計算稱為孤兒(orphan)。 孤兒會導(dǎo)致一系列的問題。起碼它浪費了CPU周期,同時又鎖住了文件或其他寶貴的資源。此外,如果客戶重新啟動并再次調(diào)用了這個RPC,客戶會很快得到那個孤兒的返回值,這將引起調(diào)用結(jié)果的混淆。孤兒問題的四種解決方法。 方法一,在客戶存根

16、發(fā)送一個RPC前,日志文件中記下要執(zhí)行操作的信息。該文件保存在不受崩潰影響的磁盤和其他媒介上。當(dāng)客戶重新舊動后,系統(tǒng)檢查日志文件,并準(zhǔn)確地清除孤兒。這種方法稱為根絕。缺點是對每個RPC都進(jìn)行磁盤記錄,極大增加了系統(tǒng)開銷。此外,孤兒還可以執(zhí)行RPC,這樣又生成了子RPC,很難找到和清除。總之,這種方法不好。 方法二,稱為再生。這種方法不必做磁盤記錄。該方法將時間劃分成序編號叫紀(jì)元。當(dāng)一客戶重新啟動時,它向所有機器廣播一個新紀(jì)元的開始,此后,所有遠(yuǎn)程計算被終止。當(dāng)然,如果網(wǎng)絡(luò)是分段的,有些孤兒還會遺留下來。但當(dāng)這些孤兒的應(yīng)答返回時,消息上帶有它們過時的紀(jì)元號。這些應(yīng)答還是容易識別和清除的。方法三,

17、是對第二種方法的改進(jìn),稱作溫和再生。當(dāng)接到某客戶開始新紀(jì)元的廣播后,每臺機器檢查自己是否有遠(yuǎn)程計算,若有則試圖去找到該遠(yuǎn)程計算的調(diào)用者。若沒有找到該計算的調(diào)用者,則終止該計算。 方法四,稱為過期。每一個RPC執(zhí)行時事先分給一個標(biāo)準(zhǔn)時間段T,當(dāng)T到期而調(diào)用未完成時就必需申請一個T。另一方面,如果客戶崩潰,服務(wù)器在客戶重新啟動前等候了一個T后,所有孤兒都被清除。由于RPC有各種不同的請求,如何選擇T的合適值呢?終止一個孤兒可能會造成不可預(yù)見的后果。例如,假設(shè)一個孤兒正鎖住一個或多個文件或數(shù)擁記錄等,如果突然清除該孤兒,那么這些資源可能會一直處于被占用的狀態(tài)。另外,一個孤兒可能已在某些遠(yuǎn)程的進(jìn)程調(diào)用

18、隊列中等待,期望將來能調(diào)用其他進(jìn)程。這樣,即使去除了這個孤兒也不能去除孤兒遺留下的痕跡。2.4.52.4.5實現(xiàn)的問題實現(xiàn)的問題 分布式系統(tǒng)的成敗往往取決于它的性能。系統(tǒng)的性能在很大程度上取決于通信的速度。而通信的速度主要取決于對它的實現(xiàn)方法。討論RPC系統(tǒng)的實現(xiàn)問題,重點在于系統(tǒng)性能和耗時情況。 RPC協(xié)議族協(xié)議族 1、如何選擇RPC的協(xié)議。采用面向連接還是面向非連接的協(xié)議。面向連接的協(xié)議是任何時候客戶進(jìn)程都與服務(wù)器進(jìn)程捆綁,它們之間建立一個連接。該協(xié)議的優(yōu)點是通信簡單,可靠性高。不用擔(dān)心消息丟失,也不用處理確認(rèn)消息。其缺點是性能下降,尤其表現(xiàn)在LAN。額外的軟件開銷是性能下降的原因。盡管面

19、向連接不會丟失信包,由于LAN的可靠性高,所以沒有必要。大多數(shù)校園網(wǎng)或在同一建筑物內(nèi)的分布式系統(tǒng)均采用面向非連接的協(xié)議。2、選擇一個標(biāo)準(zhǔn)的通用協(xié)議還是專門為RPC設(shè)計的協(xié)議。 一些分布式系統(tǒng)使用lP(或UDP)作為基本協(xié)議:(1)協(xié)議已存在,省去了大量的工作;(2)協(xié)議有許多個現(xiàn)成的工具,這也省去了許多工作:(3)絕大部分UNlX系統(tǒng)中都可發(fā)送和接收該信包:(4)大多數(shù)現(xiàn)有網(wǎng)絡(luò)支持IP與UDP信包。 總之,IP與UDP適用于大多數(shù)現(xiàn)有的UNIX系統(tǒng)和網(wǎng)絡(luò)系統(tǒng)(lntemet)。這樣,編寫在UNlX系統(tǒng)上運行的客戶或服務(wù)器程序較容易,這樣加快了代碼運行和測試的速度。 IP與UDP在性能上也有缺陷

20、。 IP不是為最終使用者設(shè)計的協(xié)議。它被設(shè)計為一個基礎(chǔ),其上可以建立在不同內(nèi)部網(wǎng)絡(luò)的可靠的TCP連接。 另一種方法是使用一個專門適用于RPC的協(xié)議,它不像 lP協(xié)議那樣去處理信包,這些信包在網(wǎng)絡(luò)中傳送幾分鐘后,會突然在某個時候到達(dá)。當(dāng)然這樣的協(xié)議需要設(shè)計、實現(xiàn)、測試并嵌入到現(xiàn)有系統(tǒng)中,從長遠(yuǎn)的觀點看開發(fā)和廣泛地接受一個高性能的RPC協(xié)議是可取的。3、信包和報文的長度。RPC有一個大而固定的獨立于發(fā)送數(shù)據(jù)的頭信息。所以,發(fā)送一個64k的文件,一次發(fā)送64K明顯要比發(fā)送64次lK要高效得多。因此,協(xié)議和網(wǎng)絡(luò)能否允許較大長度的信包傳送是很重要的。有的RPC系統(tǒng)只能傳送小尺寸的信息(例如:Sun 是8

21、K),許多網(wǎng)絡(luò)也不能處理很大的信包(如:以太網(wǎng)的最大限制為1536bytes),所以一個RPC不得不拆分成多個信包,從而增加了開銷。一個大的RPC需要被拆分成多個信息包,是否每個信包都要確認(rèn)。例如一個客戶要向文件服務(wù)器寫入一個4K的數(shù)據(jù)塊。但是系統(tǒng)能處理的信包最大為lK。一種策略稱為停等協(xié)議,客戶進(jìn)程先發(fā)送lK長的信包0后,等侍服務(wù)器的確認(rèn),然后,客戶再發(fā)送下一個lK長的信包,等待下一個確認(rèn)。 另一種策略叫爆發(fā)協(xié)議。是客戶進(jìn)程盡快將所有的信包發(fā)送完,當(dāng)所有信包到達(dá)服務(wù)器后,服務(wù)器發(fā)回確認(rèn)消息。確認(rèn)確認(rèn)這兩種協(xié)議的性質(zhì)有很大的不同。在停等協(xié)議中,如一個信包被破壞或丟失,客戶不可能收到確認(rèn),于是重

22、新發(fā)送該信包。在爆發(fā)協(xié)議中,如果信包l丟失而信包2隨后正確到達(dá),服務(wù)器會面臨選擇。服務(wù)器可以丟棄收到的信包,等客戶計時器超時后重發(fā)整條消息。或?qū)?、2這兩個正確到達(dá)的信包放入緩沖區(qū),等待信包3正確到達(dá)后,客戶指明重新發(fā)送信包1,這種技術(shù)叫做選擇重發(fā)。停等協(xié)議和丟棄所有信包在發(fā)生錯誤時都易于實現(xiàn)。有選擇重發(fā)策略需要大量的管理工作,但使用了較少網(wǎng)絡(luò)帶寬。一般可靠性高的局域網(wǎng),幾乎不會有信包丟失,因此使用有選擇重發(fā)得不償失。對于廣域網(wǎng)而言,使用有選擇重發(fā)更為合適。 當(dāng)接收者不能接收到來的信包時就出現(xiàn)了一個稱作超限的錯誤,該信包隨之丟失。這種錯誤更為嚴(yán)重。以停等方式發(fā)送不會出現(xiàn)超限錯誤。在爆發(fā)協(xié)議中,

23、它明顯比停等協(xié)議高效得多,但也可能會出現(xiàn)超限錯誤。 一方面,如果這個超限錯誤是由于芯片處理中斷而暫時無法接收信包而引起的,那么,發(fā)送者可在發(fā)送兩個信包之間加入一段延遲時間,使得芯片能在這個時間間隔內(nèi)從中斷返回到接收狀態(tài)。另一方面,若超限錯誤是出于芯片的緩沖區(qū)不夠而引起的,那么如果緩沖區(qū)容量為n個信包,則可在發(fā)送n個信包后留一個間隙,或是在發(fā)出n個信包后,得到一個確認(rèn)后再發(fā)送后面的信包。 超限錯誤 協(xié)議包括請求、應(yīng)答、確認(rèn)。確認(rèn)用來告訴服務(wù)器應(yīng)答已經(jīng)安全到達(dá)客戶,可以將之丟棄了?,F(xiàn)在假設(shè)確認(rèn)在傳送過程中丟失了,那么服務(wù)器會保留這個應(yīng)答,但是對客戶來說這個協(xié)議已經(jīng)完成,不再計時和等待信包。 我們可

24、以修改協(xié)議,讓確認(rèn)消息再被確認(rèn)一次,這種做法增加復(fù)雜性和額外開銷,得不償失。實際上,只需在服務(wù)器上設(shè)置一個計時器,在應(yīng)答發(fā)送后計時,計時到后,不論客戶是否收到應(yīng)答,服務(wù)器都將應(yīng)答丟棄,或者在收到一確認(rèn)后將應(yīng)答丟棄。當(dāng)然,若收到客戶的新的請求時,也可以認(rèn)為應(yīng)答是到達(dá)了,將應(yīng)答丟棄。確認(rèn)的確認(rèn)關(guān)鍵路徑關(guān)鍵路徑 每個RPC執(zhí)行的一系列指令順序稱為關(guān)鍵路徑??蛻羰紫日{(diào)用客戶存根,接著激活客戶內(nèi)核陷阱中斷,發(fā)送消息到服務(wù)器的內(nèi)核,同時引起服務(wù)器內(nèi)核中斷,最后消息經(jīng)服務(wù)器存根送至服務(wù)器進(jìn)程。它執(zhí)行操作并返回結(jié)果。 在關(guān)鍵路徑中的什么地方耗時最多?如果知道問題出在哪里,就可以想辦法減少時耗。 (圖2-24

25、固定的頭信息 )在無數(shù)據(jù)RPC中,耗時主要在信包到來時服務(wù)器內(nèi)核的現(xiàn)場轉(zhuǎn)換、服務(wù)器的中斷例程以及將信包傳送到接口。在有數(shù)據(jù) RPC中,數(shù)據(jù)在以太網(wǎng)上傳送時耗時最多,其次是將信包送入和移出內(nèi)部接口響耗時。忠告:建議避免使用離奇的硬件。其次,UDP協(xié)議有不足,UDP頭字段中的校驗和很耗時,有些得不償失,一個簡單的用戶自定義的RPC協(xié)議將會工作得更好一些。最后,讓服務(wù)器存根用忙等待而不是睡眠將大大減少2-24(a)中耗時最多的那一步(第 13步)的操作時間。在RPC中從客戶到服務(wù)器的14步:(1)調(diào)用存根(2)獲得消息緩沖區(qū)(3)組裝參數(shù)(4)填入頭信息(5)計算UDP校驗和(6)陷阱內(nèi)核(7)傳送

26、請求包(8)通過QBus移動信包到控制者(9)以太網(wǎng)傳輸時間(10)從控制者獲得信息(11)中斷服務(wù)例程(12)計算UDP校驗和(13)切換到用戶空間(14)服務(wù)器存根代碼圖2-24 RPC關(guān)鍵路徑(a)空的RPC(b)共有1440字節(jié)數(shù)組作為參數(shù)的RPC拷貝拷貝( (copying)copying) 一個與RPC執(zhí)行時間密切相關(guān)的問題是拷貝。根據(jù)硬件、軟件和調(diào)用類型的不同,消息可能需要拷貝一次到八次不等。 最好的情況:接口芯片支持DMA,它將消息直接從客戶存根取到網(wǎng)上(拷貝1),并且實時地存放到服務(wù)器內(nèi)核的存儲區(qū)。內(nèi)核檢查該信包,并且包含它的頁映射到服務(wù)器進(jìn)程的地址空間。如果不允許做該映射,

27、那么內(nèi)核將信包拷貝到服務(wù)器存根(拷貝2)。最壞的情況:內(nèi)核將消息從客戶存根拷貝到內(nèi)核緩沖區(qū)(拷貝1)。內(nèi)核拷貝消息到接口芯片的硬件緩沖區(qū)(拷貝2)。硬件啟動,消息經(jīng)網(wǎng)絡(luò)傳送到服務(wù)器接口芯片的緩沖區(qū)(拷貝3)。服務(wù)器內(nèi)核將消息拷貝到內(nèi)核緩沖區(qū)(拷貝4)。最后,消息從內(nèi)核的緩沖區(qū)傳送到服務(wù)器存根(拷貝5)。此外,如果此調(diào)用含有一個大的值參數(shù)組時,那么還需另外三步拷貝:將數(shù)組拷入客戶進(jìn)程的堆棧以調(diào)用客戶存根;客戶存根組裝時,將數(shù)組從堆棧拷貝到消息緩沖區(qū)中;服務(wù)器存根將數(shù)組從消息中取出,放入服務(wù)器進(jìn)程的堆棧中??傂枰舜慰截?。(例題p68)1、分散-集中。具有分散-集中功能的網(wǎng)絡(luò)接口芯片能夠通過連結(jié)兩

28、個或多個內(nèi)存緩沖區(qū)裝配一個信包。優(yōu)點是可以在內(nèi)核空間建立信包的頭字段,用戶數(shù)據(jù)仍放在客戶存根中。要發(fā)送信包時,該部件將這兩個部分連接起來形成信包。在發(fā)送方,從多個信包源集成一個信包避免了拷貝。同樣,在接收方,可將消息頭和消息體分別分散存放到不同的緩沖區(qū)中。2、內(nèi)核可以改變內(nèi)存映肘,將內(nèi)核中放置信包的緩沖區(qū)映射到服務(wù)器進(jìn)程的地址空間。同樣,也可以將服務(wù)器存根的緩沖區(qū)映射到內(nèi)核的緩沖區(qū)。當(dāng)服務(wù)器存根開始運行時,信包就出現(xiàn)在它的緩沖區(qū)內(nèi),免去了從服務(wù)器內(nèi)核到存根的拷貝。計時管理計時管理 在實際系統(tǒng)中,存在若消息由于線路中的雜音或是超限錯誤而偶然丟失的情況。在消息已發(fā)送而等候回答(應(yīng)答或確認(rèn))時,設(shè)置

29、了計時器。若計時期滿卻沒有應(yīng)答,就需多次重發(fā)消息,或在多次重發(fā)后放棄發(fā)送。 管理計時所需要的時間是不可低估的。設(shè)置一個計時器需要建立一個數(shù)據(jù)結(jié)構(gòu),指出何時計時到期并且怎樣處理。然后,將該數(shù)據(jù)結(jié)構(gòu)插入到未到時的計時器的鏈表中。一般此鏈表是按時間順序排序的,離到期時間最近的排在鏈表的首部,離到期時間最遠(yuǎn)的排在鏈表尾部。如圖2-25所示。 當(dāng)應(yīng)答或確認(rèn)消息到達(dá)時,必須找到計時鏈表并將該數(shù)據(jù)結(jié)構(gòu)從鏈表中移走。實際上,許多應(yīng)答并不超時,因此,查找鏈表并將該數(shù)據(jù)結(jié)構(gòu)移走的大部分工作是浪費了。此外,計時也無須特別精確。 一個新的更有效的計時方法。許多系統(tǒng)都有一個進(jìn)程表,該表中每一項都包括了系統(tǒng)中每個進(jìn)程的所

30、有信息。當(dāng)RPC開始執(zhí)行時,內(nèi)核中用一個局部指針指向當(dāng)前進(jìn)程的表項。將計時值放入該進(jìn)程對應(yīng)的表項的一個字段中,如圖2-25(b)所示。這樣設(shè)置的RPC計時器包括在當(dāng)前時間上加上計時的長度,并且將該值寫入進(jìn)程表。如果要停止某個計時的話,則在計時字段中寫入0。這樣在清除計時時可減少許多操作。 欲使這個方法付諸實施,內(nèi)核可以周期地檢查整個進(jìn)程表,如果發(fā)現(xiàn)一個非0的計時值小于或等于當(dāng)前的時間,則說明超時了。在采取相應(yīng)的操作后,重置該計時器。例如,有一個系統(tǒng)發(fā)送100個信包/秒,每秒掃描一次進(jìn)程表的工作僅僅是查找和更新上述鏈表(每秒200次)的 1/200。這種周期按序遍歷一個表的算法叫掃描算法。246

31、 問題領(lǐng)域基于客戶-服務(wù)器模型的RPC廣泛應(yīng)用于分而式操作系統(tǒng)。理想的RPC是透明的,現(xiàn)行的分布式系統(tǒng)幾乎沒有一個稱得上是透明的。透明性的研究仍需不斷地進(jìn)行下去。1、全局變量的問題。允許本地過程不受限制地訪間遠(yuǎn)程的全局變量,是不能夠?qū)崿F(xiàn)的,應(yīng)用中要求該變量對編程人員是可見的。這種對訪問的禁止違反了透明性的原則。 2、有些語言結(jié)構(gòu)不嚴(yán)謹(jǐn),如C語言。編譯器和存根對參數(shù)類型、大小等了解得不很清楚,存根并不總能推斷出參數(shù)的類型,參數(shù)的組裝工作不好完成。將指問復(fù)雜圖形的指針作為參數(shù)也是一個難點,若要在RPC時傳送此類指針,客戶存根很難找到整個圖形。UNIX命令的執(zhí)行: softf1f2sort可以讀標(biāo)準(zhǔn)

32、輸入、寫標(biāo)準(zhǔn)輸出,它可以作為輸入和輸出的客戶,執(zhí)行從文件服務(wù)器讀取f1,向文件服務(wù)器寫入f2的RPC操作。Grep ratf3f4Grep 作為客戶從文件f3讀出含有rat內(nèi)容的行,并寫入到文件f4中。UNIX管道: grep ratf6grep和sort都可以作為標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出的客戶。在這里grep與sort對其中一個必須作為服務(wù)器(被動的)。但是在前兩條指令中,grep與sort均作為客戶(主動的)使用,在這里客戶/服務(wù)器模型顯然是不合適的。 基于客戶/服務(wù)器模型的Rpc并不適合這種通信模式。解決此問題的方法是將管道作為雙向的服務(wù)器,既響應(yīng)左邊酌寫請求,又響應(yīng)右邊的讀請求。 2 .5

33、2 .5 組通信組通信 RPC的通信方式只包括兩個成員,即客戶與服務(wù)器。通信涉及到多個進(jìn)程時,客戶希望向所有服務(wù)器發(fā)送消息,以確保即使其中一個服務(wù)器崩潰仍能執(zhí)行該請求。RPC不能處理一個發(fā)送者給多個接收者發(fā)送消息的通信方式。組通信:一次操作中將一條消息發(fā)送給多個接收者的通信機制。25.1 組通信的引入 組:在某系統(tǒng)或用戶指定方式下協(xié)同工作的多個進(jìn)程的集合。 主要的性質(zhì)是:當(dāng)一條消息發(fā)送到該組后,組內(nèi)的所有成員都能收到該消息。 組是動態(tài)的,可創(chuàng)建,也可注銷。進(jìn)程可以同時成為多個組的成員。引入組的目的是將多個進(jìn)程的集合當(dāng)作一個獨立的抽象物處理。本書里指的是進(jìn)程組,但在計算機系統(tǒng)中有其他的組。組通信

34、的實現(xiàn)在很大程度上依賴于硬件。1、多點傳送(multicasting):創(chuàng)建一個專門網(wǎng)絡(luò)地址,多臺機器可通過這個地址來監(jiān)聽。當(dāng)包發(fā)送到該地址上時,該包就會自動地投遞給所有在該地址上監(jiān)聽的機器。2、廣播通信(broadcasting):包含某一特定地址的包可以發(fā)送給網(wǎng)上所有的機器。廣播通信同樣也用于實現(xiàn)組通信,但效率要低一些。 3、單點傳送(unicasting):通過讓發(fā)送者將包分別送往組的每個成員的方法來實現(xiàn)組通信。盡管效率較低,但是可行的,特別是在大多數(shù)組都比較小的情況下。 2 25 52 2 設(shè)計的問題設(shè)計的問題組通信和通常的消息傳遞機制在設(shè)計上有相似的地方,但發(fā)送消息給組與發(fā)送消息給進(jìn)

35、程在本質(zhì)上是不同的。 一、封閉組:只允許組內(nèi)成員給該組發(fā)送消息。組外成員不能向作為一個整體的組發(fā)送消息。盡管它們可以給單個成員發(fā)送消息。開放組:系統(tǒng)內(nèi)的任何進(jìn)程可以給任何組發(fā)送消息。 二、對等二、對等(或同位或同位)組與分層組組與分層組 封閉組和開放組的區(qū)別在于誰能與該組通信。兩者的另一個重要的區(qū)別在于它們的內(nèi)部結(jié)構(gòu)上。對等組:在一些組中,所有的進(jìn)程的地位相同,沒有哪個進(jìn)程作為領(lǐng)導(dǎo),決議是由進(jìn)程集體作出的。分層組:在另一些組中,存在某種類型的分層組織。例如,一個進(jìn)程作為“協(xié)調(diào)員”,其他所有的進(jìn)程作為“工作人員。這兩種組織方式各有其優(yōu)缺點。 對等組是對稱的而且沒有單點故障。其中一個進(jìn)程崩潰只會使組變小,而組中其他的進(jìn)程仍能繼續(xù)工作。缺點是組內(nèi)每一個決定更為復(fù)雜,都需進(jìn)行組內(nèi)成員的表決,會有一定的時延和系統(tǒng)開銷。 分層組卻有著相反的性質(zhì)。如果協(xié)調(diào)員一崩潰,則整個系統(tǒng)就會癱瘓。但只要協(xié)調(diào)員在運行,它無須打擾其他任何成員就可作出決定。當(dāng)一個組內(nèi)工作人員空閑時,便請求協(xié)調(diào)員分給其新的工作。在這種方式下,協(xié)調(diào)員控制搜索策略和修剪游戲樹,實際的計算留給組內(nèi)工作人員完成。 組的成員組的成員 使用組

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論