“否”)。執(zhí)行與第一計(jì)算實(shí)體的進(jìn)程間通信或跨保護(hù)邊界通信,以由此使得第一計(jì)算實(shí)體重新獲取數(shù)據(jù)并重建新的不可變緩沖區(qū)(動(dòng)作1021)。隨后,返回方法900,第二計(jì)算實(shí)體隨后可得到對(duì)新不可變緩沖區(qū)的強(qiáng)引用(動(dòng)作901)并從該緩沖區(qū)進(jìn)行讀取(動(dòng)作902)。
[0087]因而,第二計(jì)算實(shí)體可被看做具有從第一計(jì)算實(shí)體的強(qiáng)高速緩存(在第一計(jì)算實(shí)體的控制下保持就位的高速緩存)導(dǎo)出的弱高速緩存(在第二計(jì)算實(shí)體使用弱高速緩存完成之前可能必須被重建的高速緩存)。在另一強(qiáng)高速緩存之上構(gòu)建這一第二“弱”高速緩存造成了后備高速緩存上的替換(或逐出)策略的一些問(wèn)題。逐出指的是其中較少使用的數(shù)據(jù)(即,“冷”數(shù)據(jù))被從高速緩存移除(或逐出)來(lái)為較頻繁地使用的數(shù)據(jù)(即,“熱”數(shù)據(jù))騰出空間。逐出基于與某些數(shù)據(jù)項(xiàng)被訪問(wèn)的頻率有關(guān)的統(tǒng)計(jì)信息。弱高速緩存812和強(qiáng)高速緩存811具有與高速緩存各部分的訪問(wèn)頻率有關(guān)的不同統(tǒng)計(jì)信息,因?yàn)樗鼈兛吹綄?duì)數(shù)據(jù)的不同請(qǐng)求。
[0088]具體而言,在退回到后備高速緩存811之前,弱高速緩存812將被用來(lái)首先服務(wù)第二計(jì)算實(shí)體820的請(qǐng)求。這一弱高速緩存因而將吸收對(duì)熱數(shù)據(jù)的除初始引用之外的所有引用,從而隱藏它們對(duì)后備高速緩存811的有用性。因而,在后備高速緩存811接收到對(duì)新項(xiàng)的請(qǐng)求時(shí),在不對(duì)這一點(diǎn)進(jìn)行尋址的情況下,后備高速緩存可根據(jù)弱高速緩存812的統(tǒng)計(jì)信息使得“熱”數(shù)據(jù)替換仍然被弱高速緩存812保留的項(xiàng)。這一替換可以移除對(duì)底層緩沖區(qū)的最后一個(gè)持久存儲(chǔ)的強(qiáng)/弱引用,從而釋放與弱高速緩存中的弱引用相對(duì)應(yīng)的緩沖區(qū)。針對(duì)該弱高速緩存的對(duì)該項(xiàng)的下一請(qǐng)求隨后將失敗。
[0089]根據(jù)本文描述的各實(shí)施例,這一問(wèn)題是通過(guò)將熱數(shù)據(jù)(如弱高速緩存812看到的)的有用性傳遞給后備高速緩存811來(lái)解決的。在第二計(jì)算實(shí)體將對(duì)數(shù)據(jù)的弱引用轉(zhuǎn)換成對(duì)該數(shù)據(jù)的強(qiáng)引用時(shí),該系統(tǒng)可提供這一機(jī)制作為副作用。該系統(tǒng)對(duì)每底層緩沖區(qū)這一點(diǎn)發(fā)生的次數(shù)進(jìn)行計(jì)數(shù)并且將這一計(jì)數(shù)暴露作為緩沖區(qū)本身的元數(shù)據(jù)屬性。后備高速緩存隨后可查詢這一值并確定在任何兩個(gè)時(shí)間點(diǎn)之間發(fā)生的引用的數(shù)量。這一信息可被后備高速緩存的替換算法用來(lái)保持該項(xiàng)存活在這兩個(gè)高速緩存中。
[0090]圖11示出第一計(jì)算實(shí)體(或后備高速緩存)執(zhí)行逐出的方法1100的流程圖。首先,后備高速緩存使用其自己的統(tǒng)計(jì)信息以標(biāo)識(shí)逐出候選(動(dòng)作1101)。第一后備高速緩存隨后與弱高速緩存的第二統(tǒng)計(jì)信息協(xié)商所標(biāo)識(shí)的那些候選(動(dòng)作1102)。在與第二統(tǒng)計(jì)信息協(xié)商之后,隨后提交與所標(biāo)識(shí)的候選有關(guān)的逐出決定(動(dòng)作1103),使得如果第二統(tǒng)計(jì)信息指示對(duì)所標(biāo)識(shí)的候選的更頻繁訪問(wèn),則所標(biāo)識(shí)的候選可被暫時(shí)保持在高速緩存內(nèi)。
[0091]這前三個(gè)概念(即,不可變可共享零復(fù)制批量數(shù)據(jù)、零復(fù)制數(shù)據(jù)流、以及零復(fù)制高速緩存)可被應(yīng)用于非受管代碼系統(tǒng)中以及受管代碼系統(tǒng)中。然而,因?yàn)槭芄芟到y(tǒng)所提供的視圖可比非受管系統(tǒng)更快地創(chuàng)建且被做成更細(xì)的粒度,所以這些原理可與受管系統(tǒng)一起最高效地使用。
[0092]圖12示出示例受管代碼系統(tǒng)1200。受管系統(tǒng)1200包括受管存儲(chǔ)器1201。受管系統(tǒng)1200具有多個(gè)受管代碼組件1230,每一組件具有對(duì)實(shí)體專用存儲(chǔ)器的排他訪問(wèn)。例如,運(yùn)行的受管代碼組件1230被示為包括七個(gè)組件1231到1237,但省略號(hào)1238標(biāo)識(shí)這一數(shù)量的很大靈活性。例如,組件1231到1237可以是進(jìn)程。
[0093]七個(gè)運(yùn)行的組件1231到1237中的每一個(gè)具有對(duì)應(yīng)的實(shí)體專用存儲(chǔ)器1211到1217。受管組件可不訪問(wèn)另一實(shí)體專用存儲(chǔ)器的實(shí)體專用存儲(chǔ)器。因而,這是實(shí)體專用存儲(chǔ)器之間的隔離保護(hù),使得只有對(duì)應(yīng)的受管組件可以訪問(wèn)該實(shí)體專用存儲(chǔ)器。例如,組件1231訪問(wèn)實(shí)體專用存儲(chǔ)器部分1211,但不訪問(wèn)實(shí)體專用存儲(chǔ)器部分1212到1217 ;組件1232訪問(wèn)實(shí)體專用存儲(chǔ)器部分1212,但不訪問(wèn)實(shí)體專用存儲(chǔ)器部分1211或?qū)嶓w專用存儲(chǔ)器部分1213到1217,以此類推。
[0094]受管代碼存儲(chǔ)器1210還包括共享存儲(chǔ)器1219。這一共享存儲(chǔ)器1219是圖3A、3B和5的不可變緩沖區(qū)330的示例。換言之,以上描述的原理根本不依賴于受管代碼系統(tǒng)。然而,本文描述的最終兩個(gè)概念被限于受管環(huán)境。圖12的幾個(gè)進(jìn)一步元素將參考這最終兩個(gè)概念(即,統(tǒng)一存儲(chǔ)器訪問(wèn)和類型安全類型鑄造)的描述來(lái)進(jìn)行描述。
[0095]統(tǒng)一存儲(chǔ)器訪問(wèn)
[0096]受管語(yǔ)言環(huán)境中的存儲(chǔ)器是可能非常動(dòng)態(tài)的事物。對(duì)象被分配出堆且由垃圾收集器管理。參考圖12,受管系統(tǒng)1200包括垃圾收集器1221。基于試探法,垃圾收集器通過(guò)將對(duì)象壓縮在一起以回收先前使用的空間來(lái)定期執(zhí)行堆的維護(hù)。將對(duì)象壓縮在一起暗示對(duì)象的存儲(chǔ)器地址基本上是不穩(wěn)定的,遭受垃圾收集器的改變。垃圾收集器依賴于特定代碼生成模式和來(lái)自操作系統(tǒng)的支持,以能夠以對(duì)應(yīng)用級(jí)代碼透明的方式來(lái)移動(dòng)對(duì)象。
[0097]操作系統(tǒng)的I/O子系統(tǒng)負(fù)責(zé)通過(guò)系統(tǒng)存儲(chǔ)器混洗大量數(shù)據(jù)。在讀取時(shí),數(shù)據(jù)通常從外部設(shè)備獲取并通過(guò)由設(shè)備本身管理的具有與處理器的最小交互的DMA操作來(lái)被置于存儲(chǔ)器中。類似地,在寫出數(shù)據(jù)時(shí),DMA存儲(chǔ)器操作可自動(dòng)讀取存儲(chǔ)器的內(nèi)容。
[0098]DMA操作不能與在操作期間被重新分配的存儲(chǔ)器的內(nèi)容競(jìng)爭(zhēng)。這樣做將需要處理器與設(shè)備之間的細(xì)粒度協(xié)調(diào),這將極大地影響性能和功率效率。作為這一約束的結(jié)果,存在兩個(gè)寬泛選項(xiàng)來(lái)支持受管操作系統(tǒng)中的DMA。
[0099]特殊鎖定(pinning)操作被針對(duì)存儲(chǔ)器區(qū)域使用以指令垃圾收集器不重新分配指定對(duì)象。這允許DMA操作在它們執(zhí)行時(shí)看到受影響的存儲(chǔ)器的一致快照。
[0100]DMA操作發(fā)生在不遭受垃圾收集的特殊存儲(chǔ)器區(qū)域中。
[0101]第一種方法可能明顯妨礙垃圾收集器的效率,因?yàn)樘幚礞i定的存儲(chǔ)器區(qū)域使壓縮過(guò)程復(fù)雜化并降低其效率。第二種方法避免了該問(wèn)題,但可能容易導(dǎo)致過(guò)量存儲(chǔ)器復(fù)制,因?yàn)樾枰厥饣倪壿媮?lái)在正常存儲(chǔ)器區(qū)域和特殊DMA友好存儲(chǔ)器區(qū)域之間轉(zhuǎn)移數(shù)據(jù)。
[0102]統(tǒng)一存儲(chǔ)器訪問(wèn)體系結(jié)構(gòu)給出了系統(tǒng)化的方式來(lái)引用存儲(chǔ)器,而不管它是正常的受管存儲(chǔ)器還是特殊的DMA友好的存儲(chǔ)器區(qū)域。這使得程序員以完全安全的方式直接操縱DMA友好的存儲(chǔ)器區(qū)域中的數(shù)據(jù)成為可能,從而避免對(duì)鎖定對(duì)象的需求以及在正常存儲(chǔ)器和DMA友好的存儲(chǔ)器之間的進(jìn)行復(fù)制這兩者。
[0103]在受管語(yǔ)言環(huán)境中,批量數(shù)據(jù)通常被保持在陣列中。受管語(yǔ)言環(huán)境(例如,受管系統(tǒng)1200)直接理解陣列,從而允許訪問(wèn)各單獨(dú)的陣列元素并確保程序員不能超過(guò)陣列的邊界。在由語(yǔ)言環(huán)境管理的情況下,陣列被約束成位于受管堆中。
[0104]在圖12的受管系統(tǒng)1200中,不可變緩沖區(qū)1219位于受管堆外部,并且因此在正常情況下將不能從受管程序直接訪問(wèn)。從I/o存儲(chǔ)器進(jìn)行讀和寫通常將使用具有顯式讀和寫操作(包括受管堆中的正常存儲(chǔ)器與I/o存儲(chǔ)器之間的隱式復(fù)制)的典型I/O包來(lái)完成。
[0105]受管系統(tǒng)包括提供從受管代碼組件直接訪問(wèn)不可變緩沖區(qū)1219的機(jī)制的抽象(本文稱為“跨度”)。參考圖12,受管存儲(chǔ)器部分1211包括各種對(duì)象,包括抽象地表示的跨度抽象1240??缍瓤杀话踩貏?chuàng)建以按與陣列工作的方式非常類似的方式來(lái)提供對(duì)I/O緩沖區(qū)的任何區(qū)域的直接訪問(wèn)。此外,跨度可被構(gòu)造以引用受管存儲(chǔ)器。構(gòu)建在跨度之上的軟件抽象因此對(duì)跨度的底層存儲(chǔ)器的位置是不可知的。這提供了最終組成情況,從而允許抽象按自然的方式來(lái)設(shè)計(jì)以操作受管存儲(chǔ)器(例如,存儲(chǔ)器部分1211到1218)或不可變緩沖區(qū)1219。
[0106]跨度可通過(guò)與該跨度的底層存儲(chǔ)進(jìn)行交互來(lái)創(chuàng)建。例如,不可變緩沖區(qū)1219可以提供方法調(diào)用以返回跨度,其中該跨度引用由該跨度直接控制的不可變緩沖區(qū)。類似地,陣列提供返回指向它們或它們的各部分的跨度的方法。一旦跨度被物化,它就可被傳遞且在很大程度上與陣列在正常受管語(yǔ)言中使用得那樣相類似地使用。
[0107]跨度的特定細(xì)節(jié)涉及底層存儲(chǔ)的壽命管理。受管編程環(huán)境的主要益處之一在于垃圾收集器負(fù)責(zé)檢測(cè)對(duì)象何時(shí)不再被引用并且它們的存儲(chǔ)可被回收。這是例如在陣列不再有用的情況下發(fā)生的。
[0108]在跨度底層的存儲(chǔ)器處于正常垃圾收集堆外部時(shí),該存儲(chǔ)器的壽命應(yīng)當(dāng)被仔細(xì)管理,使得所創(chuàng)建的引用該存儲(chǔ)器的跨度不比存儲(chǔ)器緩沖區(qū)本身更長(zhǎng)壽。這可以按多種方式來(lái)安排,如通過(guò)使用底層存儲(chǔ)器上的引用計(jì)數(shù)器或界定跨度本身的壽命。
[0109]在一個(gè)實(shí)施例中,跨度對(duì)象保持指向它表示的存儲(chǔ)器區(qū)域的特殊地注釋的指針。垃圾收集器理解這些特殊指針并特殊地對(duì)待它們。在垃圾收集操作期間,如果垃圾收集器遇到特殊指針,它考慮該指針?biāo)3值牡刂?。如果垃圾收集器檢測(cè)到該指針指向受管堆的外部,則垃圾收集器從當(dāng)時(shí)開(kāi)始完全忽略該指針。如果相反,該指針被發(fā)現(xiàn)指向受管堆內(nèi)的點(diǎn),則垃圾收集器將該指針當(dāng)作對(duì)受管對(duì)象的引用并且因此自動(dòng)調(diào)整指針的值,以防萬(wàn)一底層對(duì)象被重新分配。
[0110]跨度可被創(chuàng)建以表示其他跨度的子區(qū)域。這使得跨度成為在無(wú)需作出復(fù)制的情況下以安全且便宜的方式從較大存儲(chǔ)器區(qū)域切割大塊的非常方便的方式。所得的跨度看起來(lái)像任何其他跨度,即使它被混合成另一跨度的存儲(chǔ)器的子集。
[0111]類型安全類型鑄造
[0112]受管編程語(yǔ)言的主要角色是實(shí)施類型安全性,這防止程序取得存儲(chǔ)器中的任意地址并將它作為對(duì)象來(lái)操縱。例如,圖12的受管系統(tǒng)1200包括確保類型安全性的類型系統(tǒng)1222。所有對(duì)象被顯式地獲取且每一對(duì)象的地址被垃圾收集器(例如,垃圾收集器1221)穩(wěn)固地控制。在這樣的系統(tǒng)中,不在垃圾收集器直接控制之下的存儲(chǔ)器不能被應(yīng)用代碼直接使用。相反,存儲(chǔ)器在能被使用之前需要被從特殊存儲(chǔ)器復(fù)制回到由垃圾收集器控制的存儲(chǔ)器,這是低效的。
[0113]在數(shù)據(jù)通過(guò)DMA操作流入和流出系統(tǒng)時(shí),由DMA設(shè)備操縱的數(shù)據(jù)通常具有某種固有形狀。例如,在通過(guò)DMA寫出數(shù)據(jù)時(shí),垃圾收集堆中的一些數(shù)據(jù)結(jié)構(gòu)通常保持需要被寫出的數(shù)據(jù)?!按谢辈襟E隨后被用來(lái)將這些結(jié)構(gòu)中的數(shù)據(jù)轉(zhuǎn)錄到DMA操作所需的形狀中。這一串行化步驟是冗長(zhǎng)的、易錯(cuò)的、以及低效的。串行化和解除串行化通常是受管編程語(yǔ)言的重要部分。
[0114]通過(guò)利用跨度抽象,通用模型使程序員能夠使用面向?qū)ο蟮恼Z(yǔ)義與DMA存儲(chǔ)器區(qū)域直接交互。特殊類型鑄造支持使得程序員將DMA存儲(chǔ)器區(qū)域當(dāng)作對(duì)