版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/3904611
記憶體管理
記憶體提供了一種存儲資訊的方式。
根據怎樣使處理器能快速通路存儲的資料,計算機儲存設備可分為如下幾類:
1)處理器寄存器
2)處理器緩存
3)RAM
4)本地磁盤存儲
5)經網絡連接配接的資料存儲
有三種級别的記憶體管理:
1)機器級
記憶體由一系列的讀寫單元所組成。每個記憶體單元都是一個基于半導體的電子元件,它存在兩種可能狀态。以0和1分别表示這兩種可能狀态。
記憶體單元按位元組進行分組。
處理器使用總線來操縱記憶體。總線是連接配接處理器和計算機子系統的一系列連接配接線。
有三類總線:控制總線、位址總線、資料總線。
MAS Memory Address Space 記憶體位址空間
記憶體不僅用于存儲程式指令,它還用于存儲資料。
有兩種方法在記憶體中存儲多位元組資料:Big-endian和Little-endian。
例如0xABCDEF12資料:
——————————————————————
方法 24 25 26 27
Big-endian AB CD EF 12
Little-endian 12 EF CD AB
其存儲方法取決于你所采用的硬體平台。
如采用Intel的處理器,它是以Little-endian存儲的,可程式設計證明:
#include<stdio.h>
int main(int argc, char *argv[]){
unsigned long value = 0xABCDEF12;
unsigned char *arr;
arr = (unsigned char *)&value;
printf("%X %X %X %X/n",arr[0],arr[1],arr[2],arr[3]);
return;
}
——————————————
輸出結果:12 EF CD AB
注意:位元組順序是從一個平台到另一個平台移植代碼的主要問題。
使用Big-endian的資料表示方法被稱為網絡順序(Network Order)。這是因為網絡協定如TCP/IP需要以Big-endian格式發送一定的資訊塊。
2)作業系統級
從作業系統級來看,記憶體有一系列連續的位元組所組成。每個位元組都有唯一的以0開始的整數位址,0位址表示記憶體的底部。
為防止應用程式的失效和記憶體短缺,作業系統有兩種記憶體管理手段:segmentation(分段)和paging(分頁)。
磁盤空間也經常用于模拟記憶體空間,即虛拟記憶體。
目前32位Intel處理器的記憶體分頁有三種尺寸:4096bytes、2MB、4MB。通過系統的控制寄存器CR4的第4、5位(标志PSE和PAE)進行設定。
分段是一種設定保護的方法。分段的目的是在記憶體中隔離程式,使其互相不發生幹擾。早期的作業系統如DOS沒有提供任何保護。惡意程式很容易控制計算機運作的DOS并重新格式化硬碟。
以分段方式分割記憶體的區域,這些區域稱為segment。一個程式至少由一個及以上的segment組成。
3)應用程式級
作業系統為應用程式配置設定記憶體,它把記憶體分為一個或多個segment。應用程式使用了如下幾種segments:
(1) Text segment
(2) Data segment
(3) Stack segment
(4) Heap
程式有兩個基本元素:指令和資料。
Text segment通常用于存儲程式指令。
Data segment用于存儲編譯時的全局資料。Data segment的存儲空間是靜态的。
Stack segment用于運作時作為臨時存取點。處理器使用stack來為函數參數、本地變量、函數傳回值等配置設定臨時存儲空間。當函數調用時,函數參數、本地變量、函數傳回值存儲到Stack segment,當函數傳回時,所有的記憶體都被釋放。
Heap取決于運作時的系統調用。Heap用于運作時動态配置設定記憶體。
下表簡要的比較了幾種語言的記憶體管理設施。
——————————————————————————————————————————
語言 Data segment Stack segment Heap
COBOL-85 yes no no
ANSI C yes yes 手動回收
Java no yes 垃圾收集器
C語言,使用stack配置設定臨時存儲,包括局部變量、函數參數和函數傳回值。這些變量在函數調用時存在。
Heap是一個記憶體區域,主要用于擷取資料。與Stack不同,Heap沒有push/pop操作。這使得Heap管理更為靈活,但也更為複雜。