_nosay 发表于 2016-03-10 22:54

free(),请教看过glibc代码的牛~

本帖最后由 _nosay 于 2016-03-10 23:00 编辑

asmlinkage unsigned long sys_brk(unsigned long brk);

参数brk表示新边界,mm->brk表示旧的已经分配边界:
① 新brk>mm->brk,表示用户从虚拟空间分配一段区间;
② 新brk<mm->brk,表示用户向虚拟空间归还一段区间。



这段供动态分配的区域,在内核由sys_brk()维护,在用户态由malloc()、free()维护。我想提问的是:free()函数什么情况下才会调用sys_brk()?要还的这段空间,其实是从malloc维护的小仓库拿的,而malloc的“小仓库”又是从“数据段结束到栈顶之间的大仓库”拿的,所以还的时候是放到小仓库就可以了,还是每次都直接还到大仓库?

如果free()只要还给小仓库就可以了,那什么时候才还给大仓库?
如果free()每次都是还给大仓库,那不是会造成虚拟空间里面出现空洞吗?但是从sys_brk()的代码看,它并不认为会出现空洞,如果新brk<mm->brk,它会将这段全部释放。



正好听到一首歌《遗忘之前》,有点好听啊 {:qq23:} 。

Tinnal 发表于 2016-03-13 10:25

不还大仓库。
页: [1]
查看完整版本: free(),请教看过glibc代码的牛~