“雪花”項(xiàng)目:Microsoft探索在.NET中實(shí)現(xiàn)手工內(nèi)存管理

責(zé)任編輯:editor004

作者:Abel Avram

2017-09-05 11:20:24

摘自:INFOQ

“雪花“項(xiàng)目意在實(shí)現(xiàn) NET中的手工內(nèi)存管理,這一改進(jìn)被認(rèn)為對(duì)一些應(yīng)用是非常有用。論文中提供了一系列給定場(chǎng)景下的測(cè)試結(jié)果,表明使用“雪花”項(xiàng)目的性能相比于垃圾回收機(jī)制取得了改進(jìn)。

來(lái)自Microsoft研究院、劍橋大學(xué)和普林斯頓大學(xué)的一些研究人員構(gòu)建了一個(gè).NET的分支,實(shí)現(xiàn)了在運(yùn)行時(shí)中添加支持手工內(nèi)存管理的API。研究方法的細(xì)節(jié)及所獲得的性能提升發(fā)表在名為“Project Snowflake: Non-blocking Safe Manual Memory Management in .NET”(“雪花”項(xiàng)目:非阻塞的、安全的.NET手工內(nèi)存管理)的論文中。

“雪花“項(xiàng)目意在實(shí)現(xiàn).NET中的手工內(nèi)存管理,這一改進(jìn)被認(rèn)為對(duì)一些應(yīng)用是非常有用。C#、.NET等現(xiàn)代編程語(yǔ)言都采用了垃圾回收機(jī)制,使編程人員得以從管理對(duì)象的任務(wù)中解放出來(lái),這一機(jī)制的優(yōu)點(diǎn)廣為人知,涉及提高生產(chǎn)力、改進(jìn)程序穩(wěn)定性、內(nèi)存安全及防止惡意操作等方面。但是垃圾回收機(jī)制需要付出一些性能上的代價(jià),盡管這在很多情況下不易被察覺(jué),但是在一些情況下還是存在問(wèn)題的。“雪花”項(xiàng)目的研究人員就指出,對(duì)于在具有上百GB堆內(nèi)存的系統(tǒng)上運(yùn)行數(shù)據(jù)分析和流處理任務(wù),就可受益于手工內(nèi)存管理。

“雪花”項(xiàng)目所引入的手工內(nèi)存管理是與垃圾回收機(jī)制并行工作的,開(kāi)發(fā)人員一般情況下使用的是垃圾回收機(jī)制,但在環(huán)境需要時(shí)也可以選擇手工內(nèi)存管理。該引入到運(yùn)行時(shí)中的改進(jìn)并不會(huì)對(duì)已有應(yīng)用產(chǎn)生影響,并且會(huì)改進(jìn)多線程應(yīng)用的性能。“雪花”項(xiàng)目實(shí)現(xiàn)了“在程序任一位置分配和釋放獨(dú)立對(duì)象,并確保手工管理對(duì)象同樣享有完全的類(lèi)型安全和時(shí)序安全,即使存在并發(fā)訪問(wèn)時(shí)。”

“雪花”中提出了兩個(gè)新概念,即對(duì)象“所有者”(Owner)和“護(hù)盾”(Shield),它們實(shí)現(xiàn)為CoreCLR和CoreFX層級(jí)的API。“所有者”表示了棧或堆中的一個(gè)位置,保存了對(duì)手工堆中分配對(duì)象的唯一引用。“所有者”獲取自“護(hù)盾”,而引入“護(hù)盾”是為了避免手工對(duì)象在被多個(gè)線程訪問(wèn)時(shí)重分配(deallocate)。“護(hù)盾”確保了當(dāng)最后使用一個(gè)對(duì)象的線程重分配該對(duì)象后,才從堆中移除該對(duì)象。論文中是如下詳細(xì)闡述該機(jī)制的:

我們的解決方案……受到了無(wú)鎖數(shù)據(jù)結(jié)構(gòu)研究中的“風(fēng)險(xiǎn)指針”(Hazard Pointer)這一概念的啟發(fā)。我們引入了一種機(jī)制,當(dāng)線程想要通過(guò)其中一個(gè)“所有者”位置訪問(wèn)手工對(duì)象時(shí),這一意圖將會(huì)發(fā)布在線程本地狀態(tài)(TLS,Thread-Local State)中。此注冊(cè)過(guò)程可看成是創(chuàng)建了一個(gè)“護(hù)盾”,該“護(hù)盾”將保護(hù)對(duì)象不會(huì)被重分配,并授權(quán)發(fā)布注冊(cè)的線程可直接訪問(wèn)對(duì)象,例如調(diào)用對(duì)象的方法,或是轉(zhuǎn)換(mutate)對(duì)象的字段。同時(shí),不允許任何線程(同一線程或另一個(gè)線程)重分配對(duì)象及回收(reclaim)對(duì)象的內(nèi)存。一旦客戶代碼不再需要訪問(wèn)該對(duì)象,就可以釋放(dispose)“護(hù)盾”,即從對(duì)象的TLS中移除了指向該對(duì)象的引用。直接訪問(wèn)從“護(hù)盾”獲取的對(duì)象是不安全的操作,因?yàn)樵卺尫?ldquo;護(hù)盾”后,實(shí)際的重分配操作依然允許繼續(xù)。

論文中提供了一系列給定場(chǎng)景下的測(cè)試結(jié)果,表明使用“雪花”項(xiàng)目的性能相比于垃圾回收機(jī)制取得了改進(jìn)。其中,“在峰值工作集上獲得了高達(dá)三倍的性能提高,在運(yùn)行時(shí)上取得了兩倍的性能提高”。測(cè)試結(jié)果給出了很好的性能改進(jìn)。這是因?yàn)楫?dāng)對(duì)象池非常大時(shí),垃圾回收為釋放內(nèi)存需要花費(fèi)很多時(shí)間遍歷對(duì)象圖。

Microsoft并未詳述是否有規(guī)劃在.NET中加入“雪花”項(xiàng)目。但考慮到這是一種非侵入式的和安全的機(jī)制,我們希望在.NET的未來(lái)版本中能集成類(lèi)似的功能。

查看英文原文: Microsoft Explores Manual Memory Management in .NET with Snowflake

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)