freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

freebsd虛擬內(nèi)存vm系統(tǒng)設(shè)計原理-文庫吧

2025-04-17 19:52 本頁面


【正文】 來管理所有這些對象。最初的程序二進制文件作為 VM 對象層中的最低部分。寫時復(fù)制層隨后被放到它頂上,以保持那些頁在需要時所產(chǎn)生的副本。如果程序修改了屬于原始文件的數(shù)據(jù)頁, VM 系統(tǒng)將獲得一個中斷 (fault),并在更高的這層復(fù)制那一頁。當(dāng)進程 fork 時,將產(chǎn)生附加的 VM 對象層。通過一個很基本的例子可以得到更多的感性認(rèn)識。 fork是所有 *BSD 系統(tǒng)的一個公共的操作, 因此這一事例將考慮一個程序開始,然后fork。當(dāng)進程開始時, VM 系統(tǒng)創(chuàng)建一個對象層,我們稱之為 A: A 表示文件 頁面可以在需要時從文件的物理介質(zhì)中換入 (page in)和換出(page out)。從磁盤上換入一部分?jǐn)?shù)據(jù)對程序來說是很正常的,但我們并不希望頁面被換出并覆蓋原始的可執(zhí)行文件。 VM 系統(tǒng)因此建立一個新的層, B,它將由交換空間進行物理的維護。 其后第一次頁面寫入將導(dǎo)致 B 中創(chuàng)建一個新的頁,它的內(nèi)容將根據(jù) A 中的對應(yīng)頁初始化。所有 B 中的頁可以與交換設(shè)備換入和換出。當(dāng)程序 fork 時, VM系統(tǒng)創(chuàng)建兩個新的對象 層,父進程的 C1 和子進程的 C2,這兩層都在 B 上: 在這個例子中,一個 B 中的頁由父進程進行了修改,進程將得到一個寫時復(fù)制中斷,并復(fù)制 C1 中的頁,而 B 中的頁不會被觸及?,F(xiàn)在,子進程也修改了一些數(shù)據(jù),于是在 C2 中發(fā)生了類似的事情?,F(xiàn)在, B 中的原始頁對于 C1,C2 都不再可見,因為 C1 和 C2 都擁有了一份私有的、修改過的副本;此外,如果 B層并不表示一個 實在的 文件的話,它在理論上就可以釋放掉了。然而,釋放B 層中的個別塊這類優(yōu)化的價值不高,因為它過于瑣碎,而且是如此的精細(xì)。FreeBSD 并不進行這類優(yōu)化?,F(xiàn)在,假定 (就 像通常的情況那樣 ),子進程調(diào)用了 exec(),那么當(dāng)前地址空間就被一個新的文件所表示的空間所代替。在這種情況中, C2 層被釋放: 在這種情況下, B 的子節(jié)點個數(shù)下降到 1,于是所有對 B 的訪問將直接通過C1 完成。這意味著 B 和 C1 可以被折疊到一起。任何在 B 和 C1 中都存在的頁在折疊過程中都將從 B 中刪除。因而,盡管這一油花在前一步驟中不被完成,但我們?nèi)匀豢梢栽?exec()或 exit 時恢復(fù)那些不再使用的頁。 這一模型造成了一系列潛在的問題。首先,你可能會得到一個相對深的 VM對象層棧,當(dāng)產(chǎn)生中斷時,這將造成掃描時間的增加,并 浪費內(nèi)存。深的層在進程 fork 并再次 fork 的時候 (無論父進程還是子進程 )產(chǎn)生。其次,那些不可能再次被訪問的頁可能逐步在 VM 對象棧中積累。我們的最后一個例子將是,當(dāng)父進程和子進程都修改了同一頁,它們都擁有了那一頁的私有副本,而 B 中的原始頁將不可能被訪問到時, B 中的這一頁將被釋放。 FreeBSD 通過一種被稱作 全覆蓋特例 的特殊優(yōu)化來解決深層問題。這一情況發(fā)生于,當(dāng) C1 或 C2 產(chǎn)生了足夠的寫時復(fù)制中斷,并完全包含了 B 中的所有頁面時。以 C1 達(dá)到這一情況為例。 C1 現(xiàn)在可以完全繞過 B,因此,我們不再采用 C1→ B→ A 和 C2→ B→ A 的訪問方式,相反,我們將采用 C1→ A 和 C2→ B→ A。不過,另一方面,我們觀察到現(xiàn)在 B 只有 1 個引用 (C2),因此我們可以將 B 與C2 折疊到一起。最終的結(jié)果是, B 可以被整個刪除,因而我們有 C1→ A 和 C2→A。通常情況下, B 將包括大量的頁面,而無論是 C1 還是 C2 都不能完全地蓋住它。如果此時我們再次 fork,并創(chuàng)建一組 D 層,那么,就非常有可能 D 層最終完全覆蓋 C1 或 C2 中遠(yuǎn)小的數(shù)據(jù)集。同樣的優(yōu)化將在圖中的任意一點工作,而最終結(jié)果將是即使在經(jīng)常進行 fork 的機器上, VM 對象棧也基本上不會超過 4層。無論父進程 和子進程是否進行 fork,無論子進程是否進行層疊的 fork,上述結(jié)論都是正確的。 某些不可能被訪問的頁面可能依然存在,如果 C1 和 C2 都不能完全覆蓋 B。由于我們的其他優(yōu)化,這已經(jīng)不知造成問題,因此我們將允許這樣的頁面存在。如果系統(tǒng)內(nèi)存不足,則這些頁面將被換出,消耗一些交換空間,但不會包括其他的工作了。 VM 對象模型的好處是 fork()非???,因為并不需要實際進行寫操作。缺點是 VM 對象層相對復(fù)雜,這略微減慢了缺頁中斷的處理,而且,需要額外的內(nèi)存來管理 VM 對象結(jié)構(gòu)。 FreeBSD 的優(yōu)化證明這些問題完全可以被忽略, 從而實際上不存在什么缺陷。 私有的數(shù)據(jù)頁在開始時,要么是寫時復(fù)制頁,要么是按需清零頁。當(dāng)發(fā)生修改,并因此進行賦值時,頁背后的對象 (通常是一個文件 )將不能再被作為 VM系統(tǒng)需要重用一頁時頁的可靠副本。這時將用到交換區(qū) (swap)。交換區(qū)被分配作為內(nèi)存的一個輔助存儲區(qū),它不能被用作其他目的。 FreeBSD 只有在真的需要時才分配交換管理結(jié)構(gòu)。但是,交換管理結(jié)構(gòu)在歷史上是存在問題的。 在 FreeBSD 中,交換管理結(jié)構(gòu)預(yù)先分配一個數(shù)組,它包括了需要較緩存儲的整個對象 哪怕那個對象中只有很少的頁是基于 交換區(qū)的。當(dāng)映射大的對象,或者一個有大的運行尺寸 (RSS)的進程 fork 時,這會造成內(nèi)核內(nèi)存碎片問題。此外,為了保持對交換空間的追蹤,內(nèi)核內(nèi)存中將保存一個 空洞表 ,這也趨于嚴(yán)重地產(chǎn)生碎片。由于 洞表 是一個線性表,交換分配和釋放性能不是最優(yōu)的,每頁 O(n)。此外,它也要求在交換區(qū)釋放進程時進行內(nèi)核內(nèi)存分配,而這將造成內(nèi)存不足時的死鎖。由于采用的交錯算法,由空洞產(chǎn)生的問題變得更為嚴(yán)重。同時,在非連續(xù)地分配內(nèi)存時,交換區(qū)塊映射很快就會變得充滿碎片。內(nèi)核內(nèi)存也必須在發(fā)生換出 (swapout)時很快地分配交換區(qū)管 理結(jié)構(gòu)。顯然,這些都有很大的改善余地。 在 FreeBSD 中,我整個地重寫了交換子系統(tǒng)。通過這次重寫,交換區(qū)結(jié)構(gòu)被通過一個散列表 (hash table)而不再通過線性數(shù)組來分配,這帶來了固定的分配尺寸和更好的粒度控制。取代原先使用線性鏈表來追蹤預(yù)留交換空間的是,現(xiàn)在的系統(tǒng)使用一個包含空閑區(qū)域線索的采用基數(shù)樹結(jié)構(gòu) (radix tree st
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1