什么是虚拟内存
虚拟内存是一种内存管理技术,允许操作系统使用硬盘空间来扩展可用内存的逻辑地址空间。它为每个进程创建一个独立的逻辑地址空间,这样程序可以认为自己拥有一个完整的内存空间,而不必关心实际物理内存的可用情况。
关键概念
- 逻辑地址空间:程序执行时所用的地址,由操作系统提供给每个进程。
- 物理内存:实际的 RAM(随机访问存储器),用于存储数据和程序。
- 页:将逻辑地址空间划分为固定大小的块(通常为4KB或其他大小),称为页。
- 页表:用于映射虚拟地址到物理地址的结构,它维护每个逻辑页在物理内存中的位置。
- 交换空间/交换文件:使用硬盘上的一部分空间来临时存放不活跃的页,当物理内存不足时,操作系统会将不常用的数据移动到交换空间,以便释放物理内存。
为什么要使用虚拟内存
-
扩展内存容量:
- 虚拟内存允许计算机使用比实际物理内存更多的内存。程序可以使用一个更大的逻辑地址空间,可以不节约物理内存的情况下启动更大的程序。
- 比如,物理内存是4GB,物理内存是有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作是很没效率的。
-
内存隔离:
- 每个进程的虚拟内存空间是独立的,从而提供了内存保护。一个进程无法直接访问另一个进程的内存,增强了系统的稳定性和安全性。
-
更好的内存管理:
- 操作系统可以根据进程的需求动态管理内存,优化内存使用。在需要时,可以将未使用的内存页面移动到硬盘上。
-
简化编程模型:
- 程序员可以忽略物理内存的限制,专注于开发而不必担心手动管理内存分配的复杂性。
进程访问
进程开始要访问一个地址,它可能会经历下面的过程
- 每次我要访问地址空间上的某一个地址,都需要把地址翻译为实际物理内存地址
- 所有进程共享这整一块物理内存,每个进程只把自己目前需要的虚拟地址空间映射到物理 内存上
- 进程需要知道哪些地址空间上的数据在物理内存上,哪些不在(可能这部分存储在磁盘 上),还有在物理内存上的哪里,这就需要通过页表来记录
- 页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内 存页的地址(如果在的话)
- 当进程访问某个虚拟地址的时候,就会先去看页表,如果发现对应的数据不在物理内存 上,就会发生缺页异常
- 缺页异常的处理过程,操作系统立即阻塞该进程,并将硬盘里对应的页换入内存,然后使 该进程就绪,如果内存已经满了,没有空地方了,那就找一个页覆盖,至于具体覆盖的哪 个页,就需要看操作系统的页面置换算法是怎么设计的了。
我们的cpu想访问虚拟地址所在的虚拟页(VP3),根据页表,找出页表中第三条的值.判断有效位。 如果有效位为1,DRMA缓存命中,根据物理页号,找到物理页当中的内容,返回。
若有效位为0,参数缺页异常,调用内核缺页异常处理程序。内核通过页面置换算法选择一个页面作为被覆盖的页面,将该页的内容刷新到磁盘空间当中。然后把VP3映射的磁盘文件缓存到该物理页上面。然后页表中第三条,有效位变成1,第二部分存储上了可以对应物理内存页的地址的内容。
缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1。将找到的内容映射到告诉缓存当中,CPU从告诉缓存中获取该值,结束。
虚拟内存的大小与物理内存的关系
-
虚拟内存可以大于物理内存:是的,虚拟内存的空间可以超过物理内存。例如,如果系统中有 8GB 的物理内存,但硬盘上有 16GB 的交换空间,操作系统可以将虚拟内存设置为超过 8GB,这样可以同时运行更多的进程或更大的应用程序。
-
性能考虑:尽管虚拟内存可以大于物理内存,但如果程序需要频繁访问未在物理内存中的数据,可能会导致频繁的磁盘交换(也称为“交换”或“分页”)。这种情况称为“内部碎片”,如果过度交换会显著降低性能,因此在设计系统和管理内存时,需要合理配置虚拟内存的大小。