第十四章_Android内核驱动――内存管理.docVIP

第十四章_Android内核驱动――内存管理.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十四章 Android 内核驱动——内存管理 14.1 Low Memory Killer 基本原理 Android 的 Low Memory Killer是在标准 linux kernel的 OOM 基础上修改而来的一种内存管理 机制, 当系统内存不足时, 杀死 Bad 进程释放其内存。 Bad 进程的选择标准有两个:oom_adj和占用内存的大小。 oom_adj代表进程的优先级, 数值越大, 优先级越高, 对应每个 oom_adj都有一个空闲内存的阈值。 Android Kernel 每隔一段时间会检查当前空闲内存是否低于某个 阈值, 如果是, 则杀死 oom_adj最大的 Bad 进程, 如果有两个以上 Bad 进程 oom_adj相同, 则杀死其中占用内存最多的进程。 Low Memory Killer与 OOM 的区别 OOM 即 Out of Memory是标准 linux Kernel的一种内存管理机制, Low Memory Killer在它基 础上作了改进: ●OOM 基于多个标准给每个进程打分,分最高的进程将被杀死; Low Memory Killer则用 oom_adj和占用内存的大小来选择 Bad 进程 ●OOM 在内存分配不足时调用,而 Low Memory Killer每隔一段时间就会检查,一旦发现 空闲内存低于某个阈值,则杀死 Bad 进程。 Low Memory Killer的实现 Low Memory Killer 的源代码在 drivers/staging/android/lowmemorykiller.c中,它是通过注册 Cache Shrinker来实现的。 Cache Shrinker是标准 linux kernel回收内存页面的一种机制,它由 内核线程 kswapd 监控,当空闲内存页面不足时, kswapd 会调用注册的 Shrinker 回调函数, 来回收内存页面。 register_shrinker会将 lowmem_shrink加入 Shrinker List中,被 kswapd 在遍历 Shrinker List时 调用,而 Low Memory Killer的功能就是在 lowmem_shrink中实现的。 lowmem_minfree保存空闲内存的阈值,单位是一个页面 4K , lowmem_adj保存每个阈值对 应的优先级。 lowmem_shrink首先计算当前空闲内存的大小, 如果小于某个阈值, 则以该阈值对应的优先 级为基准, 遍历各个进程, 计算每个进程占用内存的大小, 找出优先级大于基准优先级的进 程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。 用户接口 设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree, 设置对应优先 级的接口:/sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的接口: /proc/进程 pid/oom_adj。 从以上设置可以看出, 将 init 进程 oom_adj设置为 -16, 从而保证 init 进程永远不会被杀掉。 14.2 Ashmem 基本原理 Android 的 Ashmem 是一种共享内存的机制, 它基于 mmap 系统调用, 不同进程可以将同一 段物理内存映射到各自的虚拟地址控制,从而实现共享。 Ashmem 与 mmap 的区别 mmap 通过映射同一个普通文件实现进程间共享内存,普通文件被映射到进程地址空间后, 进程可以像访问普通内存一样对文件进行访问,不必再调用 read , write 等操作。进程在映 射空间对共享内存的改变并不直接写回到磁盘文件中,在调用 munmap 后才执行此操作。 可以通过调用 msync 实现磁盘上文件内存与共享内存区的内容一致。 Ashmem 与 mmap 的区别在于 Ashmem 与 cache shrinker关联起来,可以控制 cache shrinker在适当时机回收这些共享内存。 Ashmem 的实现 Ashmem 的源代码在 mm/ashmem.c中, 它通过注册 Cache Shrinker回收内存, 通过注册 misc 设备提供 open , mmap 等接口, mmap 则通过 tmpfs 创建文件来分配内存, tmpfs 将一块内 存虚拟为一个文件,这样操作共享内存就相当于操作一个文件。 Ashmem 用两个结构体 ashmem_area和 ashmem_range来维护分配的内存, ashmem_area代 表 共 享 的 内 存 区 域 , ashmem_range则 将 这 段 区

文档评论(0)

0004499 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档