程序地址空间
虚拟地址空间
地址:通常所说的地址都是内存的地址,即内存单元的编号。
在进程中,程序访问的这些地址(变量地址等等)实际上是假地址将其称之为虚拟地址;
我们所说的程序地址实际上叫做进程的虚拟地址空间(程序不占用内存,进程占用内存)
虚拟地址空间实际上是系统给进程所描述的一个假的地址空间,是一个mm_struct结构体
系统会为每个进程都描述一个虚拟地址
进程访问的都是虚拟地址,先将虚拟地址转换为物理地址然后再访问
页表映射
观察上图:现在有个16M大小的内存和三个占用内存大小分别为4M,8M,5M的程序,由于进程需要使用连续内存空间来运行所以,上面这个进程是无法运行的,但是通过页表映射以后就可以正常运行。
页表映射:给每个进程虚拟一个地址空间,让进程访问完整连续的地址,但是这些虚拟地址使用的时候是通过页表映射一块物理内存地址。页表映射实现了数据在物理内存上的离散式存储,让进程以为自己是在连续完整的内存中运行的,提高了内存的利用率。
内存管理方式
分段式内存管理:将地址空间分为多段(堆、栈、数据段、代码段…),便于编译器进行地址管理
分段式虚拟地址组成:段号+段内地址偏移量;在系统中有一个段表(段号、物理内存段起始地址)
分页式内存管理:将地址空间分为多个小块(页),提高内存利用率
分页式虚拟地址组成:页号+页内偏移(32位地址下,高20位是页号,低12位是页内偏移);在系统中有一个页表(页号,物理内存快起始地址,访问控制权限,缺页中断位…)
段页式内存管理: 将虚拟地址空间进行分段,在每段内进行分页式管理,集合了分段式和分页式的优点