深入理解 Android 内核设计思想(二)内存管理
发布日期:2021-05-14 19:18:21 浏览次数:29 分类:精选文章

本文共 1837 字,大约阅读时间需要 6 分钟。

操作系统内存管理基础

不论是 Linux 内核还是 Android 系统,内存管理都是核心关键技术。内存管理不仅仅是为应用程序分配内存,更是保障系统稳定运行的基础。了解内存管理的原理,对理解 Android 系统的性能优化和内存管理机制尤为重要。

虚拟内存

虚拟内存是操作系统内存管理的核心机制。当系统内存资源不足时,虚拟内存会利用硬盘空间来扩展物理内存,通过交换机制将需要的数据暂时加载到内存中。

虚拟内存地址空间分为三个层次:

  • 逻辑地址(Logical Address)

    逻辑地址是程序编译后产生的地址,由段选择子和偏移值组成。

  • 线性地址(Linear Address)

    线性地址是逻辑地址经过分段机制转换后的地址。分段机制通过段选择子确定段基地址,再结合偏移值得到线性地址。

  • 物理地址(Physical Address)

    物理地址是机器实际的内存地址。现代操作系统通常采用分页机制,将线性地址通过分页转换为物理地址。

  • 虚拟内存的核心工作流程: 逻辑地址 → 分段机制 → 线性地址 → 分页机制 → 物理地址

    内存分配与回收

    内存分配与回收是操作系统的关键任务,主要解决以下问题:

  • 保障应用程序的硬件无关性,避免硬件差异影响程序运行。
  • 管理内存划分、分配粒度和回收机制,确保内存使用效率。
  • 优化内存碎片,实现高效内存管理。
  • mmap

    mmap 是一种将设备或文件映射到进程内存空间的机制,允许应用程序直接操作内存而无需进行 IO 操作。mmap 函数的定义如下:

    void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

    mmap 的关键参数:

    • addr:映射到进程空间的起始地址。
    • len:被映射的内存块大小。
    • prot:内存访问权限(如可读、可写)。
    • flags:内存操作方式(如共享或私有)。
    • fd:文件描述符。
    • offset:从文件中指定偏移位置开始映射。

    mmap 在 Android 中广泛应用,例如 Binder 驱动和 MemoryFile 实现中都依赖 mmap 函数。

    Copy on Write

    Copy on Write 是一种优化内核内存管理的技术。多个进程共享同一块内存,直到某个进程修改数据时,系统才会复制一份副本供该进程使用。这种方式减少了内存拷贝的开销,提升系统性能。

    Linux 的 fork() 函数就采用了 Copy on Write 技术,避免在子进程创建时拷贝父进程的内存。

    Android 内存管理

    Android 对 Linux 内核内存管理机制进行了扩展和优化,特别是在低内存环境下的进程管理。

    Low Memory Killer

    Android 系统引入了梯级杀进程机制,避免因内存不足导致系统崩溃。Android 的 Low Memory Killer 与 Linux 内核 OOMKiller 有以下区别:

  • 允许定义不同的梯级处理策略。
  • 提供更灵活的配置选项。
  • Low Memory Killer 的核心实现:

    • lowmem_adj 数组定义进程优先级。
    • lowmem_minfree 数组定义不同梯级的内存限制。
    • 通过修改系统文件动态调整配置。

    Ashmem 驱动

    Ashmem 是 Android 的匿名共享内存机制,允许多个进程共享同一块内存。其实现依赖以下关键部分:

  • 设备节点:通过 /dev/ashmem 接口访问共享内存。
  • 驱动初始化ueventd 创建设备节点文件。
  • 内存管理:使用 kmem_cache 分配内存,支持动态内存扩展。
  • MemoryFile 原理

    MemoryFile 是 Java 层对 Ashmem 的封装,提供内存文件接口。其核心实现包括:

  • 共享内存申请:通过 SharedMemory.create 方法申请匿名共享内存。
  • 内存映射:使用 mmap 方法将共享内存映射到进程内存空间。
  • 文件描述符管理:通过 FileDescriptor 共享内存访问权限。
  • 总结

    通过对虚拟内存、内存分配与回收、mmap 以及 Android 的 Low Memory Killer、Ashmem 驱动和 MemoryFile 原理的学习,我们可以更深入地理解 Android 系统内存管理的核心机制。这些知识点不仅有助于优化应用性能,也为后续学习其他 Android 系统组件打下基础。

    上一篇:谈谈对Android中Zygote的理解
    下一篇:深入理解 Android 内核设计思想(一)进程间通信与同步机制

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月21日 03时37分23秒