系统内存管理简介
系統(tǒng)內(nèi)存管理簡介
- 系統(tǒng)內(nèi)存管理簡介
- 常見的名詞解釋
- 單塊內(nèi)存管理法
- 分區(qū)管理法
- 頁式管理法
- 幀與頁
- 小結(jié)
系統(tǒng)以字為單位,將內(nèi)存劃分為一個個存儲單位,每個存儲單位都有一個地址。指向地址的指針以字的大小為單位移動。目前常見的字單位為32位(4byte)或者64位(8byte)。
常見的名詞解釋
- 邏輯地址(logical address):僅對程序可見,從0開始計量
- 真實地址(physical addr):系統(tǒng)對內(nèi)存的真實地址編號
- 地址聯(lián)編(addr binding):將邏輯地址映射到真實地址
就地址聯(lián)編這一塊,不同的內(nèi)存管理方式聯(lián)編的方式也不同。邏輯與物理兩套地址的規(guī)劃,使得內(nèi)存管理有極大的自由。程序編譯階段,使用地址就是邏輯地址,當(dāng)機器碼loading進系統(tǒng)開始運行的時候,系統(tǒng)才開始地址聯(lián)編。這使得程序中地址表示是一致的,具體真實占用哪些地址,到地址聯(lián)編的決定。
單塊內(nèi)存管理法
想象這樣一種理想狀況,系統(tǒng)中除了操作系統(tǒng)(OS)只有一個APP。那么除了OS占用部分內(nèi)存,剩下的都是APP進程的內(nèi)存。
我們使用兩套地址管理,邏輯地址和物理地址。物理地址面向程序,從0開始計數(shù),物理地址描述內(nèi)存的實際地址規(guī)劃。
圖1中表示的是邏輯地址+基本地址=物理地址。基本地址A加上邏輯地址L,得到真實地址。
分區(qū)管理法
單塊內(nèi)存管理中只允許單個APP運行,實際上內(nèi)存可以容納多個APP同時運行。這時候的做法是將內(nèi)存分為多個區(qū),除了OS外,每一個APP占用一個連續(xù)、獨立的分區(qū)。
分區(qū)方式有:
- 固定分區(qū):引導(dǎo)OS初期就固定分好區(qū)間,以后不再變
- 動態(tài)分區(qū):根據(jù)需求動態(tài)分配區(qū)間,區(qū)間可以在內(nèi)存中移動
無論單塊內(nèi)存,還是分區(qū)內(nèi)存,同樣遵循邏輯地址和真實地址兩套管理法。每個分區(qū)都有自己的一套邏輯地址,用于內(nèi)部交流,但最終和系統(tǒng)交互的時候,都需要采用物理地址。即聯(lián)編方式,分區(qū)管理中地址信息存儲在寄存器中。基址寄存器存儲分區(qū)當(dāng)前分區(qū)的起始位置,界限寄存器存儲分區(qū)的長度。當(dāng)前進程的請求地址不可以超過分區(qū)長度。
那么分區(qū)的大小如何決定,這取決于匹配進程的方式。總共有三種方式:
- 最先匹配:驗證當(dāng)前內(nèi)存往下走,第一個符合進程需求的大小分配分區(qū)
- 最佳匹配:尋找可用容器中最小的分區(qū)
- 最差匹配:尋找最大的符合進城需求的分區(qū)
前兩者適用于固定分區(qū),便于節(jié)省內(nèi)存。
最后一個符合動態(tài)分區(qū),動態(tài)分配要求盡量滿足當(dāng)前需求,后期再進行調(diào)整。連續(xù)的小空分區(qū),可以合并成一個大的空分區(qū)。并且作業(yè)也可以在內(nèi)存中移動,以空出更大的空間,成為壓縮。
最后,無論是固定分區(qū)還是動態(tài)分區(qū),整個進程必須同時載入內(nèi)存中,一個分區(qū)必須能夠容納整個APP。這也就可以看出頁式內(nèi)存管理的優(yōu)越性,他引出了虛擬內(nèi)存的的概念。
頁式管理法
頁式管理同樣遵循邏輯地址和物理地址的概念,但是這里啟用兩個新的概念,幀面向物理地址,頁面向進程地址。
頁式管理中,將進程(Process)以頁為單位分割,同時將內(nèi)存劃分為一個個幀。頁和幀可以大小不同,為了方便起見,這里將其視為相同。
總結(jié)下來,幀描述內(nèi)存,頁描述進程。內(nèi)存加載進程的方式是通過幀載入頁。
程序面向的是頁地址,這時地址聯(lián)編需要找的是幀,這就需要一本字典,即PMT(page map table)。每一個進程都需要維護一張PMT,表中記錄每一個頁對應(yīng)的幀。
這樣的規(guī)劃管理上增加了復(fù)雜度,但是好處也是巨大的。
無論是單塊內(nèi)存管理還是分區(qū)管理,都需要整塊連續(xù)的內(nèi)存用來存儲進程,相比頁式管理內(nèi)存的利用率則相差太多。分區(qū)管理中,如果找不到能夠容納整個進程的連續(xù)地址,則無法載入進程。頁式管理中,內(nèi)存和頁都是一塊塊的,他們分散在各處,無需專門開辟一塊連續(xù)的空間,內(nèi)存可以見縫插針為頁分配可用的頁。
同時,分頁內(nèi)存管理的方式也引入了請求分頁和虛擬內(nèi)存的概念。請求分頁意思是,由于CPU同一時刻只需要進程的部分數(shù)據(jù),因此就不必將整個進程都加載進內(nèi)存。當(dāng)某些頁面被需要的時候,系統(tǒng)先訪問內(nèi)存,如果該頁面不存在,則訪問二級存儲將信息加載進內(nèi)存,與此同時,新的頁面加入使得原有的頁面退出該幀的使用,該過程稱為頁面交換。
請求分頁的引入使得有時候,內(nèi)存好像無限大一樣,內(nèi)存載入的進程的總大小遠遠大于內(nèi)存大小,這種現(xiàn)象稱為虛擬內(nèi)存。
頁面交互大大提高了內(nèi)存的利用率,但是當(dāng)頁面頻繁交換的時候,交換過程占用過多的時間,使得進程顯得不穩(wěn)定,表現(xiàn)為使用不斷地卡頓,這個現(xiàn)象稱為系統(tǒng)顛簸。
幀與頁
幀就是大小固定的內(nèi)存塊,比如為1024。頁就是進程地址,表示為一個坐標<頁位置,偏移量>。系統(tǒng)中(邏輯地址/1024)的商為頁面位置,余數(shù)為偏移量。因此,頁坐標不得大于幀大小。根據(jù)頁坐標和PMT就可找到物理地址(幀地址)。這就形成了從邏輯地址到物理地址的閉環(huán)。(僅憑記憶回顧,存疑)
小結(jié)
最后總結(jié)一下頁式管理法。一個APP載入系統(tǒng),在系統(tǒng)表現(xiàn)為進程,一個或者多個。系統(tǒng)為每一個進程分配內(nèi)存,將Process分割成頁,將內(nèi)存分割成幀。之后,根據(jù)情況為頁分配幀,同時給每一個進程維護一張PMT用于地址聯(lián)編。
參考
- 《計算機科學(xué)概論》
轉(zhuǎn)載于:https://www.cnblogs.com/Franken-Fran/p/memory_manage.html
總結(jié)
- 上一篇: [SPOJ375]QTREE - Que
- 下一篇: ios UIWebView 播放优酷土豆