操作系统专栏——Linux存储管理
我们将会从两个方面来说Linux的存储管理:
1. Buddy内存管理算法
首先来简单介绍一下Buddy内存管理算法:
- Buddy算法是经典的内存管理算法。
- 算法基于计算机处理二进制的优势具有极高的效率。
- 算法主要是为了解决内存外碎片的问题。
那么,什么是内存页内碎片,什么是内存页外碎片呢?
页内碎片:
内部碎片是已经被分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。![]()
页外碎片:
外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。![]()
总的来说,这也是让内存分配与相邻内存合并能快速进行。
在进行内存分配的时候,Buddy内存分配原则是:向上取整为2的幂大小。
比如,70K->128k,129k->256K,666K->1024K
并且,Buddy内存管理核心算法为一个“伙伴系统”。
伙伴,指的是内存的伙伴。
一片连续内存的伙伴,是相邻的另一片大小一样的连续内存。
其具体流程如下:
-
创建一系列空闲块链表,每一种都是2的幂
-
假设存储空间有1M大小,我们目前有的空闲存储块为1K 2K 4K 8K…1M
- 然后假如我们需要分配的进程所需内存块为100KB。
- 我们需要先对进程块向上取整为128K。然后考虑内存块的分配。
- 先查询是否有空闲的128K内存块,有就分配,没有就查询256K,直到找到合适的。
- 最后,假如我们找到的是1M,那么,1M-128K=872K,有872K是没有占用了,那么我们就可以切割出2的整数幂大小的内存块分配出去/进行回收。
2. Linux交换空间
交换空间(Swap)是磁盘的一个分区,Linux物理内存存满的时候,就会把一部分内存交换至Swap空间,Swap空间是初始化系统的时候配置的。 但也有一定问题,Swap是在硬盘上的存储空间,我们的linux是运行在内存上的,如果一旦频繁切换swap,linux运行速度就会极大的降低。
Linux交换空间有三个依赖,分别如下:
- 冷启动内存依赖
- 系统睡眠依赖
- 大进程空间依赖
说到这里,我们也一定会想起类似功能的概念:虚拟内存。
swap空间 | 虚拟内存 |
---|---|
swap空间存在于磁盘 | 虚拟内存存在于磁盘 |
swap空间与主存发生置换 | 虚拟内存与主存发生置换 |
swap空间是操作系统概念 | 虚拟内存是进程概念 |
swap空间解决系统物理内存不足的概念 | 虚拟内存解决进程物理内存不足的问题 |