
Programs share main memory (Multi-programming and I/O)
Program executed in a namespace (virtual address space) different from the memory space (physical address space).
Each gets a private virtual address space holding its code and data, starting at address 0, only accessible to itself.
想象一下,每个程序都认为自己拥有从 0 开始的一整块独立的内存区域(这就是虚拟地址空间),但实际上,这些程序最终都要使用同一块物理内存条(物理地址空间)。虚拟地址空间就像是给每个程序画了一个“假想的”独立内存蓝图,而物理地址空间才是真实的硬件内存布局。
虚拟内存virtual memory将虚拟地址空间virtual address space映射到物理内存physical address (映射由CPU硬件(MMU)和操作系统共同管理)
OS provides a page table that translates Virtual Address (VA) to Physical Address (PA). Hardware (MMU) speeds up the translation.
操作系统负责设置好“翻译规则”(映射表),而MMU负责在程序真正访问内存的时候,根据这些规则将虚拟地址快速地转换成物理地址。

虚拟地址空间远大于物理地址空间
Demand paging: 想象一下,你的程序可能很大,但并不是所有代码和数据在程序运行的任何时刻都需要用到。按需分页就像是,程序启动时,只把当前最需要的那一小部分pages加载到物理内存中,其他的暂时放在硬盘上。当程序要访问硬盘上的某个页时,才会触发一个“缺页异常”,然后操作系统再把这个页加载到物理内存。如果物理内存满了,操作系统可能会把一段时间没用过的页再放回硬盘,给新的页腾地方。Similar to Caches!

Exploiting locality: 程序在执行时,往往会集中访问内存中的一小块区域(局部性原理,包括时间局部性和空间局部性)。按需分页正是利用了这个原理,只加载程序当前最可能访问到的页,这样可以提高内存的利用率和程序的响应速度。
Enable multi-processing, multi-programming: 提高bandwidth,比如做I/O或CPU操作时往往很慢,这时候就可以切换到另一个program执行
Enable inter-process memory sharing: 虽然进程之间通常是隔离的,但在某些情况下,它们需要共享一些数据进行通信。虚拟内存允许操作系统将不同进程的虚拟地址空间映射到同一块物理内存区域。这样,进程之间就可以通过读写这块共享的物理内存来高效地交换数据,而不需要进行复杂的拷贝操作。
Memory-mapped I/O: 传统的读写文件通常需要使用专门的系统调用,将数据从文件拷贝到用户空间的缓冲区,或者从用户空间缓冲区拷贝到文件。内存映射文件提供了一种更高效的文件访问方式。操作系统可以将文件的一部分(或整个文件)直接映射到进程的虚拟地址空间中的一块区域。之后,程序就可以像读写内存一样读写文件,而不需要显式的读写系统调用。当程序修改了映射区域的数据时,操作系统会在适当的时候将这些修改写回磁盘。这就像你把一本书直接“投影”到你的脑海里,你可以直接“思考”书的内容,而不需要一页一页地翻看和记忆。
可以使用load/store读取和写入,比read/write file好
Translation via a page table (fixed-size page, e.g. 4KB)
