Closed 0XFF-96 closed 3 years ago
所在小组
第五组
昵称
张学广
学习内容
本周主要学习了下第九章-虚拟内存。
首先了解下虚拟内存出现的背景,在出现之前,我们直接使用的物理内存(主存),这样会出现几个问题:
虚拟内存的出现是对硬件异常、硬件地址翻译、主存、磁盘文件以及内核软件等内容的结合,虚拟内存为每个进程提供一个完整的虚拟内存空间使用,大家都有自己的内存空间,彼此之间不会互相影响。
其中,书上总结的虚拟内存三个能力如下:
本章前一部分主要介绍了虚拟内存的工作原理,后一部分描述了程序是如何使用和管理虚拟内存的,总结内容如下:
工作原理
以一个内存命中流程为引子,来了解下虚拟内存的工作原理。
首先理解下内存地址是如何找到物理内存的,内存是以页的形式管理的,以32位系统为例,页的大小为4KB,内存地址分为3部分,第一部分为10位,标识1024个页表,第二部分的10位用来标识对应物理内存页的地址,最后12位用来标识物理页中的偏移值,这样就可以通过32位的地址,锁定到4GB内存中具体的数据了。之后我们再来看页表中的内容,因为每个页的大小都是4KB,所以页表中的低12位一定存着0,所以这里的空闲空间可以使用来存储对应物理页可以可写以及是否映射等信息,映射是我们的关键,如果这里没有映射,就会触发缺页中断,操作系统会找到对应的内存页存储的磁盘空间,替换到主存中。
程序使用
程序拥有的虚拟内存分为多个段,其中我们主要关心的是堆栈,栈中的数据是程序自动申请的临时空间,当前程序段执行结束后,对应的栈的空间就会被收回,这里要注意的是栈空间溢出问题。
堆是我们主要关心的,一些持久数据的存储,可以通过malloc这样的函数去申请堆空间,堆空间的数据是持久的,生命周期伴随这程序的结束,因此为了避免无效的内存使用,应该有意识的使用free去释放申请的资源。
锦锐:https://talkgo.org/t/topic/1277/7