智能手机内外存可靠性研究

来源:互联网 发布:指南针软件怎么卸载 编辑:程序博客网 时间:2024/05/17 01:02

一. 研究目的

随着智能手机的计算处理能力越来越强,其所能做的事情越来越多,但在运行过程中(如Android)还是会存在卡顿现象。该研究的目的是要从内核层的内存管理、外存管理,框架层的虚拟机垃圾回收、显存管理等方面找出卡顿的原因所在。对于内核层的内存管理,又细分为了三个研究方向:内存碎片化带来的影响,low memory killer(lmk)带来的影响以及交换分区带来的影响。对于框架层的垃圾回收,也细分为两个方向:传统Dalvik虚拟机垃圾回收所存在的问题,最新的ART运行模式的垃圾回收存在的问题。研究的最后还提供了对应问题的可能的解决方案。


二. 内存(内核层)

1. 内存碎片

  • Buddy system原理机制(数据结构如下)。每个zone都有这11个链表,包含了不同大小(order从0到10)的连续物理块。
  • 存在的问题
    • 碎片化。系统使用一段时间后,内存链表中的连续物理块出现大量的内存碎块,导致在进行大块物理内存的请求性能低下:页面分配要从alloc_page变成alloc_page_slowpath,其分配速度会降低1000多倍。主要原因是此时对大块物理内存的分配不能满足(大块物理内存链表为空),从而需要对内存进行回收整理。
    • 难以量化。传统量化方式是使用不可用指数(unusable index)。很难刻画全局碎片化程度,所以该研究给出了全局内存碎片化程度量化公式。
  • 解决方案
    • 主动内存碎片整理线程。当内存碎片程度超过90%以后,在后台开启一个线程进行direct compact和direct reclaim的操作。
    • 基于Domain的内存分配方案。每个进程对应一个Domain,当进程有内存请求时,是以region为粒度进行分配(region的order可以选取2-7)。

2. low memory killer(lmk)

  • lmk回收原理。基于进程的优先级和其所占的内存大小对每个进程进行评分,然后根据评分结果进行终止进程。
  • 存在问题:回收进程的选择精度存在问题,也就是说经常出现杀死过的进程马上又会被启动起来。
  • 解决方案:更改lmk进程过滤模块。根据用户的使用习惯,在用户层对用户对应用的使用进行预测。然后根据预测结果来进行回收进程的选择。


三. 虚拟机垃圾回收(框架层)

1. Dalvik虚拟机和ART运行时垃圾回收存在的问题

Dalvik虚拟机垃圾回收采用的是Mark-Swap算法。其实现有非并行的和并行的两种方式。而对于ART垃圾回收,当Android应用程序在前台运行时,就使用Mark-Sweep垃圾回收的并行回收方式,这可以使得垃圾回收拥有较高的效率;而当Android 应用程序回退到后台运行时,就使用Compacting垃圾回收方式,这可以利用CPU时间对内存碎片进行整理。

  • 回收效率问题。Dalvik回收效率低于ART。根据实验结果可以看出,完成一项任务,Dalvik垃圾回收触发的次数为356次,而ART垃圾回收触发的次数为19次。这说明了ART垃圾回收的效率大大高于Dalvik垃圾回收的效率。
  • 回收频率问题。Dalvik垃圾回收的低效率导致了其高回收频率,反过来,ART垃圾回收的频率则相对较低。

2. 解决方案

  • 多阈值控制垃圾回收频率。传统垃圾回收算法都是根据可用内存阈值来触发的,也就是说当可用内存降低到一个预设阈值时,就会立即出发垃圾回收,从而满足后续的内存请求。该方案设定了5个阈值,只有当第一次到达该阈值时才会进行垃圾回收,连续第二次到达该阈值时会选择以一定的大小增长堆。这样达到了降低垃圾回收频率的目的,同时也可以较好地满足垃圾回收需要。
  • 基于页面引用统计的内存堆大小调节。

0 0