操作系统专栏——Linux存储管理

我们将会从两个方面来说Linux的存储管理:

1. Buddy内存管理算法

首先来简单介绍一下Buddy内存管理算法:

  1. Buddy算法是经典的内存管理算法。
  2. 算法基于计算机处理二进制的优势具有极高的效率。
  3. 算法主要是为了解决内存外碎片的问题。

那么,什么是内存页内碎片,什么是内存页外碎片呢?

页内碎片:
 
内部碎片是已经被分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。

操作系统专栏——Linux存储管理  

页外碎片:
 
外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。

操作系统专栏——Linux存储管理

总的来说,这也是让内存分配与相邻内存合并能快速进行。

在进行内存分配的时候,Buddy内存分配原则是:向上取整为2的幂大小。

比如,70K->128k,129k->256K,666K->1024K

并且,Buddy内存管理核心算法为一个“伙伴系统”。

伙伴,指的是内存的伙伴。
一片连续内存的伙伴,是相邻的另一片大小一样的连续内存。

其具体流程如下:

  1. 创建一系列空闲块链表,每一种都是2的幂
    操作系统专栏——Linux存储管理

  2. 假设存储空间有1M大小,我们目前有的空闲存储块为1K 2K 4K 8K…1M

操作系统专栏——Linux存储管理
  1. 然后假如我们需要分配的进程所需内存块为100KB。
  2. 我们需要先对进程块向上取整为128K。然后考虑内存块的分配。
  3. 先查询是否有空闲的128K内存块,有就分配,没有就查询256K,直到找到合适的。
  4. 最后,假如我们找到的是1M,那么,1M-128K=872K,有872K是没有占用了,那么我们就可以切割出2的整数幂大小的内存块分配出去/进行回收。

2. Linux交换空间

交换空间(Swap)是磁盘的一个分区,Linux物理内存存满的时候,就会把一部分内存交换至Swap空间,Swap空间是初始化系统的时候配置的。 但也有一定问题,Swap是在硬盘上的存储空间,我们的linux是运行在内存上的,如果一旦频繁切换swap,linux运行速度就会极大的降低。

Linux交换空间有三个依赖,分别如下:

  1. 冷启动内存依赖
  2. 系统睡眠依赖
  3. 大进程空间依赖

说到这里,我们也一定会想起类似功能的概念:虚拟内存。

swap空间 虚拟内存
swap空间存在于磁盘 虚拟内存存在于磁盘
swap空间与主存发生置换 虚拟内存与主存发生置换
swap空间是操作系统概念 虚拟内存是进程概念
swap空间解决系统物理内存不足的概念 虚拟内存解决进程物理内存不足的问题