动态分配的内存在进程结束后会被操作系统回收吗?

首先答案是:会。

这是当时在华为培训班的时候遇到的一个问题。很多同学本着C++没有内存回收的理论认为不会被回收。而我本着操作系统设计的时候就会考虑到这一点,所以大多数现代操作系统一定会回收。这是一个需求决定的机制,而不是由于语言的限制。但是有个持有错误观点的同学是清华的,我迫于学术崇拜,以及对自己实力的不自信,没有很好的坚持自己的观点,而是保留了疑问。

我是这样分析的:

1.操作系统是对于硬件的抽象。也就是说再没有操作系统的时候程序直接和机器打交道,而有了操作系统以后程序以为是很机器打交道,其实是在和操作系统打交道。程序申请的每一个操作系统的空间都是操作系统基于的虚拟地址。这也是在大三的时候我写的文章里面说程序自以为独占了机器,而操作系统是冥冥中的上帝之手。而确实是有很多的刻画小说吧人的梦境和白天的时间写成分时复用给不同的世界也是这个思路,扯远了。

2.一个进程结束以后,还保留着其内存空间,这样的机制是计算机用户不希望看到了,也没有什么用途。当然这里指的是用户级别的应用。所以操作系统不会设计成这个样子


后来通过我查资料发现

每一个进程都运行在一个独立的4GB“地址空间”当中 

这个4G只是逻辑上的,物理内存不可能有这么多,
这个“地址空间”中,内核占掉了高位的2G, 用户就用低位的2G 了,用malloc 来管理
在用户程序的堆中分配一个指定大小的空间,并告诉系统的内存管理模块:“我要使用这块空间!” 
那么,系统的内存管理模块究竟做了些什么呢?
熟悉Intel 80x86编程的人应该容易理解,它其实只做一件事:把应用程序的虚拟地址空间映射到真实的物理地址(或者磁盘上的分页文件) 
所以说,不管用户程序怎么malloc,在进程结束的时候,其虚拟地址空间就会被直接销毁,操作系统只需要在进程结束的时候
让内存管理模块把分页文件中与此进程相关的记录全部删除,标记为“可用空间”,
就可以使所有申请的内存都一次性地回收,根本没有什么麻烦.
简单说,malloc 的分配都是假的,malloc 的请求系统都知道,程序退出时,系统会回收malloc 的所有资源。
但是,有些内存系统是回收不了的。
例如运行于内核级的驱动造成的内存错误等, 这些是系统所管不了的。
这种错误,重启程序是没有效果的。必须重启电脑才能解决。
http://blog.csdn.net/hejinjing_tom_com/article/details/38561677
	后来通过查资料发现这个博主的文章更加详细,而且在理。
而我在遇到矛盾纠纷的时候就缺少这种稳定下来思维而后娓娓道来的素质。这是需要我提高的地方。
1.需要对理论知识足够的熟悉,并且经验中遇到过很多的问题。
2.拥有有道理讲道理,娓娓道来,绘声绘色,不喜不悲的素质。
3.增加自己的自信,很多时候心里总是依赖,其实在自己可以确定的地方是可以自信一下的,无论对方是谁。前提是按照前两点讲出你的道理。
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马工匠坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值