带你学会物理内存和虚拟内存
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你学会物理内存和虚拟内存相关的知识,希望对你有一定的参考价值。
文章目录
一、物理内存和虚拟内存的关系
物理内存:计算机实际的内存大小,也就是计算机安装内存条的大小
虚拟内存:是创建进程时分配的虚拟内存,是一个地址连续的地址空间
分配的虚拟内存:每个进程都认为自己拥有4G的空间,这只是每个进程认为的,但是实际上,在虚拟内存对应的物理内存上,可能只对应的一点点的物理内存,实际用了多少内存,就会对应多少物理内存。
二、进程的虚拟地址空间如何分配?
每个程序被运行起来之后,都会拥有自己独立的虚拟地址空间,虚拟地址空间的大小是由CPU的位数决定的,比如32位硬件平台决定了虚拟地址空间是4GB大小
1G:是内核空间,管理进程,内存等
3G:是用户空间,包括栈空间、堆空间、代码段等
操作系统会提供一种机制,能够将不同进程的虚拟地址空间与不同内存的物理地址映射起来,这样所有进程都不能直接访问物理内存,都只能访问自己的虚拟内存空间,提高了安全性
三、为什么引入虚拟内存?
利用虚拟内存技术让每个进程都有4GB 互不干涉的虚拟地址空间。
(1)避免用户直接访问物理内存地址,防止一些破坏性操作,保护操作系统
(2)每个进程都被分配了4GB的虚拟内存,用户程序可使用比实际物理内存更大的地址空间
(3)在程序需要分配连续空间的时候,只需要在虚拟内存分配连续空间,而不需要物理内存时连续的,实际上,往往物理内存都是断断续续的内存碎片。这样就可以有效地利用我们的物理内存
(4)当不同的进程使用同一段代码时,比如库文件的代码,在物理内存中可以只存储一份这样的代码,不同进程只要将自己的虚拟内存映射过去就好了,这样可以节省物理内存
四、虚拟内存访问流程?
当每个进程创建的时候,内核会为进程分配4G的虚拟内存,当进程还没有开始运行时,这只是一个内存布局。
实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射)。
这个时候数据和代码还是在磁盘上的。
当运行到对应的程序时,进程去寻找页表,发现页表中地址没有存放在物理内存上,而是在磁盘上,于是发生缺页异常,于是将磁盘上的数据拷贝到物理内存中。
寻找方法:把虚拟内存转成二进制,然后根据页面大小对其拆分可以找到页号,然后查询页表找到对应的物理页面,拿这个物理页面的首地址加上偏移量,就是对应的物理内存地址
缺页异常的处理办法:操作系统立即阻塞该进程,并将磁盘里对应的页换入内存,然后使该进程就绪,如果内存已经满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的哪个页,就需要看操作系统的页面置换算法是怎么设计的了。
以上是关于带你学会物理内存和虚拟内存的主要内容,如果未能解决你的问题,请参考以下文章