天天看點

記憶體的基礎知識

記憶體的基礎知識

1.什麼是記憶體,有何作用

記憶體是用于存放資料的硬體。程式執行前需要先放到記憶體中才能被CPU處理。

在多道程式環境下,系統中多個程式并發執行,如何區分各個程式的存放資料位置呢?

方案是:給記憶體的儲存單元編寫位址

(1)存儲單元和記憶體位址

存儲單元:就是存儲空間,如果按位元組編址,其空間大小就是8個bite位,可以存儲0~256個數字,如果按字編址,就字的大小,字一般由若幹個位元組組成。

記憶體位址:記憶體位址從0開始,每一個位址對應一個存儲單元

(2)按位元組編址和按字編址

按位元組編址和按字編址的方式,決定了存儲單元的大小和記憶體位址的大小(結合總的記憶體位數,即記憶體大小)

補充:幾個常用的數量機關:

1k=2^10B

1M=2^20B

1G=2^30B

1B=8bit

舉個例子:

一台電腦有4GB的記憶體,如果按字編制,求其存儲單元有多少,記憶體位址需要幾位來表示?

4GB=4*2^30

=2^32 B

B=8bit 等于0-255個數字

是以有2^32個存儲單元,位址需要32位來表示

每個程序在邏輯上由三個部分組成:

1.程式段

2.資料段

3.PCB塊

2.程序運作的基本原理

(1)指令工作的步驟

CPU逐個讀取程式段中的指令

記憶體的基礎知識

指令由操作碼和參數(位址或變量)組成。這些指令會告訴CPU應該去哪個位址進行存或取資料,然後問題就來了,在單道程式系統中,因為隻有一個程式在執行,是以位址容易确定,而在多道程式中,由于程式大小,執行的先後,導緻了記憶體位址中空閑位址的不确定,進而産生了邏輯位址和實體位址的差別。在我們程式員寫完代碼後,編譯出的機器語言指令中的存取位址都是邏輯位址,即再從0開始寫位址,到了真正運作的時候,再轉化為實際記憶體的實體位址。

(2)邏輯位址和實體位址

邏輯位址=》相對位址 實體位址=》絕對位址

(3)從寫程式到程式運作

記憶體的基礎知識

源檔案就是指c語言的 .c檔案

目标子產品就是編譯生成的 .o檔案

裝入子產品就是目标子產品連結後的 .exe檔案

1.編輯源碼檔案:

2.編譯:由源碼檔案生成目标子產品,由進階語言生成機器語言

由編譯程式将使用者的源代碼編譯成若幹個目标子產品(各個目标子產品中都有着自己的邏輯位址,即從0開始)

3.連結:由目标子產品生成裝入子產品,連結後生成完整的邏輯位址

由連結程式将編譯後形成一組目标子產品,以及所需庫函數連結在一起,形成一個完整的裝入子產品,,由裝入程式将裝入子產品裝入記憶體中運作。(會将之前每個目标子產品的邏輯位址再進行一次整合,形成一個新的邏輯位址,即從0開始)

4.裝入:将裝入子產品裝入記憶體,裝入後生成實體位址

(4)三種連結方式

1.靜态連結:裝入前連結成一個完整裝入子產品

2.裝入時動态連結:運作前 —邊裝入邊連結

3.運作時動态連結:運作目标子產品才裝入并連結

(5)三種裝入方式

1.絕對裝入:編譯時産生絕對位址(适合單道程式)

在編譯時,如果知道程式将放到記憶體中的哪個位置,編譯程式将産生的絕對位址的目标代碼。裝入程式安裝裝入子產品中的位址,直接可以在記憶體中進行操作。

2.可重定位裝入:裝入時将邏輯位址轉換為實體位址

靜态重定位:又稱可重定位裝入,編譯、連結後的裝入子產品的位址都是從0開始,指令中的位址、資料存放的位址都是相對于起始位址而言的邏輯位址。可根據記憶體的目前情況,将裝入子產品裝入到記憶體的适當位置。裝入時對位址進行重定位,将邏輯位址轉化為實體位址(位址變換是在裝入時一次完成的)

其特點:一個作業裝入記憶體時,必須配置設定其要求的全部記憶體空間,如果沒有足夠的記憶體,就不能裝入該作業,作業一旦進入記憶體以後,在運作期間就不能再移動,不能再申請記憶體空間。

3.動态運作時裝入:運作時将邏輯位址轉換為實體位址,需設定重定位寄存器

動态重定位:又稱動态運作時裝入。編譯、連結後的裝入子產品的位址都是從0開始的。裝入程式把裝入子產品裝入記憶體後,并不會立即把邏輯位址轉化為實體位址,而是把位址轉換推遲到程式真正要執行的時候才進行。是以裝入記憶體後所有的位址依舊是邏輯位址。這種方式需要一個重定位寄存器的支援。

有一個了解難點,就是連結和裝入是怎麼聯合在一起的????

繼續閱讀