对malloc和free的思考

进程的内存布局:



Heap的顶端的限制叫作program break,经过系统调用brk活着sbrk能够想内核申请内存从而改变break,也就是增长或收缩heap的大小。

进程的地址空间所面对的都是虚拟地址,kernel为每一个进程维护一个page table,创建了虚拟地址空间的页和物理内存页或swap空间的映射(虚拟内存或物理内存都是以页为单位)。

很重要的一个特色是,虚拟地址空间是连续的!

虚拟内存管理有不少好处:一、进程相互之间或进程与内核之间相互隔离,进程不能操做其余进程的内存空间,更不能操做内核的空间。二、多个进程能够共享内存。 (多个进程执行相同的程序,也就是多个进程的text segment所对应的物理内存是同一份),节约内存。三、进程维护的页表能够更容易的实现内存保护。(标记page table的entry便可)

虚拟内存这块让我想到了,“软件的不少问题均可以靠加一个中间层解决”;o(∩_∩)o 哈哈

下面是一个简单的malloc和free实现,经过系统调用sbrk来实现:
实现细节:
    一、在须要的内存块前面追加一小块空间,来存储当前块的大小(貌似都这样)
    二、维护两个全局变量,managed_memory_start、所维护内存的起始地址
        last_valid_address、所维护内存的最后有效地址,也就是program break
    三、free的实现很简单,标记此块为未用

    四、malloc实现,遍历所维护的内存块,找到合适的就返回,找不到就要求系统分配所要求大小的内存。 html

参考这篇文章:    http://www.ibm.com/developerworks/cn/linux/l-memory/index.html linux


这个简单的内存管理程序有不少缺点:
一、每一次内存不够时,都要调用sbrk系统调用。sbrk系统调用的单位一般是页大小的不少倍(页典型为4K,sbrk调用最小典型为128K,数据来自于tlpi),这样会有效减小系统调用的次数。
二、malloc中的内存大小匹配算法,找到size>=required的块,会有不少浪费(glibc的实现,则会把大块分裂,返回用户须要的,剩余的放到free list中)。
三、malloc的块查找算法,是遍历整个进程空间,效率过低(glibc是双向链表)。
四、mem_control_block的结构中变量is_available只有一位,确是个int类型,占用空间过多(glibc中只有一个size记录块大小,free块时在块中分配两个指针插入到free list双向链表中)。
五、申请的内存并不会返回给内核(glibc在某种状况下,释放的内存在heap的顶端造成一大片连续的区域,而且大小达到必定的数值(好比128K,数据来自tlpi),尽可能减小sbrk系统调用的次数)。

前面,后面最重要的文字总结,都是我本身写的,哈哈~~~
相关文章
相关标签/搜索