數(shù)據(jù)留在不可變緩沖區(qū)內(nèi)。這可被重復(fù),直至向最高應(yīng)用層提供了只對(duì)分組的凈荷進(jìn)行定義的視圖定義。
[0061]圖6示出用于將不可變數(shù)據(jù)從一個(gè)計(jì)算實(shí)體傳遞到下一計(jì)算實(shí)體的方法600的流程圖。第一計(jì)算實(shí)體訪問(wèn)視圖定義(動(dòng)作601)并將該視圖定義提供給視圖提供者(動(dòng)作602)。視圖提供者隨后將該視圖提供給第一計(jì)算實(shí)體(動(dòng)作603)。在第一計(jì)算實(shí)體執(zhí)行其邏輯(動(dòng)作604)后,它隨后可將另一視圖定義提供給下一計(jì)算實(shí)體(動(dòng)作605),該下一計(jì)算實(shí)體要處理來(lái)自不可變緩沖區(qū)的數(shù)據(jù)。下一計(jì)算實(shí)體隨后可重復(fù)這一方法600,并且因此該過(guò)程可繼續(xù)通過(guò)該系統(tǒng)的多個(gè)層。
[0062]盡管以上描述了按零復(fù)制的方式來(lái)消費(fèi)緩沖區(qū)/流,但以上描述的原理也可適用于由數(shù)據(jù)生產(chǎn)者生產(chǎn)緩沖區(qū)和流。在數(shù)據(jù)生產(chǎn)者的情況下,還存在供應(yīng)用發(fā)送(分開(kāi)地分配的)其自己的緩沖區(qū)或請(qǐng)求數(shù)據(jù)生產(chǎn)者將可寫(xiě)視圖(跨度(Span))提供到其自己的內(nèi)部緩沖區(qū)的靈活性。這可能不僅消除了復(fù)制,還通過(guò)消除對(duì)發(fā)送半充滿緩沖區(qū)的需求而改進(jìn)了緩沖區(qū)利用。
[0063]零復(fù)制數(shù)據(jù)流
[0064]通過(guò)操作系統(tǒng)的批量數(shù)據(jù)移動(dòng)通常使用流體系結(jié)構(gòu)來(lái)建模。流表示數(shù)據(jù)源與數(shù)據(jù)消費(fèi)者之間的邏輯管道,允許源所產(chǎn)生的數(shù)據(jù)被遞送到其目的地。流通常實(shí)現(xiàn)緩沖,以容納生產(chǎn)者與消費(fèi)者之間的吞吐量不協(xié)調(diào)性。
[0065]例如,圖7示出了其中數(shù)據(jù)流711被從流源710提供到(如箭頭701所表示的)流緩沖區(qū)720中并隨后從緩沖區(qū)720提供到(如箭頭702所表示的)流消費(fèi)者730的流環(huán)境700。環(huán)境700還包括執(zhí)行流控制的流管理器740。流管理器740使得各個(gè)流部分從緩沖區(qū)720以流消費(fèi)者720滿意的速率被饋送到(如箭頭702所表示的)流消費(fèi)者730。此夕卜,流管理器730在流之前執(zhí)行適當(dāng)?shù)淖x(如箭頭701所表示的)以確保流緩沖區(qū)720內(nèi)的流部分的量不會(huì)過(guò)少以至于流消費(fèi)者730處于用完流部分的風(fēng)險(xiǎn)中,并且不會(huì)過(guò)多以至于占據(jù)流緩沖區(qū)720的不必要的存儲(chǔ)器量。流管理器740還管理流緩沖區(qū)720內(nèi)的流各部分的壽命,使得流部分占據(jù)的存儲(chǔ)器一旦該流部分被消費(fèi)就可被回收。
[0066]流通常在邏輯上跨多個(gè)進(jìn)程和/或保護(hù)邊界。例如,在應(yīng)用從文件讀取數(shù)據(jù)時(shí),該數(shù)據(jù)通常從在受保護(hù)模式設(shè)備驅(qū)動(dòng)程序的控制下的物理盤(pán)讀取。該數(shù)據(jù)隨后穿過(guò)文件系統(tǒng)層,并隨后最終對(duì)應(yīng)用代碼可用。通常,層跨越可涉及數(shù)據(jù)復(fù)制,這影響性能和功耗。
[0067]然而,上述零復(fù)制不可變緩沖區(qū)的原理可被用來(lái)制定流緩沖區(qū)(如,流緩沖區(qū)720),其中跨進(jìn)程或保護(hù)邊界復(fù)制各個(gè)流部分的需求被消除。
[0068]具體而言,假定為流中的多個(gè)流部分中的每一個(gè)建立一個(gè)不可變緩沖區(qū)(如參考圖2到6描述的)。此外,假定圖2的方法和圖3A和3B的過(guò)程被執(zhí)行以創(chuàng)建包含單個(gè)流部分的相關(guān)聯(lián)的不可變緩沖區(qū),每次接收到一個(gè)流部分。
[0069]這樣的不可變緩沖區(qū)允許任何數(shù)據(jù)(包括各個(gè)流部分)穿過(guò)系統(tǒng)的不同層和組件,從而允許每一個(gè)具有它們自己的對(duì)該數(shù)據(jù)的特定視圖,而無(wú)需復(fù)制該數(shù)據(jù),如參考圖5和6中的一般數(shù)據(jù)描述的。在這種情況下,流緩沖區(qū)720將簡(jiǎn)單地是不可變緩沖區(qū)的集合,每一不可變緩沖區(qū)具有作為數(shù)據(jù)包含在其中的對(duì)應(yīng)的流部分。在消費(fèi)每一流部分時(shí),對(duì)應(yīng)的不可變緩沖區(qū)的存儲(chǔ)器被允許回收。因而,使用本文描述的原理,零復(fù)制數(shù)據(jù)流傳輸是可能的。
[0070]零復(fù)制高速緩存
[0071]高速緩存是任何操作系統(tǒng)的I/O子系統(tǒng)的重要方面。通過(guò)充分利用以下事實(shí)降低了等待時(shí)間且提高了有效吞吐量:數(shù)據(jù)訪問(wèn)模式往往被群集且同一數(shù)據(jù)通常被檢索多次。傳統(tǒng)高速緩存是通過(guò)在操作系統(tǒng)的不同層處具有被獨(dú)立地管理的各專用存儲(chǔ)器池來(lái)完成的,每一專用存儲(chǔ)器池具有正交保持和替換策略。訪問(wèn)來(lái)自高速緩存的數(shù)據(jù)通常涉及將數(shù)據(jù)從高速緩存緩沖區(qū)復(fù)制到應(yīng)用緩沖區(qū)。
[0072]以上參考圖2到6描述的原理允許在進(jìn)程之間以及跨保護(hù)邊界共享不可變緩沖區(qū),函數(shù)調(diào)用不能被放置通過(guò)保護(hù)邊界,而是必須使用昂貴得多的進(jìn)程間通信或跨保護(hù)邊界通信來(lái)用于跨邊界通信。
[0073]這些原理可被用于實(shí)現(xiàn)高速緩存。在數(shù)據(jù)從直接存儲(chǔ)器訪問(wèn)(DMA)操作流出時(shí),數(shù)據(jù)被引入系統(tǒng)中作為不可變緩沖區(qū)(如圖3A、3B和5的不可變緩沖區(qū)330)。不可變緩沖區(qū)可以圍繞系統(tǒng)來(lái)傳遞新數(shù)據(jù),并且可同時(shí)被快照到高速緩存中以供稍后重用。在對(duì)數(shù)據(jù)的稍后請(qǐng)求發(fā)生時(shí),同一不可變緩沖區(qū)可從高速緩存檢索并被重用一一全部無(wú)需復(fù)制或甚至實(shí)際訪問(wèn)底層數(shù)據(jù)。這造成顯著的效率增益。
[0074]在計(jì)算實(shí)體持有基于不可變緩沖區(qū)中的底層數(shù)據(jù)的高速緩存時(shí),計(jì)算實(shí)體具有對(duì)不可變緩沖區(qū)中的底層數(shù)據(jù)的“強(qiáng)”引用,并且可以使用該強(qiáng)引用來(lái)訪問(wèn)不可變緩沖區(qū)的數(shù)據(jù)。使用術(shù)語(yǔ)“強(qiáng)”來(lái)修飾引用僅被用來(lái)將引用與將在下文被稱為“軟”和“弱”的引用區(qū)分開(kāi)。同樣,使用術(shù)語(yǔ)“弱”和“軟”來(lái)修飾引用僅被用來(lái)將引用彼此區(qū)分開(kāi)以及與強(qiáng)引用區(qū)分開(kāi)。
[0075]只要任何實(shí)體具有對(duì)高速緩存內(nèi)的不可變緩沖區(qū)的強(qiáng)引用,對(duì)具有該強(qiáng)引用的每一實(shí)體而言,該不可變緩沖區(qū)及其數(shù)據(jù)就被保證在至少該強(qiáng)引用的持續(xù)時(shí)間期間繼續(xù)存在。對(duì)不可變緩沖區(qū)的“軟”引用不能被用來(lái)在不首先將軟引用轉(zhuǎn)換成強(qiáng)引用的情況下訪問(wèn)來(lái)自不可變緩沖區(qū)的數(shù)據(jù)。一旦數(shù)據(jù)訪問(wèn)完成,強(qiáng)引用可被轉(zhuǎn)換成軟弓I用。
[0076]軟引用可被用作存儲(chǔ)器管理提示的一種形式。如果只存在任何計(jì)算實(shí)體對(duì)給定不可變緩沖區(qū)的軟引用且系統(tǒng)的存儲(chǔ)器正在減少,則該系統(tǒng)可以選擇回收支持該不可變緩沖區(qū)的存儲(chǔ)器。如果這種情況發(fā)生,則將軟引用轉(zhuǎn)換成強(qiáng)引用的下一嘗試將失敗。緩沖區(qū)的內(nèi)容丟失且計(jì)算實(shí)體將必須根據(jù)數(shù)據(jù)源重新生成另一不可變緩沖區(qū)的內(nèi)容。
[0077]這一軟引用是使用盡可能多的系統(tǒng)存儲(chǔ)器作為高速緩存的有價(jià)值的方式,而無(wú)需調(diào)節(jié)系統(tǒng)中的高速緩存的大小的高準(zhǔn)確度。例如,高速緩存可以選擇持有其大部分?jǐn)?shù)據(jù)作為軟引用而非強(qiáng)引用。另一進(jìn)程的存儲(chǔ)器使用尖鋒隨后可足夠大以將系統(tǒng)驅(qū)動(dòng)到低存儲(chǔ)器狀態(tài)。該系統(tǒng)隨后可快速反應(yīng)并從那些軟引用釋放存儲(chǔ)器,而無(wú)需作出與將多少存儲(chǔ)器給予哪一進(jìn)程有關(guān)的任何選擇。
[0078]計(jì)算實(shí)體還可持有對(duì)給定不可變緩沖區(qū)的“弱”引用。與軟引用一樣,弱引用必須被轉(zhuǎn)換成“強(qiáng)”引用以允許對(duì)不可變緩沖區(qū)內(nèi)的數(shù)據(jù)的訪問(wèn)。強(qiáng)引用也可被轉(zhuǎn)換成弱引用。弱引用提供用于這些緩沖區(qū)的存儲(chǔ)器管理的第二種形式。它被用來(lái)保持對(duì)不可變緩沖區(qū)的潛在訪問(wèn),而不使得持有該弱引用的計(jì)算實(shí)體承擔(dān)該緩沖區(qū)所使用的存儲(chǔ)器。如果只存在任何進(jìn)程對(duì)給定不可變緩沖區(qū)的弱引用,則底層緩沖區(qū)可被立即釋放。
[0079]對(duì)不可變緩沖區(qū)的弱引用可被用來(lái)減輕從具有對(duì)不可變緩沖區(qū)的強(qiáng)引用的另一進(jìn)程檢索對(duì)不可變緩沖區(qū)的強(qiáng)引用所需的進(jìn)程間通信以及跨保護(hù)邊界通信的成本。即,弱引用的高速緩存可被創(chuàng)建在一個(gè)計(jì)算實(shí)體(例如,一個(gè)進(jìn)程)中以減輕從另一計(jì)算實(shí)體(例如,另一進(jìn)程)檢索這些緩沖區(qū)的成本,即使它們已經(jīng)被該另一計(jì)算實(shí)體高速緩存。
[0080]圖9示出第二計(jì)算實(shí)體第一次從第一計(jì)算實(shí)體支持的高速緩存進(jìn)行讀取的方法900的流程圖。圖10示出第二計(jì)算實(shí)體從第一計(jì)算實(shí)體支持的高速緩存進(jìn)行后續(xù)讀取的方法1000的流程圖。方法900和1000 —起允許第二計(jì)算實(shí)體基于第一計(jì)算實(shí)體所持有的高速緩存來(lái)構(gòu)建本地高速緩存。方法900和1000可以在圖8的環(huán)境800的上下文中執(zhí)行,并且因而將頻繁參考圖8來(lái)描述。
[0081]首先參考圖8的環(huán)境800,第一計(jì)算實(shí)體810具有由不可變緩沖區(qū)801所支持的數(shù)據(jù)的高速緩存811。第二計(jì)算實(shí)體820也要獲取來(lái)自不可變緩沖區(qū)的數(shù)據(jù)。第二計(jì)算實(shí)體820還要維護(hù)從不可變緩沖區(qū)801導(dǎo)出的數(shù)據(jù)的高速緩存812。然而,在以下意義上高速緩存812是弱高速緩存:在停止存在之前,它可能不等待來(lái)自第二計(jì)算實(shí)體的釋放命令。因而,第二計(jì)算實(shí)體820不具有對(duì)其高速緩存812何時(shí)被釋放的控制。
[0082]邊界830 (處理器間或保護(hù)邊界)位于第一計(jì)算實(shí)體810與第二計(jì)算實(shí)體820之間。在一個(gè)示例實(shí)現(xiàn)中,假定第一計(jì)算實(shí)體是文件系統(tǒng),且第二計(jì)算實(shí)體是提供和/或處理文件系統(tǒng)所提供的文件的web服務(wù)器。
[0083]在第一計(jì)算實(shí)體獲取尚速緩存(例如,在文件系統(tǒng)的情況下是文件尚速緩存)時(shí),第一計(jì)算實(shí)體得到對(duì)數(shù)據(jù)的更快和更多的本地訪問(wèn)(因此是術(shù)語(yǔ)“高速緩存”),而且還獲取對(duì)支持該高速緩存的不可變緩沖區(qū)的強(qiáng)引用。強(qiáng)引用提供以下保證:不可變緩沖區(qū)(及其數(shù)據(jù))將至少與第一計(jì)算實(shí)體繼續(xù)持有強(qiáng)引用一樣長(zhǎng)地繼續(xù)存在(并且可能更長(zhǎng),如果其他實(shí)體也持有對(duì)該不可變緩沖區(qū)的強(qiáng)引用的話)。在這一狀態(tài)下,進(jìn)入圖9的描述,它示出了第二計(jì)算實(shí)體(例如,第二計(jì)算實(shí)體820)從第一計(jì)算實(shí)體(例如,第一計(jì)算實(shí)體810)所支持的高速緩存(例如,高速緩存811)進(jìn)行初始讀取的方法900。
[0084]第二計(jì)算實(shí)體與第一計(jì)算實(shí)體通信以獲得對(duì)不可變數(shù)據(jù)的強(qiáng)引用(動(dòng)作901)。這是進(jìn)程間或跨保護(hù)邊界通信,并且因而是昂貴的通信。然而,它可能是所需的唯一跨邊界通信,只要支持高速緩存的不可變緩沖區(qū)繼續(xù)存在。例如,假定web服務(wù)器接收到對(duì)高速緩存內(nèi)包含的文件的第一請(qǐng)求。這一初始請(qǐng)求可以使得web服務(wù)器執(zhí)行這一初始通信并從文件系統(tǒng)獲得對(duì)不可變緩沖區(qū)的強(qiáng)引用。使用這一強(qiáng)引用,第二計(jì)算實(shí)體可以讀取來(lái)自不可變緩沖區(qū)的數(shù)據(jù)(動(dòng)作902)。在讀取來(lái)自高速緩存的數(shù)據(jù)之時(shí)或之后,第二計(jì)算實(shí)體將對(duì)不可變緩沖區(qū)的強(qiáng)引用降級(jí)成對(duì)不可變緩沖區(qū)的弱引用(動(dòng)作903)。
[0085]圖10示出供第二計(jì)算實(shí)體從由第一計(jì)算實(shí)體支持的高速緩存進(jìn)行后續(xù)讀取(如果第二計(jì)算實(shí)體的高速緩存不具有該數(shù)據(jù)的話)的方法1000的流程圖。在接收到對(duì)從高速緩存進(jìn)行讀取的請(qǐng)求而對(duì)該高速緩存的弱引用仍然存在時(shí)(動(dòng)作1001),第二計(jì)算實(shí)體確定不可變緩沖區(qū)是否仍然存在(判定框1002)。如果不可變緩沖區(qū)仍然存在(判定框1002中的“是”),則第二計(jì)算實(shí)體將其弱引用轉(zhuǎn)換成對(duì)不可變緩沖區(qū)的強(qiáng)引用(動(dòng)作1011)、讀取緩沖區(qū)(動(dòng)作1012)(并且將該數(shù)據(jù)本地地高速緩存在本地高速緩存812中),并且此后將強(qiáng)引用轉(zhuǎn)換回弱引用(動(dòng)作1013)。這在不執(zhí)行與第一計(jì)算實(shí)體的進(jìn)程間通信或跨保護(hù)邊界通信的情況下完成。相反,第二計(jì)算實(shí)體簡(jiǎn)單地獲取不可變緩沖區(qū)的視圖,并從不可變緩沖區(qū)進(jìn)行讀取。
[0086]如果不可變緩沖區(qū)沒(méi)有存在(判定框1002中的