虚拟存储系统是指什么 虚拟存储

虚拟存储(虚拟存储系统是什么意思)
摘要我们都知道,一个进程与其他进程共享CPU和内存资源 。为此,操作系统需要一套完善的内存管理机制来防止进程间的内存泄漏 。
为了更有效地管理内存,减少错误,现代操作系统提供了一个抽象的主存概念,即虚拟内存 。虚拟内存为每个进程提供了一个一致且私有的地址空空间,让每个进程产生一种自己在享用主存的错觉(每个进程都有一个连续完整的内存空空间) 。
没有深入了解的人会认为虚拟内存只是一种“利用硬盘空”扩充内存的技术,这是错误的 。虚拟内存的意义在于定义了一个连续的虚拟地址空,降低了编程的难度 。而且将内存扩展到硬盘空只是使用虚拟内存的必然结果 。虚拟内存空将存在于硬盘中,并由内存进行缓存(根据需要) 。有些操作系统在切换到进程时会把某个进程的内存全部放到硬盘空里 。
虚拟内存主要提供以下三个重要功能:
它把主存当成存储在硬盘上的虚拟地址空之间的缓存,只缓存主存中的活动区域(按需缓存) 。
它为每个进程提供了一致的地址空,从而降低了程序员管理内存的复杂度 。
同时也保护了每个进程的地址空不被其他进程破坏 。
在介绍了虚拟内存的基本概念之后,接下来的内容将从虚拟内存如何在硬件中工作逐渐过渡到它在Linux中的实现 。
CPU寻址
内存通常由m个连续字节大小的单元组成,每个字节都有一个唯一的物理地址PA作为数组的索引 。CPU访问内存最简单直接的方式就是使用物理地址,也就是所谓的物理寻址 。
现代处理器使用一种称为虚拟寻址的寻址方法 。使用虚拟寻址,CPU需要将虚拟地址转换成物理地址,以便访问真实的物理内存 。

虚编址
虚拟寻址需要硬件和操作系统之间的合作 。CPU包含一个称为内存管理单元(MMU)的硬件,其功能是将虚拟地址转换为物理地址 。MMU需要通过存储在内存中的页表来动态转换虚拟地址,该页表由操作系统管理 。
页面表虚拟内存空被组织成一个由m个连续字节大小的单元组成的数组,存储在硬盘上,每个字节都有一个唯一的虚拟地址作为数组的索引(这实际上与物理内存相同) 。
操作系统将虚拟内存划分为固定大小的块,作为硬盘和内存之间的传输单位 。这个块叫做虚拟页,VP),每个虚拟页的大小为p = 2 p字节 。物理内存也是这样划分成物理页(PP)的,大小也是P字节 。
CPU获得虚拟地址后,需要通过MMU将虚拟地址翻译成物理地址 。在翻译的过程中,还需要页表 。所谓页表,就是存储在物理内存中的数据结构,记录了虚拟页和物理页的映射关系 。
页是页表条目(PTE)的集合,并且每个虚拟页在页表中的固定偏移量处都有一个PTE 。下面是PTE的页表结构,只有一个有效的位标记,表示这个虚拟页是否缓存在物理内存中 。

虚拟页面VP 0、VP 4、VP 6、VP 7缓存在物理内存中,虚拟页面VP 2、VP 5分配在页表中,但不缓存在物理内存中,虚拟页面VP 1、VP 3还没有分配 。
在动态内存分配过程中,比如malloc()函数或者其他高级语言中的new关键字,操作系统会在硬盘中创建或者申请一个虚拟内存空,并更新到页表中(分配一个PTE指向硬盘上新创建的虚拟页) 。
由于CPU每次进行地址翻译都需要经过PTE,所以如果想要控制内存系统的访问,可以增加一些额外的权限位(比如读写权限、内核权限等 。)在PTE上,这样如果有任何指令违反了这些权限条件,CPU就会触发一般的保护错误,将控制权交给内核中的异常处理程序 。一般将这种异常称为“分段故障” 。
【文章福利】:边肖整理了一些我认为比较好的学习书籍和视频,分享到群档里 。如果有需要,可以自己添加!跳跃(需要振作起来)

这里推荐大家看一下Linux C/C++高级开发架构的【免费】课程:
C/C++Linux服务器开发/Backoffice架构师【零音教育】-学习视频教程-腾讯课堂如果课程内容对比腾讯C++后台开发的T8 rank技术栈,将围绕数据结构与算法、数据库、网络、操作系统、网络编程、分布式架构等进行全面提升 。值得学一波~
页面点击
页面点击
如上图所示,MMU根据虚拟地址对页表中的PTE 4进行寻址,PTE的有效位为1,表示虚拟页已经缓存在物理内存中 。最后MMU得到PTE中的物理内存地址(指向PP 1) 。
缺失的一页
缺失的一页
如上图所示,MMU根据虚拟地址在页表中寻址PTE2,PTE 2的有效位为0,表示虚拟页不缓存在物理内存中 。没有缓存在物理内存中的虚拟页面(缓存未命中)称为缺失页面 。

推荐阅读