我已经阅读并理解了二元伙伴内存分配方法背后的概念,我正在尝试将其用于C中,但在我真正开始之前,我有一些特定于实现的问题。
https://drive.google.com/file/d/0BxJX9LHXUU59OWZ6ZmhvV1lBX2M/view?usp=sharing - 这是分配规范的链接,我的问题与问题5有关。
该问题指定在分配器的初始化时对malloc进行一次调用,并且必须使用从此调用获取的空间来服务所有内存请求。
很明显,当调用get_memory()时,必须以某种方式递增指向此空间的初始指针,并且新指针将返回到调用进程。如何将指针递增特定的字节数?
我知道必须保留每个块大小的空闲列表,但我不确定如何初始化和维护这些列表。什么存储在免费列表中?内存指针?
如果以前曾问过这些问题我很抱歉,我没有找到相关的问题,这些问题足以让我明白工作。
答案 0 :(得分:0)
对于你的第一个问题,你只需要像普通变量一样增加指针。
指针的值对应于它指向的数据的内存中的地址。通过增加它,例如10,你实际上将10个字节进一步移动到你的记忆中。
对于空闲列表,malloc()使用分配的内存块创建一个结构,该内存块包含诸如内存块的地址,大小以及是否空闲等信息。
您的目标是创建这些结构,以便您可以使用get_memory()和release_memory()函数跟踪已分配或释放的不同内存块的状态。
您可能还会发现这有用:https://stackoverflow.com/a/1957125/4758798
答案 1 :(得分:0)
- 很明显,当调用get_memory()时,必须以某种方式递增指向此空间的初始指针,并且新指针将返回到调用进程。如何将指针增加特定的字节数?
醇>
当您调用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;
}
- 我知道必须保留每个块大小的空闲列表,但我不确定如何初始化和维护这些列表。什么存储在免费列表中?内存指针?
醇>
至少,你可能想要跟踪内存指针和内存块的大小,所以像这样......
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;
这个难题有多种方法。