最近入手一部Android手机,使用后发现系统总会在后台自动启动一些程序,而这些程序都是平时不怎么用的。做过实验,刚开机时系统只有5个程序启动,RAM剩余288M,待机半个小时候有10个程序被启动,RAM剩余176M,再过个把小时后有近18个程序被加载了,RAM剩余只有106M。整个过程中手机完全处于待机状态,未接打电话、收发短信、运行程序(除任务管理器用以监控程序和RAM)。虽然说106M之后并没有感觉手机有反应迟钝的现象,但心里总是不舒服,于是选择全杀,RAM回到226M。。。。但是一段时间之后进程又恢复了,而且RAM只有60M。
      感觉这个现象绝非Linux系统的默认情况,于是git了Android Froyo的源代码,仔细研读了有关内存管理及进程调度等方面的代码。发现如此现象是Android系统“故意”的,从代码中可以体会到Android如此的本意是一种内存"缓存(Cache)"机制。也就是说Android系统为了更好的管理内存和更快的启动程序,会在Idle(空闲)时期有选择性的将一些程序的框架(Frame)模块调入内存,而这些调入的代码是不会自动执行的,当你一旦运行和已经调入的模块相关(或有依赖性)的程序时,Android系统便可以直接将程序的资源调入RAM,然后开始执行,这样无疑是大幅度提高了用户程序(User Space)的执行效率。而当系统资源(RAM)不足时,Android系统会按照机制(GC机制)将RAM中的模块卸载掉以腾出更多的RAM。由此不难看出Android系统是一套以用户程序效率为基准的操作系统。同样的,电脑上的Windows 7操作系统也使用了类似的内存缓存(Cache)机制,所以在Windows7中可以看到无论如何杀进程,剩余内存(非缓冲)总是很少很少的。但和Android不同的一点是,Android是按照程序模块为单位进行后台加载缓存的,而Windows 7是按照可执行代码段为单位进行后台加载缓存的。
     但是这样一来,Android就会有如下几点问题。
      1、如此的缓存机制好么?
     显而易见,如此的缓存机制可以非常有效的提升程序的运行效率,但可怜的剩余RAM会在启动大型程序时触发系统的内存管理(释放RAM空间),CPU使用率和RAM I/O率都会在一瞬间飙到最高,最后的结果就是大型程序启动时速度非常慢,还有就是如果此时有哪个底层程序(已经ROOT)试图分配内存,便有可能会导致整个操作系统的崩溃。
      2、有没有必要经常用任务管理器来杀掉这些进程?
     配合第一点可以看出,如果你不需要运行大型程序,那么就完全没有必要去杀掉这些进程,留着他们会让你开小程序的时候速度如风,若经常杀程序会严重费电。同样的,如果你需要运行大程序,如某些大游戏,则可以先杀掉所有进程,这样可以让大程序的启动速度快一些。
      3、后台被系统开了那么多进程会不会费电呀?
     这个问题应该是大家最关心的,而且我也曾经在一个论坛上看过这个问题,当时有位网友说这些程序被加载到内存里,占用了运存(RAM),那么就一定费电。其实这是错误的理解。就如我上面所说,在系统后台被自动加载的程序(模块)是不会自动运行的。当然,带有服务的程序除外。所以这些程序被加载后是根本没有运行的(可以用Linux下的任务切换工具实验,被系统后台加载的程序根本没有办法切进去),因为这些程序的资源等一系列代码都没有被加载,只有一些类、模块、框架被加载了进去(Android系统运行程序的流程是这样的,创建Dalvik实例->加载程序代码到Dalvik->加载程序资源等到RAM->启动Dalvik)。而Android类似于iOS的一个地方就是Android的程序如果是没有服务的当切到后台时就是处于被挂起(Suspend)状态,当重新回到前台时,系统会恢复Dalvik状态表,继续执行程序。
     再说说内存(RAM)芯片的工作机制,不同于NandFlash(ROM)芯片,RAM芯片需要供电来维持内部的二进制数据。而RAM芯片都有的一个参数就是刷新率,比方一个RAM芯片的刷新率是20纳秒,那么为了维持这个RAM芯片内的数据,就需要每20纳秒给一个脉冲信号将芯片内的门电路进行刷新。RAM中有多少数据(或者说RAM被使用了多少)是一个人为定义的说法,而对于微电子来说,只要RAM开始工作(上电且开始刷新)那么RAM的每一个地址线上都有数据(如果这个数据是连续的0,那么人们则把这块区域认为“可用空间”),所以说RAM只要在工作中(通电的情况下),它就一直在用电,里面的数据是什么、有多少数据和用电量是没有关系的。
     那么Android手机主要费电在什么地方呢?这里先不说什么外放喇叭、屏幕键盘背光之类的,只说内部的。耗电大户是CPU,CPU消耗了内部电路板总耗电的70%以上,当CPU中有指令时其将处在功耗状态,此时根据指令所使用的CPU部件(L1、L2缓存、FPU、NEON部件等等)来决定功耗大小。当CPU中无指令时,其便处在Idle(空闲)状态,此时CPU中的部件基本是关闭的,只有一些中断在打开着,当有中断产生时CPU从Idle状态进入功耗状态(执行指令)。在一般的情况下每秒的时间内CPU要从功耗状态到Idle状态切换上百甚至上千次。也就是说如果你用手机玩游戏、上网等密集型操作时,CPU在功耗状态的时间会远远多于在Idle状态的时间,此时电池也就非常费电。若在手机待机时,CPU在Idle的时间会多于在功耗的时间,那么也就会很省电。CPU的使用率便是用Idle和功耗时间算出来的,100%的CPU使用率便意味着CPU几乎没有进入Idle的时间。第二耗电大户便是NandFlash(ROM)芯片了,由于和RAM不同,NandFlash芯片不需要持续的供电来维持内部的二进制数据,因此可以在空闲时将NandFlash芯片关闭以节电。但是NandFlash在上电时要经过一个长时间的初始化过程(一般需要200毫秒),此过程中会占用过多的CPU周期。
     结合这些,便不难看出,后台有多少程序,RAM剩余多少并不能直接断言耗电量,要看后台的程序有没有服务,也就是后台的程序是否还在运行。若在运行,则会消耗CPU,也就是耗电。若没有运行,则可以算是不耗电。
    4、Android系统需要设定虚拟内存吗?
    Linux系统下可以开启虚拟内存来“增大”物理内存(RAM),但这只适用于PC电脑。对于手机来说,此项功能打开弊大于利!!!
    首先要从虚拟内存的工作原理来说起。当物理内存(RAM)不足时,操作系统会将物理内存中很少中标(调度器命中率低下)的一些内存页复制到虚拟内存中,然后物理内存(RAM)中这些被复制出去的空间便成了可用内存。虚拟内存是保存在物理存储器中的,可以是硬盘、NandFlash芯片等等。当有调度器发现本来应该存在于物理内存(RAM)中的一些内存页不存在时,便会触发系统缺页中断,然后系统内核将对应的页面从虚拟内存中复制出来,重新加载到物理内存中(RAM)。由此不难看出,虚拟内存确实增大了物理内存(RAM)的可用空间。
    其次,手机和电脑的硬件是不一样的,适用于电脑的虚拟内存并不适用于手机。其最主要的原因就是电脑使用硬盘作为物理存储器,而手机使用NandFlash(ROM)芯片或SD卡作为物理存储器。硬盘的擦写次数大家应该很明白,对质量好的硬盘进行10年的擦写都不会出什么问题。但NandFlash和SD卡的擦写次数是非常有限的,一般情况下NandFlash的擦写次数一般是硬盘的万分之一而已。而像是三星、东芝等一些高端NandFlash芯片生产商生产的民用级ROM芯片的擦写次数一般均在1万到10万次左右(硬盘大概是这个值的一万倍)。也就是说机械性测试或估算,当NandFlash芯片中的某一个区域进行1万次的擦写之后,这块区域的电子特性将会变为"不确定(Unconfirmed)"。大家应该经常见过这种情况,一个手机买回来之后使劲刷机、装程序、卸程序、每天N多条短信电话,结果用了1年多发现手机出现了很多怪异的问题,比如突然白屏、无法开机、自动重启等,去修理店老板说要换字库。其实这就是因为手机里的NandFlash(ROM)芯片的擦写次数已经到了寿命之后的结果。很多人可能觉得1万次已经很多了,其实不然(这里指的是“擦/写”,“读”基本无限制)。每当你安装一个程序之后,要把程序文件写入NandFlash(ROM)芯片,操作系统要把一些特定的信息写入系统等等,这些操作有可能已经触发了几次“写”操作了。每当你收发一条短信/接打一些电话,也会触发“写”操作(因为系统要做记录,比如通话记录,发件箱和收件箱等)。此时再看看上面说的Android系统的内存管理机制,不难发现就算给Android系统10个G的内存他也会很快缓存光的,等缓存光了之后,就会使用虚拟内存了。而在Linux系统中,内核定义虚拟内存交换页的大小是4K字节,也就意味着每次交换数据的大小必须是4K的整数倍,每4K交换一次,假如要交换4M的数据,那么就需要交换1000个页,这有可能就要对NandFlash(ROM芯片)进行几十次甚至上百次的擦写!!!!假如你已经打开了虚拟内存,在玩一个大型游戏,此时有人给你打了个电话,你接听了5分钟挂机,继续游戏,就在这个短短的过程中NandFlash(ROM)芯片中的某个区域就有可能瞬间消耗掉可见的寿命!!!要明白一点,手机上的NandFlash芯片擦写使用率要远比U盘中的芯片擦写使用率高得多。这绝对不是危言耸听,不信的网友可以去Nand芯片(ROM)生产商的网站随便搜索一款几G的片子,然后看看芯片的DataSheet,其中必有一行用非常明显的大字体、黑字体来说明此芯片的擦写次数(Cycle)。本人的HTC WM系统手机因为刷机和频繁擦写致使8个月就开不了机了,而另一款索尼爱立信W800手机(只做接打电话使用)从上市到现在依然可以使用(貌似有6年了)!有一点要注意,“擦/写”次数并不是说对这个芯片的次数,而是对芯片中某一个区域的“擦/写”次数。
     最后,手机开启虚拟内存会致使系统严重不稳定和程序运行过慢。硬盘的读写速度要比NandFlash芯片快很多,因此当系统发生缺页中断时从虚拟内存调出页置换到物理内存中会浪费非常多的时间。同时,在置换的过程中操作过程是绝对不允许被打断的,否则内核就会导致崩溃。相信很多iPhone玩家在开了虚拟内存之后都深有体会(频繁的重启和Respring)。尤其是将虚拟内存文件放置到SD卡上。因为读写SD卡的时候ARM总线需要等待很多周期,再次期间CPU会进入Idle状态,若此时触发内核的其他中断,打断内存页置换的过程,则必定引发系统崩溃,重则导致SD卡损坏。
     作为手机烧油,给CPU超超频、偶尔刷刷机、倒腾倒腾ROM这些可以玩玩,但像其他的事情比如虚拟内存,只能是"Developer Only, NOT For User!"。
      有些烧油看到这个可能会担心自己的爱机寿命,上面有关NandFlash的说明均是针对“超出厂家预计的使用压力(比如开启虚拟内存等)”的情况,日常使用均在厂家设定之内。

突然想到了一些Android手机可以用的“光感解锁”,也有很多烧油在纠结于开启此功能会造成光感/距感器过早夭折。这个东西其实并不如想象中的那么脆弱,所有电子元件在出厂后并不一定都能达到设计使用寿命。如果你的光感和距感过早夭折,那只能说你RP不好。此类电子器件的工作电压和电流是一定的(无脉冲信号),所以使用上并不会降低多少寿命,等到电池坏的那天它都可能还是好的。至于有些烧油说光感/距感器上有一个灯,怕长时间亮着会烧掉,这一点我到没有注意过是否有灯。如果有灯的话,寿命也要视具体情况而定,可以用照相机来观察那个灯是常亮还是闪烁。若处在常亮状态,那寿命自然会减短很多,若是闪烁状态,则不必担心。LED和灯泡还是有区别的,灯泡常亮比闪烁的寿命要长,但LED闪烁的寿命会远长于常亮的寿命。像是电脑声卡的数字光纤输出接口,就是一个闪烁的LED,闪烁频率一般在几十到几百kHz,用过好几年的光纤接口都还是可以正常工作的!

搜索android RAM ROM SD区别时找到一篇分析不错的文章相关推荐

  1. android ram rom测试工具,RAM与ROM测试方法

    <RAM与ROM测试方法>由会员分享,可在线阅读,更多相关<RAM与ROM测试方法(4页珍藏版)>请在人人文库网上搜索. 1.ROM与RAM测试方法在硬件系统出厂前要进行产品测 ...

  2. RAM ROM内存区别

    概念 RAM(random access memory)即随机存储内存,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序.ROM(Read-Only Memory)即只读内存,是一种 ...

  3. android ram rom测试工具,ROM与RAM的那点事,超详细解说

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下部分内容来自网络整合 系统启动时会先给硬件分配内存,这里分配的内存是不可见的,就像参数1G RAM ,实际可用最多只有700多M一样 就像 剩余600 ...

  4. 找到一篇有关A*算法文章,不错~收藏

    原文地址:http://data.gameres.com/message.asp?TopicID=25439 文章为国人翻译国外www. gamedev . net 的文章,在文章的末尾附录里有很不错 ...

  5. android ndk: aborting . stop,编译时出现android ndk aborting stop怎么破

    编译时出现android ndk aborting stop怎么破 更新时间:2019-10-26 10:26 最满意答案 在报错行前加入: $(call import-add-path, cocos ...

  6. 【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  7. 扫盲:关于Android手机内存ROM、RAM还有SD卡的解释

    买Android手机,除了CPU外,接下来最重要的可能就是ROM.RAM.SD卡的大小了.那就赶紧来了解一下手机内存ROM.RAM还有SD卡的重要性吧,不然在买手机的时候可能会吃亏. 因为一些手机厂家 ...

  8. CPU和cache的区别、RAM和ROM的区别、常见的名称缩写

    内存RAM和ROM之间的区别 ROM和RAM都是一种存储技术 RAM为随机存储,掉电不会保存数据(易失性): ROM可以在掉电的情况下,依然保存原有的数据(非易失). ROM和RAM指的都是半导体存储 ...

  9. RAM与ROM的区别

    RAM:random access memory,随机存取存储器. ROM:read-only memory,只读存储器. 1 RAM RAM也叫主存,是与CPU直接交换数据的内部存储器.可以随时读写 ...

最新文章

  1. LeetCode实战:二叉树的最近公共祖先
  2. nginx + uwsgi + Django 应用部署
  3. java——File类常用方法
  4. SVG 基础知识 回顾
  5. python数据科学-数据预处理
  6. Qt_Window@Qt Command Prompt从命令行创建工程
  7. java B2B2C springmvc mybatis电子商城系统(四)Ribbon
  8. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装
  9. 20个优秀的前端css框架
  10. 浅析希区柯克的悬念电影:以《惊魂记》为例
  11. SpringBoot 添加junit单元测试+Spring Boot 的测试类库
  12. Linux使用 tar命令-g参数进行增量+差异备份、还原文件
  13. JUC的常用辅助工具
  14. vue截取一个字符串_字符串截取方法
  15. Unity 材质设置为tiling不能够重复的问题
  16. Opcodes 说明
  17. linux cp拷贝一个文件到另一个目录,cp命令复制文件夹到另一个文件夹的注意事项 - 翟码农技术博客...
  18. 【魔方教程】三阶多阶异形魔方教程大合集
  19. 苹果a15处理器参数
  20. 《高等工程数学》吴孟达版,第一章课后习题答案

热门文章

  1. java 连接 firebird
  2. 单窗口单IP,驱动级socks5,socks5驱动,模拟器不同IP,每个进程不同IP,局部及全局代理实现方案!
  3. Deep Reinforcement Learning with Knowledge Transfer for Online Rides Order Dispatching
  4. flutter httpClient的封装 dio
  5. 物理学在计算机领域的应用,物理学在计算机中的应用.pdf
  6. halcon 缺陷检测 划伤检测
  7. C#文字转换语音朗读或保存MP3、WAV等格式
  8. DDS格式介绍及相关工具
  9. C++设计模式实例讲解
  10. linux中cp rp,[原]关于cp命令中拷贝所有的写法