一、地址空间
- 地址空间:操作系统需要提供一个易用的物理内存抽象,该抽象即为地址空间。
- 地址空间包含:一个进程的地址空间包含运行的程序的所有内存状态。
例如:程序的代码、栈(保存当前的函数调用信息,分配空间给局部变量,传递参数与函数返回值)、堆(管理动态分配的、用户管理的内存)....
堆在顶部(向下扩展),栈在底部(向上扩展)。放在地址空间的俩端,向中间扩展
3、进程描述:当我们描述地址空间时,描述的是操作系统提供给运行程序的抽象,程序不在物理地址0-16kb中,而是在任意的其他物理内存。
例如:进程A尝试在地址0(虚拟地址)执行加载操作,然而操作系统在硬件的支持下,确保程序没有加载到物理地址0,而是320KB(A的载入内存地址)
二、虚拟内存目标
- 透明(看不到):程序不应当感知到内存被虚拟化的事实,程序的行为好像它拥有一个私有的物理内存。在幕后,操作系统和硬件完成所有的工作,让不同的工作复用内存,从而实现假象。
- 效率:时间上(不会使程序变得更慢)和空间上(不需要太多额外的内存支持虚拟化)。
- 保护:进程不会影响到其他进程,同时操作系统本身也不会受到影响。当进程执行加载、存储、指令提取时,不应该已任何方式影响 该进程地址空间以外的任何内容。
三、小结
1、用户级程序,所看到的的任何地址都是虚拟地址。
关键问题:操作系统如何在单一的物理内存上为多个运行的进程(所有进程共享内存)构建一个私有的、可能很大的地址空间的抽象?
虚拟内存系统负责为程序提供一个巨大的、稀疏的、私有的地址空间(假象),保存了程序的所有指令和数据。操作系统在专门硬件的帮助下,通过每一个虚拟内存的索引,将其转换为物理地址,物理内存根据获得的物理地址去获取所需的信息。
操作系统同时对许多进程执行此操作,确保程序间互不干扰,也不影响操作系统。
需要大量的机制和关键策略。