Binary Buddies实施问题

时间:2015-04-08 13:15:45

标签: c binary

我已经阅读并理解了二元伙伴内存分配方法背后的概念,我正在尝试将其用于C中,但在我真正开始之前,我有一些特定于实现的问题。

https://drive.google.com/file/d/0BxJX9LHXUU59OWZ6ZmhvV1lBX2M/view?usp=sharing - 这是分配规范的链接,我的问题与问题5有关。

该问题指定在分配器的初始化时对malloc进行一次调用,并且必须使用从此调用获取的空间来服务所有内存请求。

  1. 很明显,当调用get_memory()时,必须以某种方式递增指向此空间的初始指针,并且新指针将返回到调用进程。如何将指针递增特定的字节数?

  2. 我知道必须保留每个块大小的空闲列表,但我不确定如何初始化和维护这些列表。什么存储在免费列表中?内存指针?

  3. 如果以前曾问过这些问题我很抱歉,我没有找到相关的问题,这些问题足以让我明白工作。

2 个答案:

答案 0 :(得分:0)

对于你的第一个问题,你只需要像普通变量一样增加指针。

指针的值对应于它指向的数据的内存中的地址。通过增加它,例如10,你实际上将10个字节进一步移动到你的记忆中。

对于空闲列表,malloc()使用分配的内存块创建一个结构,该内存块包含诸如内存块的地址,大小以及是否空闲等信息。

您的目标是创建这些结构,以便您可以使用get_memory()和release_memory()函数跟踪已分配或释放的不同内存块的状态。

您可能还会发现这有用:https://stackoverflow.com/a/1957125/4758798

答案 1 :(得分:0)

  
      
  1. 很明显,当调用get_memory()时,必须以某种方式递增指向此空间的初始指针,并且新指针将返回到调用进程。如何将指针增加特定的字节数?
  2.   

当您调用get_memory()时,您将返回指向添加到某个偏移量的主内存的指针。单词'increment'意味着你要改变初始指针的值,你不应该这样做。

以下是一些简单的代码,用于对一个大内存块进行子地址。

#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;
}

  
      
  1. 我知道必须保留每个块大小的空闲列表,但我不确定如何初始化和维护这些列表。什么存储在免费列表中?内存指针?
  2.   

至少,你可能想要跟踪内存指针和内存块的大小,所以像这样......

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;

这个难题有多种方法。