專利名稱:共享的數(shù)據(jù)集合的制作方法
共享的數(shù)據(jù)集合背景技術(shù)
集合是將被一起操作的一組數(shù)據(jù)項。集合的一些示例包括列表、陣列、集、包、和各 種其他數(shù)據(jù)組。在編程的早期,程序一般是不彼此互操作的單片實體。因此,程序能采用編 程者選擇的任何方式的集合內(nèi)在地管理集合。在現(xiàn)代編程中,然而,通過操縱共享的數(shù)據(jù) 組,使得同一程序的不同實例、或不同程序彼此互操作,已成為較為流行的實踐。
盡管可能使得程序?qū)崿F(xiàn)它們用于共享數(shù)據(jù)的自身機(jī)制,這樣做一般對于編程者而 言是麻煩的。編程者可能必須將共享機(jī)制實現(xiàn)為程序的緊密結(jié)合的一部分。即使編程者 可獲得已知共享機(jī)制的代碼,該機(jī)制一般專用于程序的特性、且專用于被共享的數(shù)據(jù)類型。 且,當(dāng)其他程序想要與已有程序共享數(shù)據(jù)時,這些程序必須以使用相同共享機(jī)制的方式被 實現(xiàn)。
盡管允許程序共享數(shù)據(jù)出現(xiàn)了各種問題,集合的共享提出了附加問題。對于很多 類型的集合,集合的當(dāng)前狀態(tài)不僅由集合的內(nèi)容定義、還由其中這些內(nèi)容所出現(xiàn)的順序所 定義。例如,陣列{1,2,3,4,5}不同于陣列{2,3,1,5,4}。即使這兩個陣列包含了相同的底 層元素(從一到五的數(shù)字),順序是不同的,且因此這兩個陣列具有不同的狀態(tài)。當(dāng)集合的狀 態(tài)可由數(shù)個程序改變時,維持集合的狀態(tài)、特別是順序,提出了特定挑戰(zhàn)。
概述
共享集合的概念可被以使得共享機(jī)制對于編程者而言是透明的方式被實現(xiàn)。另 外,當(dāng)集合由數(shù)個不同實體操作時,實現(xiàn)共享的集合的機(jī)制可,對于集合提供數(shù)據(jù)收斂。
在一個示例中,共享的對象服務(wù)器,通過在任何給定時間維持集合的真實狀態(tài),來 管理集合的共享。獲得對于集合的訪問的程序可連接至機(jī)器(程序在該機(jī)器上運(yùn)行)上的共 享對象運(yùn)行時。訪問共享集合的程序?qū)⒃摷系怯洖楣蚕砑?,且這個登記由運(yùn)行時通信 至共享的對象服務(wù)器。想要訪問該集合的其他程序也將該集合登記為共享集合。類似地,這 個登記由運(yùn)行時通信至共享的對象服務(wù)器。此外,程序可訂閱在該集合上的改變提醒,其中 訂閱請求由運(yùn)行時處理。每一個程序保持集合的本地副本。當(dāng)集合的狀態(tài)以任何形式被改 變時,在其上發(fā)生改變的機(jī)器上的運(yùn)行時將這個改變通信至共享的對象服務(wù)器。共享的對 象服務(wù)器更新集合的真實狀態(tài),并將這個改變通信至通過共享對象運(yùn)行時登記過這個集合 的所有程序,該共享對象運(yùn)行時位于在其上運(yùn)行訂閱程序的機(jī)器上。然后這些程序的每一 個根據(jù)服務(wù)器所通信的狀態(tài)改變,更新其本地集合副本。在該集合上已發(fā)生并發(fā)的改變的 情況下,共享的對象服務(wù)器解決這些改變中的任何沖突,并確定性地到達(dá)集合的真實狀態(tài)。
在另一個示例中,以對等(peer-to-peer)方式、而不是客戶機(jī)/服務(wù)器方式,來管 理共享的對象。在對等實現(xiàn)中,對于共享的集合的每一個訂閱者可將改變通信至其他訂閱 者。然后,訂閱者在其上運(yùn)行的機(jī)器上的運(yùn)行時可改變它們的本地副本,同時確定性地解決 任何沖突。
幾乎可以任何編程語目(如,C,C++,Java, Visual Basic等)實現(xiàn)集合。由于共孕集 合的概念可以多種編程模型實現(xiàn),以不同語言編寫的程序可在同一個共享集合上操作。另 外,編程者可編寫程序,該程序?qū)⑴c在純粹本地的集合上操作一樣的方式在共享集合上操作。因此,程序可能夠操作共享的集合,而不必采用除了發(fā)出命令以登記新的集合或訂閱已 有集合的改變之外的任何方式,來識別集合的共享本質(zhì)。以此方式,有效地使得集合的共享 對于程序以及對于編程者而言是透明的。此外,共享機(jī)制對于集合中的數(shù)據(jù)的類型可以是 不可知的,藉此允許分享任何類型數(shù)據(jù)的集合。
提供本發(fā)明內(nèi)容以便以簡化形式介紹將在以下具體實施方式
中進(jìn)一步描述的一 些概念。本發(fā)明內(nèi)容并不旨在標(biāo)識所要求保護(hù)主題的關(guān)鍵特征或必要特征,也不旨在用于 限制所要求保護(hù)主題的范圍。
附圖簡述
圖1是共享集合的示例的框圖。
圖2是示例性場景的框圖,其中程序可共享對于共享集合的訪問。
圖3是集合共享的對等實現(xiàn)的示例的框圖。
圖4和5是共享的集合可被如何使用的一些示例的框圖。
圖6是其中可共享集合的示例性過程的流程圖。
圖7是可以結(jié)合本文描述的主題的實現(xiàn)來使用的示例組件的框圖。
具體實施方式
在現(xiàn)代計算中,通過共享對于同一底層數(shù)據(jù)的訪問,程序經(jīng)常彼此互操作。當(dāng)程序 共享數(shù)據(jù)時,經(jīng)常以認(rèn)知數(shù)據(jù)被共享的事實的方式實現(xiàn)程序。即,程序一般必須包含與其他 程序、或與同一程序的其他實例共享數(shù)據(jù)的機(jī)制的實現(xiàn)。用于共享的機(jī)制經(jīng)常專用于被共 享的數(shù)據(jù)的本質(zhì)、以及編程者的設(shè)計選擇。因此,當(dāng)兩個程序想要共享數(shù)據(jù)時,它們各自的 編程者一般必須協(xié)定、并實現(xiàn)特定的共享機(jī)制。存在特定的允許有限形式的數(shù)據(jù)共享的一 般化機(jī)制,但是不適用于特定場合。
盡管各種數(shù)據(jù)的共享提出了各種實現(xiàn)問題,當(dāng)要共享的數(shù)據(jù)是集合時,提出了附 加問題。集合是可被一起操作的一組數(shù)據(jù)項。集合的一些示例包括列表、陣列、集、包、和各 種其他數(shù)據(jù)組。一些類型的集合被排序。因此,順序集合的當(dāng)前狀態(tài)不是僅僅由集合的內(nèi) 容定義、還由其中這些內(nèi)容所出現(xiàn)的順序所定義。如,{I, 2,3,4,5}是包含從一到五的整數(shù) 的數(shù)據(jù)集合。如果該集合被排序,則{1,2,3,4,5}是與{2,3,1,5,4}不同的狀態(tài),因為這兩 個狀態(tài)具有不同的順序,即使它們都包含相同的項。
當(dāng)在同時運(yùn)行的程序中共享任何類型的數(shù)據(jù)時,數(shù)據(jù)的兩個修改可能沖突-如, 一個程序可想要修改數(shù)據(jù),同時,另一個程序正想刪除該數(shù)據(jù)。然而,當(dāng)這樣的沖突發(fā)生且 正被共享的數(shù)據(jù)是集合的一部分時,發(fā)生附加難題。一個程序可請求在集合中的第二項后 插入項。另一個程序可請求刪除第二項,藉此使得被插入的項成為第二項。為了處理這些 改變并達(dá)到集合的真實狀態(tài),必須決定原始集合中的哪一項現(xiàn)在是第二個。由于每一個程 序可能不了解另一個程序正在對同一個集合操作,兩個程序可能涉及集合中的“第二”項, 同時對于集合中的哪個項真正是順序的第二項具有不同的理解。
運(yùn)算轉(zhuǎn)換字段涉及允許對于計算中的數(shù)據(jù)進(jìn)行決定性排序的機(jī)制??墒褂靡恍┻@ 樣的機(jī)制來解決同時被操作的文件中的沖突一如,如何確定在正同時被兩個用戶編輯的文 本文件中已經(jīng)發(fā)生了什么編輯。然而,這些類型的技術(shù)一般沒有被應(yīng)用于此處描述類型的集合的一般化共享。
此處描述的主題提供了共享數(shù)據(jù)集合的機(jī)制。此處描述的技術(shù)可被用于提供一般 化的集合共享機(jī)制,其允許數(shù)個程序和/或同一程序的數(shù)個實例來共享對于集合的訪問。 這些技術(shù)可允許采用不同的編程語言實現(xiàn)程序。這些技術(shù)可允許被排序的數(shù)據(jù)集合以這樣 的方式同時被多個程序和/或程序?qū)嵗僮髟摷蠜Q定性地達(dá)到特定狀態(tài),該狀態(tài)可被 傳播至使用該集合的所有程序。另外,此處描述的技術(shù)可允許編程者編寫程序,該程序以或 多或少與程序?qū)⒃诩兇獗镜丶仙喜僮鞯姆绞揭粯拥姆绞皆诠蚕砑仙喜僮?。此外,可?得共享機(jī)制對于集合中的底層數(shù)據(jù)類型是不可知的,藉此使得對于任何合適的數(shù)據(jù)種類使 用相同的一般化的共享機(jī)制。換言之,可在無關(guān)于集合中的數(shù)據(jù)項內(nèi)容的情況下、以及無關(guān) 于這些項的內(nèi)容的結(jié)構(gòu)的情況下,執(zhí)行此處描述的各種動作。
共享數(shù)據(jù)的程序可在單個機(jī)器上運(yùn)行、或可在通過網(wǎng)絡(luò)連接的數(shù)個機(jī)器上運(yùn)行。 為了幫助數(shù)據(jù)的共享,在其上運(yùn)行程序的每一個機(jī)器可具有共享的對象的運(yùn)行時。共享的 對象的運(yùn)行時可有助于管理共享的數(shù)據(jù)對象(包括共享的集合)的共享和同步。在一個示例 中,共享的對象的服務(wù)器維持共享的集合的真實狀態(tài)。當(dāng)對于機(jī)器上的共享的集合做出改 變時,機(jī)器上的運(yùn)行時提醒共享的對象服務(wù)器有關(guān)于這個改變。響應(yīng)于該本地改變,服務(wù)器 可改變集合的真實狀態(tài)。如果兩個程序?qū)τ诩献龀霾l(fā)的改變,共享的對象服務(wù)器可解 決這些改變從而達(dá)到真實狀態(tài),此舉在可能的程度上可反映兩個程序意在實現(xiàn)的集合的狀 態(tài)。因此,如果兩個不同程序各自在不了解另一個的改變的情況下改變同一個集合,服務(wù)器 可執(zhí)行這些改變之一來創(chuàng)建集合的新狀態(tài),且然后可轉(zhuǎn)換另一個改變(在可能的程度上)以 反映如果另一個程序在其做出改變時已經(jīng)知道了集合的新狀態(tài),該另一個程序應(yīng)會作出 的改變。服務(wù)器通知各機(jī)器上的運(yùn)行時關(guān)于該改變(或經(jīng)轉(zhuǎn)換的改變,如果適用的話),且已 經(jīng)訂閱該集合的程序根據(jù)服務(wù)器所傳播的改變來更新它們的集合的本地副本。在另一個示 例中,以對等體系結(jié)構(gòu)實現(xiàn)集合共享,在對等體系結(jié)構(gòu)中,訂閱共享集合的每一個程序通知 其他訂閱者有關(guān)于該程序已經(jīng)做出的改變,且其他訂閱者(或者在正運(yùn)行這些訂閱者的機(jī) 器上的運(yùn)行時組件)在不需要服務(wù)器幫助的情況下將它們的本地副本同步至這些改變。
當(dāng)程序創(chuàng)建集合時,程序可發(fā)出指令將該集合登記為共享集合。這個指令可由在 其上運(yùn)行該程序的機(jī)器上的運(yùn)行時接收,且該運(yùn)行時可將該登記報告給共享對象服務(wù)器。 然后,共享對象服務(wù)器接收集合的副本,其代表了集合的初始狀態(tài)。從這個角度而言,創(chuàng)建 該集合的程序可以與集合是純粹地本地時采用的非常相似的方式在該集合上操作,因為運(yùn) 行時管理將改變報告至共享對象服務(wù)器(或在對等實現(xiàn)中,報告至其他訂閱者)、以及從共 享的對象服務(wù)器接收狀態(tài)改變的同步。
如果程序想要使用已經(jīng)由另一個程序創(chuàng)建的共享的集合,該程序發(fā)出指令來登記 該集合。這個指令可由運(yùn)行時接收并被傳送至共享的對象服務(wù)器。然后,共享的對象服務(wù)器 知道來通知在訂閱程序在其上運(yùn)行的機(jī)器上的運(yùn)行時有關(guān)該集合狀態(tài)的任何改變。當(dāng)程序 訂閱集合時,其可接受集合的當(dāng)前真實狀態(tài)的副本,這副本然后存儲為本地集合。然后訂閱 程序可用與集合是本地的非常類似方式在共享集合上操作。以此方式,使得集合的有效共 享相對于創(chuàng)建和登記集合的程序、以及對于訂閱該集合的程序而言都是透明的。如上所述, 系統(tǒng)可對于集合中的數(shù)據(jù)的特性是不可知的,從而共享機(jī)制可作用于包含任何類型底層數(shù) 據(jù)的集合。
圖1示出共享集合102的示例。共享集合102可包括一組數(shù)據(jù)項,其以某種方式彼此相關(guān),且其可由多個程序(諸如程序104、106、和108)訪問(如,讀取和寫入)。程序 104-108可以是相同程序(如,在數(shù)個不同過程上運(yùn)行的相同應(yīng)用)的不同運(yùn)行實例,或可以 是不同程序。另外,程序104-108可全部在同一個機(jī)器上或在不同機(jī)器上運(yùn)行。在兩種情 況下,程序104-108可以是不同程序、或同一程序的分開的運(yùn)行實例,在此意義上,它們可 被描述為“不同的”。集合共享機(jī)制110可幫助共享集合102在程序104-108之間的共享。 下文結(jié)合圖2-7描述集合共享機(jī)制110的示例性實現(xiàn)。
共孚集合102可具有名稱112,允許共孚集合102由共孚相同命名空間的程序所標(biāo) 識。作為名稱112的替代物(或除了名稱112外),共享集合102還可具有標(biāo)識符114,將共 享集合102與其他共享集合區(qū)分開來。例如,標(biāo)識符114可被應(yīng)用于還沒有被指派名稱的 集合,從而在“友好”的名稱已經(jīng)被指派給集合前,可標(biāo)識這些集合。
共享集合102可具有多個數(shù)據(jù)項。在圖1的示例中,示出了四個數(shù)據(jù)項116、118、 120、和122,但是集合可具有任意數(shù)量的數(shù)據(jù)項。每一個數(shù)據(jù)項可包含任意類型的數(shù)據(jù)。下 文,結(jié)合圖4和5將更為具體地描述可被存儲在共享集合中的數(shù)據(jù)的一些示例。然而,作為 一般示例,可被存儲于集合中的一些數(shù)據(jù)類型是諸如數(shù)字或單詞之類的元素數(shù)據(jù)類型、或 更為復(fù)雜的由程序員定義的數(shù)據(jù)類型,諸如代表待做列表上的任務(wù)的結(jié)構(gòu)、或用戶界面的 元素。此處描述的機(jī)制可對于數(shù)據(jù)類型是不可知的,從而集合中的獨(dú)立的數(shù)據(jù)項可以是(詳 細(xì)示意為)從元素數(shù)據(jù)類型到復(fù)雜的用戶定義的數(shù)據(jù)類型的任何項。
在圖1的示例中,共享集合102是排序的集合。如上所述,排序的集合是一種集合, 其中集合的狀態(tài)不僅由集合中的數(shù)據(jù)項所定義、還由這些數(shù)據(jù)項上的順序所定義。數(shù)據(jù)項 的插入或移除改變了排序的集合的狀態(tài),不過也改變了兩個現(xiàn)有數(shù)據(jù)項之間位置。因此,排 序的集合102中的每一個數(shù)據(jù)項具有順序位置。順序位置124、126、128、和130各自對應(yīng)于 數(shù)據(jù)項116、118、120、和122。因此,數(shù)據(jù)項116處在第一位置、數(shù)據(jù)項118處在第二位置, 以此類推。如果要改變?nèi)我豁椀捻樞蛱?,即使對于項本身沒有改變,這個改變將導(dǎo)致共享集 合102的狀態(tài)的改變。
可在共享集合102上執(zhí)行的示例性操作包括轉(zhuǎn)換操作132和刪除操作134。轉(zhuǎn)換 操作132交換集合中兩個(或更多個)項的順序位置,且刪除操作134移除集合中的其中一 項。還有,可通過執(zhí)行插入操作136來向集合增加新的數(shù)據(jù)項138,以修改集合。下文的討 論中,我們稍后將涉及這些操作。
圖2示出其中程序可共享對于共享集合102的訪問的示例性場景。機(jī)器202是在 其上執(zhí)行程序的機(jī)器。機(jī)器202可以是具有某種計算能力的任何類型的機(jī)器-如,諸如臺 式計算機(jī)或膝上型計算機(jī)之類的個人計算機(jī)、服務(wù)器計算機(jī)、手持式計算機(jī)、智能電話、機(jī) 頂盒等。在圖示示例中,兩個程序204和206在機(jī)器202上執(zhí)行,盡管任何數(shù)量的程序可在 機(jī)器上運(yùn)行。
機(jī)器202可存儲數(shù)據(jù),且被存儲在機(jī)器202上的數(shù)據(jù)的一個類型是共享集合102 的本地副本。在圖2的示例中,共享集合102由程序204創(chuàng)建。在集合被創(chuàng)建時,集合可以 是本地的且專用于程序204。然而,程序204可能想要將該集合登記為用于共享的集合,以 允許其他程序(可能包括,在其他機(jī)器上運(yùn)行的程序)共享對于集合102的訪問。因此,程序 204發(fā)出登記指令208。登記指令208可通過編寫程序204的任何編程語言發(fā)出,且可由共 享對象運(yùn)行時210所接收。例如,共享對象運(yùn)行時210可提供應(yīng)用程序編程接口(API),允許程序204向共享對象運(yùn)行時210發(fā)出登記指令(和訂閱請求、和其他類型的指令)。
一旦接收登記指令208,共享對象運(yùn)行時210可向共享對象服務(wù)器212登記共享集 合102。共享對象服務(wù)器212是維持共享數(shù)據(jù)對象(諸如共享集合102)的真實狀態(tài)的服務(wù) 器,且還用作共享對象的改變的交換場所。即,當(dāng)共享數(shù)據(jù)在機(jī)器上改變時,共享對象服務(wù) 器212接收通知,并將對共享數(shù)據(jù)的狀態(tài)的改變傳播至其他機(jī)器。當(dāng)共享集合102在共享 對象服務(wù)器212上登記時,共享對象運(yùn)行時210可提供共享集合102的副本。一旦集合102 已經(jīng)被登記為共享,共享的對象服務(wù)器212維持集合102的真實狀態(tài),如在圖2的代表共享 對象服務(wù)器212的框中的標(biāo)記為“(真實狀態(tài))”的框中所示那樣。(要注意的是,貫穿此處描 述,我們將程序或訂閱者發(fā)送動作稱為向服務(wù)器或其他訂閱者發(fā)送登記或訂閱請求。程序 發(fā)送這些類型的請求的動作包括其中程序?qū)⒄埱笸ㄐ胖吝\(yùn)行時、且運(yùn)行時將該請求通信至 服務(wù)器、或其他訂閱者或運(yùn)行時的情況。類似地,如下文所述地,訂閱者可將狀態(tài)改變通信 至服務(wù)器或其他訂閱者;訂閱者通信狀態(tài)改變的動作包括其中在訂閱者機(jī)器上的運(yùn)行時執(zhí) 行通信的情況。)
當(dāng)共享集合102被登記為共享時,除了程序204外的其他程序可通過訂閱該集合 來訪問該集合。為了訂閱集合,該程序可提交訂閱請求214。一些集合可經(jīng)受它們的創(chuàng)建者 所指定的訪問控制限制。這樣的訪問控制限制可限制可訪問共享集合的一組程序和/或用 戶和/或機(jī)器。然而,假設(shè)在共享集合102上沒有訪問限制(或存在訪問限制,但是尋求對 于共享集合102的訪問的那些限制具有訪問該集合的允許),然后訂閱共享集合102允許訂 閱者讀取和/或修改該集合。
訂閱請求可來自任何機(jī)器上的任何程序。例如,通過經(jīng)共享對象運(yùn)行時210提交 訂閱請求,程序206可訂閱共享集合102。值得注意的是,程序206與共享集合102的創(chuàng)建 者(即,程序204)在同一機(jī)器202上。然而,訂閱程序可在不同機(jī)器上。例如,機(jī)器218上 的程序216也通過提交訂閱請求214來訂閱共享集合102。來自程序216的訂閱請求通過 共享對象運(yùn)行時220 (機(jī)器218的運(yùn)行時)提交。(每一個機(jī)器可具有其自己的共享對象運(yùn) 行時的實例。)另外,共享集合102的訂閱請求可來自在機(jī)器222、或在任何其他機(jī)器上執(zhí)行 的程序。
當(dāng)程序已經(jīng)訂閱共享集合102時,該程序可接收共享集合102的當(dāng)前真實狀態(tài)的 副本。例如,機(jī)器218上的程序216接收共享集合102的副本,其可將副本存儲在機(jī)器218 上(如在代表機(jī)器218的圖1的框中標(biāo)記“(本地副本)”的共享集合102的實例)。然后訂閱 程序可如本地副本是純粹本地集合一樣讀取和寫入本地副本。在其上運(yùn)行有程序的機(jī)器上 的共享對象運(yùn)行時的實例(如,在程序216的情況下,是共享對象運(yùn)行時220)可監(jiān)測共享集 合102的本地副本來確定程序是否已經(jīng)對于共享集合做出將被報告至共享對象服務(wù)器212 的改變。
當(dāng)對于共享集合102的任何訂閱者執(zhí)行對共享集合102的本地副本做出改變的操 作,訂閱者機(jī)器上的共享對象運(yùn)行時將該操作報告至共享對象服務(wù)器212。然后,共享對象 服務(wù)器212更新共享集合的當(dāng)前狀態(tài),并提醒對象訂閱者關(guān)于(包括對象的創(chuàng)建者)狀態(tài)改變。
共享對象服務(wù)器212可包含同步組件226,其幫助在共享集合102的訂閱者之間的 狀態(tài)信息的收集和傳播。同步組件226的操作方式可以是依賴于實現(xiàn)的。在一個示例中,同步組件維持處于其真實狀態(tài)中的共享集合102的主副本,且無論何時在這個集合的狀態(tài)變化時,僅傳播共享集合102的新副本。在另一個示例中,同步組件226維持相對于當(dāng)前版本的共享集合102的改變列表,并將這些改變傳播至各客戶機(jī)。然后,每一個客戶機(jī)上的運(yùn)行時能基于共享集合102的本地狀態(tài)和從共享對象服務(wù)器212接收到的改變來計算共享集合 102的真實狀態(tài)。即使共享對象服務(wù)器212沒有響應(yīng)于每一次狀態(tài)改變傳播共享集合102 的完整副本,共享對象服務(wù)器212可確定如何解決對于共享集合102的同時改變,從而-當(dāng)客戶機(jī)側(cè)的運(yùn)行時接收改變的通知時-其可從舊的狀態(tài)計算共享集合102的新的狀態(tài)。如下文所述,需要時,同步組件226可轉(zhuǎn)換變化,從而在不了解第二訂閱者的同步改變的情況下,第一訂閱者做出的改變,可被發(fā)送至第一訂閱者,且可被以有意義的,且導(dǎo)致所有訂閱者的結(jié)果收斂在共享集合102的相同狀態(tài)上的方式來應(yīng)用。
同步組件226所執(zhí)行的一個功能可以是確定如何由兩個客戶機(jī)將所做出的改變應(yīng)用于集合,其中沒有一個客戶機(jī)了解另一個的改變。如果兩個客戶機(jī)在大約同時做出涉及集合中同一項的改變,從而每一個客戶機(jī)在接收另一個該改變的通知之前做出改變,這個情況可能發(fā)生。例如,假設(shè)集合中的最先兩項是阿爾法(alpha)和貝塔(beta)。兩個客戶機(jī)一稱它們?yōu)锳和B—在大約同時對于集合做出改變。A想要在阿爾法后的位置添加新項,伽馬(gamma),且B想要刪除貝塔。所以A執(zhí)行在順序位置二處增加新項的操作,且B執(zhí)行在順序位置二刪除項的操作。如果首先執(zhí)行A的操作,則兩個操作后的最終狀態(tài)是阿爾法和貝塔分別占據(jù)位置一和二。如果首先執(zhí)行B的操作,則兩個操作后的最終狀態(tài)是阿爾法和伽馬分別占據(jù)位置一和二。同步組件226可以如下方式解決這個明顯的沖突。
為了這個示例的目的,調(diào)用服務(wù)器S和客戶機(jī)A和B。S、A、和B全部在狀態(tài)O開始A執(zhí)行操作X且B執(zhí)行操作Y。由于A或B均不了解另一個操作已經(jīng)被執(zhí)行,A和B各自以狀態(tài)O向S報告-即,A和B各自報告,當(dāng)集合在狀態(tài)O中存在時,它們已經(jīng)在集合上執(zhí)行了操作。已經(jīng)執(zhí)行了一個操作,現(xiàn)在A和B各自將它們的狀態(tài)增至I。這些操作的一個, 然而,將首先到達(dá)S。為這個示例,假設(shè),X首先到達(dá)。由于操作X在狀態(tài)O (這與S的當(dāng)前狀態(tài)匹配)操作,其在沒有被轉(zhuǎn)換的情況下在S上執(zhí)行并發(fā)送至B。此外,確認(rèn)被傳送至A。 S現(xiàn)在處于狀態(tài)I。此時,B從S接收操作X。由于操作Y還沒有被S所確認(rèn),操作X被相對于Y進(jìn)行轉(zhuǎn)換,然后應(yīng)用至集合。B現(xiàn)在處于狀態(tài)2。當(dāng)操作Y到達(dá)S時,該操作表示它在狀態(tài)O被執(zhí)行。由于O不再是S的當(dāng)前狀態(tài),S確定在B執(zhí)行Y時不了解操作X。因此,操作Y被相對操作X而轉(zhuǎn)換然后傳送至A。確認(rèn)被傳送至B。S現(xiàn)在處于狀態(tài)2。此時,A接收操作Y的經(jīng)轉(zhuǎn)換的版本。由于A不具有代辦操作,在不將經(jīng)轉(zhuǎn)換的Y進(jìn)一步轉(zhuǎn)換的情況下應(yīng)用經(jīng)轉(zhuǎn)換的Y。(即,經(jīng)轉(zhuǎn)換的Y表示其相對于狀態(tài)I而被執(zhí)行。由于A已經(jīng)在狀態(tài)1, 沒有進(jìn)一步轉(zhuǎn)換Y的基礎(chǔ)。)A現(xiàn)在處于狀態(tài)2。此外,在A和B的集合的副本現(xiàn)在以相同順序顯示相同數(shù)據(jù)。
圖2示出示例性客戶機(jī)/服務(wù)器-類型實現(xiàn),其中服務(wù)器管理集合的共享。然而, 還可使用對等實現(xiàn)。圖3示出集合共享的對等實現(xiàn)的示例。
在圖3的示例中,機(jī)器202、218、和222參與集合102的共享(就像它們在圖2中所做的那樣)。例如,每一個機(jī)器可具有作為共享集合102的訂閱者的一個或多個程序(其中共享集合的創(chuàng)建者被包括在“訂閱者”的概念中)。每一個機(jī)器具有共享對象運(yùn)行時的實例一即,共享對象運(yùn)行時210、220、和302分別在機(jī)器202、218、和222上運(yùn)行。在對等實現(xiàn)中,共享對象運(yùn)行時可直接彼此通信,而不是與服務(wù)器通信。另外,共享的對象運(yùn)行時可負(fù) 責(zé)轉(zhuǎn)換傳入改變,而不是由服務(wù)器執(zhí)行那些改變。因此,只要不同運(yùn)行時實現(xiàn)用于解決對于 集合的沖突改變的相同算法,集合的當(dāng)前狀態(tài)可被確定性地了解。
如果共享集合102例如在機(jī)器202上被改變,則機(jī)器202上的共享對象運(yùn)行時202 將狀態(tài)改變304的通知傳送至機(jī)器218和222上的共享對象運(yùn)行時220和302。每一個共 享對象運(yùn)行時將狀態(tài)改變304應(yīng)用于共享集合102的當(dāng)前狀態(tài),從而到達(dá)集合102的新的 狀態(tài)。在兩個不同狀態(tài)改變同時來自兩個不同機(jī)器的情況下,共享對象運(yùn)行時可應(yīng)用沖突 解決算法(如,上述結(jié)合同步組件226描述的算法)來確定要應(yīng)用什么狀態(tài)變化。如上所述, 可使得該算法為確定性的,從而接收同一組沖突改變的任何兩個運(yùn)行時可以同樣的方式解 決沖突,藉此使得集合在各不同的機(jī)器上被改變至相同狀態(tài)。
圖4和5示出共享集合可如何被使用的一些示例。圖4和5中的示例是示意性的, 且并不限制此處的主題。其被提供僅用于給出共享集合可被如何使用的一些特定示例,但 是可理解的是存在其中可使用共享集合的眾多其他上下文。
圖4示出示例性任務(wù)列表,其可被實現(xiàn)為共享集合。任務(wù)列表中的每一個任務(wù)可 以是將被執(zhí)行的任務(wù)。所示出的任務(wù)列表包括四個示例性項,402、404、406、和408,且可以 是將由為公司開發(fā)新產(chǎn)品的工作組所執(zhí)行的任務(wù)。任務(wù)列表可被實現(xiàn)為集合,其中將被執(zhí) 行的每一個任務(wù)是集合中的項,且其中這些項所定義的順序代表了其中這些項將被執(zhí)行的 順序。工作組的成員可全部對于任務(wù)列表具有控制。例如,可通過e-mail和日歷程序訪問 該任務(wù)列表,其中每一個組員正在運(yùn)行實例。因此,不同的組員可在列表上添加或刪除項, 或可重新排列現(xiàn)有項。因此,程序的每一個實例可以是代表任務(wù)列表的集合的訂閱者。當(dāng)任 何組員使用他或她的程序?qū)嵗齺韺θ蝿?wù)列表做出改變時,該改變可被以上述方式傳播至程 序的其他實例。所以,工作人員可使用程序的第一實例來轉(zhuǎn)換第一和第二任務(wù)的順序(如數(shù) 字410所指示的)、且另一個工作人員可使用程序的第二實例來刪除第三任務(wù)(如數(shù)字412 所指示的)。這些改變可被處理,且可到達(dá)集合的新的狀態(tài)。
圖5示出示例性用戶界面,其可被實現(xiàn)為集合。用戶界面可例如,是桌面工具條, 其中圖5中所示的各數(shù)據(jù)項(即,數(shù)據(jù)項502、504、506、508、和510)是以對應(yīng)于項顯示在集 合中的順序以某種垂直順序圖是在工具條中的窗口小部件。窗口小部件的列表可被實現(xiàn)為 集合,且不同程序可共享對于集合的訪問。例如,用戶可確定他想要使得時鐘位于新的反饋 的頂部,且因此可轉(zhuǎn)換集合中最先兩個元素的順序(如數(shù)字512所示)。然后,用戶可將工具 條中的錯誤報告至信息技術(shù)管理器。然后,管理器可使用管理程序來連接至工具條。管理器 可識別,比如,照片查看程序具有錯誤,且因此可從工具條中刪除該窗口小部件(如數(shù)字514 所示)。以此方式,兩個人使用兩個不同應(yīng)用來修改被實現(xiàn)為集合的用戶界面。
要注意的是,在圖4和5的示例中,圖示的集合可涉及復(fù)雜的數(shù)據(jù)類型。例如,圖 4中的數(shù)據(jù)項是任務(wù)(可包含用于概述、詳細(xì)描述、截止日期、提醒日期等的字段)。且圖5 中的數(shù)據(jù)項可以是應(yīng)用處理(其可包含字段,諸如應(yīng)用的名稱、在磁盤上位置、運(yùn)行時參數(shù), 等)。換言之,這些示例示出可被用在共享集合中的任何類型的數(shù)據(jù),且集合共享機(jī)制可以 相同方式處理各種類型數(shù)據(jù),而不管數(shù)據(jù)的特性或結(jié)構(gòu)。
圖6示出其中可共享集合的示例性處理。在轉(zhuǎn)向圖6的描述之前,注意,參考圖1 - 5中所示的組件作為示例地描述了包含在圖6中的流程圖,盡管圖6的過程可以在任何系統(tǒng)中實現(xiàn),并且不限于圖1-5中示出的場景。另外地,圖6中的流程圖示出了其中按特定 順序來實現(xiàn)過程的各階段的一示例,如連接各框的線所示,但這個示圖中示出的各種階段 可以按任何順序、或以任何組合或子組合來執(zhí)行。
在602,創(chuàng)建集合。例如,程序可創(chuàng)建集合,可通過使用通常將被用于創(chuàng)建本地集合 的機(jī)制來這樣做。該集合可以是任意類型的集合一如,列表、陣列等。在604,集合可被登記 為用于共享。例如,創(chuàng)建集合的程序可發(fā)出指令,這可由在其上運(yùn)行程序的機(jī)器上的共享對 象運(yùn)行時所接收。在一個示例中,運(yùn)行時展示了 API,其允許程序發(fā)出登記指令,盡管可以其 他方式發(fā)出登記指令。
在集合被登記為共享后,可接收到對于集合的訂閱請求(在606)。例如,與創(chuàng)建集 合的程序共享同一命名空間的其他程序可對于該集合發(fā)出訂閱請求。這些訂閱請求可被向 在其上運(yùn)行有訂閱程序的機(jī)器上的共享對象運(yùn)行時發(fā)出。在一個示例中,可通過運(yùn)行時所 展示的API發(fā)出訂閱請求。為了此處的主題的目的,創(chuàng)建者被認(rèn)為是訂閱者之一。(即使創(chuàng) 建者發(fā)出登記請求而不是訂閱請求,從訂閱者是可訪問該集合的那些程序的意義上而言, 共享對象的創(chuàng)建者是訂閱者。)訂閱者可接收集合的當(dāng)前狀態(tài)(在608),且它們可存儲集合 的本地副本。
在某一點(diǎn),訂閱者對于集合做出改變(在610)。示例性改變包括插入652、刪除 654、和移動656。插入652在集合順序中特定位置處向集合添加新的項。刪除654從集合 中移除現(xiàn)有的項。移動656重新排序集合中兩個或更多個項的順序。
當(dāng)訂閱者機(jī)器上的共享對象運(yùn)行時檢測到改變時,共享對象運(yùn)行時通知可適用的 實體(多個)有關(guān)該改變(在612),且這些變化由這些實體(多個)所接收(在614)。哪些實 體是“可適用的實體”可取決于實現(xiàn)。如上所述,對于此處描述的主題的實現(xiàn),存在例如,客 戶機(jī)/服務(wù)器和對等實現(xiàn)。在客戶機(jī)/服務(wù)器實現(xiàn)中,檢測改變的運(yùn)行時可通知管理集合 的真實狀態(tài)的共享對象服務(wù)器。在對等實現(xiàn)中,每一個運(yùn)行時直接通知其他運(yùn)行時。
當(dāng)接收到對于集合的改變時,以確定性方式解決(如,表示兩個客戶機(jī)已經(jīng)在集合 的同一狀態(tài)執(zhí)行操作的改變)任何沖突改變(在616)。例如,如果兩個訂閱者已經(jīng)做出了影 響集合中“第二”項的改變(如,一個實體轉(zhuǎn)換第一和第二實體的位置,而另一個實體,同時 地,刪除了第二實體),這些沖突的改變可被解決來達(dá)到集合的真實狀態(tài)-如,使用上述結(jié)合 同步組件226 (圖示于圖2中)描述的算法。解決沖突的方式可能會也可能不會實現(xiàn)做出 改變的訂閱者的意圖,但是可明白地確定所得狀態(tài)。
在客戶機(jī)/服務(wù)器實現(xiàn)中,所解決的變化可被傳送至訂閱者(在618)。在對等實現(xiàn) 中,訂閱者和/或在訂閱者機(jī)器上的運(yùn)行時從其他訂閱者和/或運(yùn)行時處接收改變信息,并 在沒有服務(wù)器幫助的情況下,自己解決沖突。確定性沖突解決處理允許每一個客戶機(jī)以同 樣方式解決改變,從而各訂閱者可收斂于集合的真實狀態(tài)的相同結(jié)果上。(同樣地,可明白 地解決所得狀態(tài),但是所得狀態(tài)可能會也可能不會實現(xiàn)做出改變的訂閱者的意圖。)
當(dāng)任何所存在的沖突已經(jīng)被解決時(且在客戶機(jī)/服務(wù)器實現(xiàn)的情況下,是當(dāng)沖 突解決的結(jié)果已經(jīng)從服務(wù)器被通信至訂閱者時),可作出對于集合的本地副本的改變(在 620)來使得這些本地副本與真實狀態(tài)一致。然后訂閱者繼續(xù)讀取和寫入集合。
圖7示出其中可部署此處所述的本發(fā)明的各方面的示例環(huán)境。
計算機(jī)700包括一個或多個處理器702和一個或多個數(shù)據(jù)記憶組件704。(諸)處理器702通常是微處理器,如在個人臺式計算機(jī)或膝上型計算機(jī)、服務(wù)器、手持式計算機(jī)或 另一類型的計算設(shè)備中含有的那些微處理器。(諸)數(shù)據(jù)記憶組件704是能夠短期或長期存 儲數(shù)據(jù)的組件。(諸)數(shù)據(jù)記憶組件704的示例包括硬盤、可移動盤(包括光盤和磁盤)、易失 性和非易失性隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、閃存、磁帶等等。(諸)數(shù)據(jù)記憶組 件是計算機(jī)可讀存儲介質(zhì)的示例。計算機(jī)700可以包括顯示器712或與其關(guān)聯(lián),顯示器912 可以是陰極射線管(CRT)監(jiān)視器、液晶顯示(LCD)監(jiān)視器或任何其他類型的監(jiān)視器。
軟件可以被存儲在(諸)數(shù)據(jù)記憶組件704中,而且可以在一個或多個處理器(多 個)702上運(yùn)行。此類軟件的一個示例是可以實現(xiàn)以上結(jié)合圖1-6描述的一些或所有功能 的集合共享軟件706,但可以使用任何類型的軟件。可以例如通過一個或多個組件來實現(xiàn)軟 件706,這些組件可以是分布式系統(tǒng)中的組件、分開的文件、分開的函數(shù)、分開的對象、分開 的代碼行等等。其中程序被存儲在硬盤、被加載到RAM中并被(諸)計算機(jī)處理器上執(zhí)行的 計算機(jī)(例如,個人計算機(jī)、服務(wù)器計算機(jī)、手持式計算機(jī)等等)代表圖7中所描繪的場景,但 在此所描述的主題不限于這一示例。
在此所描述的主題可以被實現(xiàn)為被存儲在數(shù)據(jù)記憶組件704中的一個或多個內(nèi) 并在一個或多個處理器702上執(zhí)行的軟件。作為另一示例,本主題可以被實現(xiàn)為存儲在一 個或多個計算機(jī)可讀存儲介質(zhì)上的指令。諸如光盤或磁盤等有形介質(zhì)是存儲介質(zhì)的示例。 指令可以存在于非暫態(tài)介質(zhì)上。此類指令在由計算機(jī)或其他機(jī)器執(zhí)行時可以使得計算機(jī)或 其他機(jī)器執(zhí)行一種方法的一個或多個動作。執(zhí)行動作的指令可以被存儲在一個介質(zhì)上,或 可以開跨多個介質(zhì)來分布,以使得這些指令共同出現(xiàn)在一個或多個計算機(jī)可讀存儲介質(zhì)上 而無論所有指令是否恰好是在同一介質(zhì)上。
此外,作為方法的一部分,在此所描述的任何動作(無論是否在圖中示出)可以由 處理器(例如,一個或多個處理器702)執(zhí)行。因此,如果在此描述動作A、B和C,則可以執(zhí) 行一種包括動作A、B和C的方法。此外,如果在此描述動作A、B和C,則,可以執(zhí)行一種包 括使用處理器執(zhí)行動作A、B和C的方法。
在一個示例環(huán)境中,計算機(jī)700可以通過網(wǎng)絡(luò)708在通信上連接到一個或多個其 他設(shè)備。結(jié)構(gòu)上可以類似于計算機(jī)700的計算機(jī)710是可以被連接到計算機(jī)700的設(shè)備示 例,但其他類型的設(shè)備也可以這樣連接。
盡管用結(jié)構(gòu)特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權(quán) 利要求書中定義的主題不必限于上述具體特征或動作。更確切而言,上述具體特征和動作 是作為實現(xiàn)權(quán)利要求的示例形式公開的。
權(quán)利要求
1.一種幫助數(shù)據(jù)集合共享的方法,所述方法包括 接收所述數(shù)據(jù)集合的登記,其中所述數(shù)據(jù)集合由第一程序創(chuàng)建,其中所述登記從在其上執(zhí)行所述第一程序的機(jī)器上的對象運(yùn)行時處接收; 從與所述第一程序不同的第二程序處接收對于所述數(shù)據(jù)集合的訂閱,其中存在對于所述數(shù)據(jù)集合的一組訂閱者,且其中所述一組訂閱者包括所述第一程序和所述第二程序; 接收第一通知,所述訂閱者中的第一個已經(jīng)在所述數(shù)據(jù)集合上執(zhí)行了第一操作,對于所述數(shù)據(jù)集合的狀態(tài)做出改變;和 傳播所述狀態(tài)的所述改變至所述一組訂閱者。
2.如權(quán)利要求1所述的方法,其特征在于,還包括 接收第二通知,所述訂閱者中的第二個已經(jīng)在所述數(shù)據(jù)集合上執(zhí)行了第二操作,所述第二操作不同于所述第一操作;和 通過將所述第二操作相對于所述第一操作轉(zhuǎn)換,來解決所述第一操作和所述第二操作之間的沖突。
3.如權(quán)利要求2所述的方法,其特征在于,所述第二通知使用所述數(shù)據(jù)集合的項的順序位置描述所述第二操作,其中取決于是在所述第二操作前執(zhí)行還是在所述第二操作后執(zhí)行所述第一操作,所述順序位置是指不同的項。
4.如權(quán)利要求1所述的方法,其特征在于,還包括 維持所述數(shù)據(jù)集合的副本在所述數(shù)據(jù)集合的真實狀態(tài)中;且其中,所述傳播包括 將所述真實狀態(tài)通信至所述訂閱者。
5.如權(quán)利要求1所述的方法,其特征在于,所述傳播包括 將相對于所述數(shù)據(jù)集合的狀態(tài)的所述訂閱者版本的改變描述通信至所述訂閱者,所述改變源自執(zhí)行所述第一操作。
6.如權(quán)利要求1所述的方法,其特征在于,執(zhí)行所述方法,而不考慮在所述數(shù)據(jù)集合中的項的內(nèi)容的結(jié)構(gòu)如何。
7.如權(quán)利要求1所述的方法,其特征在于,所述第一通知包括在所述數(shù)據(jù)集合上執(zhí)行的操作的類型、正被操作的項在所述數(shù)據(jù)集合中的位置、和所述數(shù)據(jù)集合的狀態(tài)。
8.—種包括用于執(zhí)行權(quán)利要求1-7中任意一項的方法的計算機(jī)可執(zhí)行指令的計算機(jī)可讀介質(zhì)。
9.一種幫助數(shù)據(jù)集合共享的系統(tǒng),所述系統(tǒng)包括 處理器; 存儲器;以及 被存儲在所述存儲器中且在所述處理器上執(zhí)行的集合共享組件,其中所述集合共享組件從在第一機(jī)器上創(chuàng)建所述數(shù)據(jù)集合的第一程序處接收登記請求,所述第一程序從在第二機(jī)器上執(zhí)行的第二程序處接收對于所述數(shù)據(jù)集合的訂閱請求,所述第一機(jī)器不同于所述第二機(jī)器,其中所述集合共享組件從一組訂閱者的第一成員處,接收已經(jīng)由所述第一成員執(zhí)行了改變所述數(shù)據(jù)集合的狀態(tài)的第一操作的第一通知,且其中所述集合共享組件將所述狀態(tài)已經(jīng)被改變的第二通知傳播至所述一組訂閱者,其中所述一組訂閱者包括所述第一程序和所述第二程序。
10.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述集合共享組件,從所述一組訂閱者中的第二成員處,接收所述第二成員已經(jīng)在所述數(shù)據(jù)集合上執(zhí)行了第二操作的第三通知,并通過將所述第二操作相對于所述第一操作轉(zhuǎn)換來解決所述第一操作和所述第二操作之間的沖突,所述第一操作不同于所述第二操作,且所述第一成員不同于所述第二成員。
11.如權(quán)利要求10所述的系統(tǒng),其特征在于,所述第二通知使用所述數(shù)據(jù)集合的項的順序位置描述所述第二操作,其中取決于是在所述第二操作前執(zhí)行還是在所述第二操作后執(zhí)行所述第一操作,所述順序位置是指不同項。
12.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述集合共享組件維持所述數(shù)據(jù)集合的副本在所述數(shù)據(jù)集合的真實狀態(tài)中,且其中所述第二通知包括所述真實狀態(tài)。
13.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述第二通知包括相對于所述數(shù)據(jù)集合的狀態(tài)的所述訂閱者版本的改變的描述,所述改變源自執(zhí)行所述第一操作。
14.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述集合共享組件傳播所述第二通知而不考慮所述數(shù)據(jù)集合中項的內(nèi)容結(jié)構(gòu)如何。
15.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述第一通知包括在所述數(shù)據(jù)集合上執(zhí)行的操作的類型、正被操作的項在所述數(shù)據(jù)集合中的位置、和所述數(shù)據(jù)集合的狀態(tài)。
全文摘要
數(shù)據(jù)共享機(jī)制可允許程序共享對于數(shù)據(jù)集合的訪問。實現(xiàn)共享的機(jī)制可允許以任何語言編寫的程序讀取和寫入共享集合。通過允許程序或多或少以數(shù)據(jù)是純粹本地數(shù)據(jù)的方式在數(shù)據(jù)上操作,該機(jī)制可使得集合的共享特性相對于程序和編程者是透明的。集合的共享可由在其上使用集合的每一個機(jī)器上的共享對象運(yùn)行時、和由共享對象服務(wù)器來管理。共享對象服務(wù)器維持集合的真實狀態(tài),且當(dāng)程序在不了解彼此操作的情況下操作同一個集合時,確定性地解決集合。通過其來共享集合的機(jī)制可被實現(xiàn)為對于集合中數(shù)據(jù)種類不可知。
文檔編號G06F9/44GK103003815SQ201180030891
公開日2013年3月27日 申請日期2011年6月13日 優(yōu)先權(quán)日2010年6月23日
發(fā)明者M·S·奧古斯汀, J·博克哈德特, B·M·蘭伯特, R·E·奧齊, J·E·施萊費(fèi)爾, R·Z·斯派爾, P·S·蘇塞 申請人:微軟公司