个人幕布文档:https://mubu.com/doc/vQfZHGsDG0
进程虚拟地址空间的引入
1.程序与进程的区别
- 程序: 静态 预先编译好的指令和数据的集合 的一个文件 #菜谱
- 进程:动态 程序运行的过程 #炒菜的过程
2.虚拟地址空间: 程序运行后拥有自己独立的虚拟空间
- 大小: CPU位数决定 指针大小与虚拟地址空间位数相同
- 32 位平台 *p 32位==4byte 64位 *p 64位 == 8 byte
- Windows下可以通过参数 将 操作系统所占用的空间减少为 1 GB / Boot .ini 加上 /3G 参数
图: Linux下内存的布局
Windows下内存的布局空间
【问题1】32位CPU下,程序的使用空间能否超过4GB
虚拟地址空间的使用
虚拟地址空间的使用涉及到3个概念:页面大小、分配粒度、预定和调拨
页面大小
- 虚拟地址空间被分成以“页面”为单位,因为硬件内存管理单元是以页面为粒度将虚拟地址转译成物理地址的。
- 页面的大小根据不同的CPU不而有所不同。x86和x64系统使用的页面大小都是4KB,而IA-64系统使用的页面大小是8KB。
- 程序在虚拟空间进行内存分配的时候,系统需要确保分配区域的大小正好是系统“页面” 大小的整数倍
分配粒度
- 当应用程序在从虚拟地址空间分配空间时,系统会确保所有分配区域的起始地址都是分配粒度的整数倍。
- 分配粒度的会根据不同的CPU平台而有所不同,但目前所有的CPU平台的分配粒度都是使用64KB。也就是说,分配的起始地址 = 64 * N。
- 通过Windows的 #GetSystemInfo 函数也可以获得此分配粒度值。
预定和调拨
- 虚拟地址空间的分配需要两个步骤: 预定 和 调拨
- 预定(reserve):告诉系统我们要从虚拟地址空间预定哪一块区域,系统为我们保留这一块区域。预定的局域的起始地址和大小遵循上面介绍的分配粒度和页面大小的要求。因为预定的只是虚拟地址空间,不占用任何其他物理存储器,所以没有形成实质的开销。
- 调拨(commit):预定的区域还不能使用,我们还需要为预定的区域从页交换文件中调拨存储器,调拨之后我们才能使用该区域。
【问题】为什么要从页交换文件中调拨存储器?
【问题】页交换文件如何与物理内存之间交互?