内存管理的主要功能
-
内存分配与回收:malloc函数申请内存;free函数释放内存
-
地址转换:将程序中的虚拟内存转换为内存中的物理内存
-
内存扩充:当内存不足时,使用虚拟内存技术或自动覆盖技术从逻辑上扩充内存
-
内存映射:将一个文件直接映射到内存中,这样可以通过内存指针读写内存的办法直接读取文件内容,速度更快
-
内存优化:调整内存分配策略和回收算法优化内存使用效率
-
内存安全:保证进程间使用内存互不干扰,避免恶意程序修改内存影响系统安全性。
什么是内存碎片
内部内存碎片:已经分配的内存里面未被使用的部分。例如:按2的幂次方分配,需要65字节内存,分配了128,就会产生63字节内部内存碎片。
外部内存碎片:未被分配且无法被使用,即,碎片太小不能满足任意进程的内存分配请求。
后果:
内存碎片会导致内存利用率下降,我们需要减少内存碎片。
内存管理方式
- 连续内存管理:为一个用户程序分配连续的内存空间,内存利用率一般不高。
- 非连续内存管理:运行一个程序使用不相邻的内存空间,更为灵活。
连续内存管理包括:块式管理、伙伴系统(Linux采用)算法等
- 块式管理,将内存分为几个固定大小的块,一个块供一个进程使用,造成极大的内存浪费,且极容易产生内、外部内存碎片。
- 伙伴系统算法,内存按2的幂次方划分,相邻的内存块划为一对伙伴。分配时,系统会尝试找到最合适的一块内存,如果内存太大则不断一分为二,直到大小合适。当两个相邻内存块都被释放时,又会合二为一。进而解决了外部内存碎片的问题。
非连续内存管理包括:段式管理、页式管理、段页式管理机制
- 段式管理:以段(一段连续的物理内存)的形式管理/分配内存。应用程序的虚拟地址空间被划分为大小不同的段,段是有实际意义的,每个段定义了一组逻辑信息,例如主程序段MAIN、子程序段X、数据段D及栈段S等
- 页式管理:把物理内存分为连续等长的物理页。应用程序的虚拟地址也分配连续等长的虚拟页。
- 段页式管理机制:先把物理内存分成若干段,每个段继续分为若干大小相等的连续页