Linux内存管理 二

内存的分配与回收

在程序中申请堆上的内存使用 malloc函数,在系统调用中可以调用 brk() 函数 和 mmap()函数

当申请的内存小于128kb(默认值) 的时候会调用brk()函数在heap上开辟内存,

当申请内存大于等于128kb(默认值) 的时候会调用mmap()函数在mmap映射区开辟内存

内存的回收调用free()函数 或 unmap()函数来释放内存

函数的声明:

int brk(void* end_data_segment)
void *mmap(void *start, size_t length, int port, int flags, int fd, off_t offset);
void *sbrk(intptr_t increment);

sbrk函数的功能和brk的功能类似。 sbrk的参数 increment 是纪录需要增加(负数为减少)的空间大小,返回的值是增加或减少后的数据段结束地址,这个函数的内部调用了brk函数。
 

在堆顶有一个指针 _edata 通过移动指针在heap段开辟内存,_edata指针向高地址推,brk分配的内存需要等到高地址内存释放以后才能释放,当最高地址空闲的内存超过128k的时候,内存会紧缩。也就是释放虚拟地址空间的空闲内存。  当free的内存块没有超过128kb的时候,对应的虚拟地址空间内存和物理内存都没有释放,这块内存是可以重用的,当再来一个合适大小的内存请求,可能刚被释放的内存会通过malloc返回回去。

 

调用mmap分配的内存是在堆和栈中间分配一块虚拟的地址内存(初始化为0),mmap分配的内存可以单独释放,虚拟地址内存和物理内存会一起释放。

 

当调用了malloc函数分配了内存,只会分配虚拟地址空间的内存,并不会分配对应的真实的物理内存,程序第一次访问内存的时,会发生缺页中断,内核分配对应的物理内存,虚拟地址空间会和物理内存建立映射关系即虚拟地址映射,

如果malloc了一块内存,程序从来都没有访问过这块虚拟地址内存,那么malloc这块虚拟地址内存对应的物理内存是不会被分配的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章