Linux内存管理之基本概念介绍(一)
Linux内存管理之物理内存管理(二)
Linux内存管理之内存管理单元(MMU)(三)
Linux内存管理之分配掩码(四)
Linux内存管理之伙伴系统(五)
Linux内存管理之slab机制(六)
Linux内存管理之红黑树(七)
Linux内存管理之虚拟进程空间(八)
Linux内存管理之基本概念介绍(一)
我们知道,在linux操作系统中,cpu在执行一个进程的时候,都会访问到内存。但是CPU并不是直接访问物理内存地址
,而是通过虚拟地址空间
来间接访问到物理内存。操作系统通过在虚拟地址和物理地址之间建立映射关系,来让CPU可以间接访问到物理地址。想要了解Linux内存管理,那么需要先了解一下Linux内存管理的一些基本名词。
-
物理内存和虚拟内存
:物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存的存在就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。 -
交换空间(swap space)
:被用作虚拟内存的磁盘空间就被称为交换空间 -
虚拟地址空间
:操作系统为每一个正在执行的进程分配的一个逻辑地址
-
页
:通过将虚拟地址空间以512Byte~8K的大小作为一个单位,这个单位就被称为页。 -
页框
:将物理地址按照和页同样的大小作为一个单位,这个单位就被称为页框。 -
页表
:操作系统通过维护一张表,这张表记录每一对页和页框的映射关系,这张表就被称为页表。访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问 -
内存管理单元(MMU)
:在CPU内部,有一个专门的硬件单元提供虚拟地址和物理地址的映射、内存访问权限保护和Cache缓存控制等硬件支持,它被被称为内存管理单元(Memory Management Unit, MMU)
,是内存管理中非常重要的一个组成部分。其中,TLB(Translation Lookaside Buffer),转换旁路缓存
是MMU
的核心部件,它缓存少量的虚拟地址和物理地址的转换关系,是转换表的Cache,被称为快表
。当TLB
中没有缓冲对应的地址关系时,需要重新去对内存中转换表的访问来获得虚拟地址和物理地址的对应关系,相较于TLB
需要花费更多的时间。TTW
成功后,结果应该存放到TLB
中。 -
进程地址空间(VMA)
:对于包含MMU的处理器而言,Linux系统提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB
,在Liunx系统中,进程的4GB内存空间被分为两个部分,用户空间和内核空间
。用户空间
的地址一般分布为0~3GB
,剩下的3~4GB
为内核空间
。用户进程通常只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址,用户进程只有通过系统调用等方式才可以访问到内核空间。这些虚拟进程地址空间(包括用户空间和内核空间
)在内核中使用struct vm_area_struct
数据结构来描述,简称VMA(VMA就是虚拟进程地址空间)
。
如上图所示,Linux中1GB的内核地址空间又被划分为线性映射区
、虚拟内存分配区
、高端内存映射区
等几个区域。一般情况下,线性映射区
最大长度为760MB
(也被称作为常规内存
),物理内存被顺序映射在内核空间的这个区域中。当系统物理内存大于760MB
时,超过了线性映射区,超过的这部分内存称为高端内存
。但是在64位Linux内核中就没有高端内存这个概念了,因为48位的寻址空间已经足够大了。 -
分配掩码
:分配掩码
是一个非常重要的参数,它影响着页面分配的整个流程。起初分配掩码被分为内存管理区修饰符(zone modifier)
和行动修饰符(action modifier)
,但是在Linux4.4内核中被重新归类,最新的分配掩码分类可以分为五类
,内存管理区修饰符(zone modifier)
,移动修饰符(mobility and placement modifier)
,水位修饰符(watermark modifier)
,页面回收修饰符(page reclaim modifier)
,行动修饰符(action modifier)
。 -
伙伴系统
:伙伴系统
是Linux内存中用来管理空闲内存的一套算法 -
slab机制
:伙伴系统用于分配内存时是以page
为单位的,在实际中有很多内存需求是以Byte
为单位的,那么如果我们需要分配以Byte
为单位的小内存块时,该如何分配呢?slab分配器
就是用来解决小块内存块分配问题的,也是内存分配中非常重要的角色之一。 -
红黑树
:红黑树
是linux内存管理中最最常见的一种用来管理、查询内存节点的算法。