0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何改进移动系统的内存管理?

SSDFans 来源:SSDFans 作者:SSDFans 2023-07-31 09:13 次阅读

1、背景&问题

A、现今移动系统的内存管理对用户程序和用户来说都不友好:

① 上层应用程序以object为单位进行内存分配和回收,而底层内核以page为粒度进行内存管理。这导致系统不了解应用程序内存使用情况,往往直接分配固定大小的内存预算(heap)。而应用程序实际工作集只占应用程序被分配的heap大小的很小一部分,造成内存资源的浪费;

② 当内存资源紧张时,系统会直接杀死应用程序(lmkd),而重新启动应用程序需要很长时间,并且应用程序并没有积极使用被分配的内存;

1eaa0322-2f34-11ee-815d-dac502259ad0.png 

1eca2f08-2f34-11ee-815d-dac502259ad0.png

B、传统的swap机制效果不好:

① 传统的swap机制不适用于托管语言(比如,Java),因为这类语言运行时的垃圾回收会导致额外的swap操作,让工作集的估计变得困难;

② 传统的按需swap无法满足基于触控响应的移动设备,在内存压力下,会造成延时和卡顿;

1edf810a-2f34-11ee-815d-dac502259ad0.png

基于以上分析,作者提出对移动系统来说,限制内存管理改善的主要问题是底层系统缺少对上层系统语言运行时(比如,Android Run Time,ART)的了解。

2、设计

本文提出一种新的内存管理机制Marvin。Marvin的核心思想是结合Android系统内核内存管理机制和上层Java运行时,重新设计针对移动系统的swap机制。

A、Marvin包括三个基本功能:以对象为粒度的工作集估计、提前进行swap以及带书签的垃圾回收机制(Bookmarking garbage collector)。

以对象为粒度的工作集估计:

Marvin利用这个设计识别提前swap的候选并且将垃圾回收访问与应用程序访问分离;由于缺乏硬件访问位来帮助进行跟踪,Marvin实现ART 解释器和编译器中的软件访问跟踪,因为现代移动语言运行时同时运行解释代码和编译代码。

提前进行swap:

Marvin将磁盘交换与回收内存分开,提前swap。根据不同object的状态,划分两类object:saved objects,已经复制到磁盘,但仍然驻留在内存中;reclaimed objects,不再驻留在内存中,只存在于磁盘中。

带书签的垃圾回收机制:

垃圾回收器在遍历对象堆以查找未使用的对象时可能会无意中在内存中进行换页导致swap操作。Marvin 通过将修改后的书签垃圾收集器集成到 Android 运行时来解决这个问题

B、Marvin包括三个核心设计:存根(Stubs),相当于对象之间的中间层;回收表,运行时和底层系统进行访问协调swap工作;对象访问干预(Object access interposition),使得系统在运行时可以透明的采取行动。

对象引用间接存根:

Marvin 需要在相互引用的对象之间建立一个间接层,捕获对换出对象(swapped-out)的访问;存根提供该间接层,它是位于 Java 堆中小型伪对象,指向真实对象并且存储真实对象引用的副本。

1ef96d72-2f34-11ee-815d-dac502259ad0.png

底层系统-运行时协调的回收表:

Marvin 需要一种让运行时和操作系统协调的方法,告诉 OS 哪些对象可以被回收,防止操作系统回收运行时正在使用的对象。同时共享内存回收表允许这种协调,存储对象的位置和大小,并具有用于锁定的元数据位。

对象访问干预:

当应用程序代码访问对象时,运行时需要一种透明的方式恢复换出的对象并且更新工作集元数据。同时,对象访问干预是通过一系列成对解释器和编译器的修改来实现的。具体来说,解释器在执行对象访问时直接行动,编译器围绕对象访问生成额外的 ARM64 指令。

C、Marvin三个基本功能的工作过程:

以对象为粒度的工作集估计:对对象设置访问位;扫描访问位;产生工作集(Marvin 在每个对象标头中保留四个字节,并使用它们来存储交换元数据和访问位)。

1f08ead6-2f34-11ee-815d-dac502259ad0.png

设置访问位

1f299844-2f34-11ee-815d-dac502259ad0.png

GC扫描访问位,产生以对象为粒度的工作集

提前swap:将对象提前保存到外存;回收对象;恢复对象。

1f424024-2f34-11ee-815d-dac502259ad0.png

带书签的垃圾回收机制:运行时使用对象访问干预来维护存根引用;GC 在不接触底层对象的情况下检测存根和读取引用。

1f655726-2f34-11ee-815d-dac502259ad0.png

1f7cf110-2f34-11ee-815d-dac502259ad0.png

3、实现

Marvin 有两个关键组件:(1) Marvin 内核 (MK),修改后的 Android/Linux 内核(MK 的唯一职责是通过决定何时以及从哪个应用程序回收内存来平衡应用程序之间的内存分配。),以及 (2) Marvin Runtime (MRT),一种改进的 ART(它执行工作集估计、提前交换和书签垃圾收集)。

4、实验

A、实验配置:Pixel XL phones,Android 7.1.1 (or our modified build)

B、性能指标:运行App数量;提前swap的效率;开销

Marvin 可以运行的应用程序数量是普通 Android 的 2 倍以上,同时在带有 Linux swap 的 Android 上,少量分配会使应用程序无法使用;

1f91a290-2f34-11ee-815d-dac502259ad0.png

Marvin 回收内存比带 Linux swap 的 Android 快得多

1fa5b834-2f34-11ee-815d-dac502259ad0.png

5、总结

相比起之前优化移动系统内存管理(尤其是swap)的设计,Marvin的创新性在于结合上层高级语言运行时和底层内核对内存管理优化这一经典问题提出针对性设计。尽管Marvin的具体设计取得文章所述的收益有待验证,但作者发现的这一问题确实存在,即软件运行时和底层内核运行存在信息壁垒。通过设计合理的机制来解决这一问题,应该能够带来系统性能的有效提升。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7151

    浏览量

    162001
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26923
  • SWAP
    +关注

    关注

    0

    文章

    47

    浏览量

    12636
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    19944
  • ART
    ART
    +关注

    关注

    0

    文章

    25

    浏览量

    10426

原文标题:Marvin:语言运行时和内核协作让我们的APP更快

文章出处:【微信号:SSDFans,微信公众号:SSDFans】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux的内存管理是什么,Linux的内存管理详解

    Linux的内存管理 Linux的内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理
    的头像 发表于 05-11 17:54 5288次阅读
    Linux的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>是什么,Linux的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>详解

    嵌入式系统内存管理

    本帖最后由 VVX 于 2016-9-18 13:15 编辑 1、概述操作系统内存管理功能用于向操作系统提供一致的地址映射功能和内存
    发表于 09-17 19:40

    Linux核心对系统挂起支持及改进

    目前,系统挂起的主要障碍就是那些还不太完善的驱动程序,如USB、显卡、声卡驱动等。当然,现在Linux核心对系统挂起的支持还有待改进,主要表现在:1 不支持SMP系统。2 不支持大
    发表于 07-04 06:49

    什么是嵌入式操作系统内存管理技术?

    1 概 述内存管理是操作系统的中心任务之一。内存管理模块通常是操作系统内核的一部分,其主要任务是
    发表于 07-30 07:19

    操作系统对于内存管理

    操作系统如何有效的管理内存便显得尤为重要。本文讲述操作系统对于内存管理的过去和现在,以及一些页
    发表于 08-07 06:53

    Keil C动态内存管理机制分析及改进,不看肯定后悔

    Keil C动态内存管理机制分析及改进,不看肯定后悔
    发表于 04-25 08:48

    怎么设计嵌入式系统内存管理

    系列文章:一篇讲透嵌入式操作系统任务调度从需求反推设计方案,假如让你设计嵌入式系统内存管理,你怎么设计?最简单的,用一个双链表控制,所有已分配和未分配的
    发表于 12-17 06:54

    嵌入式系统之中断时间和内存管理

    慕课电子科技大学.嵌入式系统.第十章.中断时间和内存管理.时间管理0 目录10 中断时间和内存管理
    发表于 12-21 06:44

    内存管理概述及原理

    记录一下,方便以后翻阅~主要内容:1) 内存管理概述及原理;2)相关实验代码解读。官方资料:《STM32中文参考手册_V10》-第19章 灵活的静态存储器控制器(FSMC)。实验要求:系统启动后
    发表于 02-23 06:15

    嵌入式系统内存管理方案研究

    摘要:嵌入式系统内存管理机制必须满足实时性和可靠性的要求。本文以开源的的操作系统RTEMS为例,介绍嵌入式系统
    发表于 05-24 23:57 1028次阅读
    嵌入式<b class='flag-5'>系统</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>方案研究

    Buddy算法在μC/OSII动态内存管理改进中的应用分析

    1 内存管理概述 内存管理是操作系统的中心任务之一,其主要任务是组织内存以容纳内核和待执行程序,
    发表于 10-26 10:12 0次下载
    Buddy算法在μC/OSII动态<b class='flag-5'>内存</b><b class='flag-5'>管理</b><b class='flag-5'>改进</b>中的应用分析

    基于μC/OS-Ⅱ实时操作系统内存管理改进方案

    C/OS-Ⅱ是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。虽然该内核功能较多,但还是有不甚完善的地方。笔者在分析使用中发现,内核在任务管理(包括任务调度、任务
    发表于 10-30 11:05 0次下载

    μC/OS-II实时操作系统内存管理改进

    C/OS-II是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。虽然该内核功能较多,但还是有不甚完善的地方。笔者在分析使用中发现,内核在任务管理(包括任务调度、任务
    发表于 12-01 01:27 223次阅读

    嵌入式系统内存管理机制详解

    操作系统内存管理功能用于向操作系统提供一致的地址映射功能和内存页面的申请、释放操作。在嵌入式实时系统
    发表于 11-18 09:41 4331次阅读

    Linux 内存管理总结

    一、Linux内存管理概述 Linux内存管理是指对系统内存的分配、释放、映射、
    的头像 发表于 11-10 14:58 243次阅读
    Linux <b class='flag-5'>内存</b><b class='flag-5'>管理</b>总结