Linux内存管理概述

a 夏天 提交于 2020-01-23 05:56:03

Linux内存管理概述

2020年悄悄的来了,新年初始正是立flag的好时候,今年的flag是总结完linux内存管理和进程管理两大模块,想法是好的,希望能坚持下去,废话到此为止,今天先来介绍linux内存管理的概述,后续内存相关文章都围绕今天的内容展开。

内存管理架构图

先上图:
内存管理架构

用户空间

  • 应用程序并没有直接调用系统调用申请内存,是调用glibc的库函数malloc和free申请和释放内存,malloc和free是glibc的ptmalloc分配器提供的接口,ptmalloc使用系统调用brk和mmap向内核以页为单位申请内存,然后划分成小的内存块分配给用用程序。
  • 除了glibc的ptmalloc,还有google公司的tcmalloc和FreeBSD的jemalloc。

Note: GUN C指的是glibc,ANSI C指的是libc,是标准C库,glibc对libc做了扩展,一般只用于linux

内核空间

  • 虚拟内存管理负责为进程分配虚拟页,内存采用延迟分配虚拟页的策略,进程第一次申请内存页时,会发生页错误异常,异常处理程序从页分配器中分配物理页,并把虚拟页和物理页的映射条目更新到页表中。
  • 页分配器负责分配物理页,内核有多种页分配器,不连续内存页分配器、连续页分配器、引导内存分配器等。
    • 连续内存页分配器(CMA):DMA可以不需要cpu直接控制内存,但是一般需要连续的内存,所以系统一般需要预留一块连续的物理内存供类似DMA的场景使用,预留的这种方式对内存是一种浪费,CMA应运而生,分配一块CMA内存区域,DMA等不使用的时候其他程序可以使用,DMA使用的时候立刻回收供DMA使用。
    • 引导内存分配器:在内核初始化过程中,页分配器还初始化完成,此时需要引导内存分配器负责分配内存。
  • 内存控制组:内核通过内存控制组控制进程的内存资源。
  • 内存碎片整理:当内存没有足够的连续物理内存时,需要进行内存碎片化整理,通过内存迁移的方式实现。
  • 页回收:当内存不足时,页回收负责回收物理页,有后备存储设备的回收到存储设备中,无后备存储设备的存储到交换分区,zram就是一种特殊的交换分区。
  • LowMemorykiller:页回收后内存还是不够时,触发LowMemorykiller杀进程释放内存空间。

硬件

  • 处理器包括MMU,负责将虚拟内存地址转换为物理内存地址,每个进程有属于自己的页表,当进程切换的时候,进程需要把自己的页表告诉MMU,MMU根据新进程的页表进行地址转换。
  • 页表存储在内存中,MMU有页表缓存(TLB),避免地址转化都需要访问内存,影响效率。

参考

本文参考了余华兵老师的Linux内核深度解析一书,算是读书后的总结。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!