專利名稱:分散數(shù)據(jù)處理系統(tǒng)中顧客對(duì)文件的擴(kuò)充的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通過(guò)網(wǎng)絡(luò)相連接的處理系統(tǒng)。更具體地涉及網(wǎng)絡(luò)內(nèi)的本地與遠(yuǎn)程處理系統(tǒng)之間的文件修改。
相關(guān)申請(qǐng)的交叉參照申請(qǐng)?zhí)?7/014,897“在一個(gè)分布式網(wǎng)絡(luò)環(huán)境中訪問(wèn)遠(yuǎn)程文件的一個(gè)系統(tǒng)與方法”,1987年2月13日以茌生(Johnson)等人的名義提出,在此引入作為對(duì)比。
申請(qǐng)?zhí)?IBM內(nèi)部記錄號(hào)AT9-89-027)“在一個(gè)分散數(shù)據(jù)處理系統(tǒng)中文件屬性的維護(hù)”,1989年5月15日以茌生(Johnson)等人的名義提出,在此引入作為對(duì)比。
申請(qǐng)?zhí)?IBM內(nèi)部記錄號(hào)AT9-89-030)“在一個(gè)分散數(shù)據(jù)處理系統(tǒng)中的遠(yuǎn)程認(rèn)證與授權(quán)”,1989年5月15日以茌生(Johnson)等人的名義提出,在此引入作為對(duì)比。
申請(qǐng)?zhí)?IBM內(nèi)部記錄號(hào)AT9-89-034)“分散數(shù)據(jù)處理系統(tǒng)中認(rèn)證服務(wù)的一種靈活接口”,1989年5月15日以羅克斯(Loucks)等人的名義提出,在此引入作為對(duì)比。
申請(qǐng)?zhí)?IBM內(nèi)部記錄號(hào)AT9-89-037)“分散數(shù)據(jù)處理系統(tǒng)中文件加鎖管理”,1989年5月15日以D.W。茌生(Johnson)等人的名義提出,在此引入作為對(duì)比。
申請(qǐng)?zhí)?IBM內(nèi)部記錄號(hào)AT9-89-036)“分散數(shù)據(jù)處理系統(tǒng)中有效控制高速緩沖存儲(chǔ)數(shù)據(jù)的系統(tǒng)與方法”,1989年5月15日以D.W.茌生(Johnson)等人的名義提出,在此引入作為對(duì)比。
本專利文件的部分公開(kāi)包含受版權(quán)保護(hù)的材料,版權(quán)所有人不反對(duì)任何人以專利與商標(biāo)局專利文件或記錄的原樣對(duì)該專利文件或?qū)@_(kāi)進(jìn)行影印復(fù)制,除此而外,保留一切版權(quán)。
如
圖1所示,一個(gè)分布式網(wǎng)絡(luò)環(huán)境1包含通過(guò)通信鏈路或一個(gè)網(wǎng)絡(luò)3相連的兩個(gè)或更多的節(jié)點(diǎn)A、B、C。網(wǎng)絡(luò)3可以是一個(gè)局部網(wǎng)絡(luò)(LAN)或者一個(gè)廣域網(wǎng)絡(luò)(WAN)。
在節(jié)點(diǎn)A、B、C中任何一個(gè)上可以有一個(gè)處理系統(tǒng)10A、10B、10C,例如一個(gè)工作站。各處理系統(tǒng)10A、10B、10C可以是具有使用網(wǎng)絡(luò)3去訪問(wèn)位于一個(gè)遠(yuǎn)程節(jié)點(diǎn)上的文件的能力的一個(gè)單用戶系統(tǒng)或多用戶系統(tǒng)。例如,在本地節(jié)點(diǎn)A上的處理系統(tǒng)10A能夠訪問(wèn)分別在遠(yuǎn)程節(jié)點(diǎn)B、C上的文件5B、5C。
在本文件中,“服務(wù)器”一詞將用于表示文件永久性地存儲(chǔ)在的處理系統(tǒng),而“顧客”一詞將用于表示任何具有訪問(wèn)該文件的進(jìn)程的其它處理系統(tǒng)。然而,必須理解的是,“服務(wù)器”一詞並不是某些局部網(wǎng)絡(luò)系統(tǒng)中使用該詞所指的專用服務(wù)器。本發(fā)明在其中所實(shí)現(xiàn)的分散服務(wù)系統(tǒng)是真正的一個(gè)支持在系統(tǒng)中不同節(jié)點(diǎn)上運(yùn)行各種各樣應(yīng)用程序的分散系統(tǒng),這些節(jié)點(diǎn)可以訪問(wèn)位于系統(tǒng)中任何地點(diǎn)的文件。
如上文所述,以后所討論的本發(fā)明是指向通信網(wǎng)絡(luò)中的一個(gè)分散數(shù)據(jù)處理系統(tǒng)。在這一環(huán)境中,網(wǎng)絡(luò)中一個(gè)節(jié)點(diǎn)上的各處理器有可能訪問(wèn)網(wǎng)絡(luò)中的所有文件不論這些文件位于什么節(jié)點(diǎn)。
已知有其它支持分散數(shù)據(jù)處理系統(tǒng)的方案。例如,在申請(qǐng)?zhí)?14,897“在一個(gè)分布式網(wǎng)絡(luò)環(huán)境中訪問(wèn)遠(yuǎn)程文件的系統(tǒng)與方法”中所公開(kāi)的用于AIX操作系統(tǒng)的IBM的分散服務(wù),該專利以茌生等名義在1987年2月13日提出申請(qǐng)。此外,SunMicrosystems(Sun微系統(tǒng))發(fā)布了網(wǎng)絡(luò)文件系統(tǒng)(NFS),以及貝爾實(shí)驗(yàn)室研制了遠(yuǎn)程文件系統(tǒng)(RFS)。在一系列出版物中描述了Sun微系統(tǒng)NFS,其中包括S.R克利曼的“V節(jié)點(diǎn)SunUNIX中多文件系統(tǒng)類型的一種體系結(jié)構(gòu)”,會(huì)議報(bào)告匯編,USENIX1986夏季技術(shù)會(huì)議與展示,238至247頁(yè);羅塞爾.山勃格等“Sun網(wǎng)絡(luò)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)”,會(huì)議報(bào)告匯編,USENIX1985,119至130頁(yè);鄧.華爾西等,“Sun網(wǎng)絡(luò)文件系統(tǒng)的概述”,117至127頁(yè);張覺(jué)美,對(duì)NFS提供網(wǎng)絡(luò)封鎖服務(wù)的狀態(tài)監(jiān)控”,張覺(jué)美,“SunNet(Sun網(wǎng))”71至75頁(yè);以及布雷特蘭.泰勒,“Sun環(huán)境中的可靠聯(lián)網(wǎng)”,28至36頁(yè)。在一系列出版物中也描述了ATLT(美國(guó)電話與電報(bào)公司)RFS,其中包括安德魯P.里夫金等,“RFS體系結(jié)構(gòu)概述”,USENIX會(huì)議報(bào)告匯編,亞特蘭大,治亞(1986年6月),1至12頁(yè);里查德.漢彌爾頓等,“管理人員眼中的遠(yuǎn)程文件共亨”,1至9頁(yè);姆?;糗浀龋拔募到y(tǒng)轉(zhuǎn)換”,1至2頁(yè);以及大衛(wèi)丁.奧蘭特等,“在系統(tǒng)V中聯(lián)網(wǎng)的一種框架”,1至8頁(yè)。
將本主題發(fā)明在其中實(shí)現(xiàn)的分散服務(wù)系統(tǒng)區(qū)別于Sun微系統(tǒng)NFS的特性是Sun的方案所設(shè)計(jì)的基本上是無(wú)狀態(tài)的服務(wù)器。這意味著服務(wù)器並不存儲(chǔ)任何有關(guān)顧客節(jié)點(diǎn)的信息,包括諸如哪些顧客節(jié)點(diǎn)打開(kāi)了一個(gè)服務(wù)器文件或者顧客進(jìn)程是否以只讀或讀寫(xiě)方式打開(kāi)一個(gè)文件。這樣一種實(shí)現(xiàn)簡(jiǎn)化了服務(wù)器的設(shè)計(jì),因?yàn)榉?wù)器不需要處理當(dāng)一個(gè)顧客出現(xiàn)故障或脫機(jī)而沒(méi)有及時(shí)通知服務(wù)器它正釋放它對(duì)服務(wù)器資源的權(quán)利要求而引起的錯(cuò)誤復(fù)原情況。
在本發(fā)明在其中所實(shí)現(xiàn)分散服務(wù)系統(tǒng)的設(shè)計(jì)中采用了完全不同的方案。更具體地說(shuō),本分散服務(wù)系統(tǒng)可表征為一個(gè)“有狀態(tài)的實(shí)現(xiàn)”。這里所描述的一種“有狀態(tài)的“服務(wù)器保存有關(guān)誰(shuí)在使用其文件及這些文件正在如何被使用的信息。這便要求服務(wù)器有某種方法來(lái)檢測(cè)與一個(gè)顧客的失去聯(lián)系從而能將有關(guān)該顧客的累積狀態(tài)信息丟棄。這里所描述的高速緩沖存儲(chǔ)器管理策略除非服務(wù)器保存這些狀態(tài)信息是不能實(shí)現(xiàn)的。
可以先通過(guò)審視一個(gè)獨(dú)立系統(tǒng)如何訪問(wèn)文件來(lái)更好地了解在訪問(wèn)遠(yuǎn)程節(jié)點(diǎn)中所遇到的問(wèn)題。
在一個(gè)獨(dú)立系統(tǒng)中,例如圖2中所示的10,在永久性存儲(chǔ)器2(例如工作站中的一個(gè)硬文件或磁盤(pán))與用戶地址空間14之間的數(shù)據(jù)傳送是用操作系統(tǒng)11中的一個(gè)本地緩沖器12來(lái)緩沖存儲(chǔ)的。操作系統(tǒng)11中的本地緩沖器12也稱作本地高速緩沖存儲(chǔ)器或核心緩沖器。
在獨(dú)立系統(tǒng)中,核心緩沖器12被分成以設(shè)備號(hào)及該設(shè)備中的邏輯塊號(hào)標(biāo)識(shí)的塊15。在發(fā)布一個(gè)讀系統(tǒng)調(diào)用16時(shí),與其同時(shí)發(fā)布一個(gè)文件5的文件描述符及文件5中的一個(gè)字節(jié)范圍,如圖3中步驟101中所示。操作系統(tǒng)11取得這一信息並將其轉(zhuǎn)換成設(shè)備號(hào)與該設(shè)備中的邏輯塊號(hào),如圖3中步驟103所示。若該塊在高速緩沖存儲(chǔ)器中(步驟105)。在高速緩沖存儲(chǔ)器中並沒(méi)有在步驟103所尋找的塊的情況中,則在前進(jìn)至從高速緩沖存儲(chǔ)器中獲得數(shù)據(jù)的步驟105之前,先在步驟104將數(shù)據(jù)讀入高速緩沖存儲(chǔ)器中。
從磁盤(pán)2讀入的任何數(shù)據(jù)都保存在高速緩沖存儲(chǔ)器塊15之中直到該高速緩沖存儲(chǔ)器塊需要用于其它目的。從而,任何來(lái)自在處理系統(tǒng)10上運(yùn)行的一個(gè)應(yīng)用程序4的對(duì)于以前讀取的相同數(shù)據(jù)的接連的讀請(qǐng)求都是從高速緩沖存儲(chǔ)器12而不是磁盤(pán)2上讀取的。從高速緩沖存儲(chǔ)器上讀取運(yùn)比從磁盤(pán)上讀取節(jié)省時(shí)間。
同樣,從應(yīng)用程序4寫(xiě)入的數(shù)據(jù)並不立即存在磁盤(pán)2上而是寫(xiě)入高速緩沖存儲(chǔ)器12中。如果另一次寫(xiě)操作也是發(fā)布到同一塊的,這便節(jié)省了磁盤(pán)訪問(wèn)。在高速緩沖存儲(chǔ)器12中被修改過(guò)的塊周期性地存在磁盤(pán)2上。
在使用AIX操作系統(tǒng)的一個(gè)獨(dú)立系統(tǒng)采用高速緩沖存儲(chǔ)器提高系統(tǒng)的總體性能,由于對(duì)接連的讀與寫(xiě)消除了磁盤(pán)訪問(wèn)。因?yàn)樵L問(wèn)永久性存儲(chǔ)器比訪問(wèn)高速緩沖存儲(chǔ)器更慢更貴,所以總體性能得以增進(jìn)。
在一個(gè)分布式環(huán)境中,如圖1所示,在本地節(jié)點(diǎn)C上的處理系統(tǒng)10C有兩種方法可以從節(jié)點(diǎn)A讀文件5A。一種方法是處理系統(tǒng)10C將整個(gè)文件5A進(jìn)行復(fù)制,然后如同它是位于節(jié)點(diǎn)C的一個(gè)本地文件5C那樣去讀它。以這一方法讀一個(gè)文件導(dǎo)致這樣一個(gè)問(wèn)題,如果在另一節(jié)點(diǎn)A上的另一處理系統(tǒng)10A在文件5A已經(jīng)被作為文件5C復(fù)制到節(jié)點(diǎn)C以后修改文件5A。處理系統(tǒng)10C便不能訪問(wèn)對(duì)文件5A的這些最新的修改。
處理系統(tǒng)10C訪問(wèn)在節(jié)點(diǎn)A上的一個(gè)文件5A的另一種方法是當(dāng)節(jié)點(diǎn)C上的處理系統(tǒng)需要某一塊時(shí)每次只讀入一塊,例如N1。這種方法的一個(gè)問(wèn)題是每讀一次必須跨越網(wǎng)絡(luò)通信鏈路3到達(dá)文件所在的節(jié)點(diǎn)A。為每一次接連的讀取發(fā)送數(shù)據(jù)是費(fèi)時(shí)的。
跨越網(wǎng)絡(luò)訪問(wèn)文件提出了上述兩個(gè)挑戰(zhàn)性的問(wèn)題。一個(gè)問(wèn)題涉及為接連的讀和寫(xiě)跨越網(wǎng)絡(luò)傳輸數(shù)據(jù)所需的時(shí)間。另一方面,如果為了減少網(wǎng)絡(luò)通信量而將文件數(shù)據(jù)存儲(chǔ)在節(jié)點(diǎn)上,則可能失掉文件的完整性。例如,如果若干節(jié)點(diǎn)中的一個(gè)也寫(xiě)入該文件,則正在訪問(wèn)該文件的其它節(jié)點(diǎn)所訪問(wèn)的可能不是剛寫(xiě)入的最近更新的數(shù)據(jù)。這樣,由于一個(gè)節(jié)點(diǎn)可能訪問(wèn)不正確和過(guò)時(shí)了的文件而失去文件的完整性。
在以UNIX操作系統(tǒng)為基礎(chǔ)的操作系統(tǒng)中,沒(méi)有必要寫(xiě)入到文件中的每一個(gè)字節(jié)。例如,如果一個(gè)文件是10,000字節(jié),一個(gè)進(jìn)程可以寫(xiě)入一個(gè)文件的第一字節(jié)及該文件的第10,000個(gè)字節(jié),而不寫(xiě)入任何其它的字節(jié)。如果企圖讀取第10,001號(hào)字節(jié),這便超出了文件的結(jié)尾,而不能讀取。然而,如果企圖讀取的是第2至第9999字節(jié),它們並沒(méi)有超出文件的結(jié)尾。中間的這些字節(jié)從未寫(xiě)入過(guò),而且磁盤(pán)塊也從未分配給它們過(guò)。這是基于UNIX操作系統(tǒng)的文件系統(tǒng)的一個(gè)優(yōu)點(diǎn)。這些文件系統(tǒng)並不分配塊給未曾寫(xiě)入的字節(jié)。然而,如果一個(gè)進(jìn)程企圖讀取這些字節(jié),由于它們並未超過(guò)該文件的結(jié)尾,該進(jìn)程所得回的為邏輯零的字節(jié)。
所以,在本發(fā)明的較佳實(shí)施例中,一個(gè)進(jìn)程在能夠?qū)懭胱止?jié)以前,它必須在一個(gè)get-bytrs(取字節(jié))請(qǐng)求中請(qǐng)求這些字節(jié)。例如,假定一個(gè)進(jìn)程要寫(xiě)入一個(gè)字節(jié)。雖然該進(jìn)程可以只請(qǐng)求所要寫(xiě)入的這一字節(jié)或不同范圍的字節(jié),該進(jìn)程也可以請(qǐng)求4K范圍的字節(jié)。一旦該進(jìn)程接收到這一范圍的字節(jié),它便可寫(xiě)入在接收到的字節(jié)范圍內(nèi)的那些字節(jié)中的只一個(gè)字節(jié)。在本例中使用了4K范圍的字節(jié),因?yàn)橐粋€(gè)顧客數(shù)據(jù)處理系統(tǒng)在一頁(yè)的級(jí)別基礎(chǔ)上管理其數(shù)據(jù),一頁(yè)大約為4K字節(jié)。
然而,寫(xiě)入的最常見(jiàn)情況是當(dāng)一個(gè)進(jìn)程寫(xiě)入一個(gè)沒(méi)有數(shù)據(jù)存在的新文件。在這一情況中,一個(gè)進(jìn)程從新文件的開(kāi)頭開(kāi)始寫(xiě)一直寫(xiě)到文件的結(jié)尾。所以,一個(gè)進(jìn)程經(jīng)常寫(xiě)入一個(gè)文件中以前並不存在的部分。在以前的系統(tǒng)中,在能夠進(jìn)行這種寫(xiě)入以前,在顧客處理系統(tǒng)中運(yùn)行的一個(gè)進(jìn)程必須跨越網(wǎng)絡(luò)並申請(qǐng)一整頁(yè)字節(jié)。一旦該字節(jié)已經(jīng)寫(xiě)入后,可以申請(qǐng)下一頁(yè)字節(jié)。然而,這造成在顧客數(shù)據(jù)處理系統(tǒng)與服務(wù)器數(shù)據(jù)處理系統(tǒng)之間大量的網(wǎng)絡(luò)通信量,其目的只是為了取得一塊含有邏輯零的字節(jié)。
在一個(gè)分散數(shù)據(jù)處理系統(tǒng)中,數(shù)據(jù)能被多個(gè)節(jié)點(diǎn)訪問(wèn)。在本發(fā)明中,數(shù)據(jù)被這一數(shù)據(jù)處理系統(tǒng)中稱作服務(wù)器的一個(gè)節(jié)點(diǎn)所控制。訪問(wèn)該數(shù)據(jù)的其它節(jié)點(diǎn)稱作顧客。顧客向服務(wù)器發(fā)送一個(gè)請(qǐng)求以得到對(duì)數(shù)據(jù)的訪問(wèn)。服務(wù)器將該數(shù)據(jù)返回給請(qǐng)求訪問(wèn)數(shù)據(jù)的顧客。該顧客便可以讀與/或修改所請(qǐng)求的數(shù)據(jù)。當(dāng)多個(gè)顧客對(duì)該數(shù)據(jù)有興趣時(shí),服務(wù)器節(jié)點(diǎn)必須對(duì)數(shù)據(jù)的訪問(wèn)進(jìn)行同步使之保持一致。服務(wù)器節(jié)點(diǎn)以下述方法做到這一點(diǎn)在任何給定的時(shí)間,保證一個(gè)節(jié)點(diǎn)能夠進(jìn)行修改訪問(wèn)的各部分?jǐn)?shù)據(jù)不得被任何其它節(jié)點(diǎn)進(jìn)行讀或修改訪問(wèn),而允許只能進(jìn)行讀訪問(wèn)的數(shù)據(jù)部分可以被任何數(shù)目的節(jié)點(diǎn)所訪問(wèn)。
為了執(zhí)行這一同步性,要求寫(xiě)入一個(gè)文件的某些部分或擴(kuò)充一個(gè)文件的顧客必須首先向服務(wù)器請(qǐng)求對(duì)包括所要修改的那些字節(jié)在內(nèi)的一個(gè)范圍的字節(jié)的寫(xiě)訪問(wèn),顧客通過(guò)一個(gè)對(duì)服務(wù)器的get,bytes(取字節(jié))報(bào)文請(qǐng)求一個(gè)范圍的字節(jié)。服務(wù)器則以所請(qǐng)求的字節(jié)答復(fù)這一請(qǐng)求。然后,顧客便可以修改這些字節(jié)了。然而,在某些情況中,如果一位不同的顧客提出了一個(gè)互相沖突的請(qǐng)求,為了同步若干個(gè)顧客對(duì)該范圍字節(jié)的訪問(wèn),服務(wù)器可能有必要收回早先已經(jīng)分配給一個(gè)顧客的數(shù)據(jù)。服務(wù)器通過(guò)從服務(wù)器發(fā)往顧客的一個(gè)revoke-bytes(收回字節(jié))報(bào)文收回一個(gè)范圍的字節(jié)。
雖然大多數(shù)對(duì)文件的寫(xiě)入是在文件的結(jié)尾處新分配的只包含零的各個(gè)新塊上進(jìn)行的,但在更廣義的情況中,當(dāng)一個(gè)進(jìn)程寫(xiě)或存入一個(gè)遠(yuǎn)程文件的一個(gè)塊中時(shí),在可以進(jìn)行寫(xiě)或存入以前塊必須從文件服務(wù)器得來(lái)。為了減輕常用機(jī)制的費(fèi)用,本發(fā)明優(yōu)化了一個(gè)重要的特殊情況寫(xiě)或存入早先不在文件中的塊。這樣便減少了在已存在的文件后面增加新塊和建立新文件的費(fèi)用。
如果一個(gè)顧客知道文件中的一個(gè)塊是一個(gè)新塊,尚不在文件中的一個(gè)塊,他便能建立一個(gè)全零的塊并使用它而不接觸服務(wù)器。這便可省去一次取字節(jié)(get-bytes)請(qǐng)求的費(fèi)用,但這也可能在一個(gè)顧客處建立一個(gè)塊而在文件的服務(wù)器上並未分配一個(gè)對(duì)應(yīng)的磁盤(pán)塊。為了避免顧客超負(fù)荷使用服務(wù)器資源以及由于在兩處建立同一個(gè)塊而相互干擾,服務(wù)器維護(hù)分配新的頁(yè)的控制。
服務(wù)器除了發(fā)送實(shí)際字節(jié)以外也向顧客發(fā)送新生的零以管理新文件塊的分布式分配。當(dāng)一個(gè)服務(wù)器回答一個(gè)get-bytes請(qǐng)求時(shí),它可以選擇性地返回一個(gè)未經(jīng)請(qǐng)求的范圍的新生零。新生零是新的邏輯零的字節(jié),它們尚未包含在文件之中。所返回的新生零的范圍一般大于所請(qǐng)求的字節(jié)的范圍。新生零是從未存儲(chǔ)或?qū)懭脒^(guò)的,並且可能在文件的當(dāng)前范圍之外。和來(lái)自文件的實(shí)際字節(jié)一樣,一個(gè)范圍的新生零被發(fā)送給一個(gè)顧客只有當(dāng)沒(méi)有其它顧客具有任何復(fù)蓋該范圍的數(shù)據(jù)(實(shí)際的或新生的)時(shí)才能對(duì)它們進(jìn)行寫(xiě)入。和實(shí)際字節(jié)一樣,新生零可以被服務(wù)器用一則收回(reroke-bytes)報(bào)文收回。
本發(fā)明允許一個(gè)進(jìn)程每二次向服務(wù)器數(shù)據(jù)處理系統(tǒng)請(qǐng)求字節(jié)時(shí),該服務(wù)器不但送回所請(qǐng)求的字節(jié),并且服務(wù)器也可以送回包含從未寫(xiě)入過(guò)數(shù)據(jù)的一個(gè)額外范圍的字節(jié)。這種數(shù)據(jù)在這里將被稱作新生零。當(dāng)服務(wù)器判定顧客可能要寫(xiě)入這些額外字節(jié)時(shí),它便送回這一額外范圍的字節(jié)。該服務(wù)器給該顧客以寫(xiě)入這一較顧客原來(lái)請(qǐng)求的更大范圍的字節(jié)的許可。
這一點(diǎn)很重要是服務(wù)器管理這一額外范圍的字節(jié)而不是顧客可以自作主張地寫(xiě)入一個(gè)早先從末寫(xiě)入過(guò)的范圍的字節(jié)。由于服務(wù)器具有對(duì)可利用的物理存儲(chǔ)器容量的控制,服務(wù)器是給予顧客寫(xiě)入這一額外范圍的字節(jié)的許可者這一點(diǎn)是重要的。服務(wù)器必須保證當(dāng)文件被關(guān)閉與數(shù)據(jù)被返回時(shí),服務(wù)器有足夠的空間來(lái)存儲(chǔ)這些額外的數(shù)據(jù),所以,在服務(wù)器向一個(gè)顧客給出一個(gè)范圍的新生零時(shí),它必須肯定如果顧客決定寫(xiě)入這一額外范圍時(shí),已經(jīng)為它保留了磁盤(pán)空間。
然而,一個(gè)顧客可以決定不寫(xiě)入這一額外范圍。在這一情況中,服務(wù)器仍然保留磁盤(pán)空間。服務(wù)器在顧客關(guān)閉該文件時(shí)確定是否已經(jīng)寫(xiě)入了這一額外范圍的字節(jié)的。如果顧客末普寫(xiě)入這一額外范圍的新生零,該服務(wù)器可以釋放這一磁盤(pán)空間。服務(wù)器只在顧客有可能寫(xiě)入這些字節(jié)時(shí)保持該磁盤(pán)空間。
與本發(fā)明的較佳實(shí)施例相連,服務(wù)器可能有必要收回早先已經(jīng)給予一個(gè)顧客的新生零范圍的字節(jié),這是由于另一個(gè)顧客可能請(qǐng)求這一額外范圍的字節(jié)。所以,服務(wù)器不但能收回顧客請(qǐng)求的范圍的字節(jié),也能收回它給予顧客的額外范圍的新生零字節(jié),即使顧客并未專門(mén)請(qǐng)求它們。
本發(fā)明的某些優(yōu)點(diǎn)如下。一個(gè)服務(wù)器不但可以返回正好在一個(gè)文件結(jié)尾處開(kāi)始的一個(gè)范圍的新生零,而且可以返回文件中間早先曾寫(xiě)入的過(guò)的任何范圍的字節(jié)。例如,一個(gè)顧客可以請(qǐng)求在文件中間的一個(gè)范圍的字節(jié)。如果服務(wù)器確定存在著一個(gè)范圍的新生零鄰接于顧客正在請(qǐng)求的該范圍,服務(wù)器也有權(quán)迭將這一額外范圍的新生零給于顧客。
另一個(gè)優(yōu)點(diǎn)示出在下述例子中。一個(gè)顧客可能請(qǐng)求表示文件最后一塊的一個(gè)范圍的字節(jié)。服務(wù)器返回的可能不止這一最后一塊字節(jié),而還有任何數(shù)目的額外頁(yè)的新生零。為了示例的目的,假定服務(wù)器返回了4個(gè)額外的頁(yè)。當(dāng)顧客寫(xiě)完了這一最后一塊字節(jié)與額外的四頁(yè)新生零以后,該顧客可回到服務(wù)器並請(qǐng)求另一塊字節(jié)。然后,服務(wù)器可以返回給顧客不止他所請(qǐng)求的下一塊字節(jié),而同樣還有額外的四頁(yè)新生零。在這一情況中,由于顧客每5次請(qǐng)求字節(jié)塊回到服務(wù)器一次而不是每一塊回到服務(wù)器一次,從而減少了網(wǎng)絡(luò)通信量。
作為本發(fā)明的成果,擴(kuò)充一個(gè)文件時(shí)不需要特定的協(xié)議。服務(wù)器以向顧客提供額外范圍的新生零來(lái)自動(dòng)地完成文件擴(kuò)充。對(duì)于每一次get-bytes請(qǐng)求,服務(wù)器可以選擇返回額外范圍的新生零的字節(jié)。
根據(jù)協(xié)議的這一特點(diǎn),一個(gè)服務(wù)器並不需要返回新生零。所以在設(shè)計(jì)這一處理請(qǐng)求新生零的協(xié)議時(shí)不需要額外的報(bào)文。因此,服務(wù)器沒(méi)有必要拘泥于要求返回新生零的協(xié)議。所以,設(shè)計(jì)成返回新生零的一個(gè)服務(wù)器仍然可以在其它服務(wù)器不是設(shè)計(jì)為可以有選擇地返回新生零的一個(gè)分散數(shù)據(jù)處理系統(tǒng)中工作。同樣,一個(gè)顧客也並不是非使用返回的新生零不可。一個(gè)顧客有權(quán)選擇不使用這一額外范圍的新生零而每次需要一個(gè)范圍的字節(jié)都回到該服務(wù)器。所以,知道這些返回的新生零並能夠?qū)λ鼈冞M(jìn)行寫(xiě)入的一個(gè)顧客與不知道這一額外范圍的新生零的其他顧客可以在同一個(gè)分散數(shù)據(jù)處理系統(tǒng)中工作。以這種方式,高性能的服務(wù)器仍然能在一個(gè)分散數(shù)據(jù)處理系統(tǒng)中與低功能顧客進(jìn)行通信,反之亦然。這便消除了對(duì)服務(wù)器與顧客之間在進(jìn)行通信時(shí)需要什么級(jí)上的支持進(jìn)行協(xié)商的要求。
不是由顧客決定他所請(qǐng)求的需要量與服務(wù)器響應(yīng)這一請(qǐng)求,而是由服務(wù)器作出決定是否要把這些額外范圍的新生零字節(jié)交給顧客。例如,如果若干顧客正在寫(xiě)入文件的結(jié)尾處,服務(wù)器可能認(rèn)為revoke-bytes報(bào)文通信量太高了。在這種情況下,服務(wù)器可以決定不給出額外范圍的新生零。此外,服務(wù)器可能確定磁盤(pán)已接近其容量。在這一情況下,服務(wù)器可以決定不再給出任何新生零范圍以節(jié)省磁盤(pán)上的空間。反之,如果磁盤(pán)上剩有大量空間,服務(wù)器能夠向顧客提供大范圍的新生零而不致構(gòu)成某些顧客會(huì)沒(méi)有足夠磁盤(pán)空間的危險(xiǎn)。
附圖的簡(jiǎn)要說(shuō)明圖1是本技術(shù)中已知的分散數(shù)據(jù)處理系統(tǒng)的方框圖。
圖2是表示本技術(shù)中用于通過(guò)系統(tǒng)調(diào)用訪問(wèn)一個(gè)文件的一個(gè)獨(dú)立數(shù)據(jù)處理系統(tǒng)的方框圖。
圖3是圖2中通過(guò)系統(tǒng)調(diào)用訪問(wèn)一個(gè)文件的數(shù)據(jù)處理系統(tǒng)的流程圖。
圖4A為通知服務(wù)器對(duì)文件進(jìn)行一個(gè)關(guān)閉操作的一則Close(關(guān)閉)報(bào)文的數(shù)據(jù)結(jié)構(gòu)。
圖4B為從一個(gè)文件請(qǐng)求數(shù)據(jù)字節(jié)的一則glf-bytes(取字節(jié))報(bào)文的數(shù)據(jù)結(jié)構(gòu)。
圖4C為從顧客數(shù)據(jù)處理系統(tǒng)向服務(wù)器數(shù)據(jù)處理系統(tǒng)送回經(jīng)過(guò)修改的字節(jié)的Put-bytes(置字節(jié))報(bào)文的數(shù)據(jù)結(jié)構(gòu)。
圖4D為收回先前答復(fù)一則get-bytes報(bào)文而送出的字節(jié)的revoke-bytes(收回字節(jié))報(bào)文的數(shù)據(jù)結(jié)構(gòu)。
圖5示出本發(fā)明的分散數(shù)據(jù)處理系統(tǒng)中的一個(gè)顧客數(shù)據(jù)處理系統(tǒng)與一個(gè)服務(wù)器數(shù)據(jù)處理系統(tǒng)。
圖6為表示二個(gè)顧客與一個(gè)服務(wù)器之間的節(jié)點(diǎn)間報(bào)文流的一個(gè)流程圖用于展示在響應(yīng)來(lái)自顧客的通過(guò)get-bytes、revoke-bytes、與Put-bytes請(qǐng)求訪問(wèn)文件中的字節(jié)時(shí)服務(wù)器的操作。
圖7A為示出在一個(gè)服務(wù)器上對(duì)get-bytes請(qǐng)求的操作的一個(gè)流程7B為展示響應(yīng)訪問(wèn)一個(gè)文件中的字節(jié)的一個(gè)請(qǐng)求選擇發(fā)送給一個(gè)顧客新生零的一個(gè)流程圖。
較佳實(shí)施例的說(shuō)明在一個(gè)分散數(shù)據(jù)處理系統(tǒng)中,存在著可以訪問(wèn)共享數(shù)據(jù)的多個(gè)節(jié)點(diǎn)。本發(fā)明以這一分散數(shù)據(jù)處理系統(tǒng)中的多個(gè)節(jié)點(diǎn)管理對(duì)文件的訪問(wèn)。該文件是物理上存儲(chǔ)在一個(gè)稱作服務(wù)器的節(jié)點(diǎn)上的。服務(wù)器是長(zhǎng)期存儲(chǔ)該文件的處理系統(tǒng)。以一個(gè)通信網(wǎng)絡(luò)連接到該服務(wù)器的其它節(jié)點(diǎn)也能訪問(wèn)這一文件。在這些情況中這些節(jié)點(diǎn)稱為顧客。任何節(jié)點(diǎn)對(duì)某些文件可以是一個(gè)服務(wù)器,而對(duì)其它文件則為一個(gè)顧客。一個(gè)節(jié)點(diǎn)可以同時(shí)以兩種能力工作;作為顧客訪問(wèn)遠(yuǎn)程文件而作為服務(wù)器向其它節(jié)點(diǎn)提供服務(wù)。
一個(gè)節(jié)點(diǎn)作為一個(gè)顧客的操作與該節(jié)點(diǎn)作為一個(gè)服務(wù)器的操作是互相獨(dú)立的。所以,這兩種操作將分開(kāi)說(shuō)明,盡管這兩種操作有可能并發(fā)發(fā)生。
參照?qǐng)D4A-4D,對(duì)這里所使用的節(jié)點(diǎn)間報(bào)文進(jìn)行說(shuō)明。
圖4A示出了顧客用于通知服務(wù)器進(jìn)行關(guān)閉操作的關(guān)閉報(bào)文410。修改計(jì)數(shù)411是反映顧客處修改的一個(gè)值。訪問(wèn)計(jì)數(shù)412是反映顧客處訪問(wèn)的一個(gè)值。
圖4B示出向一個(gè)文件請(qǐng)求數(shù)據(jù)字節(jié)的get-bytes報(bào)文440。位移量441是標(biāo)記所請(qǐng)求的數(shù)據(jù)的起始位置的文件中的位移量。長(zhǎng)度442是所請(qǐng)求的字節(jié)數(shù)。讀/寫(xiě)標(biāo)志443用于表示該顧客正在請(qǐng)求數(shù)據(jù)的一份只讀付本或者數(shù)據(jù)的一份可寫(xiě)付本。如果顧客只從字節(jié)范圍中讀取,則rw-flag(讀/寫(xiě)標(biāo)志)的允許值為0×0000,如果顧客可以修改該字節(jié)則為0×0001。服務(wù)器只只有當(dāng)用戶以相客的方式早先已打開(kāi)而尚未關(guān)閉該文件時(shí)才執(zhí)行該get-bytes操作。如果rw-flag443為只讀,則顧客必須已將文件打開(kāi)。如果rw-flag443為讀寫(xiě),則顧客必須將文件打開(kāi)用于寫(xiě)入。
在對(duì)get-bytes報(bào)文440的答復(fù)中,nz-offsef(新生位移量)444為所請(qǐng)求字節(jié)而有新生零的文件中的位移量。只有當(dāng)域nz-lengfh(新生零長(zhǎng)度)大于零時(shí)nz-offset域才有意義。域nz-lengfh445為服務(wù)器選定返回給請(qǐng)求者的起始于位移量nz-offsef444的新生零字節(jié)數(shù)。服務(wù)器可以永遠(yuǎn)選擇不進(jìn)行任何新生零處理以在此域中返回零來(lái)表明這一點(diǎn)。Lengfh(長(zhǎng)度)446是返回的數(shù)據(jù)的長(zhǎng)度。Dafa(數(shù)據(jù))447是所請(qǐng)求的實(shí)際數(shù)據(jù)字節(jié)。
圖4C示出了Put-byfes報(bào)文460。顧客以Puf-byfes報(bào)文460將經(jīng)過(guò)修改的數(shù)據(jù)返回給服務(wù)器。服務(wù)器只對(duì)顧客早先已經(jīng)打開(kāi)而尚未關(guān)閉的用于寫(xiě)入的文件執(zhí)行Puf-bytes操作。offsef(位移量)461是長(zhǎng)度462的數(shù)據(jù)字節(jié)463應(yīng)當(dāng)放置的在文件中的位移量。
圖4D示出了revoke-byfes(收回字節(jié))報(bào)文470。這一報(bào)文是文件服務(wù)器發(fā)送給一個(gè)顧客用于收回早先答復(fù)一則get-byfes報(bào)文440而給于該顧客的字節(jié)。該顧客在沒(méi)有拋棄所有干凈(未改動(dòng))的高速緩沖存儲(chǔ)器中的數(shù)據(jù)及新生零並將所有臟(改動(dòng)過(guò))的數(shù)據(jù)寫(xiě)入服務(wù)器和收到答復(fù)以前,並不為由位移量471與長(zhǎng)度472所指明的字節(jié)范圍發(fā)送答復(fù)。當(dāng)顧客發(fā)送答復(fù)時(shí),在收回的字節(jié)范圍內(nèi)必須已經(jīng)沒(méi)有高速緩沖存儲(chǔ)的數(shù)據(jù)。這一報(bào)文收回顧客使用落在該收回范圍內(nèi)的任何早先返回的新生零的權(quán)利。在一個(gè)revoke-byfes請(qǐng)求被處理時(shí)未付的所有收回字節(jié)范圍內(nèi)的數(shù)據(jù)或新生零在它們到達(dá)時(shí)都必須拋棄,這一收回的字節(jié)范圍是從get-bytes請(qǐng)求返回的。顧客可以選擇收回一個(gè)比所請(qǐng)求的更大的字節(jié)范圍,或者他可以確定在比所請(qǐng)求的范圍更大的范圍內(nèi)沒(méi)有什么可以收回的。在這些情況中,reply-offset(答復(fù)位移量)473與reply-length(答復(fù)長(zhǎng)度)474指明該顧客沒(méi)有高速緩沖存儲(chǔ)頁(yè)的一個(gè)范圍。答復(fù)位移量473與答復(fù)長(zhǎng)度474必須至少包括由位移量471與長(zhǎng)度472所指明的范圍。
結(jié)合圖4A-4D參照?qǐng)D6,當(dāng)一個(gè)顧客要求訪問(wèn)一個(gè)文件中的數(shù)據(jù)時(shí),該用戶向文件服務(wù)器發(fā)送一則稱為get-bytes請(qǐng)求或報(bào)文的請(qǐng)求,步驟601,602。一則get-bytes請(qǐng)求除了其它項(xiàng)目以外,還指定這一顧客有興趣訪問(wèn)的字節(jié)范圍441,442(圖4B)。get-byfes請(qǐng)求440是顧客向服務(wù)器發(fā)送的。畢備就緒時(shí),該服務(wù)器將在這一范圍內(nèi)的數(shù)據(jù)送回給提出請(qǐng)求的顧客作為對(duì)這一get-bytes請(qǐng)求的答復(fù),步驟603,604。這一get-bytes答復(fù)使顧客能夠訪問(wèn)這些數(shù)據(jù)。
當(dāng)一個(gè)服務(wù)器在前面已經(jīng)滿足了一個(gè)get-bytes請(qǐng)求,步驟603,以后又到達(dá)了一個(gè)get-bytes請(qǐng)求440,步驟605,606,的情況下,服務(wù)器可能有必要收回早先已發(fā)送給其它顧客的字節(jié),步驟607。字節(jié)是以一則revoke-bytes報(bào)文470收回的,圖4D。Revoke-bytes報(bào)文470是由服務(wù)器發(fā)送到顧客機(jī)器的。顧客必須以送回在被收回的字節(jié)范圍內(nèi)任何被改變了的數(shù)據(jù)以響應(yīng)一則revoke-bytes請(qǐng)求。顧客也必須拋棄這一范圍內(nèi)的任何未曾改變的數(shù)據(jù)。
顧客用Put-bytes報(bào)文460,圖4C,將修改過(guò)的數(shù)據(jù)送回給服務(wù)器,步驟609,圖6。和get-bytes報(bào)文及revoke-bytes報(bào)文一樣,這一報(bào)文有一則由接收者送回發(fā)送者的答復(fù),步驟611。在所有這三種情況中的答復(fù)都是通知發(fā)送者他所指定的接收者已經(jīng)收到了報(bào)文並對(duì)之進(jìn)行操作。注意,在答復(fù)get-bytes請(qǐng)求中的數(shù)據(jù)447,圖4B,實(shí)際上從服務(wù)器轉(zhuǎn)移到顧客,而在Put-bytes報(bào)文中,463,圖4C則是從顧客轉(zhuǎn)移到服務(wù)器。
一種一個(gè)服務(wù)器必須發(fā)出一則revoke-bytes請(qǐng)求的情況,步驟607,發(fā)生在來(lái)自一個(gè)顧客的一則要求寫(xiě)訪問(wèn)這一范圍的字節(jié)的get-bytes請(qǐng)求到達(dá)一個(gè)服務(wù)器時(shí),步驟606。該服務(wù)器必須收回在這一范圍內(nèi)的早先已發(fā)送給顧客而尚未收回的所有字節(jié)。一個(gè)顧客每次發(fā)出一則get-bytes請(qǐng)求,服務(wù)器保存它已經(jīng)發(fā)給這一顧客的get-bytes答復(fù)(圖5)的一個(gè)記錄。以這種方法,服務(wù)器能夠記載屬于一個(gè)文件的已經(jīng)給出給顧客節(jié)點(diǎn)的所有數(shù)據(jù)付本。當(dāng)來(lái)自顧客的一則請(qǐng)求寫(xiě)入這些字節(jié)的get-bytes請(qǐng)求到達(dá)時(shí),服務(wù)器檢查它的記錄確認(rèn)當(dāng)前沒(méi)有其他顧客提取這些相同的字節(jié)在讀或?qū)?。如果有其他顧客提取這些字節(jié),服務(wù)器首先向提取這些字節(jié)的這些顧客中的每一個(gè)發(fā)送一則revoke-bytes報(bào)文來(lái)收回這些字節(jié)。在這些字節(jié)可能已被修改的情況下,這些顧客用Put-bytes報(bào)文將這些字節(jié)送回給服務(wù)器,而對(duì)沒(méi)有被修改過(guò)的字節(jié)則顧客們將它們拋棄。然而,在所有情況中,字節(jié)已經(jīng)被收回后,顧客不再對(duì)這些字節(jié)有訪問(wèn)權(quán)了。在接收到Pnt-bytes答復(fù)以后,步驟612,顧客便得知返回的數(shù)據(jù)已被服務(wù)器收到,然后該顧客答復(fù)該revoke-bytes請(qǐng)求,步驟613。
當(dāng)服務(wù)器接收到revoke-bytes答復(fù)時(shí),步驟614,(在接收到由收回所觸發(fā)的任何Put-bytes報(bào)文之后),現(xiàn)在服務(wù)器可以在get-bytes答復(fù)中將這些字節(jié)送給提出請(qǐng)求的顧客以響應(yīng)寫(xiě)入的get-bytes請(qǐng)求了,給該顧客修改這些字節(jié)的許可,步驟615,616。這樣,一個(gè)文件中的數(shù)據(jù)上在一個(gè)地方被修改。如果該數(shù)據(jù)正在被修改,沒(méi)有其他顧客能訪問(wèn)這一范圍的數(shù)據(jù)。這便保證了在顧客重新得到對(duì)這些數(shù)據(jù)的訪問(wèn)權(quán)利,這些顧客將見(jiàn)到所有接連的寫(xiě)操作結(jié)束后的數(shù)據(jù)。這提供了串行地訪問(wèn)數(shù)據(jù)的效果。
重要的規(guī)定是對(duì)于文件中的任何字節(jié),只有一臺(tái)機(jī)器能夠?qū)@一字節(jié)進(jìn)行寫(xiě),而任何數(shù)量的機(jī)器可以提取該字節(jié)用于讀。在本較佳實(shí)施例中,字節(jié)不是在單個(gè)的基礎(chǔ)上被跟蹤的。反之,所跟蹤的是被顧客所請(qǐng)求的字節(jié)范圍。在本較佳實(shí)施例中,對(duì)于任何范圍的字節(jié)只有一個(gè)顧客能夠用寫(xiě)訪問(wèn)訪問(wèn)該范圍的字節(jié)。
本發(fā)明的系統(tǒng)與方法控制機(jī)器怎樣可以高效地?cái)U(kuò)充文件及寫(xiě)入文件中原先沒(méi)有數(shù)據(jù)的區(qū)域。所希望的是最小化在顧客與服務(wù)器之間的報(bào)文往返次數(shù)。最小化一個(gè)顧客超額使用服務(wù)器所管理的磁盤(pán)空間的可能性也是所希望的。
雖然絕大多數(shù)對(duì)文件的寫(xiě)入是在文件的結(jié)尾處新分配的並只含零的字節(jié)的各新塊上進(jìn)行的,在最普遍的情況中,當(dāng)一個(gè)進(jìn)程寫(xiě)或存儲(chǔ)進(jìn)一個(gè)遠(yuǎn)程文件的一塊中時(shí),在能夠進(jìn)行寫(xiě)或存儲(chǔ)以前該塊必須從文件服務(wù)器得來(lái)。為了減輕這一普遍機(jī)制的費(fèi)用,本發(fā)明優(yōu)化了一個(gè)重要的特殊情況寫(xiě)或存儲(chǔ)進(jìn)原先不在文件中的塊中。這減少了附加在已有文件的后面及建立新文件的費(fèi)用。
如果一個(gè)顧客知道文件中的一塊是一個(gè)新的塊,文件中還不存在的一個(gè)塊,他可以不接觸服務(wù)器而建立一個(gè)全零的塊並使用該塊。這可以避免一則get-bytes請(qǐng)求的費(fèi)用,但這也可能造成在一個(gè)顧客處建立一個(gè)塊而並沒(méi)有在文件服務(wù)器上分配一個(gè)對(duì)應(yīng)的磁盤(pán)塊。為了不使顧客超量使用服務(wù)器資源及防止由于在兩處建立同一塊而互相干擾,服務(wù)器維護(hù)對(duì)新頁(yè)分配的控制。
服務(wù)器以發(fā)送附加在實(shí)際字節(jié)上的新生零給顧客來(lái)管理新文件塊的分布式分配。當(dāng)一個(gè)服務(wù)器答復(fù)一則get-byes請(qǐng)求時(shí),它可以有選擇地返回一個(gè)未曾請(qǐng)求的范圍的新生零。新生零是新的,邏輯上為零的字節(jié),這些字節(jié)尚未包含在文件中。返回的新生零的范圍通常大于所請(qǐng)求的字節(jié)的范圍。新生零是從未存儲(chǔ)或?qū)懭脒^(guò)的,並可以超出文件的當(dāng)前范圍。和來(lái)自文件的實(shí)際字節(jié)一樣,只有當(dāng)沒(méi)有其它顧客的任何數(shù)據(jù)(實(shí)際的或新生的)復(fù)蓋該范圍時(shí),才能將一個(gè)范圍的新生零發(fā)送給顧客而使顧客可以寫(xiě)入這些新生零中。和實(shí)際字節(jié)一樣,新生零可以被服務(wù)器用revoke-bytes報(bào)文收回。
顧客機(jī)器從不明顯地請(qǐng)求新生零。反之,只有當(dāng)服務(wù)器答復(fù)一則get-bytes請(qǐng)求時(shí),顧客才能從服務(wù)器接收未曾請(qǐng)求的新生零。這意味著服務(wù)器並不一定非返回新生零給顧客不可;一種簡(jiǎn)單的服務(wù)器實(shí)現(xiàn)可以正確地進(jìn)行工作而從來(lái)不給出新生零。然而,這樣一種實(shí)現(xiàn)將不如一種使用新生零的實(shí)現(xiàn)那樣高效地支持顧客。當(dāng)新生零被分配給顧客構(gòu)器時(shí),它們必須像已經(jīng)給出的實(shí)際字節(jié)那樣受到跟蹤。如果一個(gè)顧客請(qǐng)求的一個(gè)范圍的字節(jié)復(fù)蓋已經(jīng)以互相沖突的方式(即,讀訪問(wèn)對(duì)寫(xiě)訪問(wèn))給予另一顧客的實(shí)際字節(jié)或者新生零,則服務(wù)器必須收回實(shí)際字節(jié)以及新生零。由于revoke-bytes請(qǐng)求收回一個(gè)指定范圍內(nèi)的實(shí)際字節(jié)以及新生零,服務(wù)器只須向每一持有該字節(jié)或零的顧客發(fā)送一則報(bào)文即可。服務(wù)器能夠簡(jiǎn)單地從具有一個(gè)文件中的任何實(shí)際字節(jié)或新生零的各顧客收回該文件的所有字節(jié)和新生零來(lái)統(tǒng)計(jì)已經(jīng)給出的字節(jié)和零。一個(gè)服務(wù)器只須記住哪些顧客有任何字節(jié)或零而無(wú)須關(guān)心已經(jīng)把哪些字節(jié)和新生零給了什么顧客來(lái)完成這一工作。更精巧的服務(wù)器能以更精細(xì)的份量來(lái)為字節(jié)和新生零保管信息從而在它們的顧客中支持更高的并發(fā)性。
參照?qǐng)D5,顧客501通過(guò)通信鏈路514向服務(wù)器502送一個(gè)取字節(jié)請(qǐng)求,請(qǐng)求存儲(chǔ)在服務(wù)器的磁盤(pán)512上的一個(gè)文件513以便從該文件中獲得字節(jié)並將它們放置在顧客的高速緩沖存儲(chǔ)器503中。在服務(wù)器上處理該get-bytes請(qǐng)求時(shí)查閱顧客清單515。顧客清單是以查閱該文件的內(nèi)節(jié)點(diǎn)(inode)結(jié)構(gòu)504來(lái)定位的。每一個(gè)使用中的文件都會(huì)有一個(gè)內(nèi)節(jié)點(diǎn)結(jié)構(gòu)。正在被顧客機(jī)器使用的文件的內(nèi)節(jié)點(diǎn)結(jié)構(gòu)包含一個(gè)鏈接即指針505指向該文件的顧客清單515的起始位置。這一指針指向第一顧客清單入口508,而該入口依次又可能包含一個(gè)指針506指向顧客清單上的下一個(gè)入口。顧客清單上的最后一個(gè)入口包含一個(gè)空值的指針507表示該顧客清單上沒(méi)有更多入口了。每一個(gè)入口508有三個(gè)部分。第一部分509標(biāo)識(shí)該遠(yuǎn)程顧客節(jié)點(diǎn)。第二部分510標(biāo)識(shí)已經(jīng)發(fā)送給該顧客而尚未收回的所有字節(jié)范圍以及指明這些字節(jié)范圍中的每一個(gè)是否已經(jīng)授予該顧客修改該范圍的許可的一個(gè)標(biāo)志。同樣,部分511標(biāo)識(shí)已經(jīng)給予該顧客的所有范圍的新生零。每一個(gè)使用該文件的遠(yuǎn)程顧客在顧客清單上都有一個(gè)入口508。
參見(jiàn)圖7A,在服務(wù)器上的一則get-bytes請(qǐng)求的處理開(kāi)始于步驟701。在步驟702,查閱顧客清單並定位顧客清單上的第一個(gè)入口。如果這一當(dāng)前顧客清單入口便是get-bytes請(qǐng)求中請(qǐng)求字節(jié)的同一顧客的入口,則對(duì)顧客清單中這一入口的進(jìn)一步處理是沒(méi)有必要的,下一步便執(zhí)行步驟710。否則,在步驟704繼續(xù)進(jìn)行處理,在該步驟中檢驗(yàn)當(dāng)前get-bytes請(qǐng)求的性質(zhì)。如果所請(qǐng)求的是對(duì)它們進(jìn)行修改的許可,則在步驟705處繼續(xù)處理。否則,在步驟706繼續(xù)處理,在該步驟中檢驗(yàn)當(dāng)前顧客清單入口。如果該顧客清單入口表示該入口的顧客在當(dāng)前取字節(jié)請(qǐng)求的范圍內(nèi)接收到過(guò)許可入或新生零的字節(jié),則處理繼續(xù)到步驟707。否則,對(duì)這一顧客清單入口沒(méi)有進(jìn)一步處理的必要而處理繼續(xù)到步驟710。在步驟705中,檢驗(yàn)當(dāng)前顧客清單入口,如果在所請(qǐng)求的字節(jié)范圍內(nèi)有已經(jīng)發(fā)送給該入口的顧客而尚未收回的任何字節(jié),則處理維續(xù)到步驟707。否則,這一入口沒(méi)有必要進(jìn)行進(jìn)一步的處理,而以步驟710繼續(xù)處理。在步驟707,這是在必須從顧客清單入口中指明的顧客收回字節(jié)的情況中到達(dá)這一步驟的,將一則revoke-bytes報(bào)文發(fā)送給當(dāng)前清單入口中指明的顧客收回對(duì)應(yīng)于get-bytes請(qǐng)求中所請(qǐng)求的一個(gè)范圍的字節(jié)。處理繼續(xù)到步驟708,在該步驟中等待對(duì)revoke-bytes報(bào)文的答復(fù)。在步驟709,更新顧客清單入口以反映該范圍的字節(jié)被收回這一事實(shí)。然后處理繼續(xù)步驟710。在步驟710,對(duì)該顧客清單入口進(jìn)行檢驗(yàn)以確定它是否是該顧客清單中最后一個(gè)入口。如果不是,則在步驟711,該顧客清單中的下一個(gè)入口成為當(dāng)前入口而處理繼續(xù)到步驟703。在步驟710,如果該當(dāng)前入口是該顧客清單中的最后一個(gè)入口,處理在步驟712繼續(xù)進(jìn)行,在該步驟中選擇一個(gè)范圍的新生零畢備與這一取字節(jié)請(qǐng)求的答復(fù)一起返回。畢備返回的新生零的選擇的進(jìn)一步細(xì)節(jié)見(jiàn)于圖7B。處理在步驟713中繼續(xù)進(jìn)行,在該步驟中提出請(qǐng)求的顧客的顧客清單入口被更新以反映將要送給該顧客的新生零。在步驟714,更新該入口以反映在get-bytes答復(fù)中在步驟715中實(shí)際返回的字節(jié)范圍,在步驟716中結(jié)束get-bytes請(qǐng)求的處理。
上述描述以下面的編程設(shè)計(jì)語(yǔ)言代碼說(shuō)明get_bytes(gb_client,gb_file,gb_range,gb_rw)--requestfromgb_client--forgb_rangebytes--ingb_file--gb_rw==trueiffrequestisformodifyBEGINFORentry=firstentryonclientlistforgb_fileTOlastentryinclientlistIFentry′sclientisnotgb_clientTHEN
IF(gb_rw==trueAND(entryhasabyterangethatintersectsgb_rangeORentryhasnascentzerosthatintersectgb_range))OR(gb_rw==falseAND(entryhasabyterangeformodifyintersectinggb_rangeORentryhasnascentzerosthatintesectgb_range))THENSENDrevoke_bytestoentry′sclientforgb_range;
AWAITrevoke_bytesreply;
clearentry′sbyterangeandnascentzerosforgb_range;
ENDIFENDIFENDFOR--allrevokingdone,nowanswerrequestCALLselect_nascent_zero_range;
recordnascenterosselectedinclientlistentryforgb_client;
recordgb_rangebyteswithgb_rwinclientlistentryforgb_client;
SENDreplytoget_bytesrequestwithselectednascentzeros;
ENDCopyrightIBMCorporation1989參見(jiàn)圖7B,在步驟720中檢驗(yàn)為之選擇新生零的get-bytes請(qǐng)求。如果這一get-bytes請(qǐng)求是一則不帶修改許可的字節(jié)請(qǐng)求,即,只請(qǐng)求字節(jié)的只讀付本,則在步驟730繼續(xù)進(jìn)行處理,在該步驟中指明在步驟731中返回以前不選擇新生零。否則,如果該請(qǐng)求是修改許可的,則在步驟721中作出一個(gè)決定是否對(duì)該文件必須進(jìn)行一個(gè)高的收回率。如果是這樣,則在步驟730繼續(xù)處理,在該步驟中確定將不選擇新生零。否則如果收回率并不太高,則在步驟723繼續(xù)處理,在該步驟中檢驗(yàn)磁盤(pán)上可利用的空間。如果磁盤(pán)空間太少,在步驟730繼續(xù)處理不選擇新生零。否則在步驟724檢驗(yàn)該get-bytes請(qǐng)求。如果檢驗(yàn)結(jié)果確定該get-bytes請(qǐng)求擴(kuò)充該文件,而下面的16K字節(jié)未曾作為新生零分配,則在步驟727選擇下面的16K字節(jié)作為要在這一get-bytes請(qǐng)求中返回的新生零。然后在步驟732中為這些新生零保留磁盤(pán)空間,並且處理在步驟731返回。如果在步驟724中確定這一get-bytes請(qǐng)求並不擴(kuò)充該文件,則處理繼續(xù)到步驟725。在步驟725中,檢驗(yàn)該get-bytes請(qǐng)求。如果所請(qǐng)求的字節(jié)是該文件中的最后一塊,且下面的8K字節(jié)尚未作為新生零分配,則在步驟728選擇下面的8K字節(jié)處理繼續(xù)到步驟732保留磁盤(pán)空間。如果在步驟725中確定該取字節(jié)請(qǐng)求所請(qǐng)求的不是該文件中的最后一塊,則處理繼續(xù)到步驟726,在該步驟中檢驗(yàn)鄰接于所請(qǐng)求的字節(jié)的塊。如果在鄰接于該請(qǐng)求范圍的字節(jié)處找到未曾作為新生零分配的4K邏輯上的零的字節(jié),則在步驟729選擇這些字節(jié),並在步驟732保留磁盤(pán)空間。確定該文件中的邏輯上的零的字節(jié)是否已作為新生零被分配可以通過(guò)檢驗(yàn)顧客清單入口來(lái)完成。
下面的編程設(shè)計(jì)語(yǔ)言代碼表示上文中的說(shuō)明elect_nascent_zero_range()EGINIFgb_rw==falseORhighrevoke_bytetrafficforgb_fileORlowdiskspaceavailableforgb_fileTHENselected_rangeisempty;
RETURN;
ENDIF;
IFgb_rangeispastendoffileforgb_fileAND16Kbytespastgb_rangearelogicallyzeroAND16Kbytespastgb_rangearenotnascentzerosinanyclientlistentryforgb_fileTHENselected_rangeis16Kpastgb_range;
ELSEIFgb_rangeendsatendoffileforgb_fileAND8Kbytespastgb_rangearelogicallyzeroAND8Kbytespastgb_rangearenotnascentzerosinanyclientlistentryforgb_fileTHENselected_rangeis8Kpastgb_range;
ELSEIFgb_rangeisadjacenttoa4Kblockthatislogicallyzeroandisnotnascentzerosinanyclientlistentryforgb_fileTHENselected_rangeisthe4Kblock;
ELSEselected_rangeisempty;
RETURN;
ENDIFENDIFENDIFreservediskspaceforselected_range;
RETURNCopyrightIBMCorporation1989
如果一臺(tái)顧客機(jī)器上的一個(gè)進(jìn)程需要訪問(wèn)早先未曾向文件服務(wù)器請(qǐng)求的一個(gè)文件的字節(jié),它可以使用從該文件的服務(wù)器上接收到的任何新生零。一個(gè)顧客存入或?qū)懭胍粋€(gè)新生零將它轉(zhuǎn)變成一個(gè)修改過(guò)的實(shí)際字節(jié),最后象任何修改過(guò)的字節(jié)一樣在一則Put-bytes報(bào)文中返回到服務(wù)器。服務(wù)器可以使用revoke-bytes強(qiáng)制顧客送回在請(qǐng)求范圍內(nèi)的所有修改過(guò)的字節(jié),包括原先是實(shí)際的以及原先是新生零的;在該范圍內(nèi)的未曾修改過(guò)的實(shí)際字節(jié)與新生零被顧客簡(jiǎn)單地拋棄。如果再度使用新生零時(shí)必須重新獲取。
新生零已經(jīng)在服務(wù)器上保留了磁盤(pán)可以在不通知服務(wù)器的情況下由顧客安全地加在文件上。在服務(wù)器上,磁盤(pán)保留防止顧客超額使用服務(wù)器的磁盤(pán)空間。只有在字節(jié)返回到服務(wù)器時(shí)所保留的磁盤(pán)塊才成為該文件的一部分。如果新生零未曾被一個(gè)顧客使用,它們不返回到服務(wù)器上面磁盤(pán)保留最終被歸還。
顧客不必對(duì)文件服務(wù)器發(fā)送給他們的新生零進(jìn)行跟蹤。一種簡(jiǎn)單的顧客實(shí)現(xiàn)可以忽視新生零而仍然正確地操作。它將永不使用這些零從而永遠(yuǎn)無(wú)須將它們歸還給服務(wù)器。這樣的顧客在寫(xiě)入每一塊以前都必須先請(qǐng)求它,即使對(duì)于超過(guò)文件結(jié)尾的新塊也是一樣,而這樣的顧客在附加或?qū)懭胄挛募r(shí)就不能像得益于新生零的顧客那樣高效。
當(dāng)一個(gè)顧客關(guān)閉一個(gè)文件時(shí),以Close(關(guān)閉)報(bào)文410通知服務(wù)器。在發(fā)送Close報(bào)文之前,顧客必須將該文件的所有修改過(guò)的數(shù)據(jù)發(fā)送給服務(wù)器。顧客以Put-bytes報(bào)文460來(lái)完成這一工作。服務(wù)器在收到該close請(qǐng)求時(shí),可將該顧客從該文件的顧客清單中去掉,並重新利用記錄在該顧客上的為新生零保留的任何磁盤(pán)空間。服務(wù)器能以另一種方式,即用revoke-bytes報(bào)文收回它們的方式,重新利用這些為新生零保留的磁盤(pán)空間。當(dāng)對(duì)磁盤(pán)空間的需要超過(guò)計(jì)入這些新生零保留以后可以利用的水平時(shí),服務(wù)器可以選擇這一做法。顧客在使用被收回范圍內(nèi)的字節(jié)時(shí),在回收新生零時(shí)要受到性能上的懲罰,因?yàn)樾枰l(fā)送額外的get-bytes報(bào)文。
雖然本發(fā)明是參照一個(gè)較佳實(shí)施例來(lái)具體展示和說(shuō)明的,但不言而喻,熟悉這一技術(shù)的人可以在不脫離本發(fā)明的精神和范圍下作出各種各樣的形式上與細(xì)節(jié)上的改變。
權(quán)利要求
1.服務(wù)器數(shù)據(jù)處理系統(tǒng)中的一種方法,用于從至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)訪問(wèn)位于所述服務(wù)器數(shù)據(jù)系統(tǒng)的一個(gè)文件中的一個(gè)范圍的字節(jié),其中所述服務(wù)器數(shù)據(jù)處理系統(tǒng)與所述至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)通過(guò)一個(gè)通信裝置相連接,其特征在于在對(duì)來(lái)自所述至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)之一的一個(gè)要求服務(wù)器執(zhí)行一個(gè)操作的請(qǐng)求的答復(fù)中,照所述服務(wù)器數(shù)據(jù)處理系統(tǒng)所確定的,返回對(duì)文件中當(dāng)前未使用的字節(jié)的一個(gè)范圍的一個(gè)描述;以及授予該顧客數(shù)據(jù)處理系統(tǒng)使用該被描述的字節(jié)范圍的許可。
2.根據(jù)權(quán)利要求1的一種方法,其特征在于在授予使用該被描述的范圍的許可之前在所述服務(wù)器數(shù)據(jù)處理系統(tǒng)上保留物理存儲(chǔ)器空間。
3.根據(jù)權(quán)利要求2的一種方法,其特征在于當(dāng)所述顧客數(shù)據(jù)處理系統(tǒng)關(guān)閉該文件時(shí),由該服務(wù)器數(shù)據(jù)處理系統(tǒng)判定是否該顧客數(shù)據(jù)處理系統(tǒng)已經(jīng)寫(xiě)入過(guò)該被描述的字節(jié)范圍,並且在該顧客數(shù)據(jù)處理系統(tǒng)未曾寫(xiě)入該被描述的字節(jié)范圍的情況下,釋放該被保留的物理存儲(chǔ)器。
4.根據(jù)權(quán)利要求1的一種方法,其特征在于來(lái)自所述至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)之一的請(qǐng)求是用于獲得在該文件中的一個(gè)請(qǐng)求字節(jié)范圍進(jìn)行寫(xiě)訪問(wèn)的操作的。
5.根據(jù)權(quán)利要求4的一種方法,其特征在于授予的對(duì)所描述的范圍的使用是用于寫(xiě)入。
6.根據(jù)權(quán)利要求1的一種方法,其特征在于由該服務(wù)器數(shù)據(jù)處理系統(tǒng)收回使用該被描述的字節(jié)范圍的許可。
7.在一個(gè)服務(wù)器數(shù)據(jù)處理系統(tǒng)中的一種方法,用于從至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)訪問(wèn)位于所述服務(wù)器數(shù)據(jù)處理系統(tǒng)上的一個(gè)文件中的一個(gè)字節(jié)范圍,其中所述服務(wù)器數(shù)據(jù)處理系統(tǒng)與所述顧客數(shù)據(jù)處理系統(tǒng)是通過(guò)一個(gè)通信裝置連接的;其特征在于按所述服務(wù)器數(shù)據(jù)處理系統(tǒng)的確定,以與所請(qǐng)求的字節(jié)范圍一起返回一個(gè)邏輯上為零的額外的字節(jié)范圍回來(lái)答復(fù)來(lái)自所述至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)之一的要求寫(xiě)訪問(wèn)該字節(jié)范圍的一個(gè)請(qǐng)求,借此,給予該顧客數(shù)據(jù)處理系統(tǒng)寫(xiě)入較所請(qǐng)求的更大的字節(jié)范圍的許可;以及當(dāng)該顧客數(shù)據(jù)處理系統(tǒng)具有寫(xiě)入該額外字節(jié)范圍時(shí),在所述服務(wù)器數(shù)據(jù)處理系統(tǒng)上為所述額外字節(jié)范圍保留物理存儲(chǔ)器空間。
8.在一個(gè)服務(wù)器數(shù)據(jù)處理系統(tǒng)中的一種方法,用于從至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)訪問(wèn)位于所述服務(wù)器數(shù)據(jù)處理系統(tǒng)上的一個(gè)文件中的一個(gè)字節(jié)范圍,其中所述服務(wù)器數(shù)據(jù)處理系統(tǒng)與所述顧客數(shù)據(jù)處理系統(tǒng)是通過(guò)一個(gè)通信裝置連接的;其特征在于按所述服務(wù)器數(shù)據(jù)處理系統(tǒng)的確定,以與所請(qǐng)求的字節(jié)范圍一起返回一個(gè)未曾請(qǐng)求的額外的未曾寫(xiě)入的零的字節(jié)范圍來(lái)答復(fù)來(lái)自所述顧客數(shù)據(jù)處理系統(tǒng)之一的要求對(duì)該字節(jié)范圍進(jìn)行寫(xiě)訪問(wèn)的一則請(qǐng)求,借此給予該顧客數(shù)據(jù)處理系統(tǒng)寫(xiě)入比所請(qǐng)求的更大的一個(gè)字節(jié)范圍的許可;以及為了控制來(lái)自所述顧客數(shù)據(jù)處理系統(tǒng)對(duì)該文件的訪問(wèn),由該服務(wù)器數(shù)據(jù)處理系統(tǒng)收回對(duì)該顧客數(shù)據(jù)處理系統(tǒng)所請(qǐng)求的字節(jié)范圍與額外的未曾請(qǐng)求的字節(jié)范圍的寫(xiě)入的許可。
9.在一個(gè)服務(wù)器數(shù)據(jù)處理系統(tǒng)中的一種方法,用于從至少一個(gè)顧客數(shù)據(jù)處理系統(tǒng)訪問(wèn)位于所述服務(wù)器數(shù)據(jù)處理系統(tǒng)上的一個(gè)文件中的一個(gè)字節(jié)范圍,其中所述服務(wù)器數(shù)據(jù)處理系統(tǒng)與所述顧客數(shù)據(jù)處理系統(tǒng)是通過(guò)一個(gè)通信裝置連接的;其特征在于答復(fù)來(lái)自所述顧客數(shù)據(jù)處理系統(tǒng)之一的對(duì)表示所述文件的最后一塊的該字節(jié)范圍的寫(xiě)訪問(wèn)的一個(gè)請(qǐng)求,按照所述服務(wù)器數(shù)據(jù)處理系統(tǒng)的確定,在返回所述請(qǐng)求的字節(jié)范圍時(shí)一起返回至少一個(gè)未曾請(qǐng)求的未寫(xiě)入的零的字節(jié)的額外的塊,借此給予該顧客數(shù)據(jù)處理系統(tǒng)寫(xiě)入一個(gè)較所請(qǐng)求的更大字節(jié)范圍的許可;以及在所述顧客數(shù)據(jù)處理系統(tǒng)已經(jīng)寫(xiě)入了所述文件的所述請(qǐng)求的最后塊以及所述至少一個(gè)非請(qǐng)求額外塊之后,接收對(duì)該文件的下一個(gè)字節(jié)塊的后續(xù)請(qǐng)求,借此最小化來(lái)自所述顧客數(shù)據(jù)處理系統(tǒng)的請(qǐng)求新的字節(jié)節(jié)塊的次數(shù)。
10.在一個(gè)具有通過(guò)一個(gè)通信裝置連接的多個(gè)數(shù)據(jù)處理系統(tǒng)的分散數(shù)據(jù)處理系統(tǒng)中的一種方法,用于訪問(wèn)被至少一個(gè)第二數(shù)據(jù)處理系統(tǒng)所請(qǐng)求的位于所述數(shù)據(jù)處理系統(tǒng)中的第一個(gè)上的一個(gè)文件中的一個(gè)字節(jié)范圍;其特征在于從該第一數(shù)據(jù)處理系統(tǒng)返回第二數(shù)據(jù)處理系統(tǒng)所請(qǐng)求的該字節(jié)范圍;根據(jù)在所述第一數(shù)據(jù)處理系統(tǒng)上的一個(gè)決定,有選擇地在返回所述請(qǐng)求的字節(jié)范圍的同時(shí)是否返回一個(gè)未曾寫(xiě)入過(guò)的零的字節(jié)的額外范圍;以及如果所述第二數(shù)據(jù)處理系統(tǒng)覺(jué)察所述額外的未曾寫(xiě)入過(guò)的零的字節(jié)的范圍和如果所述第二數(shù)據(jù)處理系統(tǒng)決定寫(xiě)入所述額外未曾寫(xiě)入過(guò)的零的字節(jié)的范圍,則由所述第二數(shù)據(jù)處理系統(tǒng)寫(xiě)入所述返回的額外的未曾寫(xiě)入過(guò)的零的字節(jié)范圍。
11.具有從一個(gè)第二數(shù)據(jù)處理系統(tǒng)訪問(wèn)位于一個(gè)第一數(shù)據(jù)處理系統(tǒng)上的一個(gè)文件中一個(gè)字節(jié)范圍的裝置的一個(gè)系統(tǒng),其中所述第一數(shù)據(jù)處理系統(tǒng)與所述第二數(shù)據(jù)處理系統(tǒng)是通過(guò)一個(gè)通信裝置連接的,其特征在于根據(jù)所述第一數(shù)據(jù)處理系統(tǒng)的確定,用于在對(duì)來(lái)自所述數(shù)據(jù)處理系統(tǒng)第二個(gè)要求第一數(shù)據(jù)處理系統(tǒng)在所述文件上執(zhí)行一個(gè)操作的一個(gè)請(qǐng)求答復(fù)中返回一個(gè)文件中當(dāng)前未使用的一個(gè)字節(jié)范圍的描述的裝置;以及用于授于該第二數(shù)據(jù)處理系統(tǒng)使用該被描述的所述字節(jié)范圍的許可的裝置。
全文摘要
本發(fā)明的系統(tǒng)與方法控制一個(gè)分布式網(wǎng)絡(luò)環(huán)境中的顧客數(shù)據(jù)處理系統(tǒng)如何得以高效地?cái)U(kuò)充文件并寫(xiě)入文件中早先未曾被數(shù)據(jù)占用的區(qū)域。服務(wù)器數(shù)據(jù)處理系統(tǒng)以向顧客數(shù)據(jù)處理系統(tǒng)送出他所請(qǐng)求的實(shí)際字節(jié)以及額外的新生零來(lái)管理新文件塊的分布式分配。新生零是邏輯上為零的字節(jié),它們從未存儲(chǔ)或?qū)懭脒^(guò),并且可以在該文件的當(dāng)前范圍之外。服務(wù)器根據(jù)它所能利用的物理存儲(chǔ)器的數(shù)量以及有否其它顧客數(shù)據(jù)處理系統(tǒng)需要訪問(wèn)這一范圍的塊來(lái)確定是否將這一額外范圍的新生零送給一個(gè)顧客。
文檔編號(hào)G06F17/30GK1047408SQ90103520
公開(kāi)日1990年11月28日 申請(qǐng)日期1990年5月15日 優(yōu)先權(quán)日1989年5月15日
發(fā)明者斯蒂芬·保羅·摩根, 托德·艾倫·史密斯 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司