东南大学-NetSI
用户3024
添加快捷方式
分享
malloc内存分配器是怎样实现的
输入“/”快速插入内容
malloc内存分配器是怎样实现的
用户3024
用户3024
2024年12月31日修改
在此之前我们需要回答一个基本问题,那就是我们为什么要发明内存分配器这种东西。
程序员经常使用的内存申请方式被称为
动态内存分配
,Dynamic Memory Allocation。我们为什么需要动态的去进行内存分配与释放呢?
答案很简单,因为我们不能
提前知道程序到底需要使用多少内存
。那我们什么时候才能知道呢?答案是只有当程序真的
运行
起来后我们才知道。
这就是为什么程序员需要动态的去申请内存的原因,如果能提前知道我们的程序到底需要多少内存,那么直接知道告诉编译器就好了,这样也不必发明malloc等内存分配器了。知道了为什么要发明内存分配器的原因后,接下来我们着手实现一个。
程序员应如何看待内存
实际上,现代程序员是很幸福的,程序员很少去关心内存分配的问题。作为程序员,
可以简单的认为我们的程序独占内存,注意,是独占哦
。
写程序时你从来没有关心过如果我们的程序占用过多内存会不会影响到其它程序,我们可以简单的认为每个程序(进程)独占4G内存(32位操作系统),即使我们的物理内存512M。
总之,程序员可以
放心的
认为我们的程序运行起来后在内存中是这样的:
作为程序员我们应该知道,内存动态申请和释放都发生在堆区,heap。
我们使用的malloc或者C++中的new申请内存时,就是从堆区这个区域中申请的
。接下来我们就要自己管理堆区这个内存区域。堆区这个区域实际上非常简单,真的是非常简单,你可以将其看做一大数组,就像这样:
从内存分配器的角度看,
内存分配器根本不关心你是整数、浮点数、链表、二叉树等数据结构、还是对象、结构体等这些花哨的概念,在内存分配器眼里不过就是一个内存块,这些内存块中可以装入原生的字节序列
,申请者拿到该内存块后可以塑造成整数、浮点数、链表、二叉树等数据结构以及对象、结构体等,这是使用者的事情,和内存分配器无关。我们要在这片内存上解决两个问题:
实现一个malloc函数,也就是如果有人向我申请一块内存,我该怎样从堆区这片区域中找到一块返回给申请者。
实现一个free函数,也就是当某一块内存使用完毕后,我该怎样还给堆区这片区域。