2012-04-04 174 views
0

我正在寫我自己的內存分配器。如果我的概念是正確的,那麼內核的地址空間從零到1 GB,用戶空間從1到4,包含不同的部分,如代碼,堆棧,數據,堆和其他部分。堆大小和位置

  1. 是不是在程序執行過程中堆段的大小和位置不能改變?
  2. 我該如何獲得大小和位置?
  3. 在獲得堆區域之後,我需要做的就是根據自己的判斷分配內存,不是嗎?
+0

您在什麼級別分配內存?如果您正在編寫自己的'malloc()'版本作爲練習,那麼當程序啓動時,您可能需要調用「real」malloc()'來分配大量內存。這將是您通過分配部分數據並跟蹤已使用或仍然可用的區域來管理的「堆」。 – 2012-04-04 23:31:01

回答

2

你爲什麼要擔心這個?

如果您正在編寫a-la libc分配器,請使用sbrk和/或mmap從內核中預留內存。無需擔心這些系統調用中堆的位置。

如果你想儀器libc的malloc/calloc/realloc,事情更簡單 - 只需將它們包裝在您的分配器功能。

  1. 是的,分配器通過從內核請求內存來有效地管理堆。通常,與brk的情況一樣,它的位置位於數據段結束之後,並且它在增加的地址處增長(或者以mmap等的頁面大小的倍數分配)

  2. 分配器管理大小;就分配者而言,堆的位置並不相關,但它處於知道它的位置。

  3. 分配器從內核有效地請求內存。一旦它擁有了這種記憶,它就可以將它分發給它認爲合適的節目。

1
  1. 它是限定了堆的分配器。如果你有一個自定義的分配器,並且它確定所有的內存客戶都返回了所有的內存,那麼刪除它的堆或者創建一個新的來提供內存請求是完全有效的。

  2. 由於分配器本身定義堆,它應該知道它的大小和位置。如果你正在談論的是用你自己的分配器篡奪OS分配器的責任,那麼你應該只使用OS分配器來獲得一塊內存,然後用它作爲你自己的分配器的堆。

  3. 同樣,一旦你的分配器擁有內存塊,它可以根據你的判斷使用。你不能簡單地把由另一個分配器管理的內存和它的空閒池中的內存使用並且沒有嚴重的潛在後果。