目录
前言
之前说过linux中的程序地址空间是使用的虚拟地址,虚拟地址和真实的物理地址有着某种特殊的映射关系(MMU,全称Memory Manage Unit),使用虚拟地址可以提高内存利用率,实现离散式存储和内存访问控制。
Linux中内存管理方式有三种:分段式、分页式、段页式。
内存管理方式
分段式
分段式内存管理是将整体虚拟地址空间划分为多个段(包括代码段、数据段、栈区、堆区等等)。这种内存管理方式的好处是有利于对地址空间进行管理。
分页式
这种内存管理方式是将整体虚拟地址空间划分为很多个小的分页(默认4096字节为一页,每页数据量越小,地址空间利用率越高),分页式的作用是实现离散式存储,提高内存利用率。
段页式
这种内存管理方式就是分段式和分页式的集合,即先将地址分段,然后对每段分页。
虚拟地址如何映射到物理地址
分段式:在这种方式下虚拟地址的组成是段号和段内偏移量
虚拟地址会通过段表来映射物理地址,段表是一种数据结构,其中描述了相关信息、段号和物理内存的起始地址。
通过上图可知,实际地址=起始地址+偏移量。
分页式:分页式的映射方式和分段式差不多,分页式的虚拟地址由页号和页内偏移量组成。
虚拟地址通过页表来映射物理地址,页表主要包括页号、物理内存起始地址、缺页中断位、访问权限(当前地址能进行什么样的操作)组成。
映射方式和分段式一样,是通过虚拟地址中的页号找到页表中物理内存起始地址,然后根据起始地址+页内偏移量得到物理地址。
分段式和分页式的不同之处在于应用方向不同,分段式利于管理,分页式趋向于碎片化管理,提高内存利用率且便于控制内存的访问。
缺页中断
当程序要访问一块内存时,经过页表映射时发现页表中的缺页中断位被置位(这个地址原先的数据现在不存在于内存中了),则会触发缺页中断。触发缺页中断后需要重新进行内存置换才能访问,置换后的地址不一定与原地址相同。
内存交换
因为计算机内存是有限的,如果内存满了,那么再想加载一个新程序进来的话计算机是会直接崩溃的,为了避免内存满后无法运行新的内存,故设计计算机按某种规则将内存中的某些数据从内存中移到硬盘上(实际上是暂时移动到硬盘上的交换区也叫swap区,这个区大小通常是内存大小的两倍,而且不会被我们计算机用户所用,也就是说我们平常在计算机中看到的磁盘总大小是不包含交换区的),然后将腾出的空间供当前程序所用。
这里注意一旦出现内存交换后,程序运行速率变慢,因为内存交换的效率低下,所以平常我们在计算机上开太多软件或游戏后,电脑会变卡。
内存置换算法
内存置换算法主要有 LRU——最久未使用, 即会将最久未使用的数据移动到磁盘上
LFU——最少未使用 ,即会将最少未使用的数据移动到磁盘上
FIFO——先进先出(和队列相似),即最先进入内存的数据会被交换