計算機記憶體管理介紹

2022-07-30 12:18:11 字數 3619 閱讀 7109

計算機作業系統記憶體管理是十分重要的,因為其中涉及到很多設計很多演算法。《深入理解計算機系統》這本書曾提到過,現在作業系統儲存的設計就是「帶著鐐銬跳舞」,造成計算機一種一種容量多,速度快的假象。包括現在很多系統比如資料庫系統的設計和作業系統做法相似。所以在學習作業系統之餘我來介紹並總結一些作業系統的記憶體管理。

首先我們看一下計算機的儲存層次結構

按照金字塔結構可以分為四種型別: 暫存器,快速快取,主存和外存。而

暫存器和l1快取都在processor內部。在金字塔中,越往下**越低速度越慢但容量越大。

簡言之就這兩個空間分別是程式設計師能夠觀測到的儲存空間和真實的物理空間。

需求:為了滿足需求的目標:

作業系統在記憶體中的位置有以下三種可能

此時整個記憶體只有兩個程式,即使用者程式和作業系統。

作業系統所佔的空間是固定的,則使用者程式空間也是固定的,因此可以將使用者程式永遠載入到同乙個位址,即使用者程式永遠從同乙個地方開始執行。這種情況下,使用者程式位址可以在執行之前就可以計算出來。

此時使用者的程式空間需要通過分割槽來分給多個不同的程式了。每個應用程式占用乙個或幾個分割槽,這種分配支援多個程式併發執行,但難以進行記憶體分割槽的共享。

其中分割槽有兩種方法:

顧名思義就是把記憶體劃分為若干個固定大小的連續分割槽,這幾個分割槽或者大小相等以適合多個相同程式併發,或者大小不等的分割槽以適合不同大小的程式。

這種分配方法優點很明顯,在於非常容易實現,開銷小。

缺點就是會產生很多內部碎片(也就是未被利用的儲存空間),固定的分割槽總數也限制了併發執行的程式數目。我們簡單介紹下靜態分配的幾種方法。

單一佇列的分配方式

多佇列分配方式

固定分割槽管理

先使用表進行大小初始化,固定分割槽大小

此時分割槽的邊界可以移動,但也產生了分割槽與分割槽之間狹小的外部碎片。

在可變分割槽中,知道記憶體的空閒空間大小就十分重要了。os通過跟蹤記憶體使用計算出記憶體有多少空閒。跟蹤的方法有兩種:

也就是所謂的bitmap,用每一位來存放某種狀態。將記憶體每乙個分配單元賦予乙個判斷的用於判斷狀態的字位,字位取值位0表示單元閒置;字位為1表示單元被占用

特點空間成本固定:不受記憶體程式數量影響

時間成本低:操作的時候只需要將狀態值改變

缺少容錯能力:由於記憶體單元發生錯誤的時會將狀態值改變,對作業系統來講,這個狀態值是因為發生錯誤發生的改變還是原來的狀態很難判斷。

​ 將分配單元按照是否閒置鏈結,p代表這個空間被占用,h代表這個這是一片閒置空間。為了方便遍歷查詢,每個程式空間的結點接著乙個空閒空間的結點每個鍊錶結點還有乙個起始位址,與分配單元的大小,用**表示為

enum status;

struct linknode;

特點

1. 空間成本:取決於程式數量

2. 時間成本:鍊錶不停的遍歷速度很慢,同時還要進行鍊錶的插入和刪除修改。

3. 有一定的容錯能力,可以通過程式空間結點和空閒空間結點相互驗證。

os通過上面兩種跟蹤方法知道記憶體空閒容量,而現在作業系統一般都以鍊錶的形式進行記憶體空閒容量跟蹤。如果有新的程式需要讀入記憶體,可變分割槽就要對空閒的分割槽進行記憶體分配。

記憶體分配使用兩張表:已分配分割槽表和未分配分割槽表。用c++描述如下:

//未分配分割槽表

struct freeblock ;

//已分配分割槽表

struct allocatedblock ;

然後os用雙向鍊錶將所有未分配分割槽表進行串聯

structnode;
未分配分割槽表在整個系統空間上的結構如下:

這裡我們介紹四種基於順序搜尋的尋找空閒儲存空間的演算法:

下次適應演算法( next fit ) :將儲存空間中空白區構成乙個迴圈鏈,每次為儲存請求查詢合適的分割槽時,總是從上次查詢結束的下乙個空閒塊開始,只要找到乙個足夠大的空白區,就將它劃分後分配出去。

最佳適應演算法( best fit ) : 為乙個作業選擇分割槽時,總是尋找其大小最接近(小於等於)於作業所要求的儲存區域。

最壞適應演算法( worst fit ) :為作業選擇儲存區域時,總是尋找最大的空白區。

系統中空閒分割槽表如下按照位址遞增次序排列,現有三個作業分配申請記憶體空間100k,30k,7k

區號大小

位址狀態

132k

20k未分配28k

52k未分配

3120k

60k未分配

4331k

180k

未分配首次適應:

從上到下尋找合適的大小

下次適應

最佳適應演算法

最壞適應演算法

基於順序搜尋的分配演算法實際上只適合小型的作業系統,大中型系統使用了是比較複雜的索引搜尋的動態分配演算法。

**分割槽上鄰接乙個空閒分割槽,合併後首位址為空閒分割槽的首位址,大小為二者之和。

**分割槽下鄰接乙個空閒分割槽,合併後首位址為**分割槽的首位址,大小為二者之和。

**分割槽上下鄰接空閒分割槽,合併後首位址為上空閒分割槽的首位址,大小為三者之和。

**分割槽不鄰接空閒分割槽,這時在空閒分割槽表中新建一表項,並填寫分割槽大小等資訊。

ipad畫了乙個簡單的示意圖如下:

記憶體分配實際上是作業系統非常重要的一環,如果僅限於理論而不寫**實踐則容易迷惘,很多具體的實現與都比較困難。如上面的基於順序搜尋的最佳適應演算法,比如幾個分割槽的表示方法,都用到了資料結構和演算法的知識。如果能用c或者c++完成上述幾個演算法和操作的具體實現,相信一定會大有脾益的。

計算機記憶體管理

在計算機中,儲存區域主要分為 他們的執行速率自下而上加快,與之相應的造價越高。其中,硬碟的執行效率最慢,暫存器的效率最快。在c 中,記憶體主要分為五個區,分別是 區是用來儲存程式的所有 以及字串常量等在編譯期間就能確定的值,在程式的整個生命週期內,在常量資料區的資料都是可用的。在這個區域內,所有的資...

計算機記憶體分配 管理

當我們寫完乙個程式後,編譯 鏈結 執行,表面看似很簡單,其實程式執行過程中,記憶體為我們的程式做了很多事。我們先來看乙個圖 一般我們將記憶體分為 堆區 棧區 全域性區 區 常量區,各個區域存放的內容 棧區 在程式中所建立的區域性變數 引數 陣列 指標等,當程式執行完後,將釋放所占用的該塊記憶體。堆區...

計算機記憶體

1.1 計算機硬體記憶體架構。計算機cpu central processing unit 和記憶體的互動是最頻繁的,記憶體是我們的快取記憶體區。使用者磁碟和cpu的互動,而cpu運轉速度越來越快,磁碟遠遠跟不上cpu的讀寫速度,才設計了記憶體,使用者快取使用者io等待導致cpu的等待成本。但是隨著...