手机也有虚拟内存?今天我就给大家科普一下!

奇巧淫技2年前 (2022)发布 知客
7,073 0 0
【福利】绝版流量卡19元/180G,免费领取!🛍️🎉专享福利!全网购物内部优惠卷领取平台!🎉
100T+网盘资源免费分享!点击此处免费下载!
【APP】🎉每日更新!安卓+电视TV优质VIP优化版软件,免费分享!🎉
手机也有虚拟内存?今天我就给大家科普一下!插图

手机虚拟内存普及指南

#手机运行内存扩展有必要吗#
其实这项技术好几年前我就看到了,那个时候就有把存储空间用来当虚拟内存(2-3G),虚拟内存主要还是用来存放应用缓存的,这样可以减少物理内存压力和CPU耗电

手机也有虚拟内存?今天我就给大家科普一下!插图1

什么是虚拟内存?
虚拟内存是计算机系统内存管理的一种技术。
虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。其实早在好多年前,安卓就采用了这种技术。但是,从RAM读取数据的速率要比从硬盘读取数据的速率快。

手机也有虚拟内存?今天我就给大家科普一下!插图2

ZRAM和SWAP的区别在哪?
ZRAM(压缩内存) ZRAM是linux的一种内存优化技术,基本工作原理是:通过划定一片区域,将压缩过后的硬盘数据放到zram里,打开解压出来,以实现高速读取,会增加CPU负担,对于现在高端CPU来说,问题不大,如果是低端CPU的话,不建议你开,反而更卡,导致CPU耗电过高。

Android里面普遍使用了zRAM技术,由于zRAM牺牲了CPU时间,所以交换次数还是越少越好。像Android和windows,内存越大越好,因为发生交换的几率就小。这样两个进程相互切换(如微博和微信)时就会变得流畅,因为内存足够的话,后台进程无需被换进swap分区或被OOM杀掉。

磁盘 swap:是把磁盘的一部分作为内存, 对应用来说完全是透明的,相当与增大了内存, 但是缺点很明显, 当用到swap的时候,速度决定于闪存规格,比如说ufs2.0/2.1/3.0/3.1等等,但是速度差距和内存相差太大了。

所以,当内存使用存在压力,开始触发内存回收的行为时,就可能会使用swap空间。

内核对swap的使用实际上是跟内存回收行为紧密结合的

手机也有虚拟内存?今天我就给大家科普一下!插图3

安卓手机有必要开zram吗?
如果你的可用运行内存实在是太小,且CPU性能不是太低端(zRAM会消耗CPU资源),那么zRAM还是有必要开。

1为什么要进行内存回收

内核之所以要进行内存回收,主要原因有两个:
①内核需要为任何时刻突发到来的内存申请提供足够的内存。所以一般情况下保证有足够的free空间对于内核来说是必要的。
另外,Linux内核使用cache的策略虽然是不用白不用,内核会使用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。
所以内核有必要设计一个周期性回收内存的机制,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

②当真的有大于空闲内存的申请到来的时候,会触发强制内存回收。
所以,内核在应对这两类回收的需求下,分别实现了两种不同的机制:
一个是使用 kswapd进程对内存进行周期检查 ,以保证平常状态下剩余内存尽可能够用。
另一个是 直接内存回收(directpagereclaim) ,就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。
这两种内存回收的触发路径不同:
一个是由内核进程kswapd直接调用内存回收的逻辑进行内存回收;
另一个是内存申请的时候进入slow path的内存申请逻辑进行回收。
这两个方法中实际进行内存回收的过程殊途同归,最终都是 调用shrink_zone() 方法进行针对每个zone的内存页缩减。

手机也有虚拟内存?今天我就给大家科普一下!插图4

2.swappiness到底是用来调节什么的?
很多人应该都知道 /proc/sys/vm/swappiness 这个文件,是个可以用来调整跟swap相关的参数。这个文件的默认值是60,可以的取值范围是0-100。
这很容易给大家一个暗示:我是个百分比哦!
这个文件的值用来定义内核使用swap的积极程度:
值越高,内核就会越积极的使用swap;
值越低,就会降低对swap的使用积极性。
如果这个值为0,那么内存在free和file-backed使用的页面总量小于高水位标记(high water mark)之前,不会发生交换。

3 kswapd什么时候会进行swap操作?
我们回到kswapd周期检查和直接内存回收的两种内存回收机制。
直接内存回收比较好理解,当申请的内存大于剩余内存的时候,就会触发直接回收。

那么kswapd进程在周期检查的时候触发回收的条件是什么呢?
还是从设计角度来看,kswapd进程要周期对内存进行检测,达到一定阈值的时候开始进行内存回收。
这个所谓的阈值可以理解为内存目前的使用压力,就是说,虽然我们还有剩余内存,但是当剩余内存比较小的时候,就是内存压力较大的时候,就应该开始试图回收些内存了,这样才能保证系统尽可能的有足够的内存给突发的内存申请所使用。

4、什么是内存水位标记?(watermark)
那么如何描述内存使用的压力呢?
Linux内核使用水位标记(watermark)的概念来描述这个压力情况。

Linux为内存的使用设置了三种内存水位标记:high、low、min。他们 所标记的含义分别为:
剩余内存在high以上表示内存剩余较多,目前内存使用压力不大;
high-low的范围表示目前剩余内存存在一定压力;
low-min表示内存开始有较大使用压力,剩余内存不多了;
min是最小的水位标记,当剩余内存达到这个状态时,就说明内存面临很大压力。
小于min这部分内存,内核是保留给特定情况下使用的,一般不会分配。

内存回收行为就是基于剩余内存的水位标记进行决策的:
当系统剩余内存低于watermark[low]的时候,内核的kswapd开始起作用,进行内存回收。直到剩余内存达到watermark[high]的时候停止。
如果内存消耗导致剩余内存达到了或超过了watermark[min]时,就会触发直接回收(direct reclaim)。

那么watermark相关值是如何计算的呢?
所有的内存watermark标记都是根据当前内存总大小和一个可调参数进行运算得来的,这个参数是: /proc/sys/vm/min_free_kbyte

QA:
1.一个内存剩余还比较大的系统中,是否有可能使用swap?
有可能,如果运行中的某个阶段出发了这个条件”zonefile+zonefree<=high_wmark_pages(zone) “,就可能会swap。

2.swappiness设置为0就相当于关闭swap么?
不是的,关闭swap要使用swapoff命令。swappiness只是在内存发生回收操作的时候用来平衡cache回收和swap交换的一个参数,调整为0意味着,尽量通过清缓存来回收内存。

3.swappiness设置为100代表系统会尽量少用剩余内存而多使用swap么?
不是的,这个值设置为100表示内存发生回收时,从cache回收内存和swap交换的优先级一样。就是说,如果目前需求100M内存,那么较大机率会从cache中清除50M内存,再将匿名页换出50M,把回收到的内存给应用程序使用。但是这还要看cache中是否能有空间,以及swap是否可以交换50m。内核只是试图对它们平衡一些而已。

4.kswapd进程什么时候开始内存回收?
kswapd根据内存水位标记决定是否开始回收内存,如果标记达到low就开始回收,回收到剩余内存达到high标记为止。

现在越来越多厂商把它拿来当卖点,毕竟现在发布会也没有什么可吹的

手机也有虚拟内存?今天我就给大家科普一下!插图5
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...