📂 操作系统 - Operating System / Chapter II 虚拟化 / Section 2 内存虚拟化 / 2-1 虚拟内存

抽象:地址空间

2026-05-10
#OS
  • 内存的发展

    1. 早期的计算机并没有安排虚拟内存给用户,OS和用户程序都直接使用物理内存
    2. 后来人们逐渐开始在计算机上运行多个任务、共享机器(多道程序(Multiprogramming)系统时代),并开始追求效率,例如让一个程序在IO期间把CPU让给别的程序
    3. 后来人们觉得计算机的交互性不够,想要提高计算机的响应速度(分时系统时代),于是人们尝试使用时分共享。曾经有过一种想法:让程序在不运行时将内存里的数据写入磁盘,要运行的时候再取出数据,这种实现时分共享的方式显然太慢了。于是人们把物理内存划分为多个区域,每个程序拥有一个区域,省去了磁盘读写的步骤
    4. 后来人们又想要让进程彼此隔离,不想让一个进程影响别的进程使用的内存。于是需要OS提供一个易用(Easy to Use)的物理内存抽象,这个抽象就叫做“地址空间(Address Space)”
  • 地址空间

    • 地址空间的作用
      • 地址空间是OS分配给用户程序的内存,程序会以为它拥有一块从0x00地址开始的很大一块内存,但是实际上它拥有的地址都是虚拟的,真正的内存是OS在物理内存中分出来的一块地方
      • 程序只需考虑操作自己的地址空间和虚拟地址,OS会通过映射让程序真正地在正确的物理地址上进行操作
      • 这是操作系统在虚拟化内存(Virtualizing Memory)
    • 地址空间的结构
      • 地址空间内包含三个内容
        • 程序代码:被加载进内存的代码
        • :程序通过malloc()或者new申请的内存分配在堆区
        • :存储程序的函数结构,程序中声明定义变量也会存储在栈区
      • 地址空间的各个内容按照特定的结构存储
        • 程序代码:拥有一个确定大小的空间,从低地址处开始存储
        • 堆:一个边界贴着程序代码区域。堆区可能是动态的空间,它的另外一个边界可以向高地址处移动
        • 栈:一个边界在地址空间的高地址处。栈区也可能是动态的空间,它的另一个边界可以向低地址处移动
        • 对于多线程的程序,结构可能没有那么简单
  • 虚拟化内存

    • 虚拟化内存构建出虚拟内存(VM) 是为了达成一些目标:
      • 透明
        • 这里的“透明”与平常说的“透明”有所不同,此处的“透明”是指让别人看不见自己,而不是“将自己的一切公之于众”
        • 虚拟内存要达到透明的目的,即让程序根本感知不到自己的存在;程序会认为自己有一片私有的物理内存,而事实是这是一片虚拟内存。OS和硬件还会进行一些操作,让不同的工作复用内存
      • 效率
        • 这里不仅要追求时间效率也要追求空间效率,既要让程序不会以为虚拟内存运行的太慢,也不会需要太多额外内存来实现虚拟内存
      • 保护
        • 虚拟内存会确保进程受到保护,在进程之间提供隔离(Isolation),让不同的进程之间不会互相影响,每个进程都只在自己的独立环境内运行