比思网首页iOS经典面试面试
iOS内存不够怎么办?-底层原理

iOS内存不够怎么办?-底层原理

作者: _小迷糊 | 来源:发表于2019-05-27 14:06 被阅读8次

原文作者:Cooci_协调学习_不急不躁
https://juejin.im/post/5ccd6bb3e51d453a5604c42e

在早期的计算机中,程序是间接运行在物理内存上的,也便是说:程序在运行时访问的地址便是物理地址。如许也便是单运行的时候没有什么成就!可是,计算机遇有多到程序、分时体系和多任务,当咱咱咱们可以或许或许同时运行多个程序时,CPU的利用率将会比较高。那么有一个非常严重的成就:如何将计算机的有限的物理内存分派给多个程序应用

假设咱咱咱们计算有128MB内存,程序A必要10MB,程序B必要100MB,程序C必要20MB。如果咱咱咱们必要同时运行程序A和B,那么比较间接的做法是将内存的前10MB分派给程序A,10MB~110MB分派给B。

但如许做,会构成如下成就:

  • 当多个程序必要运行时,必需包管这些程序用到的内存总量要小于计算机实际的物理内存的大小。

  • 过程地址空间不隔离,因为程序是间接访问物理内存的,所以每个过程都可以或许或许修改其余过程的内存数据,设置修改内核地址空间中的数据,所以有些恶意程序可以或许或许随意修改别的过程,就会构成一些破坏

  • 内存应用效力低 内存空间不敷,就必要将其余程序展现拷贝到硬盘傍边,然后将新的程序装入内存。然而因为大批的数据装入装出,内存的应用效力会非常低

  • 程序运行的地址不确定;因为内存地址是随机分派的,所以程序运行的地址也是不正确的

解决这几个成就的思绪便是应用咱咱咱们非常牛逼的办法:增长中央层 - 即应用一种间接的地址访问办法。

把程序给出的地址看做是一种虚构地址,然后颠末过程某种映射,将这个虚构地址转化到实际的物理地址。如许,只必要节制好映射过程,就能包管程序所能访问的物理内存地区跟别的程序不重叠,到达空间隔离的效果。

隔离

通俗的程序它只必要一个简略的履行环境,一个繁多的地址空间,有自己的CPU。
地址空间比较形象,如果把它想象成一个数组,每个数组是一字节,数组大小便是地址空间的长度,那么32位的地址空间大小便是2^32=4294967296字节,即4G,地址空间有用位是0x00000000~0xFFFFFFFF。
地址空间分为两种:

  • 物理空间:便是物理内存。32位的机械,地址线就有32条,物理空间4G,但如果只装有512M的内存,那么实际有用的空间地址便是0x00000000~0x1FFFFFFF,其余部分都是无效的。

  • 虚构空间:每个过程都有自己自力的虚构空间,而且每个过程只能访问自己的空间地址,如许就有用的做到了过程隔离。

分段

基本思绪: 把一段与程序所必要的内存空间大小的虚构空间映射到某个地址空间。虚构空间的每个字节对应物理空间的每个字节。这个映射过程由软件来实现。

比如A必要10M,就假设有0x000000000x00A00000大小的虚构空间,然后从物理内存分派一个相同大小的空间,比如是0x001000000x00B00000。操纵体系来设置这个映射函数,实际的地址转换由硬件实现。如果越界,硬件就会判断这是一个非法访问,拒绝这个地址请求,并上报操纵体系或监控程序。

如许一来利用:分段的办法可以或许解决之前的个(地址空间不隔离)和第三个成就(程序运行地址不确定)

  • 首先做到了地址隔离,因为A和B被映射到了两块分歧的物理空间,它咱咱们之间没有任何重叠,如果A访问虚构空间的地址超过了0x00A00000这个规模,硬件就会判断这是一个非法的访问,并将这个请求申报给操纵体系或许监控程序,由它决定如何处理。

  • 再者,对付每个程序来说,不管它咱咱们被分派到地址空间哪囊个地区,对付程序来说都是透明的,它咱咱们不必要关怀物理地址的变更,它咱咱们只要按照从地址0x00000000到0x00A00000来编写程序、放置变量,所以程序不必要重定位。

第二成就内存应用效力成就依旧没有解决。

但是分段的办法没有解决内存应用效力的成就。分段对付内存地区的映射还是按照程序为单位,如果内存不敷,被换入换出的磁盘的都是全体程序,如许势必会构成大批的磁盘访问操纵,从而严重影响速率,这种办法还是显得粗糙,粒度比较大。率瞪细莩序的局部性原理,当一个程序正在运行时,在某个光阴段内,它只是频繁用到了一小部分数据,也便是说,程序的很多数据其实在一个光阴段内是不会被用到的。人咱咱们很自然地想到了更小粒度的内存分割和映射办法,使得程序的局部性原理获得充足利用,大大提高了内存的应用率。这种办法便是分页。

分页

分页的基本办法是把地址空间人为得等分成固定大小的页,每个页的大小由硬件决定,或硬件支撑多种页的大小,由操纵体系抉择决定页的大小。 目前几乎统统PC的操纵体系都是用4KB大小的页。咱咱咱们应用的PC机是32位虚构地址空间,也便是4GB,按4KB分页,总共有1048576个页。

那么,当咱咱咱们把过程的虚构地址空间按页分割,把常用的数据和代码装载到内存中,把不常用的代码和数据保留在磁盘里,当必要用到的时候再把它咱咱们从磁盘里取出即可。图中的线表示映射相干,咱咱咱们可以或许看到虚构空间有些页被映射到同一个物理页,如许就可以或许实现内存同享。
虚构页,物理页,磁盘页根据内存空间不一样而区分

咱咱咱们可以或许或许看到Process 1 的VP2和VP3不在内存中,但是当过程必要用到这两个页的时候,硬件就会捕获到这个消息,便是所谓的页错误(Page Fault),然后操纵体系接收过程,卖力将VP2和VP3从磁盘读取进去装入内存,然都将内存中的这两个页和VP2和VP3树立映射相干。以页为单位存取和交换数据非常便利,硬件自己就支撑这种以页为单位的操纵办法。

  • 掩护页也且秤成涞偏向之一,简略地说便是每个页可以或许设置权限属性,谁可以或许修改,谁可以或许访问,而且只要操纵体系有权修改这些属性,那么操纵体系就可以或许做到掩护自己和掩护过程。

  • 虚构存储的实现必要硬件支撑,几乎统统CPU都采纳称为MMU的部件来停止页的映射:


    在页映射情势下,CPU收回的是Virtual Address,即咱咱咱们程序看到的是虚构地址。颠末MMU转换以后就变成为了Physical Address。一样平常MMU集成在CPU内部,不会以自力的部件存在。

相干文章

  • iOS内存不够怎么办?-底层原理

    原文作者:Cooci_协调学习_不急不躁https://juejin.im/post/5ccd6bb3e51d45...

  • 【iOS 底层原理】内存管理

    一.定时器 1.CADisplayLink、NSTimer CADisplayLink、NSTimer 会对 ta...

  • 学02:手机内存不够怎么办?

    文/一剑江湖 最近很多人推荐手机App,高效办公也好,有趣生活也罢,可是装配几个应用就提醒内存已满,更新一下就空间...

  • iOS底层原理探究- NSObject 所占内存

    iOS底层原理探究- NSObject 所占内存 面向对象的Objective-C 咱咱咱们平时写的 OC 代码底层实...

  • 设法主意不够聚焦怎么办

    设法主意很多却不聚焦 本日在地铁上反思了最近写文章的环境。 我最近设法主意还是很多的,但便是没有更新什么文章。原因在于,自...

  • 企业本钱票不够怎么办

    企业本钱票不够怎么办?在曩昔,很多为了少缴税或许缺少本钱票大批购买不合规的发票,但如今是不行以的。如今你如果想颠末过程...

  • 光阴不够用怎么办?

    新的一年开端减肥计划,但是却发现光阴不够用,天天忙忙叨叨,但是结果什么的都干不成。 究竟什么原因我的光阴不够用?想...

  • 光阴不够用怎么办

    之前有很长的一段光阴,总发现光阴不够用。天天总有那么多的杂事,都处理不完,弄得情也很烦躁。后来也去网上找了一些时...

  • 技术贴 | 苹果手机内存不够用了,怎么办?

    当初买了苹果16G的同伙咱咱们肠子都要悔青了吧!平均三天就要清理一次缓存或许删掉一些照片,如今每次看到空间不敷的提醒,...

  • ?颜值不够身高凑,身高不够怎么办?

    长处本"大众号想说:没相干,颜值不高身高来凑,身高没有,至少你另有如下如许东西? 对付手控妹子来说,你的手、脸、身高...

网友评论

    本文标题:iOS内存不够怎么办?-底层原理

    本文链接:/subject/fzgcoqtx.html

    友情链接:阿尔迪姆LED新闻网  北京儿童医院网  金融时报网  广州美容在线学习网  志趣  mc喊麦网  中国科技新闻网  梅花表维修网  重庆商务网  保山市人民医院