專利名稱:事務存儲器中的并行嵌套事務的制作方法
事務存儲器中的并行嵌套事務本申請是申請日2008. 09. 16,申請?zhí)枮?00880107300. 2 (國際申請?zhí)枮镻CT//US2008/076563),名稱為“事務存儲器中的并行嵌套事務”的申請的分案申請。背景軟件事務存儲器(STM)是類似于數(shù)據(jù)庫事務的、用于在并發(fā)計算中控制對共享存儲器的訪問的并發(fā)控制機制。事務存儲器的上下文中的事務是對共享存儲器執(zhí)行一系列讀取和寫入的一段代碼。換言之,事務訪問一個或多個對象中的數(shù)據(jù)。事務存儲器的上下文中的對象是作為一個實體來鎖定的一組連接的存儲單元。該上下文中的對象也可能是靜態(tài) 變量,或一組這樣的變量,或者該對象可能是一組高速緩存線。STM用作傳統(tǒng)鎖定機制的替換。STM允許更簡單地編寫并發(fā)程序。事務指定應當如同其隔離執(zhí)行一樣地執(zhí)行的代碼序列。這一隔離錯覺可以通過對象的細粒度鎖定,以及通過以在發(fā)現(xiàn)事務與某一其它事務相沖突的情況下允許回退該事務的副作用的模式執(zhí)行來實現(xiàn)。如果對于數(shù)據(jù)訪問所生成的代碼被修改成包括對這些鎖定和回退機制的支持,則可以說該訪問被“事務化”。事務可以進行嵌套,并且可被分類為開放或封閉嵌套。如果一線程當前正在執(zhí)行一事務并且到達一新原子塊的開頭,則該原子塊作為當前執(zhí)行的父事務的封閉嵌套子事務來執(zhí)行。該嵌套事務與封閉事務在同一隔離邊界內執(zhí)行,并且就像封閉事務中所訪問的其他存儲器那樣,嵌套事務的影響將只在該封閉事務提交時變得可見。換言之,有效地掛起父事務,并且允許封閉嵌套事務運行至在繼續(xù)父事務中的處理之前完成。在嵌套事務回退時,其臨時影響被撤消并且父事務的狀態(tài)恢復到該嵌套事務開始的點處。給定線程正在執(zhí)行的“最外面的”事務是不嵌套的;稱之為頂層事務。該頂層事務必須原子地執(zhí)行,因此嵌套事務變成其一部分。如果某些抽象A和B各自具有即使在由并發(fā)線程使用時它們也想要維護的內部表示不變量,則可能引發(fā)嵌套,并且這些抽象由此在實現(xiàn)其方法時使用原子塊以確保并發(fā)訪問不違反這些不變量。現(xiàn)在假設某一更高級的抽象C在其實現(xiàn)時使用A和B的實例,并且具有使這些A和B實例相關的某些不變量。C的方法可能使用事務來確保不違反該不變量。如果在C的事務內部使用A和B方法,則A和B方法中的事務將進行嵌套(在這種情況下)?,F(xiàn)有事務存儲器系統(tǒng)不允許將在一個事務的隔離邊界內執(zhí)行的工作分布在多個并發(fā)執(zhí)行線程之間。在現(xiàn)有系統(tǒng)中,事務只可具有一個嵌套子事務。這些系統(tǒng)的語義簡單地不允許事務內的這樣的并行性,并且一次執(zhí)行不止一個嵌套事務的嘗試將導致嵌套事務日志條目在父事務的日志中無序混合和其他錯誤,以及用于提供隔離錯覺的基本的底層細粒度鎖定協(xié)議的崩潰。概述公開了用于支持事務存儲器系統(tǒng)中的并行嵌套事務的各種技術和方法。為單個父事務創(chuàng)建多個封閉嵌套事務,并且將這些封閉嵌套事務作為并行嵌套事務來并發(fā)執(zhí)行。使用各種技術來確保對父事務之外的其他事務隱藏并行嵌套事務的影響直到該父事務提交。在一個實現(xiàn)中,就并行嵌套事務使用版本化寫鎖。當事務存儲器字從寫鎖變?yōu)榘姹净瘜戞i時,在全局版本化寫鎖映射中形成一條目以存儲指向該版本化寫鎖所替換的寫日志條目的指針。當在事務處理期間遇到該版本化寫鎖時,咨詢全局版本化寫鎖映射以便將該版本化寫鎖轉換成指向寫日志條目的指針。在另一實現(xiàn)中,對于并行事務支持釋放重復寫鎖以便回退。在并行嵌套事務的回退處理期間,遇到表示寫鎖的第一寫日志條目。如果該寫鎖被確定為是重復的,則獲取全局鎖并使用該全局鎖來同步對全局版本化寫鎖映射的訪問。在又一實現(xiàn)中,對并行嵌套事務支持樂觀讀取確認。在樂觀讀取確認期間,如果版本化寫鎖指示來自兄弟并行嵌套事務的沖突,則咨詢信息以確定是否應破壞并行嵌套事務。在一個實現(xiàn)中,該信息被包含在版本化寫鎖和全局版本化寫鎖映射中。在又一其他實現(xiàn)中,對并行嵌套事務支持寫鎖獲取。在試圖獲取并行嵌套事務的寫鎖時,讀取并分析事務存儲器字以確定是否能夠獲取該寫鎖。如果事務存儲器字指示版本化寫鎖,則訪問全局版本化寫鎖映射以取回指向第一寫日志條目的寫日志條目指針。在又一實現(xiàn)中,對并行嵌套事務支持悲觀讀取。為并行嵌套事務創(chuàng)建悲觀重復檢測數(shù)據(jù)結構。將對應于并行嵌套事務中的每一悲觀讀取的條目形成到該數(shù)據(jù)結構中。在提交并行嵌套事務時,將新的悲觀讀鎖傳遞給直接父事務,并且在兄弟事務之間同步的情況下將一條目形成到直接父事務的單獨的悲觀重復檢測數(shù)據(jù)結構中。該悲觀重復檢測數(shù)據(jù)結構還可用于從悲觀讀取到寫鎖的升級。在另一實現(xiàn)中,對并行嵌套事務支持重試操作。在作為并行嵌套事務或并行嵌套事務的子事務的事務執(zhí)行重試時,為該重試注冊事務讀取集合。當決定將該重試傳播通過該事務的并行嵌套父事務時,該讀取集合保持注冊并成為父事務讀取集合的一部分。在又一實現(xiàn)中,寫中止補償映射可以就并行嵌套事務使用以檢測和處理錯誤破壞的父事務。當在回退期間釋放并行嵌套事務的新寫鎖時,創(chuàng)建寫中止補償映射。在并行嵌套事務回退時,在寫中止補償映射中創(chuàng)建對應于所釋放的每一個新寫鎖的條目。提供本概述以便以簡化形式介紹將在以下詳細描述中進一步描述的一些概念。本概述不旨在標識所要求保護的主題的關鍵特征或必要特征,也不旨在用于幫助確定所要求保護的主題的范圍。附圖簡述圖I是一個實現(xiàn)的計算機系統(tǒng)的圖示。圖2是在圖I的計算機系統(tǒng)上操作的一個實現(xiàn)的事務存儲器應用程序的圖示。·
圖3是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出允許在單個父事務下嵌套多個并行事務所涉及的各階段。圖4是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出在提前知道并行嵌套事務的數(shù)量時分配父日志中的并行嵌套事務條目所涉及的各階段。圖5是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出在不提前知道并行嵌套事務的數(shù)量時分配父日志中的并行嵌套事務條目所涉及的各階段。圖6示出了一個實現(xiàn)的事務存儲器字的示例結構。圖7是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出使用版本化寫鎖來確保并行嵌套事務適當?shù)厍短缀秃铣伤婕暗母麟A段。圖8和9是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出適當?shù)靥幚砬短资聞斋@取寫鎖所涉及的各階段。
圖10是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出適當?shù)靥幚砬短资聞蔗尫湃我环N寫鎖以便提交所涉及的各階段。圖11是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出適當?shù)靥幚砬短资聞蔗尫判聦戞i以便回退所涉及的各階段。圖12是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出適當?shù)靥幚砬短资聞蔗尫胖貜蛯戞i以便回退所涉及的各階段。 圖13是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出執(zhí)行樂觀讀鎖獲取。圖14A-14D是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,這些流程圖示出執(zhí)行樂觀讀取確認。圖15是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出確保對并行嵌套事務的正確的悲觀讀取操作所涉及的各階段。圖16是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出將悲觀讀鎖升級到寫鎖所涉及的各階段。圖17A-17D是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,這些流程圖示出執(zhí)行悲觀讀鎖獲取。圖18是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出就并行嵌套事務允許重試正確地工作所涉及的各階段。圖19是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出就并行嵌套事務使用寫中止補償映射所涉及的各階段。詳細描述此處的技術和方法可以在事務存儲器系統(tǒng)的一般上下文中描述,但本系統(tǒng)也用作除此之外的其它目的。在一個實現(xiàn)中,此處所描述的一個或多個技術可被實現(xiàn)為諸如微軟 . NET框架等框架程序內的、或來自為開發(fā)者提供開發(fā)軟件應用程序的平臺的任何其它類型的程序或服務的特征。在另一實現(xiàn)中,此處所描述的一個或多個技術被實現(xiàn)為處理開發(fā)在并發(fā)環(huán)境中執(zhí)行的應用程序的其它應用程序的特征。如在背景部分中所描述的,如果嵌套事務的影響是與其包含(S卩,父)事務相同的隔離邊界的一部分,則該嵌套事務被認為是封閉的。使用此處所描述的各種技術和方法,事務可同時具有多個封閉嵌套事務。這些封閉嵌套事務被稱為“并行嵌套事務(PNT)”。單個封閉事務下的所有PNT都被稱為該事務的“并行子事務”,并且該封閉事務被稱為“并行父事務”。該并行父事務及其子事務被稱為“并行嵌套”。PNT的“兄弟”是封閉(處在某一嵌套級)在同一并行父事務中的另一 PNT。在一個實現(xiàn)中,每一個PNT與普通封閉嵌套事務非常像地執(zhí)行其影響被隔離在封閉事務內并且只在并行父事務提交時才在并行嵌套之外變得可見。然而,每一個PNT都與其兄弟隔離,就像它是頂層事務那樣。PNT的影響只在它提交時才變得對其兄弟可見。如圖I所示,用于實現(xiàn)本系統(tǒng)的一個或多個部分的示例性計算機系統(tǒng)包括諸如計算設備100等計算設備。在其最基本的配置中,計算設備100通常包括至少一個處理單元102和存儲器104。取決于計算設備的確切配置和類型,存儲器104可以是易失性的(如RAM)、非易失性的(如ROM、閃存等)或是兩者的某種組合。該最基本配置在圖I中由虛線106來示出。另外,設備100還可具有附加特征/功能。例如,設備100還可包含附加存儲(可移動和/或不可移動),包括但不限于磁盤、光盤或磁帶。這樣的附加存儲在圖I中由可移動存儲108和不可移動存儲110示出。計算機存儲介質包括以用于存儲諸如計算機可讀指令、數(shù)據(jù)結構、程序模塊或其它數(shù)據(jù)等信息的任何方法或技術來實現(xiàn)的易失性和非易失性、可移動和不可移動介質。存儲器104、可移動存儲108和不可移動存儲110都是計算機存儲介質的示例。計算機存儲介質包括但不限于,RAM、R0M、EEPR0M、閃存或其它存儲器技術、CD-ROM、數(shù)字多功能盤(DVD)或其它光存儲、磁帶盒、磁帶、磁盤存儲或其它磁存儲設備、或者可用于存儲所需信息并且可由設備100訪問的任何其它介質。任何這樣的計算機存儲介質都可以是設備100的一部分。計算設備100包括允許計算設備100與其它計算機/應用程序115進行通信的一個或多個通信連接114。設備100還可以具有諸如鍵盤、鼠標、筆、語音輸入設備、觸摸輸入·設備等輸入設備112。還可以包括諸如顯示器、揚聲器、打印機等輸出設備111。這些設備在本領域中公知且無需在此處詳細討論。在一個實現(xiàn)中,計算設備100包括事務存儲器應用程序200。事務存儲器應用程序200將在圖2中更詳細地描述?,F(xiàn)在轉向圖2并繼續(xù)參考圖1,示出了在計算設備100上操作的事務存儲器應用程序200。事務存儲器應用程序200是駐留在計算設備100上的應用程序中的一個。然而,可以理解,事務存儲器應用程序200可另選地或另外地被具體化為一個或多個計算機上的計算機可執(zhí)行指令和/或與圖I所示的不同變型。另選地或另外地,事務存儲器應用程序200的一個或多個部分可以是系統(tǒng)存儲器104的一部分、可以在其它計算機和/或應用程序115上、或可以是計算機軟件領域的技術人員能想到的其它此類變型。事務存儲器應用程序200包括負責執(zhí)行在此描述的技術中的部分或全部的程序邏輯204。程序邏輯204包括用于允許在單個父事務下嵌套多個并行事務的邏輯206 (如以下參考圖3所描述的);用于允許并行嵌套事務正確地與其他封閉嵌套事務嵌套和合成的邏輯208 (如以下參考圖7-14所描述的);用于允許并行嵌套事務在具有獨立日志的情況下執(zhí)行并且在低爭用的情況下將鎖所有權和日志傳遞給父事務的邏輯210 (如以下參考圖4-5所描述的);用于啟用并行嵌套事務以便在同一事務中進行樂觀和悲觀讀取的邏輯212(如以下參考圖15-17所描述的);用于啟用并行嵌套事務來進行就地或緩沖寫入的邏輯214(如以下參考圖7、11和12所描述的);用于就并行嵌套事務允許重試正確地工作的邏輯216(如以下參考圖18所描述的);用于就并行嵌套事務允許寫中止補償映射工作的邏輯218(如以下參考圖19所描述的);以及用于操作應用程序的其他邏輯220?,F(xiàn)在轉向圖3-19并繼續(xù)參考圖1-2,更詳細地描述了用于實現(xiàn)事務存儲器應用程序200的一個或多個實現(xiàn)的各階段。在某些實現(xiàn)中,圖3-19的過程至少部分地在計算設備100的操作邏輯中實現(xiàn)。圖3示出了允許在單個父事務下嵌套多個并行事務所涉及的各階段的一個實現(xiàn)。該過程開始于起始點240,在那里提供將創(chuàng)建準備好執(zhí)行的一組并行嵌套事務的功能或其他特征(階段242)。全部一次性或惰性地在需要時為給定父事務創(chuàng)建一組并行嵌套事務(階段244)。使用特殊邏輯來事務性地執(zhí)行、提交、回退、重新執(zhí)行和重試并行嵌套事務(階段246)。當并行嵌套事務完成時,必須在該并行嵌套事務及其所有并行兄弟都已完成后破壞該事務(階段248)。該過程在結束點250處結束。
圖4和5示出了如何分配父日志中的并行嵌套事務條目。并行嵌套事務能夠在具有獨立日志的情況下執(zhí)行并且在根據(jù)圖4和5所描述的分配技術中的一種來分配后在低爭用的情況下將鎖所有權、日志和其他數(shù)據(jù)傳遞給父事務?,F(xiàn)在轉向圖4,示出了用于在提前知道并行嵌套事務的數(shù)量時分配父日志中的并行嵌套事務條目的一個實現(xiàn)。該過程開始于起始點270,在那里因為提前知道并行嵌套事務的數(shù)量,所以在任何并行嵌套事務(PNT)開始執(zhí)行之前為嵌套中的每一個PNT創(chuàng)建一個并行嵌套事務條目(PNTE)(階段272)。當在回退或提交處理期間需要時,并行嵌套事務在進行最小同步的情況下從父事務中取回并行嵌套事務條目。。在一個實現(xiàn)中,預先分配的PNTE被保持在父事務中的陣列中。PNT可通過對下一可用并行嵌套事務索引的簡單的比較和交換操作來獲取指向下一可用PNTE的指針(階段274)。比較和交換(CAS)是原子地執(zhí)行給定值和給定存儲單元的內容之間的比較并且如果它們匹配,則將給定的新值存儲在該存儲單元中的操作。如果它們不匹配,則不采取動作。存在許多用于在許多不同的CPU和操作系統(tǒng)上執(zhí)行CAS操作的方法,一些是硬件,一些是軟件。如此處所使用的,術語CAS意指一般覆蓋所有這些方法。并行嵌套事務用信息來填充父日志中的并行嵌套事務條目(階段276)。在一個實現(xiàn)中,該信息包括指向子事務的日志的指針和指向子事務的寫中止補償映射和/或悲觀讀取對象表(在適當時)的指針。該寫中止補償映射在圖19中更詳細地描述。悲觀讀取對象表在圖15中更詳細地描述。該過程在結束點278處結束。圖5示出了在不提前知道并行嵌套事務的數(shù)量時分配父日志中的并行嵌套事務條目所涉及的各階段的一個實現(xiàn)。該過程開始于起始點290,在那里在創(chuàng)建并行嵌套事務時為新并行嵌套事務條目分配父日志中的空間(階段292)。當并行嵌套事務提交時,在父日志中創(chuàng)建并行嵌套事務條目(階段294)。同步對父日志的訪問以移動該父事務的當前日志點以便獲取對并行嵌套事務條目的下一可用空間的訪問(階段296)。并行嵌套事務用信息來填充父日志中的并行嵌套事務條目(階段298)。在一個實現(xiàn)中,該信息包括指向子事務的日志的指針和指向子事務的寫中止補償映射和/或悲觀讀取對象表(在適當時)的指針。該寫中止補償映射在圖19中更詳細地描述。悲觀讀取對象表在圖15中更詳細地描述。該過程在結束點300處結束。圖6示出了一個實現(xiàn)的事務存儲器字(TMW)的示例結構320,該結構具有用于標記各種鎖定狀態(tài)的各個位322。在一個實現(xiàn)中,TMW與每一對象相關聯(lián)。在一個實現(xiàn)中,使用 單個硬件字表示;但允許存儲鎖定信息的對TMW的眾多其他表示是可能的。在此處所描述的示例結構中,TMW可指示相關聯(lián)的對象是寫鎖定的或者不是寫鎖定的。TMW中的一個位專用于該區(qū)別。如果TMW不是寫鎖定的,則它包含被稱為版本/計數(shù)對324 (V/C對)的版本號和悲觀讀取者計數(shù)。在該狀態(tài)中,TMW中的某數(shù)量的位記錄對象的版本號,而其余位表示當前保持該對象上的悲觀讀鎖的事務數(shù)量的計數(shù)。當事務保持對象中的寫鎖時,該鎖可具有兩種類型(通過TMW中的另一位來進行區(qū)分)。通常,寫鎖定的TMW中的其余位包含指向鎖定事務的寫日志中的條目326 ;該寫日志條目(WLE)包含關于對象和鎖定的其他信息。例如,WLE可能包含在獲取寫鎖之前的對象的TMW值;在另一實現(xiàn)中,該WLE可能包含對其作出未提交修改的對象的“影子副本”。在另一狀態(tài)中,寫鎖定的TMW包含版本化寫鎖(VWL)。此處,TMW中的其余位(被稱為VWL[V/C]328)表示在該TMW仍舊是寫鎖定時的對象的版本號以及悲觀讀取者的計數(shù),這類似于V/C對。
在繼續(xù)至關于如何使用版本化寫鎖的更多詳細討論之前,讓我們首先探查將幫助示出對版本化寫鎖(VWL)的需求的示例。假設存在就地STM系統(tǒng),以及獲取對對象01的寫鎖的頂層事務Txl。01的TMW被設為WLE1,其是Txl的日志中表示Txl的對01的寫鎖的寫日志條目?,F(xiàn)在,假設引入兩個PNT,即Tx2和Tx3,且Txl作為父并行事務。Τχ2和Τχ3是并行嵌套中的兄弟事務并且并發(fā)執(zhí)行。Τχ2和Τχ3可訪問被Txl鎖定的數(shù)據(jù),但它們必須彼此隔離。因此,雖然Τχ2和Τχ3都可訪問01,但它們必須不被允許同時這樣做。現(xiàn)在,假設Τχ3希望從01讀取。它執(zhí)行樂觀讀操作,從而在其日志中創(chuàng)建將01的值記錄為WLEl的樂觀讀日志條目。接著,假設Τχ2對01寫入。Τχ2將獲取對01的寫鎖,并將01的TMW設為WLE2,這作為Τχ2的日志中的寫日志條目。WLE2記錄WLEl是01的TMW的前一值。Τχ2現(xiàn)在可對01的各字段寫入,并且以就地寫入的方式這樣做。當Τχ2繼續(xù)執(zhí)行時,它讀取包含來自Τχ2的未提交寫入的01的各字段。Τχ3通過定義來破壞并且應當回退。然而,如果出于任何原因Τχ2在Τχ3試圖提交之前回退,則Τχ2必須釋放其對01的寫鎖。為此,Τχ2通常將01的TMW設回為WLEl。但現(xiàn)在當Τχ3試圖提交時,它將看到01的TMW包含在Τχ3首先讀取01時所設置的相同的值。在這種情況下,Τχ3將表現(xiàn)為有效,并且將無法識別它從 Τχ2讀取了未提交的寫入。因此,當Τχ2回退時它必須將01的TMW設為除WLEl之外的某個值,并且它必須以確保該系統(tǒng)中的其他事務(PNT兄弟或其他頂層事務)識別出01仍舊被Txl寫鎖定的方式這樣做。這通過將01的TMW設為版本化寫鎖(VWL)并在全局版本化寫鎖映射(VWLM)中形成指示Txl持有對01的寫鎖的條目來實現(xiàn)。VWL和VWLM的細節(jié)和用途在下文中描述。該示例示出了其中VWL是必需的一種情況。然而,本領域的普通技術人員將會理解,存在眾多其中可使用VWL的情況,如隨著在本章節(jié)的其余部分中詳細描述用于鎖獲取和釋放的各過程將變得顯而易見的。圖7示出了使用版本化寫鎖來確保并行嵌套事務適當?shù)厍短缀秃铣伤婕暗母麟A段的一個實現(xiàn)。該過程開始于起始點340,在那里提供可以是版本/計數(shù)對、寫日志條目(WLE)或版本化寫鎖(VWL)中的一個的事務存儲器字(階段342)。當事務存儲器字(TMW)變?yōu)榘姹净瘜戞i時,在全局版本化寫鎖映射(VWLM)中形成涉及版本化寫鎖所替換的舊寫日志條目指針的條目,該條目通過對象地址來索引(階段344)。當看到版本化寫鎖時,咨詢全局版本化寫鎖映射以便將該版本化寫鎖轉換成寫日志條目指針,并且對寫日志條目指針進行普通處理(階段346 )。無論是保持在V/C對還是版本化寫鎖中,事務存儲器字中的版本號在提交或中止處理期間都始終遞增(階段348)。就在將版本化寫鎖放置在事務存儲器字中之前在全局版本化寫鎖映射中形成一條目,并且只要該事務存儲器字包含該版本化寫鎖,該條目就保留(階段350)。在任何時刻,事務都必須獲取訪問全局版本化寫鎖映射的全局鎖(階段352)。該過程在結束點354處結束。圖8和9示出了適當?shù)靥幚砬短资聞斋@取寫鎖所涉及的各階段的一個實現(xiàn)。新寫鎖是在事務嵌套中首次獲取的鎖,而重復寫鎖是嵌套事務可獲取的對先輩事務當前已寫鎖定的對象的寫鎖。該過程開始于起始點370,在那里嵌套事務讀取事務存儲器字(階段372)。如果該事務存儲器字不是V/C對(判定點374),則該過程繼續(xù)至在下一節(jié)中描述的圖9階段404。如果事務存儲器字是V/C對且C (悲觀讀取者的計數(shù))大于O (判定點375),則執(zhí)行圖16的過程以處理悲觀讀取到寫鎖的升級。如果事務存儲器字是V/C對且C等于O (判定點375),則這指示該事務存儲器字未被悲觀地鎖定以供任何事務讀取或寫入,因此允許獲取新寫鎖。為此,該系統(tǒng)形成新的寫日志條目以記錄版本號并將該寫日志條目附加到該事務的寫日志(階段376)。然后執(zhí)行比較和交換以便將事務存儲器字值從V/C對切換至寫日志條目指針(例如,WLE*)(階段378)。如果比較和交換成功(判定點380),則成功獲取鎖(階段382)。如果比較和交換不成功(判定點380),則存在沖突(階段384)并且未成功獲取鎖。該過程在結束點386處結束。繼續(xù)至圖9,如果TMW不是V/C對(圖8上的判定點374),并且如果事務存儲器字不是版本化寫鎖(判定點404),則它是指向WLEa的WLE*并且該過程在階段408處繼續(xù)。如果事務存儲器字是版本化寫鎖(判定點404),則使用全局版本寫鎖映射來取回指向WLEa的底層WLE* (階段406)。如果WLEa不被任何先輩事務所擁有(判定點408),則存在沖突(階段410)并且該過程在結束點420處結束。如果WLEa被一先輩擁有(判定點408),則形成新WLEb以記錄WLEa并且將WLEb附加到事務的寫日志(階段412)。然后執(zhí)行比較和交換以便 將事務存儲器字值從WLEa*切換至WLEb* (階段414)。如果比較和交換成功(判定點416),則成功獲取鎖(階段418)。如果比較和交換不成功(判定點416),則存在沖突(階段410)并且未成功獲取鎖。該過程在結束點420處結束。圖10示出了適當?shù)靥幚砬短资聞蔗尫湃我环N寫鎖以便提交所涉及的各階段的一個實現(xiàn)。該過程開始于起始點440,在那里在提交處理期間在事務寫日志中遇到WLEx (階段442)。簡單地將寫鎖的所有權和WLEx傳遞給直接父事務(階段444)。通過在提交時將所有權從并行嵌套事務傳遞給父事務,其他兄弟事務現(xiàn)在發(fā)現(xiàn)它們現(xiàn)在能夠為自己獲取寫鎖。同樣,獲取重復寫鎖的動作防止兄弟事務能夠為它們自己獲取寫鎖。該過程在結束點446處結束。圖11示出了適當?shù)靥幚砬短资聞蔗尫判聦戞i以便回退所涉及的各階段的一個實現(xiàn)。該過程開始于起始點460,在那里在回退處理期間在事務寫日志中遇到WLEx(階段462)。系統(tǒng)檢查以查看WLEx表示什么類型的寫鎖(階段464)。如果WLEx不表示新寫鎖(判定點466),則執(zhí)行用于釋放重復寫鎖的邏輯(階段471),如在圖12中參考一個實現(xiàn)所描述的。如果WLEx表示新寫鎖(判定點466),則取回存儲在WLEx中的前一版本號(階段468)。從WLEx中取回事務存儲器字的位置并且使用普通存儲操作來釋放寫鎖以便將事務存儲器字值改為適用于該系統(tǒng)類型(就地或緩沖)的V/C對(階段470)。在緩沖系統(tǒng)的一個實現(xiàn)中,將事務存儲器字值改回到表示原始版本號。在就地系統(tǒng)的一個實現(xiàn)中,則將事務存儲器字值改為表示原始版本號加一。該過程在結束點472處結束。圖12示出了適當?shù)靥幚砬短资聞蔗尫胖貜蛯戞i以便回退所涉及的各階段的一個實現(xiàn)。在一個實現(xiàn)中,該過程僅用于在回退時遞增對象的版本號的系統(tǒng),即就地系統(tǒng)。在緩沖系統(tǒng)的某些實現(xiàn)中,不在回退期間增加版本號。在這些系統(tǒng)中,用于釋放新寫鎖的過程(圖11)可用于釋放重復寫鎖。該過程開始于起始點490,在那里在回退處理期間在事務寫日志中遇到WLEx(階段492)。系統(tǒng)檢查以查看WLEx表示什么類型的寫鎖(階段494)。如果鎖不是重復寫鎖(判定點496),則執(zhí)行用于釋放新寫鎖的邏輯(階段511),如在圖11中參考一個實現(xiàn)所描述的。如果鎖是重復寫鎖,則獲取用于同步對全局版本化寫鎖映射的訪問的全局鎖(階段498)。從WLEx中取回原始寫日志條目指針WLEy*和事務存儲器字的位置(階段500)。形成對應于涉及WLEy的對象的新的全局版本化寫鎖映射條目(階段502)。然后釋放用于同步對全局版本化寫鎖映射的訪問的全局鎖(階段504)。從WLEx中取回原始版本號(階段506),并且形成作為原始版本號+1的新版本化寫鎖值(階段508)。使用普通存儲操作來釋放寫鎖以便將事務存儲器字值從WLEx*改為新版本化寫鎖(階段510)。該過程在結束點512處結束。圖13是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,其示出執(zhí)行樂觀讀鎖獲取。該過程開始于起始點530,在那里在事務執(zhí)行對對象的樂觀讀取時讀取對象的當前TMW值(階段532)。創(chuàng)建樂觀讀日志條目(階段534)并且用當前TMW值和該TMW的位置來填充該讀日志條目(階段536)。將讀日志條目附加到事務的讀日志(階段538)。在一個實現(xiàn)中,該過程對于以下所有類型的事務都是相同的頂層、簡單嵌套或者并行嵌套事務。該過程在結束點540處結束。圖14A-14D是圖I的系統(tǒng)的一個實現(xiàn)的處理流程圖,這些流程圖示出執(zhí)行樂觀讀取確認。該過程開始于起始點560,在那里在試圖提交事務或以其他方式確定該事務是否有效時考慮該事務的讀日志中的每一個樂觀讀日志條目(階段562)。從讀日志條目中取回原始TMW值(階段564),并且讀取當前TMW值(階段566)。注意,在每一種情況下,如果系統(tǒng)正·在使用寫中止補償映射(WACM)(在圖19中描述),則只要在兩個版本號中存在差異,就咨詢當前聚集WACM (在確認或提交處理期間形成)。如果原始TMW是V/C對(判定點568),則執(zhí)行圖14B中所描述的過程。如果原始TMW是WLE* (判定點570),則執(zhí)行圖14C中所描述的過程。如果原始TMW既不是V/C對也不是WLE*,則該原始TMW是VWL(階段572),并且執(zhí)行圖14D的過程。讓我們更詳細地看一下這些情況中的每一種。圖14B涵蓋了關于當原始TMW是V/C對時(判定點568)的一個實現(xiàn)中的在樂觀讀取確認期間執(zhí)行的示例性過程的更多細節(jié)。如果當前TMW是V/C對(判定點590),并且原始TMW和當前TMW中的版本號匹配(判定點592),則事務有效(階段594)。如果當前TMW是V/C對(判定點590),并且原始TMW和當前TMW中的版本號不匹配(判定點592),則事務無效(階段596)。如果當前TMW改為是WLE*(判定點598),并且如果事務擁有WLE,并且WLE中的已保存的版本號匹配舊TMW (判定點600),則該事務有效(階段594)。如果當前TMW不是V/C對(判定點590),并且當前TMW不是WLE* (判定點598),則TMW是VffL (階段602)。使用已鎖定對象的地址來在VWLM中進行同步查找。如果不存在VWLM條目(判定點604),則事務無效(階段596)。如果存在條目(判定點604),則使用該VWLM條目來取回VWL所替換的WLE*。如果事務擁有WLE,并且WLE中的已保存的版本號匹配舊TMW (判定點606),則事務有效(階段594)。否則,事務無效(階段596)。該過程在結束點608處結束?,F(xiàn)在轉向圖14C,示出了當原始TMW是WLE*時的一個實現(xiàn)中的在樂觀讀取確認期間執(zhí)行的示例性過程。如果當前TMW是V/C對(判定點620),則當前事務無效(階段630)。如果當前TMW不是V/C對(判定點620 ),而改為是WLE* (判定點624 ),則系統(tǒng)檢查以查看原始和當前TMW是否匹配,以及當前事務或任何先輩事務是否擁有WLE (判定點626)。如果滿足這兩個準則,則事務有效(階段628 )。否則,事務無效(階段630 )。如果當前TMW不是V/C對(判定點620),并且不是WLE* (判定點624),則當前TMW是VWL (階段632)。如果該事務或任何先輩事務擁有來自原始TMW的WLE,并且如果保存在該WLE中的版本號匹配VWL中的版本號(判定點634),則事務有效(628)。否則,事務無效(階段630)。該過程在結束點636處結束。
現(xiàn)在轉向圖14D,示出了當原始TMW是VWL時的一個實現(xiàn)中的在樂觀讀取確認期間執(zhí)行的示例性過程。如果當前TMW是V/C對(判定點650),則事務由于沖突而無效(階段660)。如果當前TMW不是V/C對(判定點650),而改為是WLE*(判定點654),則系統(tǒng)檢查以查看當前事務或任何先輩事務是否擁有WLE,以及存儲在該WLE中的版本號是否匹配VWL中的版本(判定點656)。如果滿足這兩個準則,則事務有效(階段658)。否則,事務無效(階段660)。如果當前TMW不是V/C對(判定點650),并且當前TMW不是WLE* (判定點654),則當前TMW是VWL (階段662)。在VWLM中執(zhí)行查找以便將VWL轉換成WLE* (階段664)。如果未找到條目(判定點666),則事務無效(階段660)。否則,如果找到條目(判定點666),則系統(tǒng)檢查以查看原始和當前VWL的版本號是否匹配,以及該事務或任何先輩事務是否擁有在VWLM中找到的對應于TMW的WLE (判定點668)。如果滿足這兩個準則,則事務有效(階段658)。否則,事務無效(階段660)。該過程在結束點670處結束。具有簡單的封閉嵌套事務的系統(tǒng)中的正確的悲觀讀取操作需要使用被稱為悲觀·讀取對象表(PROT)的重復檢測數(shù)據(jù)結構。每一個頂層事務在事務開始時或者惰性地在首次悲觀讀取操作時創(chuàng)建PROT。當該事務或任何后代事務試圖獲取對一對象的悲觀讀鎖時,該事務咨詢PROT以確定是否已經(jīng)獲取悲觀讀鎖。如果該對象在PROT中,則該對象已被事務嵌套讀鎖定。如果該對象不在PROT中,并且如果該對象當前未被另一事務寫鎖定,則使用CAS操作遞增存儲在該對象的TMW中的V/C對中的C (悲觀讀取者的計數(shù))來獲取悲觀讀鎖。如果該CAS操作成功,則在PROT中形成一條目以記錄該嵌套現(xiàn)在已鎖定該對象以便進行悲觀讀取的事實。當釋放悲觀讀鎖時,在頂層提交或回退期間,遞減C (再次用CAS),并且移除PROT條目。讓我們現(xiàn)在看一下如何就并行嵌套事務使用PR0T。圖15示出了確保對于并行嵌套事務的正確的悲觀讀取操作所涉及的各階段的一個實現(xiàn)。該過程開始于起始點690,在那里并行嵌套事務在初始化期間,或者惰性地在并行嵌套事務獲取第一個悲觀讀鎖期間創(chuàng)建悲觀重復檢測數(shù)據(jù)結構(被稱為PR0T,如上所述)(階段692)。在事務試圖將悲觀讀鎖升級到寫鎖時,系統(tǒng)使用該數(shù)據(jù)結構。將對應于并行嵌套事務或任何后續(xù)子事務所作出的對對象的首次悲觀讀取的條目形成到PROT中(階段694)。在提交時,將新的悲觀讀鎖傳遞給直接父事務,并且形成適當?shù)母窹ROT條目(階段696)。釋放重復讀鎖以允許兄弟事務在并行子事務提交后獲取寫訪問(階段698)。系統(tǒng)然后破壞與重復的悲觀讀鎖相關聯(lián)的日志條目(階段700)。在提交后,可以用其余事務來破壞子事務的PROT (階段702)。該過程在結束點704處結束。圖16示出了將悲觀讀鎖升級到寫鎖所涉及的各階段的一個實現(xiàn)。該過程開始于起始點720,在那里發(fā)現(xiàn)所需要的對對象的寫鎖已經(jīng)對悲觀讀取開放(階段722)。查詢子事務的PROT (階段724)以查看讀取者的當前計數(shù)并且決定當前事務是否能夠計入(accountfor)所有這些讀取(階段726)。如果結果計入所有悲觀讀取者,則子事務可試圖照常升級至寫鎖(階段728)。如果仍舊存在未計入的讀取者,則子事務必須查詢所有先輩事務的PROT以確定其是否可以升級到寫鎖(階段730)。如果任何先輩事務是并行父事務,則必須考慮該并行父事務的PROT以及已經(jīng)提交的任何并行兄弟事務的PR0T。這些兄弟事務的PROT經(jīng)由PNTE保持在并行父事務的日志中。需要適當?shù)耐絹泶_保存在對這些兄弟事務的PROT的無競爭訪問。該同步通過確保PNT不在將其PROT放置在相關聯(lián)的PNTE中后訪問該PROT來實現(xiàn)。如果先輩事務和任何已提交的并行兄弟事務補償額外的悲觀讀取者,則子事務可嘗試照常升級至寫鎖(階段732)。在一個實現(xiàn)中,升級如下實現(xiàn)。形成新的寫日志并將其添加到PNT的日志。將當前TMW值放置在WLE中以便在回退和提交處理期間使用。如果當前TMW值是VWL,則在進行適當?shù)耐降那闆r下使用VWLM來首先將VWL轉換成WLE*。使用CAS來獲取寫鎖。如果CAS成功,則升級奏效,否則存在沖突。該過程在結束點734處結束。現(xiàn)在是時候描述圖17A-17D所示的用于在處于并行嵌套事務中時執(zhí)行悲觀讀鎖獲取的示例性過程。該過程開始于17A,在那里讀取當前TMW (階段752)。如果TMW是V/C對(判定點754),則執(zhí)行圖17B中所描述的過程。如果TMW是WLE* (判定點756),則執(zhí)行圖17C中所描述的過程。如果TMW不是V/C對(判定點754),并且不是WLE* (判定點756),則TMW是VWL(階段758),并且執(zhí)行圖17D中所描述的過程?,F(xiàn)在將更詳細地看一下這些情況中的每一種。 現(xiàn)在轉向圖17B,如果TMW是V/C對,則咨詢事務的PROT以確定該事務是否已經(jīng)持有對對象的悲觀讀鎖(判定點769)。如果存在PROT條目,則該過程在結束點776處結束。如果不存在PROT條目(判定點769),在使用比較和交換(CAS)來遞增悲觀讀取者的計數(shù)C(階段770)。如果CAS成功(判定點772),則獲取鎖并且形成PROT條目(階段774)。如果CAS失敗(判定點772),則重試,這通過參考圖17A的階段752示出。如圖17C所示,如果TMW是WLE*,并且當前事務或任何先輩事務擁有該WLE (判定點790),則系統(tǒng)確定擁有該WLE的事務在并行父事務之下還是之上(判定點792)。如果擁有該WLE的事務在并行父事務之下(判定點792),則悲觀讀取成功(階段794)。如果擁有該WLE的事務在并行父事務之上(判定點792),則系統(tǒng)將TMW切換至VWL以便與兄弟事務進行協(xié)調。為此,在進行適當同步的情況下形成VWLM條目以記錄WLE* (階段796),并且從存儲在VWL中的版本號中形成VWL且將C (悲觀讀取者的計數(shù))設為I (階段798)。用CAS來在TMW中設置新VWL (階段800)。如果CAS成功,則形成PROT條目并且獲取悲觀讀鎖(階段806)。如果CAS不成功,則移除VWLM條目(階段804),并且通過返回到圖17A的階段752來重試。該過程在結束點810處結束。如圖17D所示,如果TMW是VWL,則在進行適當同步的情況下經(jīng)由VWLM將VWL轉換成WLE* (階段820)。如果該事務或任何先輩事務擁有該WLE (判定點822),則使用CAS來遞增TMW中的VWL中的C (悲觀讀取者的計數(shù))(階段824)。如果CAS成功(判定點826),則形成PROT條目并且獲取鎖。如果CAS失敗,則通過繼續(xù)至圖17A的階段752來重試。如果該事務或任何先輩事務不擁有該WLE(判定點822),則存在沖突(階段830)。該過程在結束點832處結束。圖18示出了就并行嵌套事務允許重試正確地工作所涉及的各階段的一個實現(xiàn)。在深入研究圖18的細節(jié)以及討論就并行嵌套事務允許重試工作之前,首先有必要提供關于一個實現(xiàn)的重試操作的某些背景信息。重試操作允許在事務之間進行基本通信。在事務執(zhí)行重試操作時,回退該事務的影響并掛起執(zhí)行直到該事務讀取的某物改變。當檢測到改變時,重新執(zhí)行事務。重試操作可用于某些非常常見的數(shù)據(jù)結構,如阻塞隊列。例如,事務可檢查以查看隊列是否為空并且如果該隊列為空,則重試,或者如果該隊列不為空,則移除一元素。該事務將在隊列保持不變時阻塞并且在隊列狀態(tài)改變時重新執(zhí)行,這給予了該事務另一次完成機會。
在一個實現(xiàn)中,在事務執(zhí)行重試操作時,系統(tǒng)為對待重試事務的讀取集合中的每一讀取注冊。重試事務等待讀取集合中的某物已改變的通知。從釋放寫鎖的特定事務發(fā)出等待通知。事務以兩種方式中的一種知道是否需要通知。以第一種方式,如果事務存儲器字在寫鎖獲取期間包含等待者位,則在釋放期間在對象等待者映射中查找事務存儲器字,并發(fā)信號通知每一等待事務。以第二種方式,如果寫事務在釋放所有寫鎖后發(fā)現(xiàn)等待事務的全局計數(shù)大于0,則該寫事務將使用事務等待者映射來確定哪些事務(如果有的話)正在等待寫入位置并需要發(fā)信號通知。在每一種情況下,使用普通存儲操作來釋放寫鎖。在另一實現(xiàn)中,以回退僅重試嵌套事務和等待其讀取集合來開始漸進式重試操作。在等待某一特定時間或者滿足某一其他條件后,執(zhí)行退避過程以回退重試事務的直接父事務,從而增加原始等待集合的大小。重復該退避過程直到回退最頂層的父事務,以便增加對每一個下一父事務的附加等待。該聚集等待集合與最頂層的父事務相關聯(lián)并且任何通·知都將導致重新執(zhí)行該最頂層的父事務。現(xiàn)在參考圖18,現(xiàn)在將討論對如何能夠就并行嵌套事務使用重試的解釋。該過程開始于起始點850,當并行嵌套事務或任何順序后代執(zhí)行重試時,系統(tǒng)照常為重試注冊事務的讀取集合(階段852)。該系統(tǒng)包括用于確定在將重試操作擴展成包括事務的先輩事務中的某一子集之前重試事務應等待多久的試探法(階段854)。調整這些對于并行嵌套事務的試探法并允許延長的等待時間,只要其他并行兄弟事務是活動的。如果超出該延長的等待時間,則將重試操作擴展成包括父事務(階段856)。在進一步傳播之前考慮兄弟事務的狀態(tài)(階段858)。當決定將重試傳播通過并行嵌套父事務時,破壞所有子事務,并且然后必須在回退重試父事務之前完成(階段860)。當決定將重試傳播通過父事務時,并行嵌套事務的讀取集合保持注冊并成為父事務讀取集合的一部分(階段862)。注意,將已被提交到父事務中的任何并行兄弟事務的讀取集合與該父事務的讀取集合一起成為等待集合的一部分。被將重試傳播至父事務的決定中止的任何并行兄弟事務不對該等待集合作出貢獻。該過程在結束點864處結束。圖19示出了在就并行嵌套事務使用寫中止補償映射所涉及的各階段的一個實現(xiàn)。在深入研究圖19的細節(jié)以及如何能夠就并行嵌套事務使用寫中止補償映射之前,有必要提供關于一個實現(xiàn)的寫中止補償映射的某些背景信息。寫中止補償映射可用于檢測使用就地寫入的事務存儲器系統(tǒng)中的嵌套子事務的遭錯誤破壞的父事務。寫中止補償映射(或其他存儲機制)跟蹤為回退的每一嵌套事務所釋放的每一個鎖的釋放計數(shù)。嵌套事務釋放寫鎖定的次數(shù)被記錄在它們相應的寫中止補償映射中??梢栽诟甘聞盏拇_認期間使用釋放計數(shù)來確定明顯無效的樂觀讀取實際上是否是有效的。在一個實現(xiàn)中,在處理父事務日志時,所看到的對于嵌套子事務的任何寫中止補償映射被組合到父事務中的聚集的寫中止補償映射中。如果樂觀讀取由于版本號不匹配而未能確認,則咨詢聚集的寫中止補償映射來取回對于嵌套子事務的特定變量的寫鎖釋放計數(shù)。如果版本號差與嵌套子事務的寫鎖釋放計數(shù)正好匹配,則樂觀讀取是有效的?,F(xiàn)在返回到圖19,讓我們看一下如何能夠就并行嵌套事務使用寫中止補償映射。該過程開始于起始點880,在那里在回退并行嵌套事務期間釋放新寫鎖時創(chuàng)建寫中止補償映射(WACM)(階段882)。當嵌套事務回退時,它為所釋放的每一個新寫鎖創(chuàng)建WACM條目(階段884)。當在提交期間將并行嵌套事務的日志的所有權傳遞給父事務時,在邏輯上將WACM放在該日志的前面(階段886)。如上所述,就像任何其他嵌套事務的WACM那樣將在父事務回退期間使用這些PNT WACM,并且這些PNT WACM將確保對父事務樂觀讀取的正確確認(階段888)。該過程在結束點890處結束。盡管用結構特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權利要求書中定義的主題不必限于上述具體特征或動作。相反,上述具體特征和動作是作為實現(xiàn)權利要求的示例形式公開的。落入在此所述和/或所附權利要求所描述的實現(xiàn)的精神的范圍內的所有等效方案、更改和修正都期望受到保護。例如,計算機軟件領域普通技術人員將認識到,此處所討論的示例可以在一個或多個計算機上不同地組織來包括比這些示例中所描繪的更少或更多選項或特征?!?br>
權利要求
1.一種用于就并行嵌套事務使用版本化寫鎖的方法,所述方法包括以下步驟 當事務存儲器字從寫鎖變?yōu)榘姹净瘜戞i時,在全局版本化寫鎖映射中形成一條目以存儲指向所述版本化寫鎖替換的寫日志條目的指針(344);以及 當在事務處理期間遇到所述版本化寫鎖時,咨詢所述全局版本化寫鎖映射以便將所述版本化寫鎖轉換成指向所述寫日志條目的指針(346)。
2.如權利要求I所述的方法,其特征在于,通過使用所述版本化寫鎖,并行嵌套事務能夠獲取和釋放父事務所持有的鎖以便適當?shù)赝蕉淮蚱扑龈甘聞盏母綦x邊界(352)。
3.如權利要求I所述的方法,其特征在于,存儲在所述事務存儲器字中的版本號始終遞增,無論是保持在版本計數(shù)對還是所述版本化寫鎖中(348 )。
4.如權利要求I所述的方法,其特征在于,還包括以下步驟 在獲取悲觀讀取時,將所述事務存儲器字切換至所述版本化寫鎖以便提供用于存儲悲觀讀取者的計數(shù)的空間,且所述版本化寫鎖現(xiàn)在指示兄弟事務可能已經(jīng)執(zhí)行對父事務已經(jīng)寫鎖定的對象的悲觀讀取(796)。
全文摘要
本發(fā)明公開了用于支持事務存儲器系統(tǒng)中的并行嵌套事務的各種技術和方法。為單個父事務創(chuàng)建多個封閉嵌套事務,并且這些封閉嵌套事務作為并行嵌套事務來并發(fā)執(zhí)行。使用各種技術來確保對父事務之外的其他事務隱藏并行嵌套事務的影響直到該父事務提交。例如,就并行嵌套事務使用版本化寫鎖。當事務存儲器字從寫鎖變?yōu)榘姹净瘜戞i時,在全局版本化寫鎖映射中形成一條目以存儲指向該版本化寫鎖所替換的寫日志條目的指針。當在事務處理期間遇到該版本化寫鎖時,咨詢全局版本化寫鎖映射以便將該版本化寫鎖轉換成指向寫日志條目的指針。
文檔編號G06F17/30GK102929702SQ20121039925
公開日2013年2月13日 申請日期2008年9月16日 優(yōu)先權日2007年9月18日
發(fā)明者M·M·馬格魯?shù)? D·德特勒夫, J·J·達菲, G·格雷費, V·K·格羅弗 申請人:微軟公司