问一个底层问题, malloc 申请得到的内存后,再 free 释放它的时候,操作系统会立即收回那块内存吗??

2015-03-29 16:55:24 +08:00
 wind3110991

如题,然后下面是一个朋友给我的解答:
1)C库老老实实地待在硬盘里,没法管这事。free()是库函数,没错。可这就给许多人错觉,以为,C自己把这事给办了。空间回收和空间分配一样,涉及到两块空间:虚拟空间与物理空间。虚拟空间是进程私有的,这没事,进程可以自行了断。但物理空间一共就一块,所有的进程都共用它。如果让每个进程自行做垃圾回收,那不就乱了套了?因此,我想象,库函数free()只是通知“可以回收啦”而没有真正回收空间。
2)当虚存释放空间时,如果系统立即做实存的回收,那会把系统累死。整个系统的运作效率大大降低。因此,现代系统的垃圾回收都有一些算法。这个好比你家门口的垃圾袋,并不是你放出去,小区清洁工立即拿走的。没有一个清洁工能对小区所有业主做到这样的服务,除非她是超人或机器猫。如果系统足够聪明,能识别某进程已经僵死并回收了它所占的空间,那为啥还剩下它的PCB呢?

但是还是不太懂,而且这个不一定是唯一答案,有这方面专业的大神来解答下吗?

4764 次点击
所在节点    C
30 条回复
tonyluj
2015-03-29 17:01:07 +08:00
如果是Linux,可以参考 深入理解Linux内核,Slab和伙伴分配算法。
wind3110991
2015-03-29 17:01:42 +08:00
能不能理解为:
free 告诉的是 C 库,在一般的 OS 上,malloc/free 都不是 system call,而是库函数。这些空间释放不释放,是 C 库说了算,还没到 OS
hjc4869
2015-03-29 17:03:12 +08:00
楼主先研究一下HeapAlloc和HeapFree。另外C库本身可能有很多种实现,单纯研究malloc是什么都没有的。
wzxjohn
2015-03-29 17:06:02 +08:00
@Livid 男性使用女性头像。。。
choury
2015-03-29 17:13:23 +08:00
在linux下面实现的实现你可以参考下brk和sbrk这两个系统调用,一般free的内存是不会让操作系统收回的
damngood
2015-03-29 18:02:43 +08:00
可以直接看看 c 库的源码. 应该不同的 c 库实现的原理不会差太多. 所以可以找个小点的 c 库, 比如 musl lib c 来看一会儿也就差不多了解了.

我记得 musl lib 里 free 的时候最后是调的是 madvise syscall 来的?
fenjuly
2015-03-29 18:26:01 +08:00
我猜楼主去参加了腾讯的笔试
XiaoxiaoPu
2015-03-29 18:32:54 +08:00
《深入理解计算机系统》,第 9 章虚拟存储器,楼主看了就懂了。
DiveIntoEyes
2015-03-29 19:15:34 +08:00
wind3110991
2015-03-29 19:37:07 +08:00
@fenjuly 不错啊,这个问题之前还真没仔细想下,看了下free函数的源代码
wind3110991
2015-03-29 19:38:24 +08:00
@wzxjohn 意思是我是人类就不能用动物做头像了?
wy315700
2015-03-29 19:39:03 +08:00
内存分配和释放那是C库的事情,

操作系统只管内存分页映射的事情,你内存怎么用他不管
kn007
2015-03-29 19:58:34 +08:00
wwqgtxx
2015-03-29 20:03:38 +08:00
@wind3110991 这个是L大的规定,就是不准男生用女生的头像,所以(≧∇≦)
albert43
2015-03-29 20:24:00 +08:00
貌似是今天腾讯的笔试题啊,不过我没去,楼主广研那边一面之后就没消息了么?
wzxjohn
2015-03-29 20:29:09 +08:00
nicai000
2015-03-29 20:36:59 +08:00
这题的答案是不会.

但当然不能这么肯定, 你可以自己写个操作系统和C库, 就马上回收, 咋咋地?
jonah
2015-03-29 22:16:52 +08:00
不会,比如C库申请了一大块内存,中间的一块释放了,而高地址有一块没释放,那么中间那块就不会还给操作系统,但用户代码申请新内存时那块还能用。
wind3110991
2015-03-29 22:41:59 +08:00
@albert43 没了 - -目测被刷了
Monad
2015-03-29 22:46:32 +08:00
Google "ptmalloc2" "tcmalloc" "jemalloc" 看完源代码就懂了~
就我自己的感受来说,tcmalloc最清晰,glibc里面的ptmalloc2次之, jemalloc简直…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX