[Linux]程序地址空间,虚拟地址,内存管理方式

程序地址空间

虚拟地址空间

地址:通常所说的地址都是内存的地址,即内存单元的编号。
在进程中,程序访问的这些地址(变量地址等等)实际上是假地址将其称之为虚拟地址
我们所说的程序地址实际上叫做进程的虚拟地址空间(程序不占用内存,进程占用内存)

虚拟地址空间实际上是系统给进程所描述的一个假的地址空间,是一个mm_struct结构体

系统会为每个进程都描述一个虚拟地址
进程访问的都是虚拟地址,先将虚拟地址转换为物理地址然后再访问

页表映射

在这里插入图片描述

观察上图:现在有个16M大小的内存和三个占用内存大小分别为4M,8M,5M的程序,由于进程需要使用连续内存空间来运行所以,上面这个进程是无法运行的,但是通过页表映射以后就可以正常运行。

页表映射:给每个进程虚拟一个地址空间,让进程访问完整连续的地址,但是这些虚拟地址使用的时候是通过页表映射一块物理内存地址。页表映射实现了数据在物理内存上的离散式存储,让进程以为自己是在连续完整的内存中运行的,提高了内存的利用率。

内存管理方式

分段式内存管理:将地址空间分为多段(堆、栈、数据段、代码段…),便于编译器进行地址管理
分段式虚拟地址组成:段号+段内地址偏移量;在系统中有一个段表(段号、物理内存段起始地址)

分页式内存管理:将地址空间分为多个小块(页),提高内存利用率
分页式虚拟地址组成:页号+页内偏移(32位地址下,高20位是页号,低12位是页内偏移);在系统中有一个页表(页号,物理内存快起始地址,访问控制权限,缺页中断位…)

段页式内存管理: 将虚拟地址空间进行分段,在每段内进行分页式管理,集合了分段式和分页式的优点

猜你喜欢

转载自blog.csdn.net/weixin_43962381/article/details/114895815