操作系统的虚拟内存和物理内存
早期的计算机系统只有物理内存的概念,所谓的物理内存就是真实的内存直观一点就是咱们计算机的内存条,他的大小决定了内存的大小。但是直接使用物理内存会存在很多的问题,首先就是直接使用物理内存可能会产生很多的内存碎片,因为如果把程序读取到内存需要连续的内存空间,由于对物理内存进行分页后会导致很多次的内存分割这样会产生很多的内存碎片。直接使用物理内存最主要的问题就是内存不足的问题,如果一个需要很大内存的程序需要运行而此时的物理内存大小不足以支撑这个程序的运行这是就会内存溢出。
由于以上的种种不足物理内存也就诞生了。所谓的虚拟内存就是利用的磁盘的存储空间,一个程序如果运行现代操作系统会自动为其分配一定的虚拟内存,当程序运行时会首先将程序读取到虚拟内存中,而物理内存中只读取需要的程序,不再运行的程序和代码及时从内存中删除,提高了内存的利用率,保证了大程序能在小内存上运行。然后通过一定的映射机制将虚拟内存的地址映射到物理内存。
接下来讲下物理内存和虚拟内存映射的关系,要了解他两个的关系就首先要大体知道操作系统的内存管理机制,现代操作系统所支持的内存管理机制主要有页式存储管理,段式存储管理以及段页式存储管理等,咱们接下来以页式存储管理机制为例讲下物理内存和虚拟内存的关系。
在操作系统中会将虚拟内存和物理内存的分成大小相等的多个片(通常为4k),虚拟内存中叫页物理内存中叫页框,一个页对应一个页框具体如图所示:
但是虚拟地址和物理地址的映射关系维护在一个页表中,具体的关系图如图:
在页表中维护了虚拟地址和实际物理地址的映射关系具体的映射流程为:
1.cpu想访问虚拟地址所在的虚拟页(VP3),根据页表,找出页表中对应的页表项,判断有效位。
2.若有效位为1,则DRMA缓存命中,根据物理页号,找到物理页当中的内容,返回。
3.若有效位为0,则发生缺页异常,调用内核缺页异常处理程序。内核通过页面置换算法选择一个页面作为被覆盖的页面,将该页的内容刷新到磁盘空间当中。然后把VP3映射的磁盘文件内容缓存到该物理地址对应的页上面。然后将页表项中的有效位变成1,第二部分存储了对应的物理内存也的地址。
4.缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1。
5.将找到的内容映射到高速缓存当中,CPU从高速缓存中获取该值,结束。
这样保证了虚拟内存中的地址是连续的但是实际的物理地址是非连续的,这样可以减少内存碎片的产生。以上就是虚拟内存以及物理内存的概念和关系。