程序员详解iOS的原生和第三方虚拟内存机制

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 05:52 点击:
虚拟内存。这项技术本质上就是对内存地址进行映射,使得进程认为自己拥有连续的,大量的内存,提高内存利用率,降低程序编写难度。因此,虚拟内存范畴可以划分为两类:第一类:将进程占用的内存地址映射到RAM内其他位置,第二类:将进程占用的内存地址映射到磁盘上面。iOS5必定是有第一类虚拟内存的,但没有第二类。
 
首先介绍一下虚拟内存。这项技术本质上就是对内存地址进行映射,使得进程认为自己拥有连续的,大量的内存,提高内存利用率,降低程序编写难度。比如一个程序被系统告知其可用的内存片段是0到100页。而实际上其占用的内存片段可能是分散的,有可能其占用的真正物理范围是70-120页,201页到240页,还有10页在磁盘上面。
 
因此,虚拟内存范畴可以划分为两类:
第一类:将进程占用的内存地址映射到RAM内其他位置。
第二类:将进程占用的内存地址映射到磁盘上面。
而我们通俗讲的虚拟内存就是第二类。
 
第一类由于都是在RAM内进行的,速度很快,并且有专门硬件负责转换,因而就像是把宾馆房间的门牌号换一下而已,对程序的执行没有任何影响。
 
第二类由于磁盘的速度读写速度太慢,且很多都会有一定读写次数的限制,因此,当在磁盘上的页面要被使用时候,并非直接在磁盘上修改,而是重新搬运回RAM并暂时冻结进程,搬运完成后在RAM内被修改。而RAM内不活动的页面也会在内存不足时候搬运到磁盘上,为活动的进程提供可用的物理内存。也就是说,磁盘相当于一个仓库而已,真正干活的地方还是在RAM里面。
这种方式使得在一些小内存的机器上也可以运行一些占用内存大程序,但是不足之处就是慢,卡。
 
iOS5必定是有第一类虚拟内存的,但是没有第二类。
 
首先,如果使用虚拟内存,必定会造成一定的慢,卡,大家在PC上内存满时候应该体会过。而这一点正是苹果所不愿意的。苹果一定要让一项技术可以流畅的在设备上运行时候才让它出现。这个很好理解,多任务就是这样的。
 
其次,设备会在内存不足时候自动关掉一些后台程序,如果使用了这项技术,就不会出现内存不足的情况,一旦内存不足,系统会自动将一些不活动进程在内存里数据搬到磁盘里,为活动的程序提供空间,因而也就是说所有的程序都会在后台保留,最终虚拟内存占用的磁盘空间也会越来越大。而事实上并没有这种情况。而苹果本身的设计也就是允许用户不去关闭这些后台程序。
当然,你也可以认为iOS的虚拟内存不会提供给应用程序使用。但是如果真的这样,这虚拟内存又有什么用呢?
 
除此之外,苹果也在发布会后的一次WWDC大会上说了:limited memory/virtual memory/no swapfile。也就是说并没有通俗意义上的虚拟内存。
 
至于一些开发者发现在terminal里面输入top时候有一个VM的数值,并怀疑它是虚拟内存大小。那个具体是什么我也不知道,但是我认为并不是的。那个数值确实会随着程序开的越多而越大,甚至可以到达4G。
 
下面是我分析的办法。我将用户盘和系统盘全部塞满,发现系统仍然可以正常运行。当我打开那些程序的时候,VM的数值同样增大,最终同样可以到4G以上。那这部分空间是在什么地方呢?假如你说是在除系统盘和用户盘以外的地方,好的,这不是不可能,但我们可以算一下。我是32G的,用户盘大小29754M,系统盘大小1024M,加起来30778M也就是30G,那剩下的4G往什么地方塞?况且一般来讲由于换算原因和其它因素实际可用空间都会小于称标空间的。
 
至于iOS系统的内存管理究竟是怎么样的呢?据我推测是这样的。
 
①当内存不足时候,首先会先叫后台程序或者系统进程释放。此时后台程序会主动释放一些不太重要的数据资料,比如说图片信息之类的,保留最重要的状态信息,与此同时也可能对内存数据进行压缩。此时,由于占用处理器资源,可能会出现卡顿。
 
②当内存依然不足时,系统便开始考虑关闭一些后台程序了。此时,后台程序会得到信号,然后开始运行,进行数据的保存,完成后退出,释放内存。此时,由于会占用处理器以及储存器,可能会再次导致卡顿。
 
③如果问题还不能得到解决,系统就会强制结束前台程序,同时在/var/logs/AppleSupport/下面留下一堆lowmemory的错误报告。这就是常说的闪退的一种原因。
 
由此也可以说明,iOS系统的内存管理确实很先进,确实是没有必要去关闭后台程序。当然,如果你认为①②步骤导致的小卡让你很不爽,那你还是主动去关吧。
 
说完了iOS系统的内存管理,下面来说一下用deb安装的虚拟内存,也就是真正意义上的虚拟内存。
 
有人说开启这种虚拟内存完全没有用,只能是使得内存看上去增大了很多而实际上没有任何用,还会导致系统不稳。
 
而我想在此澄清的是:
 
①虚拟内存并不能增大你设备的内存,只是为正在运行

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Lexical or Preprocessor Issue 'xxx.h
      • ios学习笔记(二)xcode 4.3.2下实现基本交互
      • ios版本的helloworld
      • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
      • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
      • IOS类似iphone通讯录TableView的完整demo【附源码】
      • UITableView一些方法
      • [iPhone中级]iPhone团购信息客户端的开发 (二)
      • iphone(object-c)内存管理(1)
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1