一、虚拟内存
虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块乘坐一页或页面(page)。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
二、虚拟内存的作用
虚拟内存提供了三个重要的能力:缓存、内存管理、内存保护。
1. 缓存。将内存视为一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。
2. 内存管理。为每个进程提供了一致的地址空间,简化内存管理。
1)简化链接。独立地址空间允许每个进程的内存映像使用相同的基本格式。
2)简化加载。
3)简化共享。独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。在部分情况下,进程间还是需要共享代码和数据的,例如每个C程序都会调用C标准库中的程序(printf)、都需要调用相同的内核代码。操作系统通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个副本,而不是在每个进程中都包括单独的内核和C标准库的副本。
4)简化内存分配。当运行在用户进程的程序要求额外的堆空间时,操作系统分配k个连续的虚拟内存页面,并且将它们映射到物理内存中任意位置的k个任意的物理页面。由于页表的存在,操作系统没必要分配k个连续的物理页面,页面可随机地分散在物理内存中。
3. 内存保护。保护了每个进程的地址空间不被其他进程破坏。操作系统会控制进程对内存系统的访问,例如:
1)不允许一个用户进程修改它的只读代码段;
2)不允许用户进程读或修改任何内核中的代码和数据结构;
3)不允许用户进程读或写其他进程的私有内存;
4) 不允许用户进程修改任何其他进程共享的虚拟页表。
参考文章:https://www.jianshu.com/p/baf3a13c47db
三、分页系统实现虚拟内存原理
1、虚拟内存技术的实现
虚拟内存技术允许将一个作业分多次调入内存。采用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。
虚拟内存的实现有三种方式:请求分页存储管理、请求分段存储管理、请求段页式存储管理。
不管是哪种方式,都需要有一定的硬件支持。一般需要的支持有以下几个方面:
1)一定容量的内存和外存;
2)页表机制(或段表机制),作为主要的数据结构。
3)中断机构,当用户程序要访问的部分尚未调入内存时,则产生中断;
4)地址变换机构,逻辑地址到物理地址的变换。
2、请求分页管理方式
大部分虚拟内存系统中都使用一种称为分页的技术。而在分页存储管理方式中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为基本分页存储管理方式和请求分页存储管理方式。显然,要想实现虚拟内存,我们需要使用请求分页管理方式。
在任何一台计算机上, 程序引用了一组内存地址。地址可用过索引、基址寄存器、段寄存器或其他方式产生。由程序产生的这些地址称为虚拟地址,它们构成了一个虚拟地址空间。在没有虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(Memory Management Unit,MMU),MMU把虚拟地址映射为物理内存地址。
虚拟地址空间按照固定大小划分成被称为页面(page)的若干单元。在物理内存中对应的单元称为页框(page frame)。页面和页框的大小通常是一样的,但实际系统中的页面大小512字节到1GB。对应于64KB的虚拟地址空间和32KB的物理内存,可得到16个虚拟页面和8个页框。
在请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。