存儲我們要講兩點内容:
實存管理:
存儲我們隻需要了解三種配置設定方法即 可:單一連續配置設定、固定分區配置設定、可變分區配置設定;其實我們經常講對于一些不好區分的概念,我們畫個表,把他們放在一起來進行對比,那麼通過對比來了解,那 真的是太爽了;是以呢,我們也畫個表,把這幾個概念放在一起來進行區分和了解,看圖:
這樣一對比,我們就能看的出來,隻有可變分區配置設定的空間是可變的;然後另外兩個配置設定是靜态的。其實顧名思義也就差不多能了解的差不多,沒有難度的,我們再深入一點來了解:看幾個圖:
單一連續配置設定:
我們可以看得出來,把整個記憶體區畫為一個區。它同一時間在記憶體當中隻能裝入一個程式,隻能用于單使用者、單任務的執行操作。
固定分區配置設定:
這個跟單一連續有相似之處,就是記憶體配置設定的還是比較固定了;但是這個配置設定還有自己的特點,就是把記憶體分為幾個塊,比如是:10k、22k、32k;那麼 就會有可能能運作三個程式,當三個程式占用記憶體在這三個區域内的時候,我們就能運作。把這個分區給定死了,是以一旦有比這些區域要大的程式要運作,那麼就 完蛋了,雖然總記憶體夠用,但是也不能運作,因為分區分的太死了。
可變分區:
打個比方:有三個過程,一開始和單一連續配置設定是一樣的,然後當有程式要運作的時候,就給該程式配置設定比對的空間,當用完之後,釋放出來之後,又能拼湊成一個空白的區域,回到最初的狀态,特别靈活。
我們繼續對可變分區配置設定方式進行探讨:
最佳适應法:選 擇等于或最接近需求的記憶體自由區進行配置設定。這種方法可以減少碎片,但同時也可能帶來更多小得無法再用的碎片。但是這個還算有弊端的,這個我們應該怎麼了解 呢?比如我們有一個6k的空間,然後配置設定一個5k的空間給一個程式運作,那麼剩餘的1k一般來說就沒法利用了,因為一般很少有1k的程式要運作,是以這個 1k就成了碎片了,那麼循環下來的話,就有很多碎片産生了。但是相對來說,這個配置設定方法還算是挺好的。
首次适應法:首次就是尋找第一個可用的,可用就是尋找大于等于作業需求的記憶體的自由區配置設定給作業。這個的好處就是縮短查找時間。
最差适應法:選擇整個主存中最大的記憶體自由區。比如我有一個5k的程式要運作,然後記憶體中最大的自由區是64k,那麼一樣把64k配置設定給5k的程式運作,然後剩下的59k自由區還能繼續利用起來。
循環首次适應算法:不在每次都是從頭開始配置設定,而是連續向下比對。我們畫個圖來了解:
比如我們的記憶體是這麼個配置設定,那麼我們現在有個作業需要12k記憶體占用,我們就從5k、10k、15k連續查找合适 的,當找到15k的時候,我們就配置設定給12k,那麼當我們剩餘的3k的時候,剛好有一個程式是3k的需要配置設定内容來運作,要是我們按照首次适應法來進行分 配,因為首次适應法是每次都是從頭開始的,是以我們就找到5k的區域,就把5k配置設定了;但是要是我們按照循環首次适應的話,我們是連續配置設定的,這樣我們就 能剛好把剩餘的3k配置設定給這個程式了;這就是首次和循環首次的差別;我這麼講應該沒有問題了吧。
虛存管理:
頁式存儲存儲管理:
通過使用者程式和記憶體的分塊,使用者程式分為n個頁面,頁表起記錄的作用。接下來我們看位址轉換圖:
這個就是我們的位址轉換器,我們想看這個是怎麼個工作的,那麼我們來看個例子,我們分析例子來進行了解:
我們設定頁面大小為4k,圖中的邏輯位址用十進制表示:我們來求a:
我們的過程應該是這樣的,我們的邏輯位址是8644(十進制的),那麼轉換成二進制的為:10 0001 1100 0100;我們得知頁面為4k=2的12次方,是以頁内位址就為12位,是以a的後半部分為10 0001 1100 0100的後12位,為0001 1100 0100,那麼剩下的最高兩位為頁号:10,轉換成十進制為2,然後找出實體塊号為8,8轉換成二進制位1000,是以實體快号頁内偏移拼合得1000 0001 1100 0100,化為十進制得33220。
其實隻要我們懂得了這個過程,那麼剩下的就是進制的轉換了,不難。
段式存儲組織
從使用者出發,将一個程式分成幾個塊:
我們有頁式存儲的基礎,這個就不在胯下,隻是段的大小有點大。
我們再看看位址轉換:
這個算法跟咱們的頁式存儲是一樣的。大家動手試試。
存儲講起來挺有意思,我了解也許會有偏差,希望大家多多指正,不勝感激~
本文出自seven的測試人生公衆号最新内容請見作者的github頁:http://qaseven.github.io/