内存管理功能不是操作系统具备的主要功能(内存管理有哪些主要功能)
2022-10-27 22:57:56
0
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:
地址映射
内存管理的方式
缺页异常
先来看一些基本的知识,在进程看来,内存分为内核态和用户态两部分,经典比例如下:
从用户态到内核态一般通过系统调用、中断来实现。用户态的内存被划分为不同的区域用于不同的目的:
当然内核态也不会无差别地使用,所以,其划分如下:
下面来仔细看这些内存是如何管理的。
地址
在Linux内部的地址的映射过程为逻辑地址–>线性地址–>物理地址,物理地址最简单:地址总线中传输的数字信号,而线性地址和逻辑地址所表示的则是一种转换规则,线性地址规则如下:
这部分由MMU完成,其中涉及到主要的寄存器有CR0、CR3。机器指令中出现的是逻辑地址,逻辑地址规则如下:
在Linux中的逻辑地址等于线性地址,也就是说Inter为了兼容把事情搞得很复杂,Linux简化顺便偷个懒。
内存管理的方式
在系统boot的时候会去探测内存的大小和情况,在建立复杂的结构之前,需要用一个简单的方式来管理这些内存,这就是bootmem,简单来说就是位图,不过其中也有一些优化的思路。
bootmem再怎么优化,效率都不高,在要分配内存的时候毕竟是要去遍历,buddy系统刚好能解决这个问题:在内部保存一些2的幂次大小的空闲内存片段,如果要分配3page,去4page的列表里面取一个,分配3个之后将剩下的1个放回去,内存释放的过程刚好是一个逆过程。用一个图来表示:
可以看到0、4、5、6、7都是正在使用的,那么,1、2被释放的时候,他们会合并吗?