2012-10-21 102 views
0

我閱讀了有關內存分配過程中的以下行:內存分配過程

One of the important considerations in main memory management is: how should an 
    OS allocate a chunk of main memory required by a process. One simple approach 
    would be to somehow create partitions and then different processes could 
    reside in different partitions. 

注意,本款尋呼的概念之前來了,在一次談論內存分配全過程。 我的問題是:

Why should we create partitions? We can just keep track of holes in the memory 
    and keep pointers to the beginning and end of the holes. When we allocate a 
    process some memory, we can associate the pointer to the beginning and end of 
    the process with the process and end pointer of the process serves as the 
    pointer to the beginning of a new hole. 

回答

1

我想答案是「效率」。如果你只想跟蹤漏洞,最壞的情況是在給定的內存塊中有許多空洞等於一半的字節(內存塊中的每個第二個字節都是一個「空洞」),這意味着對於每個內存給定尺寸的塊需要的指針附加數量等於塊的一半大小,例如:

塊大小:1024B

「洞」的

最大NUMER:二分之一千○二十四= 512

每個指針跟蹤單個「洞」是4B(在32位架構上),因此:512 * 4 = 2048B! 我希望我不必說服你,這不是最好的解決方案。一些聰明的人發現,爲了「解決」問題,你需要更大的「粒度」記憶。換句話說,操作系統只在一些固定大小的塊(稱爲頁面)中分配內存。通常一頁是4KiB(4096B)。你可以這樣想:當我們談論內存分配操作系統不是零售商。 OS只在頁面中分配內存。在進程級別上需要更小的分配粒度 - C庫的實現在那裏發揮作用(C庫分配例程是零售商)例如:malloc,free功能和朋友。這些函數從操作系統分配內存(以頁爲單位),然後跟蹤「已用」和「未用」塊(這只是一種簡化:它要複雜得多,因爲它們有不同的「策略」所請求的塊)。

P.S. 我知道這是非常普遍的,但我不知道你對這個主題的現有知識有多廣泛。

+0

@sirgeorge ...請注意,我正在討論連續分配內存給進程。因此,如果每個第二個字節是一個空洞,那麼意味着每個進程都是1個字節長。我認爲我們可以認爲,如果分區中遺漏的空洞可能被另一個進程完全或部分佔用。例如:如果有一個256字節的分區,並且有一個100字節的進程。現在,如果有50字節的進程出現,它可以佔據與100字節相鄰的地方(所以我們需要一個指針告訴我們100字節進程的結束)。所以,爲什麼涉及分區時指針可以照顧它呢? – avinash