作为操作系统中的一个赋值,我们必须编写自己的malloc代码并使用C编程语言自由编写,我知道如果我问代码,我就没有必要去学习。我面临的问题是不知道在哪里包含用50000字节初始化char数组并使两个列表空闲和使用。在我的功能中,我无法触发malloc或自由发生。第三方主程序将用于测试我的功能..... 如果我的文件是mymalloc.c或什么
void* myalloc(size_t size)
{
//code for allocating memory
}
void myfree(void *ptr)
{
//code for free the memory
}
启动内存空间和列表的代码将在哪里进行..
答案 0 :(得分:1)
实现在很大程度上取决于操作系统和体系结构,无论如何你可以看看这个:http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html
(并研究它是如何工作的!)。
答案 1 :(得分:1)
如果您使用的是unix系统,则可以查看brk
和sbrk
的手册。那些系统调用“推/设”堆的限制。
使用那些你可以管理你的记忆页面,根据需要分配它们。
我建议链式列表管理你的不同分配空间和构建函数来拆分它们,或者如果它们是空闲的,就合并它们。
如果您需要使用高级应用程序尝试代码,可以将函数命名为malloc / free,将它们编译为共享对象(.so),然后使用LD_PRELOAD
和LD_LIBRARY_PATH
环境变量加载.so并替换系统的malloc
您调用的每个命令都将使用您的共享对象,从而使用您的malloc,告诉您您的malloc是否稳定或是否不符合现实。
如果您需要一个明确的例子,我很乐意在这里提供一些代码,但我不想让我的答案太难阅读。
答案 2 :(得分:1)
我认为你只需要实现一个内存管理器。因此,您不必使用brk
,sbrk
,...
只需将用过的内存放在一个简单的数组中,然后将其分段。既然它是功课,你想让它变得尽可能简单,否则你会因为作业的复杂性/时间限制而遇到问题。
您只需要决定要使用哪种策略。我建议使用buddy system。虽然它比最简单的更复杂..也许固定大小的碎片更简单..
也许this也是一本很好的读物。
不要按照其他答案的建议做一些低级别的事情。
答案 3 :(得分:0)
首先,你可以制作一个总是失败的虚假malloc
/* fake malloc */
void* myalloc(size_t sz)
{ return NULL; }
但那是“作弊”。你想制作一个有用的malloc
。
您可能想要进行系统调用,要求内核提供内存。当然,你需要symetrical系统调用来释放内存。在Linux和许多Posix系统上,您经常使用mmap和munmap系统调用。
(您也可以使用sbrk,但mmap
使用munmap
会更容易,更通用)
这个想法是你获得大块内存(mmap
),然后你在内部管理更小的内存区域。有趣的细节是如何管理这些较小的区域。您可能希望处理大型malloc
与“小”分配不同。
答案 4 :(得分:0)
您可以将全局静态变量初始化为零。然后在malloc
和free
函数的开头检查该变量。在malloc
函数中,如果变量为零,则初始化所需的任何内容,然后将变量设置为非零。在free
函数中,只要变量为零,就返回。
答案 5 :(得分:0)
更像这样,是一个简单的malloc:
void* my_malloc(size_t size)
{
return (sbrk(size));
}
man sbrk会帮助你。
现在的问题是创建一个免费的并创建一个高效的malloc: - )
如果你想测试你的malloc,你可以这样做:
$> LD_PRELOAD = / mypath / my_malloc.so / bin / ls
但是你需要先创建一个动态库,因为malloc是一个.so
答案 6 :(得分:0)
我将为您提供基本概念,您可以使用C语言为malloc()和free()函数编写自己的代码。
假设我们有一个连续的特定大小的内存块。这将是我们抽象的内存感,它将携带所有请求的内存分配以及用于保存有关这些已分配块的数据的数据结构。
我们使用一个简单的链表来携带与分配的以及空闲的内存块相关的数据。
其结构如下。
struct block{
size_t size; /*Specifies the size of the block to which it refers*/
int free; /*This is the flag used to identify whether a block is free
or not*/
struct block *next; /*This points to the next metadata block*/
};
为此,您需要2个源文件。一个是mymalloc.h,它是头文件,它包含初始化部分和我们要实现的其余函数的函数原型。另一个是mymalloc.c源文件,其中包含所有必要的函数实现。
需要一个初始化第一个空闲内存块的功能。 另一个功能是分割一块内存,它有足够的空间来提供所需的大小。另一种方法是扫描链表并合并任何可用的连续块,以防止外部碎片。
注意:我们使用First-fit-algorithm查找一个空闲块来分配内存。
我认为这将有助于任何寻求使用C编写自己的malloc和自由函数的简单方法的人。请按照以下链接获取详细说明。
http://tharikasblogs.blogspot.com/p/how-to-write-your-own-malloc-and-free.html