虚拟内存 与 物理内存
物理内存
物理内存实际上是 CPU中能直接寻址的地址线条数。由于物理内存是有限的,例如32位平台下,寻址的大小是4G,并且是固定的。内存很快就会被分配完,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作是很没效率的。
这就需要用到虚拟内存了。
虚拟内存
在那个进程创建的时候,系统都会给每个进程分配4G的内存空间,这其实是虚拟内存空间。
进程得到的这4G虚拟内存,进程自身以为是一段连续的空间,而实际上,通常被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,需要的时候进行数据交换。
进程要访问地址的过程
- 每次要访问地址空间上的一个地址,都需要把地址翻译成物理地址。
- 所有进程共享这一物理地址,每个进程只需要把自己的虚拟地址映射到物理地址上。
- 进程需要直到哪些空间地址上的数据在物理内存上,哪些没在(可能在外部磁盘),并在在物理内存的哪里,这就需要页表来记录。
- 页表的内容有两部分,第一部分表示此页是否在物理内存上,第二部分记录物理内存页的地址。
- 当进程访问某个虚拟地址的时候,就要先去查页表,如果发现对应的数据不在物理内村上,则返回缺页异常。
- 缺页异常的处理过程是,操作系统立即阻塞该过程,并将磁盘里的数据换到对应页,然后使该进程就绪,如果内存已经满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的哪个页,就需要看操作系统的页面置换算法是怎么设计的了。
参考:https://blog.csdn.net/lvyibin890/article/details/82217193