我们打开linux的资源管理器 目前内存有2GB,目前用了200多M,swap分区:2GB(虚拟内存) 虚拟内存—磁盘上的划分的空间,当做内存来用 程序大,内存装不下,有了虚拟内存,把一部分放到虚拟内存上执行,虽然速度慢,但是起码能运行啊!
我们写一个程序,申请1GB空间
好像并没有什么变化? 因为我们的malloc申请空间,实际上是在进程的虚拟地址空间说:我们需要1GB的空间,虚拟地址空间会划分一部分给应用程序去使用,真正到去使用这块空间的时候,用到了哪块,才会去分配真正的物理内存。 我们对代码修改一下 memset:把内存空间的值都置为0 这样的话相当于1GB的内存空间我们都用到了 我们运行main程序
增长到1.2GB,然后退回去了,程序结束 当我们程序申请了1GB的内存空间以后,虽然没有执行free这个操作,但是进程结束了,这个时候内存是会被操作系统回收,因为进程结束了,所有分配给该进程的资源都要回收(属于被动回收)。 程序在运行的过程中,申请一块空间,如果不用了,就要free掉,如果不free,就一直占用着,你不用了,别人也没法用,但是,这个进程如果结束了,所有的资源都会被归还给操作系统。
malloc申请1GB成功的依据
现在内存是有2GB,所以刚才申请1GB的空间是够用的,如果现在申请2GB呢?操作系统现在本身就占了200多M了,再申请2GB肯定不够啊。 但是,我们来测试看看:
编译时,警告可能会越界。 我们来执行一下main程序 我们看到,左边的物理内存使用在不断增长: 现在右边的虚拟内存也在增长了: 因为我们的物理内存空间肯定是不够用了,要把一部分搬到虚拟内存空间上运行, 我们把不用的那块先放到虚拟内存上 现在 程序结束了,物理内存空间是使用了113.6M,还有108.3M在外存(虚拟内存)上,程序结束了,为什么不把108.3M从外存上搬回来呢?它是:你用到了,但是它在虚拟内存上,才从虚拟内存上调回来。如果都不用了,然后调回来,等会空间又不够,又要放到外存上,系统不会这么做的。 虽然刚才申请的大小超过了物理内存,但是我们有虚拟内存的支撑,加起来没有超过总大小。
如果把虚拟内存停掉
把磁盘(虚拟内存)的数据赶回物理内存上。 现在是不能使用虚拟内存了。我们再运行刚才申请2GB空间的程序 直接报错,因为空间不够,就剩下1.8GB
所以,我们判断申请空间能不能成功:如果申请的空间的大小比当前物理内存剩余的大小要小,肯定申请成功。 如果物理内存不够,我们看看有没有虚拟内存,如果有虚拟内存,看虚拟内存剩余的空间和物理内存剩余的空间加起来够不够,如果够,也能申请成功!如果不够,或者压根没有虚拟内存,就肯定申请失败了。
|