-
内存的发展
- 早期的计算机并没有安排虚拟内存给用户,OS和用户程序都直接使用物理内存
- 后来人们逐渐开始在计算机上运行多个任务、共享机器(多道程序(Multiprogramming)系统时代),并开始追求效率,例如让一个程序在IO期间把CPU让给别的程序
- 后来人们觉得计算机的交互性不够,想要提高计算机的响应速度(分时系统时代),于是人们尝试使用时分共享。曾经有过一种想法:让程序在不运行时将内存里的数据写入磁盘,要运行的时候再取出数据,这种实现时分共享的方式显然太慢了。于是人们把物理内存划分为多个区域,每个程序拥有一个区域,省去了磁盘读写的步骤
- 后来人们又想要让进程彼此隔离,不想让一个进程影响别的进程使用的内存。于是需要OS提供一个易用(Easy to Use)的物理内存抽象,这个抽象就叫做“地址空间(Address Space)”
-
地址空间
- 地址空间的作用
- 地址空间是OS分配给用户程序的内存,程序会以为它拥有一块从0x00地址开始的很大一块内存,但是实际上它拥有的地址都是虚拟的,真正的内存是OS在物理内存中分出来的一块地方
- 程序只需考虑操作自己的地址空间和虚拟地址,OS会通过映射让程序真正地在正确的物理地址上进行操作
- 这是操作系统在虚拟化内存(Virtualizing Memory)
- 地址空间的结构
- 地址空间内包含三个内容:
- 程序代码:被加载进内存的代码
- 堆:程序通过malloc()或者new申请的内存分配在堆区
- 栈:存储程序的函数结构,程序中声明与定义的变量也会存储在栈区
- 地址空间的各个内容按照特定的结构存储
- 程序代码:拥有一个确定大小的空间,从低地址处开始存储
- 堆:一个边界贴着程序代码区域。堆区可能是动态的空间,它的另外一个边界可以向高地址处移动
- 栈:一个边界在地址空间的高地址处。栈区也可能是动态的空间,它的另一个边界可以向低地址处移动
- 对于多线程的程序,结构可能没有那么简单
- 地址空间内包含三个内容:
- 地址空间的作用
-
虚拟化内存
- 虚拟化内存构建出虚拟内存(VM) 是为了达成一些目标:
- 透明
- 这里的“透明”与平常说的“透明”有所不同,此处的“透明”是指让别人看不见自己,而不是“将自己的一切公之于众”
- 虚拟内存要达到透明的目的,即让程序根本感知不到自己的存在;程序会认为自己有一片私有的物理内存,而事实是这是一片虚拟内存。OS和硬件还会进行一些操作,让不同的工作复用内存
- 效率
- 这里不仅要追求时间效率也要追求空间效率,既要让程序不会以为虚拟内存运行的太慢,也不会需要太多额外内存来实现虚拟内存
- 保护
- 虚拟内存会确保进程受到保护,在进程之间提供隔离(Isolation),让不同的进程之间不会互相影响,每个进程都只在自己的独立环境内运行
- 透明
- 虚拟化内存构建出虚拟内存(VM) 是为了达成一些目标:
操作系统 - Operating System
/
Chapter II 虚拟化
/
Section 2 内存虚拟化
/
2-1 虚拟内存