本申請要求由Zoran Radovic等人于2014年3月28日提交的標(biāo)題為“Memory Corruption Detection Support For Distributed Shared Memory Applications”的美國臨時申請No.61/972,082的優(yōu)先權(quán),其內(nèi)容通過引用被結(jié)合于此。本申請涉及于2013年3月15日提交的標(biāo)題為“MEMORY BUS PROTOCOL TO ENABLE CLUSTERING BETWEEN NODES OF DISTINCT PHYSICAL DOMAIN ADDRESS SPACES”、代理人案號為50277-4032的美國專利申請No.13/838,542;于2013年3月15日提交的標(biāo)題為“REMOTE-KEY BASED MEMORY BUFFER ACCESS CONTROL MECHANISM”、代理人案號為50277-4091的美國專利申請No.13/839,525;以及于2013年3月14日提交的標(biāo)題為“MEMORY SHARING ACROSS DISTRIBUTED NODES”、代理人案號為50277-4072的美國專利申請No.13/828,555;在本段中的每個申請的內(nèi)容通過引用被結(jié)合于此。
技術(shù)領(lǐng)域
本公開內(nèi)容一般涉及用于檢測分布式節(jié)點(diǎn)系統(tǒng)中的存儲器損壞的技術(shù)。
背景技術(shù):
在互聯(lián)網(wǎng)上或在企業(yè)網(wǎng)絡(luò)上可用的許多功能和服務(wù)由分布式計算節(jié)點(diǎn)中的一個或多個集群提供。例如,用來運(yùn)行大規(guī)模業(yè)務(wù)的數(shù)據(jù)庫可以由在形成集群的多個分布式計算節(jié)點(diǎn)上運(yùn)行的多個數(shù)據(jù)庫服務(wù)器來維護(hù)并且通過其變得可用。利用計算節(jié)點(diǎn)的集群提供功能或服務(wù)會具有許多優(yōu)點(diǎn)。例如,利用集群,相對容易添加另一個節(jié)點(diǎn)來增加系統(tǒng)的能力,以滿足不斷增長的需求。集群也使得有可能在各種節(jié)點(diǎn)之間進(jìn)行負(fù)載均衡,使得如果一個節(jié)點(diǎn)變得負(fù)擔(dān)過重,則工作可以被分配給其它節(jié)點(diǎn)。另外,集群使得有可能容忍故障,使得如果一個或多個節(jié)點(diǎn)失效,則功能或服務(wù)仍然可用。此外,集群中的節(jié)點(diǎn)可以能夠共享信息,以便例如一起工作和執(zhí)行事務(wù)、負(fù)載均衡、實(shí)現(xiàn)故障預(yù)防和恢復(fù)等。
對于在集群上運(yùn)行的應(yīng)用,可能需要存儲器損壞檢測。當(dāng)存儲器位置被不恰當(dāng)?shù)卦L問或修改時,發(fā)生存儲器損壞。存儲器損壞的一個例子發(fā)生在當(dāng)應(yīng)用試圖推動指針變量超出為特定數(shù)據(jù)結(jié)構(gòu)分配的存儲器時。這些存儲器錯誤會導(dǎo)致程序崩潰或意外的程序結(jié)果。
對于單機(jī)應(yīng)用存在存儲器損壞檢測方案。單機(jī)存儲器損壞檢測方案允許計算機(jī)在運(yùn)行時跟蹤應(yīng)用指針并且就存儲器錯誤通知用戶。
但是,在集群上運(yùn)行的應(yīng)用比單機(jī)應(yīng)用更難調(diào)試。對于調(diào)試在集群上運(yùn)行的應(yīng)用存在一些解決方案。這些調(diào)試解決方案可能包括內(nèi)部工具支持、運(yùn)行時支持、或校驗(yàn)和方案。不幸的是,這些解決方案使編程模型變得復(fù)雜并且向系統(tǒng)增加了性能開銷,并且可能無法檢測到存儲器損壞。
在本部分中描述的方法是可以實(shí)行的方法,但不一定是先前已構(gòu)想或?qū)嵭械姆椒?。因此,除非另外指出,否則不應(yīng)當(dāng)假定在本部分中描述的任何方法僅僅憑其包括在本部分中就有資格作為現(xiàn)有技術(shù)。
附圖說明
在附圖中:
圖1是繪出實(shí)施例中的示例分布式節(jié)點(diǎn)系統(tǒng)的框圖;
圖2示出了根據(jù)實(shí)施例的其中分布式節(jié)點(diǎn)系統(tǒng)中的一些節(jié)點(diǎn)是共享存儲器的例子;
圖3是繪出在實(shí)施例中用于檢測節(jié)點(diǎn)中的存儲器損壞的過程的流程圖;
圖4是繪出在實(shí)施例中用于在檢測到存儲器損壞時在加載高速緩存行時更新高速緩存行的過程的流程圖;
圖5A是繪出在實(shí)施例中用于在遠(yuǎn)程節(jié)點(diǎn)中執(zhí)行存儲的過程的流程圖;
圖5B是繪出在實(shí)施例中用于從遠(yuǎn)程節(jié)點(diǎn)向源節(jié)點(diǎn)傳播存儲的過程的流程圖;
圖6是繪出在實(shí)施例中用于在源節(jié)點(diǎn)中執(zhí)行存儲的過程的流程圖;
圖7是示出其上可以實(shí)現(xiàn)本發(fā)明的實(shí)施例的計算機(jī)系統(tǒng)的框圖。
具體實(shí)施方式
在下面的描述中,出于解釋的目的而闡述了許多具體細(xì)節(jié),以便提供對本發(fā)明的透徹理解。但是,將顯而易見,本發(fā)明也可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在其它情況下,眾所周知的結(jié)構(gòu)和設(shè)備以框圖的形式示出以避免不必要地模糊本發(fā)明。
總體概述
根據(jù)本文描述的實(shí)施例,分布式節(jié)點(diǎn)系統(tǒng)中的節(jié)點(diǎn)被配置為當(dāng)存儲器在節(jié)點(diǎn)之間被共享時支持存儲器損壞檢測。分布式節(jié)點(diǎn)系統(tǒng)中的節(jié)點(diǎn)在本文稱為“共享高速緩存行”的存儲器單元中共享數(shù)據(jù)。節(jié)點(diǎn)將版本值與共享高速緩存行中的數(shù)據(jù)相關(guān)聯(lián)。版本值和數(shù)據(jù)可以存儲在節(jié)點(diǎn)的主存儲器中的共享高速緩存行中。當(dāng)節(jié)點(diǎn)執(zhí)行存儲器操作時,它可以使用版本值來確定是否已發(fā)生存儲器損壞。例如,指針可以與版本值相關(guān)聯(lián)。當(dāng)指針被用來訪問存儲器時,指針的版本值可以指示在存儲器位置處的期望版本值。如果版本值不匹配,則已發(fā)生存儲器損壞。
如該術(shù)語在本文中所使用的,指針是包含指向存儲器中存儲的另一個值的存儲器位置的地址的值。該值可加載到處理器的寄存器中。根據(jù)實(shí)施例,指針包含兩個單獨(dú)的值即版本值和虛擬地址,其中虛擬地址被轉(zhuǎn)換為物理地址以用于執(zhí)行存儲器操作。
分布式節(jié)點(diǎn)系統(tǒng)中的節(jié)點(diǎn)與系統(tǒng)中的其它節(jié)點(diǎn)共享它們主存儲器的部分。節(jié)點(diǎn)(“源節(jié)點(diǎn)”)使其主存儲器的一部分可用于與系統(tǒng)中的其它節(jié)點(diǎn)共享,并且另一個節(jié)點(diǎn)(“遠(yuǎn)程節(jié)點(diǎn)”)在其自己的主存儲器中復(fù)制該共享存儲器部分。存儲器部分可以包括一個或多個共享高速緩存行。遠(yuǎn)程節(jié)點(diǎn)創(chuàng)建復(fù)制的高速緩存行,它是源節(jié)點(diǎn)中的源高速緩存行的副本。
在實(shí)施例中,共享高速緩存行包括版本位和數(shù)據(jù)位。共享高速緩存行的版本位指示與共享高速緩存行相關(guān)聯(lián)的版本值。配置為指向共享高速緩存行的指針也包含版本值。當(dāng)指針被用來在共享高速緩存行上執(zhí)行存儲器操作時,節(jié)點(diǎn)比較指針的版本值和由共享高速緩存行的版本位指示的版本值。
在實(shí)施例中,源節(jié)點(diǎn)響應(yīng)于存儲器分配請求而生成版本值。例如,如果應(yīng)用為數(shù)據(jù)結(jié)構(gòu)分配存儲器,則源節(jié)點(diǎn)可以生成要與那個數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)的版本值。生成的版本值和相關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)可以被復(fù)制在本地節(jié)點(diǎn)的主存儲器中。
在實(shí)施例中,存儲器操作是通過應(yīng)用請求的。如果節(jié)點(diǎn)檢測到已發(fā)生存儲器破壞,則節(jié)點(diǎn)可以就錯誤通知應(yīng)用。節(jié)點(diǎn)也可以終止存儲器操作而不是執(zhí)行它。
在另一種實(shí)施例中,節(jié)點(diǎn)使用版本值來維護(hù)節(jié)點(diǎn)之間的一致性。例如,在遠(yuǎn)程高速緩存行中的版本值可以指示該遠(yuǎn)程高速緩存行已過時。遠(yuǎn)程節(jié)點(diǎn)然后可以根據(jù)對應(yīng)的源高速緩存行更新該遠(yuǎn)程高速緩存行。在實(shí)施例中,一個或多個版本值被保留用于指示何時復(fù)制的高速緩存行是無效的。當(dāng)節(jié)點(diǎn)響應(yīng)于存儲器分配請求而生成版本值時,一個或多個保留的版本值不被使用。
系統(tǒng)概述
圖1示出了在實(shí)施例中的示例分布式節(jié)點(diǎn)系統(tǒng)100的框圖。分布式節(jié)點(diǎn)系統(tǒng)100包括三個節(jié)點(diǎn):節(jié)點(diǎn)1 102A、節(jié)點(diǎn)2 102B和節(jié)點(diǎn)3 102C。雖然在本說明中示出了三個節(jié)點(diǎn),但是系統(tǒng)100可以包括更多或更少的節(jié)點(diǎn)。
每個節(jié)點(diǎn)102包括主存儲器108。主存儲器108包括一個或多個共享高速緩存行106。在實(shí)施例中,共享高速緩存行106包括版本位112和數(shù)據(jù)位114。數(shù)據(jù)被存儲在數(shù)據(jù)位114中。版本位112指示與共享高速緩存行106相關(guān)聯(lián)的版本值。共享高速緩存行106可以是相同的大小或者大小可以不同。
節(jié)點(diǎn)102可以使其主存儲器108的一部分可用于與其它節(jié)點(diǎn)共享(“共享存儲器部分”)。另一個節(jié)點(diǎn)102可以分配其主存儲器108的一部分(“復(fù)制的存儲器部分”)用于復(fù)制共享存儲器部分的內(nèi)容。在實(shí)施例中,節(jié)點(diǎn)102既可以使其主存儲器108的一部分可用于共享,又可以復(fù)制由另一個節(jié)點(diǎn)102變得可用的主存儲器108的一部分。對于本發(fā)明的目的,節(jié)點(diǎn)102可以共享任何數(shù)量的存儲器部分(零個或多個),并且可以復(fù)制任意數(shù)量的共享存儲器部分(零個或多個)。每個存儲器部分可以包括一個或多個共享高速緩存行106。在實(shí)施例中,共享或復(fù)制主存儲器108的一部分分別包括共享或復(fù)制一個或多個共享高速緩存行106。
作為例子,在圖2中,節(jié)點(diǎn)2 102B正在使其主存儲器108B的一部分可用于與其它節(jié)點(diǎn)共享。節(jié)點(diǎn)1和3正在復(fù)制共享存儲器部分202。因此,節(jié)點(diǎn)1 102A在其主存儲器108A中具有存儲器部分204A,它是共享存儲器部分202的副本,并且節(jié)點(diǎn)3 102C在主存儲器108C中具有存儲器部分204C,它是共享存儲器部分202的副本。節(jié)點(diǎn)3 102C也正在使其主存儲器108C的一部分可用于與其它節(jié)點(diǎn)共享。節(jié)點(diǎn)1和節(jié)點(diǎn)2正在復(fù)制共享存儲器部分206。因此,節(jié)點(diǎn)2 102B具有存儲器部分208B,它是共享存儲器部分206的副本,并且節(jié)點(diǎn)1 102A具有存儲器部分208A,它是共享存儲器部分206的副本。在示出的例子中,節(jié)點(diǎn)2和節(jié)點(diǎn)3既在共享存儲器部分,又在復(fù)制來自另一個節(jié)點(diǎn)的共享存儲器部分。節(jié)點(diǎn)1正在從兩個節(jié)點(diǎn)復(fù)制存儲器部分,但是沒有共享存儲器部分。
在實(shí)施例中,節(jié)點(diǎn)102可以包括目錄210。對于每個共享存儲器部分,目錄210指示系統(tǒng)100中哪些節(jié)點(diǎn)包含那個共享存儲器部分的副本。在實(shí)施例中,目錄210包含用于共享存儲器部分中每個源高速緩存行的條目。即,目錄210包含用于其中節(jié)點(diǎn)102是源節(jié)點(diǎn)的每個共享高速緩存行的條目。
在實(shí)施例中,節(jié)點(diǎn)102可以包括索引212。對于每個共享存儲部分,索引212指示目錄在該共享存儲器部分的主存儲器108中的位置。對于每個復(fù)制的存儲器部分,索引212還指示共享了該存儲器部分的源節(jié)點(diǎn)和該共享存儲器部分在源節(jié)點(diǎn)的主存儲器中的位置。在實(shí)施例中,索引212包含用于主存儲器108中每個共享高速緩存行的條目。對于復(fù)制的存儲器部分中的每個共享高速緩存行,索引212指示共享了源高速緩存行的源節(jié)點(diǎn)和該源高速緩存行在源節(jié)點(diǎn)的主存儲器中的的位置。
系統(tǒng)初始化
為了準(zhǔn)備系統(tǒng)100中的節(jié)點(diǎn)102以共享存儲器,節(jié)點(diǎn)102被初始化。在實(shí)施例中,節(jié)點(diǎn)102可以以下面描述的方式被初始化。節(jié)點(diǎn)102可以共享任何數(shù)量的存儲器部分,并且可以復(fù)制任意數(shù)量由其它節(jié)點(diǎn)共享的存儲器部分。取決于節(jié)點(diǎn)102決定做什么,它可以執(zhí)行所描述的操作中的一些操作、全部操作或者不執(zhí)行任何所描述的操作。
在初始化期間,節(jié)點(diǎn)102確定它是否希望使其主存儲器108的任何部分可用于與系統(tǒng)100中的其它節(jié)點(diǎn)共享。如果它確實(shí)希望,則節(jié)點(diǎn)102向其它節(jié)點(diǎn)102廣播信息,指示其愿意共享其主存儲器的一部分。廣播的信息可以包括關(guān)于節(jié)點(diǎn)102、共享存儲器部分202的大小、以及存儲器部分202在主存儲器108上位于哪里的信息。該信息向系統(tǒng)100中的其它節(jié)點(diǎn)指示在哪里訪問共享存儲器位置。
節(jié)點(diǎn)102可以接收指示另一個節(jié)點(diǎn)希望共享其主存儲器的一部分的廣播信息。響應(yīng)于接收到廣播信息,節(jié)點(diǎn)102可以決定是否要復(fù)制或不復(fù)制共享存儲器部分202。如果節(jié)點(diǎn)102決定復(fù)制該共享存儲器部分,則節(jié)點(diǎn)將分配足以存儲共享存儲器部分的副本的復(fù)制的存儲器部分。
在實(shí)施例中,節(jié)點(diǎn)102不利用數(shù)據(jù)填充分配的存儲器。即,節(jié)點(diǎn)只分配存儲器,但不從共享存儲器部分復(fù)制數(shù)據(jù)。節(jié)點(diǎn)將用于復(fù)制的存儲器部分中的每個復(fù)制的高速緩存行的版本值設(shè)置為指示復(fù)制的高速緩存行是無效的值。在實(shí)施例中,直到應(yīng)用請求數(shù)據(jù),節(jié)點(diǎn)102才將來自共享存儲器部分的數(shù)據(jù)復(fù)制到其存儲器部分的副本中。當(dāng)節(jié)點(diǎn)試圖執(zhí)行針對復(fù)制的高速緩存行的操作時,版本值將向節(jié)點(diǎn)指示該共享高速緩存行是無效的。節(jié)點(diǎn)然后可以將源高速緩存行從共享存儲器部分復(fù)制到復(fù)制的存儲器部分中的復(fù)制的高速緩存行中。
在實(shí)施例中,如果節(jié)點(diǎn)102正共享其主存儲器108的一部分,則該節(jié)點(diǎn)在主存儲器108中分配存儲器用于存儲目錄結(jié)構(gòu)210。目錄結(jié)構(gòu)210指示哪些節(jié)點(diǎn)包含由節(jié)點(diǎn)102共享的每個存儲器部分的副本。在實(shí)施例中,目錄結(jié)構(gòu)210包含用于在共享存儲器部分中每個共享高速緩存行的目錄條目。換句話說,每個源高速緩存行與目錄條目相關(guān)聯(lián)。因此,對于每個源高速緩存行,目錄條目指示哪些其它節(jié)點(diǎn)具有應(yīng)該是那個源高速緩存行的副本的復(fù)制的高速緩存行。在實(shí)施例中,目錄條目也可以指示遠(yuǎn)程節(jié)點(diǎn)中每個復(fù)制的高速緩存行是否是有效(最新)副本。在實(shí)施例中,目錄條目可以包括串行化對目錄條目的訪問的鎖(lock)。
在實(shí)施例中,節(jié)點(diǎn)102為索引結(jié)構(gòu)212在其主存儲器108中分配存儲器。索引結(jié)構(gòu)212包含用于主存儲器108中每個共享高速緩存行的索引條目。如果節(jié)點(diǎn)102正在共享共享存儲器部分中的共享高速緩存行,則索引條目為共享高速緩存行指示目錄條目在主存儲器108中的位置。如果共享高速緩存行處于復(fù)制的存儲器部分中,則索引條目指示共享了共享存儲器部分的源節(jié)點(diǎn)和對應(yīng)的源高速緩存行在源節(jié)點(diǎn)的主存儲器中的位置。在實(shí)施例中,如果節(jié)點(diǎn)102決定在從源節(jié)點(diǎn)接收到廣播信息時復(fù)制共享存儲器部分,則它更新索引結(jié)構(gòu)212。從源節(jié)點(diǎn)接收到的信息可以對應(yīng)于存儲在索引結(jié)構(gòu)212中的信息。
示例性存儲器分配
在實(shí)施例中,當(dāng)存儲器被分配時,節(jié)點(diǎn)102給存儲器位置指派版本值。例如,當(dāng)應(yīng)用執(zhí)行malloc請求時,節(jié)點(diǎn)102分配所請求的存儲器量、生成與所分配的存儲器相關(guān)聯(lián)的版本值、并且將指針返回給應(yīng)用。在實(shí)施例中,所分配的存儲器位置包括一個或多個共享高速緩存行。版本值可以由每個共享高速緩存行的版本位指示。
在實(shí)施例中,版本值由應(yīng)用的堆管理器(heap manager)生成。版本值可以從有效值的范圍中選擇。在實(shí)施例中,一個或多個版本值被用來指示何時共享高速緩存行是無效的,并且不包括在從中選擇的有效值的范圍內(nèi)。版本值的格式可以取決于實(shí)現(xiàn)方式而不同。例如,版本值可以是四位長,從而導(dǎo)致十六種可能的值。在另一個例子中,版本值可以是44位的時間戳。
版本值也與指向所分配的存儲器的指針相關(guān)聯(lián)。在實(shí)施例中,指針包括版本值和虛擬地址。例如,節(jié)點(diǎn)可以使用44位寄存器來存儲指針,但是虛擬地址不使用該整個44位。版本值可以存儲在44位寄存器的額外未使用位中。
如果所分配的存儲器作為共享存儲器部分的一部分被共享,則其它節(jié)點(diǎn)102可以將在所分配的存儲器位置中的共享高速緩存行復(fù)制到其各自的復(fù)制的存儲器部分中。在實(shí)施例中,復(fù)制共享高速緩存行包括復(fù)制相關(guān)聯(lián)的版本值。其它節(jié)點(diǎn)102也可以生成指向復(fù)制的共享高速緩存行的指針。版本值可以與每個生成的指針相關(guān)聯(lián)被存儲。
基于指針的存儲器損壞檢測
圖3是示出用于利用與指針相關(guān)聯(lián)的版本值檢測節(jié)點(diǎn)102中存儲器損壞的過程的流程圖。該過程可以當(dāng)執(zhí)行涉及由其中與版本值相關(guān)聯(lián)的指針引用的共享高速緩存行的存儲器操作時執(zhí)行。該過程可以在下文中被稱為基于指針的存儲器損壞檢測。
例如,節(jié)點(diǎn)102從應(yīng)用接收命令。該命令可以是例如執(zhí)行存儲器操作的請求,諸如加載或存儲命令。在命令的執(zhí)行期間,節(jié)點(diǎn)102執(zhí)行用于檢測存儲器損壞的步驟。命令可以包括指向主存儲器108中的共享高速緩存行的指針。如以上所討論的,在實(shí)施例中,當(dāng)節(jié)點(diǎn)102向應(yīng)用分配存儲器時,節(jié)點(diǎn)返回與版本值相關(guān)聯(lián)的指針。
在步驟302中,節(jié)點(diǎn)102確定與包括在命令中的指針相關(guān)聯(lián)的版本值。在實(shí)施例中,指針包括版本值。與指針相關(guān)聯(lián)的版本值可以指示命令期望要與所請求的共享高速緩存行相關(guān)聯(lián)的版本值。例如,如果命令在使用指針訪問數(shù)據(jù)結(jié)構(gòu),則版本值可以與該數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)。
在步驟304中,節(jié)點(diǎn)102將指針的版本值與和所請求的共享高速緩存行相關(guān)聯(lián)的版本值進(jìn)行比較。在實(shí)施例中,共享高速緩存行的版本位指示與該共享高速緩存行相關(guān)聯(lián)的版本值。該方法然后前進(jìn)到?jīng)Q定框308。
在決定框308處,如果指針的版本值與和所請求的共享行相關(guān)聯(lián)的版本值不匹配,則存儲器損壞被檢測到。在實(shí)施例中,執(zhí)行自陷(trap)操作。自陷操作可以包括向應(yīng)用指示存儲器損壞被檢測到。自陷操作也可以包括終止存儲器操作的執(zhí)行。可替代地,該過程結(jié)束并且存儲器操作繼續(xù)。
如果指針的版本值與和所請求的共享行相關(guān)聯(lián)的版本值匹配,則該過程結(jié)束并且存儲器操作繼續(xù)。
在圖3中示出的用于利用與指針相關(guān)聯(lián)的版本值檢測存儲器損壞的過程可以在執(zhí)行各種存儲器操作時執(zhí)行。將進(jìn)一步詳細(xì)描述這些存儲器操作。
節(jié)點(diǎn)之間的一致性
在實(shí)施例中,共享高速緩存行中的版本值也可以被用來管理節(jié)點(diǎn)之間的共享高速緩存行的一致性。當(dāng)源節(jié)點(diǎn)更新源高速緩存行時,遠(yuǎn)程節(jié)點(diǎn)中的復(fù)制的高速緩存行將會過時。但是,遠(yuǎn)程節(jié)點(diǎn)可以不立即更新其復(fù)制的高速緩存行。而是,每個復(fù)制的高速緩存行的版本值被設(shè)置以指示該復(fù)制的高速緩存行是無效的。以后,如果遠(yuǎn)程節(jié)點(diǎn)試圖訪問該復(fù)制的高速緩存行,則節(jié)點(diǎn)將看到該復(fù)制的高速緩存行是無效的并且將更新該復(fù)制的高速緩存行。
在實(shí)施例中,當(dāng)節(jié)點(diǎn)102執(zhí)行存儲命令時,它可以執(zhí)行自陷操作。在實(shí)施例中,取決于目標(biāo)共享高速緩存行是源高速緩存行還是復(fù)制的高速緩存行,節(jié)點(diǎn)102將執(zhí)行不同的步驟。如果目標(biāo)共享高速緩存行是復(fù)制的高速緩存行,則節(jié)點(diǎn)102將把存儲傳播到源節(jié)點(diǎn)中的源高速緩存行。在實(shí)施例中,在將存儲發(fā)送到源節(jié)點(diǎn)之前,遠(yuǎn)程節(jié)點(diǎn)可以在存儲緩沖區(qū)中記錄該存儲。
在實(shí)施例中,節(jié)點(diǎn)102包含索引212。如果所請求的共享高速緩存行是復(fù)制的高速緩存行,則索引條目將指示源節(jié)點(diǎn)和用于復(fù)制的高速緩存行的源高速緩存行的位置。因此,節(jié)點(diǎn)102可以引用索引212來確定所請求的共享高速緩存行是復(fù)制的高速緩存行還是源高速緩存行?;谠摯_定,節(jié)點(diǎn)102可以確定采取哪些步驟來執(zhí)行存儲命令。
遠(yuǎn)程節(jié)點(diǎn)加載
在實(shí)施例中,當(dāng)源節(jié)點(diǎn)更新源高速緩存行時,節(jié)點(diǎn)不更新對應(yīng)的復(fù)制的高速緩存行。當(dāng)復(fù)制的高速緩存行在節(jié)點(diǎn)處被加載時,節(jié)點(diǎn)可以只更新復(fù)制的高速緩存行。指示復(fù)制的高速緩存行無效的版本值觸發(fā)更新。當(dāng)復(fù)制的高速緩存行被更新時,存儲器損壞檢測被執(zhí)行。圖4是示出當(dāng)在節(jié)點(diǎn)102中請求復(fù)制的高速緩存行時用于更新共享高速緩存行的過程的流程圖。
在步驟402中,節(jié)點(diǎn)102從應(yīng)用接收命令。例如,命令可以是涉及加載操作的存儲器操作,諸如加載命令。
命令可以包括指向主存儲器108中的共享高速緩存行的指針。如以上所討論的,在實(shí)施例中,當(dāng)節(jié)點(diǎn)102向應(yīng)用分配存儲器時,節(jié)點(diǎn)返回與版本值相關(guān)聯(lián)的指針。出于本說明的目的,將假定包含在命令中的指針與版本值相關(guān)聯(lián)。
在步驟404中,節(jié)點(diǎn)102確定版本值是否指示共享高速緩存行是無效的。在實(shí)施例中,至少一個版本值被用來指示共享高速緩存行是無效的并且不在存儲器分配期間被使用。在實(shí)施例中,共享高速緩存行是復(fù)制的高速緩存行。如果例如復(fù)制的高速緩存行還沒有用來自源高速緩存行的數(shù)據(jù)填充,則版本值可以指示共享高速緩存行是無效的。所請求的共享高速緩存行可以是復(fù)制的高速緩存行或可以不是復(fù)制的高速緩存行。
在一個例子中,共享高速緩存行不是復(fù)制的高速緩存行。在實(shí)施例中,不在復(fù)制的存儲器部分中的共享高速緩存行被假定為始終是有效的。
在另一個例子中,共享高速緩存行是復(fù)制的高速緩存行。共享高速緩存行中的數(shù)據(jù)可能會過時。即,復(fù)制的高速緩存行中的數(shù)據(jù)與源高速緩存行中的數(shù)據(jù)不同。這會例如當(dāng)源節(jié)點(diǎn)存儲數(shù)據(jù)到源高速緩存行時發(fā)生。
該方法然后前進(jìn)到?jīng)Q定框406。在決定框406處,如果版本值指示共享高速緩存行是有效的,則節(jié)點(diǎn)102繼續(xù)過程的執(zhí)行并且前進(jìn)到步驟410,在該步驟中,基于指針的存儲器損壞檢測被執(zhí)行。
如果版本值指示共享高速緩存行是無效的,則方法前進(jìn)到步驟408。在步驟408中,節(jié)點(diǎn)使命令的執(zhí)行掛起并且執(zhí)行自陷操作。
在實(shí)施例中,自陷操作包括將源高速緩存行復(fù)制到復(fù)制的高速緩存行。復(fù)制源高速緩存行可以包括復(fù)制源高速緩存行的版本位和數(shù)據(jù)位。因此,在復(fù)制被執(zhí)行之后,復(fù)制的高速緩存行的版本值被設(shè)置為來自源高速緩存行的版本值。在復(fù)制的高速緩存行中的數(shù)據(jù)被設(shè)置為在源高速緩存行中包含的最近數(shù)據(jù),如由遠(yuǎn)程節(jié)點(diǎn)對復(fù)制的高速緩存行做出的還沒有被傳播到源高速緩存行的記錄到存儲緩沖區(qū)中的任何存儲所修改的那樣。因此,節(jié)點(diǎn)能夠更新共享高速緩存行中的數(shù)據(jù),以便維護(hù)與其它節(jié)點(diǎn)的一致性。
在實(shí)施例中,節(jié)點(diǎn)包含索引212。節(jié)點(diǎn)可以使用對應(yīng)于所請求的共享高速緩存行的索引條目,以便確定哪些源節(jié)點(diǎn)包含對應(yīng)的源高速緩存行以及對應(yīng)的源高速緩存行位于源節(jié)點(diǎn)的主存儲器中哪里。
在實(shí)施例中,源節(jié)點(diǎn)包含目錄210。當(dāng)遠(yuǎn)程節(jié)點(diǎn)更新其復(fù)制的高速緩存行時,源節(jié)點(diǎn)可以更新用于對應(yīng)的源高速緩存行的目錄條目,以指示在遠(yuǎn)程節(jié)點(diǎn)處的副本是有效副本。
遠(yuǎn)程節(jié)點(diǎn)存儲
如前面提到的,在實(shí)施例中,在存儲被發(fā)送到源節(jié)點(diǎn)之前,遠(yuǎn)程節(jié)點(diǎn)使用存儲緩沖區(qū)來記錄該存儲。圖5A是示出由分布式節(jié)點(diǎn)系統(tǒng)100中的遠(yuǎn)程節(jié)點(diǎn)102執(zhí)行的存儲的流程圖。該存儲可以被執(zhí)行,以執(zhí)行存儲命令。命令可以包括指向主存儲器108中復(fù)制的高速緩存行的指針。指針可以與版本值相關(guān)聯(lián)。
在步驟502中,節(jié)點(diǎn)102使命令的執(zhí)行掛起并且執(zhí)行自陷操作來執(zhí)行以下步驟。
在步驟504處,存儲被記錄在存儲緩沖區(qū)中。記錄在存儲緩沖區(qū)中的信息可以指示向其執(zhí)行存儲的存儲器位置和要存儲什么數(shù)據(jù)。在存儲緩沖區(qū)中記錄存儲可以包括指示源節(jié)點(diǎn)和應(yīng)該向其執(zhí)行存儲的源節(jié)點(diǎn)的主存儲器中源高速緩存行的位置、存儲線程、以及與(一個或多個)存儲相關(guān)聯(lián)的版本號。
在實(shí)施例中,節(jié)點(diǎn)102包含索引212。節(jié)點(diǎn)可以使用對應(yīng)于所請求的共享高速緩存行的索引,以便確定哪個源節(jié)點(diǎn)包含對應(yīng)的源高速緩存行以及對應(yīng)的源高速緩存行位于源節(jié)點(diǎn)的主存儲器中哪里。
在步驟506中,節(jié)點(diǎn)102確定復(fù)制的高速緩存行的版本值是否指示復(fù)制的高速緩存行是無效的。如果版本值指示共享高速緩存行是無效的,則存儲不對該共享高速緩存行執(zhí)行。如果該值指示復(fù)制的高速緩存行有效,則該方法前進(jìn)到步驟508。
在508處,節(jié)點(diǎn)102執(zhí)行基于指針的存儲器損壞檢測。如果由節(jié)點(diǎn)102執(zhí)行的基于指針的存儲器損壞檢測沒有檢測到存儲器損壞,則該方法前進(jìn)到步驟510。
在步驟510處,節(jié)點(diǎn)102將數(shù)據(jù)存儲在它的共享高速緩存行中。
自陷操作結(jié)束。
更新傳播
在實(shí)施例中,遠(yuǎn)程節(jié)點(diǎn)將存儲記錄在其存儲緩沖區(qū)中,但不將存儲發(fā)送到包含對應(yīng)的源高速緩存行的源節(jié)點(diǎn)。在節(jié)點(diǎn)將存儲記錄在其存儲緩沖區(qū)之后,該存儲需要被傳播到源節(jié)點(diǎn)。傳播該存儲可以作為與記錄存儲緩沖區(qū)相同的過程的一部分來執(zhí)行,或者它可以被單獨(dú)地執(zhí)行。在實(shí)施例中,節(jié)點(diǎn)可以接收包括傳播存儲操作的命令。例如,存儲命令可以包括傳播該存儲的指令。存儲可以在自陷操作完成之后作為恢復(fù)存儲命令的執(zhí)行的一部分被傳播。在另一種實(shí)施例中,節(jié)點(diǎn)102可以在向共享高速緩存行寫入之前為條目檢查存儲緩沖區(qū)。圖5B是示出分布式節(jié)點(diǎn)系統(tǒng)100中的存儲傳播的流程圖。存儲可以由另一個執(zhí)行的線程異步傳播。
在步驟522處,節(jié)點(diǎn)從存儲緩沖區(qū)中檢索條目。條目可以包括指示源節(jié)點(diǎn)、應(yīng)該對其執(zhí)行存儲的源高速緩存行、要被存儲的數(shù)據(jù)、與(一個或多個)存儲相關(guān)聯(lián)的版本號以及存儲線程的信息。
在步驟524處,節(jié)點(diǎn)102向源節(jié)點(diǎn)請求用于源高速緩存行的遠(yuǎn)程節(jié)點(diǎn)列表。在接收到這一信息之后,該方法前進(jìn)到步驟526。
在實(shí)施例中,響應(yīng)于該請求,源節(jié)點(diǎn)引用用于那個共享高速緩存行的目錄條目。該目錄條目指示哪些節(jié)點(diǎn)包含源高速緩存行的副本。系統(tǒng)100中任何數(shù)量的節(jié)點(diǎn)可以包含源高速緩存行的副本。在實(shí)施例中,當(dāng)訪問用于所請求的共享高速緩存行的目錄條目時,源節(jié)點(diǎn)鎖定該目錄條目。在實(shí)施例中,源節(jié)點(diǎn)只共享包含源高速緩存行的有效副本的遠(yuǎn)程節(jié)點(diǎn)列表。目錄條目可以被更新,以指示所有遠(yuǎn)程節(jié)點(diǎn)包含無效副本。
在步驟526處,節(jié)點(diǎn)102使包含源高速緩存行的副本的其它遠(yuǎn)程節(jié)點(diǎn)將其復(fù)制的高速緩存行標(biāo)記為無效。該節(jié)點(diǎn)向保持各自復(fù)制的高速緩存行的每個節(jié)點(diǎn)指示源高速緩存行中的數(shù)據(jù)已被改變。在遠(yuǎn)程節(jié)點(diǎn)處的復(fù)制的高速緩存行的版本值被改變,以指示復(fù)制的高速緩存行是無效的。
在步驟528處,節(jié)點(diǎn)102通知源節(jié)點(diǎn)來執(zhí)行存儲。通知可以包括源高速緩存行在源節(jié)點(diǎn)的主存儲器中的位置、要被存儲在源高速緩存行中的數(shù)據(jù)以及版本號。在執(zhí)行存儲之前,源節(jié)點(diǎn)將來自存儲緩沖區(qū)的版本號與在各自源高速緩存行中的版本號進(jìn)行比較。如果檢測到版本不匹配,則源節(jié)點(diǎn)不執(zhí)行存儲并且可以例如經(jīng)由異步自陷通知發(fā)起線程。
在步驟530處,存儲的數(shù)據(jù)從存儲緩沖區(qū)中去除。
在實(shí)施例中,對存儲緩沖區(qū)中的每個條目重復(fù)這些步驟。
在可替代的實(shí)施例中,遠(yuǎn)程節(jié)點(diǎn)不將存儲記錄在存儲緩沖區(qū)中。而是,遠(yuǎn)程節(jié)點(diǎn)在自陷操作執(zhí)行期間執(zhí)行更新傳播步驟,來代替向存儲緩沖區(qū)寫入。
源節(jié)點(diǎn)存儲
在實(shí)施例中,源節(jié)點(diǎn)在不使用存儲緩沖區(qū)的情況下執(zhí)行存儲命令來存儲共享高速緩存行。圖6是示出由源節(jié)點(diǎn)102執(zhí)行的在分布式節(jié)點(diǎn)系統(tǒng)100中執(zhí)行存儲命令的步驟的流程圖。存儲命令可以包括指向主存儲器108中的源高速緩存行的指針。指針可以與版本值相關(guān)聯(lián)。
在步驟602處,節(jié)點(diǎn)102使存儲命令的執(zhí)行掛起,并且執(zhí)行自陷操作。
在步驟604處,節(jié)點(diǎn)102為源高速緩存行執(zhí)行基于指針的存儲器損壞檢測。如果沒有檢測到存儲器損壞,則該方法前進(jìn)到步驟606。如果檢測到存儲器損壞,則該方法退出自陷操作而不執(zhí)行存儲。
在步驟606中,節(jié)點(diǎn)102指示遠(yuǎn)程節(jié)點(diǎn)使其各自復(fù)制的高速緩存行無效。節(jié)點(diǎn)102向每個遠(yuǎn)程節(jié)點(diǎn)指示源高速緩存行中的數(shù)據(jù)已被改變。在遠(yuǎn)程節(jié)點(diǎn)處復(fù)制的高速緩存行的版本值被改變,以指示復(fù)制的高速緩存行是無效的。
在實(shí)施例中,源節(jié)點(diǎn)引用用于那個共享高速緩存行的目錄條目。該目錄條目指示哪些節(jié)點(diǎn)包含源高速緩存行的副本。系統(tǒng)100中任何數(shù)量的節(jié)點(diǎn)可以包含源高速緩存行的副本。該節(jié)點(diǎn)向正在復(fù)制源高速緩存行的每個節(jié)點(diǎn)指示數(shù)據(jù)已被改變。在其它節(jié)點(diǎn)處復(fù)制的高速緩存行的版本值被改變,以指示源高速緩存行的副本是無效的。
在實(shí)施例中,使源高速緩存行無效被記錄并且到遠(yuǎn)程節(jié)點(diǎn)的無效化指令被延遲地發(fā)送。例如,除執(zhí)行存儲的線程之外的其它線程發(fā)現(xiàn)無效源高速緩存行的記錄,并且發(fā)送指令到遠(yuǎn)程節(jié)點(diǎn),以使源高速緩存行的復(fù)制的高速緩存行無效。
在步驟608處,源節(jié)點(diǎn)在源高速緩存行上執(zhí)行存儲。
源節(jié)點(diǎn)完成自陷操作。
硬件概述
根據(jù)一種實(shí)施例,本文所描述的技術(shù)由一個或多個專用計算設(shè)備實(shí)現(xiàn)。專用計算設(shè)備可以是硬連線的以執(zhí)行所述技術(shù),或者可以包括諸如被永久性地編程以執(zhí)行所述技術(shù)的一個或多個專用集成電路(ASIC)或現(xiàn)場可編程門陣列(FPGA)的數(shù)字電子設(shè)備,或者可以包括編程為按照固件、存儲器、其它存儲裝置或者其組合中的程序指令執(zhí)行所述技術(shù)的一個或多個通用硬件處理器。這種專用計算設(shè)備還可以組合定制的硬連線邏輯、ASIC或FPGA與定制的編程來實(shí)現(xiàn)所述技術(shù)。專用計算設(shè)備可以是臺式計算機(jī)系統(tǒng)、便攜式計算機(jī)系統(tǒng)、手持式設(shè)備、聯(lián)網(wǎng)設(shè)備或者結(jié)合硬連線和/或程序邏輯來實(shí)現(xiàn)所述技術(shù)的任何其它設(shè)備。
例如,圖7是說明本發(fā)明的實(shí)施例可以在其上實(shí)現(xiàn)的計算機(jī)系統(tǒng)700的框圖。計算機(jī)系統(tǒng)700包括總線702或者用于傳送信息的其它通信機(jī)制,以及與總線702耦合用于處理信息的硬件處理器704。硬件處理器704可以是例如通用微處理器。
計算機(jī)系統(tǒng)700還包括耦合到總線702用于存儲信息和要由處理器704執(zhí)行的指令的主存儲器706,諸如隨機(jī)存取存儲器(RAM)或其它動態(tài)存儲設(shè)備。主存儲器706還可以用于在要由處理器704執(zhí)行的指令執(zhí)行期間存儲臨時變量或其它中間信息。當(dāng)存儲在處理器704可訪問的非臨時性存儲介質(zhì)中時,這種指令使計算機(jī)系統(tǒng)700變成為被定制以執(zhí)行指令中所指定的操作的專用機(jī)器。
計算機(jī)系統(tǒng)700還包括耦合到總線702的只讀存儲器(ROM)708或者其它靜態(tài)存儲設(shè)備,用于為處理器704存儲靜態(tài)信息和指令。提供了諸如磁盤、光盤或固態(tài)驅(qū)動器的存儲設(shè)備710,并且存儲設(shè)備710耦合到總線702,用于存儲信息和指令。
計算機(jī)系統(tǒng)700可以經(jīng)總線702耦合到顯示器712(諸如陰極射線管(CRT)),用于向計算機(jī)用戶顯示信息。包括字母數(shù)字和其它鍵的輸入設(shè)備714耦合到總線702,用于向處理器704傳送信息和命令選擇。另一種類型的用戶輸入設(shè)備是光標(biāo)控件716,諸如鼠標(biāo)、軌跡球或者光標(biāo)方向鍵,用于向處理器704傳送方向信息和命令選擇并且用于控制光標(biāo)在顯示器712上的運(yùn)動。這種輸入設(shè)備通常具有在兩個軸即第一個軸(例如,x)和第二個軸(例如,y)中的兩個自由度,以允許設(shè)備在平面內(nèi)指定位置。
計算機(jī)系統(tǒng)700可以利用定制的硬連線邏輯、一個或多個ASIC或FPGA、固件和/或程序邏輯來實(shí)現(xiàn)本文所述的技術(shù),這些與計算機(jī)系統(tǒng)相結(jié)合使計算機(jī)系統(tǒng)700或者把計算機(jī)系統(tǒng)700編程為專用機(jī)器。根據(jù)一種實(shí)施例,本文的技術(shù)由計算機(jī)系統(tǒng)700響應(yīng)于處理器704執(zhí)行包含在主存儲器706中的一條或多條指令的一個或多個序列而執(zhí)行。這種指令可以從另一存儲介質(zhì)(諸如存儲設(shè)備710)讀到主存儲器706中。包含在主存儲器706中的指令序列的執(zhí)行使處理器704執(zhí)行本文所述的過程步驟。在可替代的實(shí)施例中,硬連線的電路系統(tǒng)可以代替軟件指令或者與其結(jié)合使用。
如在本文所使用的,術(shù)語“存儲介質(zhì)”指存儲使機(jī)器以特定方式操作的數(shù)據(jù)和/或指令的任何非臨時性介質(zhì)。這種存儲介質(zhì)可以包括非易失性介質(zhì)和/或易失性介質(zhì)。非易失性介質(zhì)包括例如光盤、磁盤,或固態(tài)驅(qū)動器,諸如存儲設(shè)備710。易失性介質(zhì)包括動態(tài)存儲器,諸如主存儲器706。存儲介質(zhì)的常見形式包括例如軟盤、柔性盤、硬盤、固態(tài)驅(qū)動器、磁帶或者任何其它磁性數(shù)據(jù)存儲介質(zhì)、CD-ROM、任何其它光學(xué)數(shù)據(jù)存儲介質(zhì),任何具有孔模式的物理介質(zhì)、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任何其它存儲器芯片或盒式磁帶。
存儲介質(zhì)與傳輸介質(zhì)不同但是可以與其結(jié)合使用。傳輸介質(zhì)參與在存儲介質(zhì)之間傳送信息。例如,傳輸介質(zhì)包括同軸電纜、銅線和光纖,包括包含總線702的配線。傳輸介質(zhì)還可以采取聲波或光波的形式,諸如在無線電波和紅外線數(shù)據(jù)通信中產(chǎn)生的那些。
各種形式的介質(zhì)可以涉及把一條或多條指令的一個或多個序列攜帶到處理器704供執(zhí)行。例如,指令最初可以承載在遠(yuǎn)程計算機(jī)的磁盤或固態(tài)驅(qū)動器上。遠(yuǎn)程計算機(jī)可以把指令加載到其動態(tài)存儲器中并且利用調(diào)制解調(diào)器經(jīng)電話線發(fā)送指令。位于計算機(jī)系統(tǒng)700本地的調(diào)制解調(diào)器可以在電話線上接收數(shù)據(jù)并且使用紅外線發(fā)送器把數(shù)據(jù)轉(zhuǎn)換成紅外線信號。紅外線檢測器可以接收在紅外線信號中攜帶的數(shù)據(jù)并且適當(dāng)?shù)碾娐废到y(tǒng)可以把數(shù)據(jù)放在總線702上??偩€702把數(shù)據(jù)攜帶到主存儲器706,處理器704從主存儲器706檢索并執(zhí)行指令。由主存儲器706接收到的指令可以可選地在被處理器704執(zhí)行之前或之后存儲在存儲設(shè)備710上。
計算機(jī)系統(tǒng)700還包括耦合到總線702的通信接口718。通信接口718提供耦合到網(wǎng)絡(luò)鏈路720的雙向數(shù)據(jù)通信,其中網(wǎng)絡(luò)鏈路720連接到本地網(wǎng)絡(luò)722。例如,通信接口718可以是綜合業(yè)務(wù)數(shù)字網(wǎng)絡(luò)(ISDN)卡、電纜調(diào)制解調(diào)器、衛(wèi)星調(diào)制解調(diào)器,或者提供到對應(yīng)類型電話線的數(shù)據(jù)通信連接的調(diào)制解調(diào)器。作為另一個例子,通信接口718可以是提供到兼容的局域網(wǎng)(LAN)的數(shù)據(jù)通信連接的LAN卡。也可以實(shí)現(xiàn)無線鏈路。在任何此類實(shí)現(xiàn)中,通信接口718發(fā)送和接收攜帶表示各種類型的信息的數(shù)字?jǐn)?shù)據(jù)流的電信號、電磁信號或光信號。
網(wǎng)絡(luò)鏈路720通常通過一個或多個網(wǎng)絡(luò)向其它數(shù)據(jù)設(shè)備提供數(shù)據(jù)通信。例如,網(wǎng)絡(luò)鏈路720可以通過本地網(wǎng)絡(luò)722提供到主計算機(jī)724或者到由互聯(lián)網(wǎng)服務(wù)提供商(ISP)726操作的數(shù)據(jù)設(shè)備的連接。ISP 726又通過現(xiàn)在通常稱為“互聯(lián)網(wǎng)”728的全球分組數(shù)據(jù)通信網(wǎng)絡(luò)提供數(shù)據(jù)通信服務(wù)。本地網(wǎng)絡(luò)722和互聯(lián)網(wǎng)728兩者都使用攜帶數(shù)字?jǐn)?shù)據(jù)流的電信號、電磁信號或光信號。通過各種網(wǎng)絡(luò)的信號以及在網(wǎng)絡(luò)鏈路720上并通過通信接口718的信號是傳輸介質(zhì)的示例形式,其中這些信號把數(shù)字?jǐn)?shù)據(jù)攜帶到計算機(jī)系統(tǒng)700或者攜帶來自計算機(jī)系統(tǒng)700的數(shù)字?jǐn)?shù)據(jù)。
計算機(jī)系統(tǒng)700可以通過(一個或多個)網(wǎng)絡(luò)、網(wǎng)絡(luò)鏈路720和通信接口718發(fā)送消息和接收數(shù)據(jù),包括程序代碼。在互聯(lián)網(wǎng)例子中,服務(wù)器730可以通過互聯(lián)網(wǎng)728、ISP 726、本地網(wǎng)絡(luò)722和通信接口718發(fā)送對應(yīng)用程序的請求代碼。
接收到的代碼可以由處理器704在它被接收到時執(zhí)行、和/或存儲在存儲設(shè)備710或其它非易失性存儲裝置中用于以后執(zhí)行。
在前面的說明書中,本發(fā)明的實(shí)施例已經(jīng)參考許多具體細(xì)節(jié)進(jìn)行了描述,這些細(xì)節(jié)可以從一種實(shí)現(xiàn)到另一種實(shí)現(xiàn)而不同。因此,說明書和附圖應(yīng)當(dāng)在說明性而不是限制性的意義上加以考慮。本發(fā)明范圍的唯一且排他指示以及申請人預(yù)期要作為本發(fā)明范圍的是由本申請產(chǎn)生的權(quán)利要求集合的字面和等效范圍,以這種權(quán)利要求產(chǎn)生的具體形式,包括任何后續(xù)的校正。