Android 操作系统为什么不启用swap?

【来自】 https://www.jianshu.com/p/dc515d6f14db 

如今(2017)Android智能手机的存储空间(64GB+)和读写速度(UFS2.0+)都已经相当可观,那为何不启用swap来增加内存的可用空间呢?

Android是基于Linux的,但是在内存策略上有自己的套路。先区别一下两者的不同:Linux是一种“进程内存最大化”的分配策略,每个进程拿着OS分配给自己的虚拟内存,仿佛自己占满了整个地址总线的用户态空间。而这样就自然需要Swap机制来保证物理内存不被消耗殆尽,把最近最少使用的空间腾到外部存储空间上,假装还是存储在RAM里。但是Android的的进程分配策略是每个进程都有一个内存占用限制,这个具体大小由手机具体配置决定。目的就是为了让更多的进程都保留在RAM中,这样每个进程被唤起的时候可以避免外部存储到内部存储的数据读写而造成的启动卡顿,加快更多的App被点开时候的响应速度,所以这是为什么Android不采用“进程内存最大化”的分配策略的原因,一个流氓App把所有的内存全抢了,岂不是手机卡成狗。随之而然,Android采用了自己的LowMemoryKill策略来控制RAM中的进程。所以目的相同,都是希望物理内存的利用最大化,只不过两者采用不同的策略,一个是Swap,一个是LowMemoryKill。

比较一下Swap和LowMemoryKill的区别:Swap通过将最不频繁使用的进程数据写入磁盘,来给物理内存腾出空间。LowMemoryKill通过给进程分等级,来选择级别最低去杀死来腾出物理内存空间。Android系统会考虑进程的回收利益,当Android系统开始杀死LRU缓存中的进程时,系统会判断每个进程杀死后带来的回收收益。因为Android总是倾向于杀死一个能回收更多内存的进程,从而可以杀死更少的进程,来获取更多的内存。杀死的进程越少,对用户体验的影响就越小。相比较而言,LowMemoryKill这种策略更符合手机OS的用户体验需求。再者。你说UFS2.0+的读写速度相当可观,可那毕竟也是外部存储设备,就目前而言和RAM的读写速度相比还是慢太多。并且也没有那种系统架构可以直接让CPU和外部存储的数据交互,所以它再快,也还是一种外部存储设备而已。

 
原文地址:https://www.cnblogs.com/timeObjserver/p/12260101.html