您的位置:首页 > 移动开发 > Android开发

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

2016-09-01 17:23 344 查看
一. 研究目的

随着智能手机的计算处理能力越来越强,其所能做的事情越来越多,但在运行过程中(如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个阈值,只有当第一次到达该阈值时才会进行垃圾回收,连续第二次到达该阈值时会选择以一定的大小增长堆。这样达到了降低垃圾回收频率的目的,同时也可以较好地满足垃圾回收需要。



基于页面引用统计的内存堆大小调节。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息