2015-04-08 82 views
0

我已經閱讀並理解了二進制夥伴的內存分配方法背後的概念,我試圖把它用C語言工作,但在真正開始之前我有一些特定於實現的問題。二進制好友的實現問題

https://drive.google.com/file/d/0BxJX9LHXUU59OWZ6ZmhvV1lBX2M/view?usp=sharing - 這是對分配說明一個鏈接,我的問題涉及到的問題5

問題指定了一個調用MALLOC是在分配器的初始化進行,並且所有的請求內存必須使用從此調用獲取的空間進行維護。

  1. 很顯然,初始指針到這個空間必須以某種方式遞增時調用get_memory()製成,而新指針將被返回給調用過程。我如何通過特定數量的字節增加指針?

  2. 據我所知,每個塊大小的自由列表必須保留,但我不確定這些將如何初始化和維護。什麼是完全存儲在空閒列表中?內存指針?

我很抱歉如果之前詢問過這些問題,我還沒有找到一個相關的問題,爲我提供了足夠的清晰度來工作。

回答

0

對於你的第一個問題,你只需要像普通變量一樣增加你的指針。

指針的值對應於它指向的數據在內存中的地址。通過增加10,你實際上將10個字節進一步移動到你的內存中。

對於空閒列表,malloc()用分配的內存塊創建一個結構分支,該分配的內存塊包含內存塊的地址,大小以及是否空閒等信息。

您的目標是創建這些結構,以便您可以使用get_memory()和release_memory()函數跟蹤已分配或釋放的不同內存塊的狀態。

您也可能會發現這個有用:https://stackoverflow.com/a/1957125/4758798

0
  1. 很顯然,初始指針到這個空間必須以某種方式遞增時調用get_memory()製成,而新指針會返回到調用進程。我如何通過特定數量的字節增加指針?

當你調用get_memory(),你會返回一個指向加入一些抵消主存儲器。單詞'增量'意味着你將改變初始指針的值,你不應該這樣做。

下面是一些簡單的代碼,我subaddressing一個大的內存塊。

#include <stdlib.h> 
#include <stdio.h> 

int main (void) 
{ 
    // Allocate a block of memory 
    void * memory_block = malloc (512); 

    // Now "Split" that memory into two halves. 
    void * first_half = memory_block; 
    void * second_half = memory_block + 256; 

    // We can even keep splitting... 
    void * second_first_half = second_half; 
    void * second_second_half = second_half + 128; 

    // Note that this splitting doesn't actually change the main memory block. 
    // We're just bookmarking locations in it. 

    printf ("memory_block %p\n", memory_block); 
    printf ("first_half %p\n", first_half); 
    printf ("second_half %p\n", second_half); 
    printf ("second_first_half %p\n", second_first_half); 
    printf ("second_second_half %p\n", second_second_half); 

    return 0; 
} 

  • 我理解,對於每種塊大小自由列表必須被保留,但是我不能確定究竟如何這些將被初始化和維護。什麼是完全存儲在空閒列表中?內存指針?
  • 至少,你可能要跟蹤內存指針和該內存塊的大小,所以像這樣的......

    typedef struct memory_block { 
        void * memory; 
        size_t size; 
    } memory_block_t; 
    

    還有其他的方法來表示這雖然。例如,您通過跟蹤其相對於全局malloc的內存偏移量來獲得等效信息。我建議將存儲器視爲一組偏移量,如下所示:

    void * global_memory; // Assigned by start_memory() 
    
    // Functionally equivalent to the above struct 
    // memory = global_memory + begin; 
    // size = end - begin; 
    typedef struct memory_block { 
        size_t begin; 
        size_t end; 
    } memory_block_t; 
    

    這個難題有多種解決方法。