0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何改進(jìn)移動(dòng)系統(tǒng)的內(nèi)存管理?

SSDFans ? 來源:SSDFans ? 作者:SSDFans ? 2023-07-31 09:13 ? 次閱讀

1、背景&問題

A、現(xiàn)今移動(dòng)系統(tǒng)的內(nèi)存管理對用戶程序和用戶來說都不友好:

① 上層應(yīng)用程序以object為單位進(jìn)行內(nèi)存分配和回收,而底層內(nèi)核以page為粒度進(jìn)行內(nèi)存管理。這導(dǎo)致系統(tǒng)不了解應(yīng)用程序內(nèi)存使用情況,往往直接分配固定大小的內(nèi)存預(yù)算(heap)。而應(yīng)用程序?qū)嶋H工作集只占應(yīng)用程序被分配的heap大小的很小一部分,造成內(nèi)存資源的浪費(fèi);

② 當(dāng)內(nèi)存資源緊張時(shí),系統(tǒng)會(huì)直接殺死應(yīng)用程序(lmkd),而重新啟動(dòng)應(yīng)用程序需要很長時(shí)間,并且應(yīng)用程序并沒有積極使用被分配的內(nèi)存;

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

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

B、傳統(tǒng)的swap機(jī)制效果不好:

① 傳統(tǒng)的swap機(jī)制不適用于托管語言(比如,Java),因?yàn)檫@類語言運(yùn)行時(shí)的垃圾回收會(huì)導(dǎo)致額外的swap操作,讓工作集的估計(jì)變得困難;

② 傳統(tǒng)的按需swap無法滿足基于觸控響應(yīng)的移動(dòng)設(shè)備,在內(nèi)存壓力下,會(huì)造成延時(shí)和卡頓;

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

基于以上分析,作者提出對移動(dòng)系統(tǒng)來說,限制內(nèi)存管理改善的主要問題是底層系統(tǒng)缺少對上層系統(tǒng)語言運(yùn)行時(shí)(比如,Android Run Time,ART)的了解。

2、設(shè)計(jì)

本文提出一種新的內(nèi)存管理機(jī)制Marvin。Marvin的核心思想是結(jié)合Android系統(tǒng)內(nèi)核內(nèi)存管理機(jī)制和上層Java運(yùn)行時(shí),重新設(shè)計(jì)針對移動(dòng)系統(tǒng)的swap機(jī)制。

A、Marvin包括三個(gè)基本功能:以對象為粒度的工作集估計(jì)、提前進(jìn)行swap以及帶書簽的垃圾回收機(jī)制(Bookmarking garbage collector)。

以對象為粒度的工作集估計(jì):

Marvin利用這個(gè)設(shè)計(jì)識(shí)別提前swap的候選并且將垃圾回收訪問與應(yīng)用程序訪問分離;由于缺乏硬件訪問位來幫助進(jìn)行跟蹤,Marvin實(shí)現(xiàn)ART 解釋器和編譯器中的軟件訪問跟蹤,因?yàn)楝F(xiàn)代移動(dòng)語言運(yùn)行時(shí)同時(shí)運(yùn)行解釋代碼和編譯代碼。

提前進(jìn)行swap:

Marvin將磁盤交換與回收內(nèi)存分開,提前swap。根據(jù)不同object的狀態(tài),劃分兩類object:saved objects,已經(jīng)復(fù)制到磁盤,但仍然駐留在內(nèi)存中;reclaimed objects,不再駐留在內(nèi)存中,只存在于磁盤中。

帶書簽的垃圾回收機(jī)制:

垃圾回收器在遍歷對象堆以查找未使用的對象時(shí)可能會(huì)無意中在內(nèi)存中進(jìn)行換頁導(dǎo)致swap操作。Marvin 通過將修改后的書簽垃圾收集器集成到 Android 運(yùn)行時(shí)來解決這個(gè)問題

B、Marvin包括三個(gè)核心設(shè)計(jì):存根(Stubs),相當(dāng)于對象之間的中間層;回收表,運(yùn)行時(shí)和底層系統(tǒng)進(jìn)行訪問協(xié)調(diào)swap工作;對象訪問干預(yù)(Object access interposition),使得系統(tǒng)在運(yùn)行時(shí)可以透明的采取行動(dòng)。

對象引用間接存根:

Marvin 需要在相互引用的對象之間建立一個(gè)間接層,捕獲對換出對象(swapped-out)的訪問;存根提供該間接層,它是位于 Java 堆中小型偽對象,指向真實(shí)對象并且存儲(chǔ)真實(shí)對象引用的副本。

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

底層系統(tǒng)-運(yùn)行時(shí)協(xié)調(diào)的回收表:

Marvin 需要一種讓運(yùn)行時(shí)和操作系統(tǒng)協(xié)調(diào)的方法,告訴 OS 哪些對象可以被回收,防止操作系統(tǒng)回收運(yùn)行時(shí)正在使用的對象。同時(shí)共享內(nèi)存回收表允許這種協(xié)調(diào),存儲(chǔ)對象的位置和大小,并具有用于鎖定的元數(shù)據(jù)位。

對象訪問干預(yù):

當(dāng)應(yīng)用程序代碼訪問對象時(shí),運(yùn)行時(shí)需要一種透明的方式恢復(fù)換出的對象并且更新工作集元數(shù)據(jù)。同時(shí),對象訪問干預(yù)是通過一系列成對解釋器和編譯器的修改來實(shí)現(xiàn)的。具體來說,解釋器在執(zhí)行對象訪問時(shí)直接行動(dòng),編譯器圍繞對象訪問生成額外的 ARM64 指令。

C、Marvin三個(gè)基本功能的工作過程:

以對象為粒度的工作集估計(jì):對對象設(shè)置訪問位;掃描訪問位;產(chǎn)生工作集(Marvin 在每個(gè)對象標(biāo)頭中保留四個(gè)字節(jié),并使用它們來存儲(chǔ)交換元數(shù)據(jù)和訪問位)。

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

設(shè)置訪問位

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

GC掃描訪問位,產(chǎn)生以對象為粒度的工作集

提前swap:將對象提前保存到外存;回收對象;恢復(fù)對象。

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

帶書簽的垃圾回收機(jī)制:運(yùn)行時(shí)使用對象訪問干預(yù)來維護(hù)存根引用;GC 在不接觸底層對象的情況下檢測存根和讀取引用。

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

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

3、實(shí)現(xiàn)

Marvin 有兩個(gè)關(guān)鍵組件:(1) Marvin 內(nèi)核 (MK),修改后的 Android/Linux 內(nèi)核(MK 的唯一職責(zé)是通過決定何時(shí)以及從哪個(gè)應(yīng)用程序回收內(nèi)存來平衡應(yīng)用程序之間的內(nèi)存分配。),以及 (2) Marvin Runtime (MRT),一種改進(jìn)的 ART(它執(zhí)行工作集估計(jì)、提前交換和書簽垃圾收集)。

4、實(shí)驗(yàn)

A、實(shí)驗(yàn)配置:Pixel XL phones,Android 7.1.1 (or our modified build)

B、性能指標(biāo):運(yùn)行App數(shù)量;提前swap的效率;開銷

Marvin 可以運(yùn)行的應(yīng)用程序數(shù)量是普通 Android 的 2 倍以上,同時(shí)在帶有 Linux swap 的 Android 上,少量分配會(huì)使應(yīng)用程序無法使用;

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

Marvin 回收內(nèi)存比帶 Linux swap 的 Android 快得多

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

5、總結(jié)

相比起之前優(yōu)化移動(dòng)系統(tǒng)內(nèi)存管理(尤其是swap)的設(shè)計(jì),Marvin的創(chuàng)新性在于結(jié)合上層高級語言運(yùn)行時(shí)和底層內(nèi)核對內(nèi)存管理優(yōu)化這一經(jīng)典問題提出針對性設(shè)計(jì)。盡管Marvin的具體設(shè)計(jì)取得文章所述的收益有待驗(yàn)證,但作者發(fā)現(xiàn)的這一問題確實(shí)存在,即軟件運(yùn)行時(shí)和底層內(nèi)核運(yùn)行存在信息壁壘。通過設(shè)計(jì)合理的機(jī)制來解決這一問題,應(yīng)該能夠帶來系統(tǒng)性能的有效提升。


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

    163515
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208717
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    590

    瀏覽量

    27316
  • SWAP
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    12776
  • JAVA語言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20062
  • ART
    ART
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    10472

原文標(biāo)題:Marvin:語言運(yùn)行時(shí)和內(nèi)核協(xié)作讓我們的APP更快

文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解

    Linux的內(nèi)存管理 Linux的內(nèi)存管理是一個(gè)非常復(fù)雜的過程,主要分成兩個(gè)大的部分:內(nèi)核的內(nèi)存管理
    的頭像 發(fā)表于 05-11 17:54 ?5947次閱讀
    Linux的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>是什么,Linux的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>詳解

    嵌入式系統(tǒng)內(nèi)存管理

    本帖最后由 VVX 于 2016-9-18 13:15 編輯 1、概述操作系統(tǒng)內(nèi)存管理功能用于向操作系統(tǒng)提供一致的地址映射功能和內(nèi)存
    發(fā)表于 09-17 19:40

    Linux核心對系統(tǒng)掛起支持及改進(jìn)

    目前,系統(tǒng)掛起的主要障礙就是那些還不太完善的驅(qū)動(dòng)程序,如USB、顯卡、聲卡驅(qū)動(dòng)等。當(dāng)然,現(xiàn)在Linux核心對系統(tǒng)掛起的支持還有待改進(jìn),主要表現(xiàn)在:1 不支持SMP系統(tǒng)。2 不支持大
    發(fā)表于 07-04 06:49

    操作系統(tǒng)對于內(nèi)存管理

    操作系統(tǒng)如何有效的管理內(nèi)存便顯得尤為重要。本文講述操作系統(tǒng)對于內(nèi)存管理的過去和現(xiàn)在,以及一些頁
    發(fā)表于 08-07 06:53

    Keil C動(dòng)態(tài)內(nèi)存管理機(jī)制分析及改進(jìn),不看肯定后悔

    Keil C動(dòng)態(tài)內(nèi)存管理機(jī)制分析及改進(jìn),不看肯定后悔
    發(fā)表于 04-25 08:48

    怎么設(shè)計(jì)嵌入式系統(tǒng)內(nèi)存管理

    系列文章:一篇講透嵌入式操作系統(tǒng)任務(wù)調(diào)度從需求反推設(shè)計(jì)方案,假如讓你設(shè)計(jì)嵌入式系統(tǒng)內(nèi)存管理,你怎么設(shè)計(jì)?最簡單的,用一個(gè)雙鏈表控制,所有已分配和未分配的
    發(fā)表于 12-17 06:54

    Buddy算法在μC/OSII動(dòng)態(tài)內(nèi)存管理改進(jìn)中的應(yīng)用分析

    1 內(nèi)存管理概述 內(nèi)存管理是操作系統(tǒng)的中心任務(wù)之一,其主要任務(wù)是組織內(nèi)存以容納內(nèi)核和待執(zhí)行程序,
    發(fā)表于 10-26 10:12 ?0次下載
    Buddy算法在μC/OSII動(dòng)態(tài)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b><b class='flag-5'>改進(jìn)</b>中的應(yīng)用分析

    關(guān)于μC/OS-II實(shí)時(shí)操作系統(tǒng)內(nèi)存管理改進(jìn)方法分析

    C/OS-II是一種開放源碼的實(shí)時(shí)操作系統(tǒng),具有搶先式、多任務(wù)的特點(diǎn),已被應(yīng)用到眾多的微處理器上。雖然該內(nèi)核功能較多,但還是有不甚完善的地方。筆者在分析使用中發(fā)現(xiàn),內(nèi)核在任務(wù)管理(包括任務(wù)調(diào)度、任務(wù)
    發(fā)表于 10-27 11:50 ?0次下載

    基于μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng)內(nèi)存管理改進(jìn)方案

    C/OS-Ⅱ是一種開放源碼的實(shí)時(shí)操作系統(tǒng),具有搶先式、多任務(wù)的特點(diǎn),已被應(yīng)用到眾多的微處理器上。雖然該內(nèi)核功能較多,但還是有不甚完善的地方。筆者在分析使用中發(fā)現(xiàn),內(nèi)核在任務(wù)管理(包括任務(wù)調(diào)度、任務(wù)間
    發(fā)表于 10-30 11:05 ?0次下載

    μC/OS-II實(shí)時(shí)操作系統(tǒng)內(nèi)存管理改進(jìn)

    C/OS-II是一種開放源碼的實(shí)時(shí)操作系統(tǒng),具有搶先式、多任務(wù)的特點(diǎn),已被應(yīng)用到眾多的微處理器上。雖然該內(nèi)核功能較多,但還是有不甚完善的地方。筆者在分析使用中發(fā)現(xiàn),內(nèi)核在任務(wù)管理(包括任務(wù)調(diào)度、任務(wù)
    發(fā)表于 12-01 01:27 ?321次閱讀

    嵌入式系統(tǒng)內(nèi)存管理機(jī)制詳解

    操作系統(tǒng)內(nèi)存管理功能用于向操作系統(tǒng)提供一致的地址映射功能和內(nèi)存頁面的申請、釋放操作。在嵌入式實(shí)時(shí)系統(tǒng)
    發(fā)表于 11-18 09:41 ?4486次閱讀

    Windows版Firefox將改進(jìn)密碼管理系統(tǒng)

    Mozilla 計(jì)劃對 Windows 版 Firefox 上的密碼管理系統(tǒng)進(jìn)行改進(jìn),以更好地提升數(shù)據(jù)安全性。
    的頭像 發(fā)表于 03-23 09:36 ?1255次閱讀

    Linux內(nèi)存管理體系介紹

    內(nèi)存是計(jì)算機(jī)最重要的資源之一,內(nèi)存管理是操作系統(tǒng)最重要的任務(wù)之一。內(nèi)存管理并不是簡單地
    的頭像 發(fā)表于 08-08 09:28 ?1558次閱讀

    Linux內(nèi)存管理的詳細(xì)介紹分享

    內(nèi)存管理是計(jì)算機(jī)系統(tǒng)中負(fù)責(zé)管理系統(tǒng)內(nèi)存資源的一種機(jī)制,主要包括
    的頭像 發(fā)表于 05-29 14:09 ?1668次閱讀
    Linux<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的詳細(xì)介紹分享

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對系統(tǒng)內(nèi)存的分配、釋放、映射、
    的頭像 發(fā)表于 11-10 14:58 ?486次閱讀
    Linux <b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>總結(jié)