2010-10-30 52 views

回答

37

一個在它佔據的地址中沒有任何空白。你大概可以把它看成是一個「塊」,把中間的空隙看作是「兩塊」。

該術語在數組的定義中出現爲「連續」。這意味着元素是端對端佈局的,沒有不連續性,它們之間沒有填充(每個元素內部可能有填充,但元素之間沒有填充)。所以5 4字節元件的陣列看起來像這樣(每字節1個下劃線字符,則|符號不表示存儲器):

____ ____ ____ ____ ____ 
|____|____|____|____|____| 

它不會看起來像這樣:

____ _ ____ _ ____ _ ____ _ ____ 
|____|_|____|_|____|_|____|_|____| 

而且它也不是這樣的:

____ ____ ____           ____ ____ 
|____|____|____| ... somewhere completely different ... |____|____| 

在所有情況下,「看起來像」的意思是「就在C可見的地址被關注」。虛擬地址空間中可能有連續的東西,但在物理RAM中不連續。對於這個問題,物理內存地址空間可能是連續的,但在物理內存中並不實際相鄰。其中一半可能在這裏的一個RAM芯片上,另一半在另一個RAM芯片上。但是C內存模型不能「看到」任何這種模型。

+1

+1好的數字。 – 2010-10-30 15:42:37

+25

@Sinan:謝謝,我解決了。 – 2010-10-30 16:00:24

+2

對於那個反應,經典。 – 2010-10-30 17:27:21

5

未被其他內存中斷的內存塊。或者更確切地說,它需要一個不間斷的虛擬地址空間塊。支持該地址空間的真實RAM不需要連續。

如果您分配一個較大的內存塊,這一點很重要。操作系統必須把它作爲一個連續的塊來提供給你,但是如果內存如此碎片化以致只有較小的塊被釋放,那麼即使總可用內存大於所請求的空間,也不能滿足這種內存分配。

這對64位應用程序來說並不是什麼大問題,因爲地址空間很大。但是在32位進程中,可能會發生這樣的情況,即堆得到如此分散(釋放的塊之間仍存在未實現的塊),導致較大的分配失敗。

2

回答分配內存的情況,當調用內存分配器並請求24個字節的內存時,它必須能夠找到至少24字節未分配內存的單個塊。

如果其具有16個字節的存儲器中,起始一個地址x和起始於一個地址的另一個8個字節y使得y > x + 16y < x - 8(這將產生間隙),則分配器不能滿足您的24個字節的請求,即使總共有24個字節可用。請參閱Fragmentation

2

當內存塊由來自單個線性地址空間的開始和結束地址定義且沒有空洞時,該內存塊是連續的。

45

這是5個字節的連續存儲器塊,從位置1跨越到位置5:是一起在存儲器沒有間隙

alt text

它代表字節(淺藍色)字節(白色) 它們之間。

這是一種非連續組的五個字節的興趣:

alt text

它被分段成三個組字節(黃色)的,開始於與間隙位置1字節組之間存在。間隙字節在位置4和6.

+17

+1爲彩色插圖:) – Michael 2011-08-18 21:50:54