从计算机内存结构到iOS

news2024/11/20 14:22:30

一、冯.诺伊曼结构

当前计算机都是冯.诺伊曼结构(Von Neumann architecture),是指存储器存放程序的指令以及数据,在程序运行时根据需要提供给CPU使用。

冯.诺伊曼瓶颈

在目前的科技水平之下,CPU与存储器之间的读写速率远远小于CPU的工作效率,造成了CPU性能的浪费。当前解决方式是采用多级存储,来平衡存储器的读写速率、容量、价格。
存储器主要分为两类:易失性存储器速度更快,断电后数据会丢失;非易失性存储器容量更大、价格更低,断电也不会丢失数据。随机访问存储器RAM也分为两类,其中SRAM速度更快,所以用作高速缓存,DRAM用作主存。只读存储器ROM实际上只有最开始的时候是只读的,后来随着发展也能够进行读写了,只是沿用了之前的名字。计算机存储金字塔
局部性原理(Principle of locality):被使用过的存储器内容可能会在未来多次使用,以及它附近的内容也大概率被使用。当我们把这些内容放在高速缓存中,那么就可以在部分情况下节约访问存储器的时间。

二、CPU寻址

物理地址

内存可以被看作是一个数组,数组元素是一个字节大小的空间,而数组索引则是所谓的物理地址(Physical Address)。CPU直接通过物理地址去访问对应的内存叫做物理寻址。物理寻址拓展了分段机制,通过在CPU中增加段寄存器,将物理地址变成了“段地址”:“段内偏移量”的形式,增加了物理寻址的寻址范围。

虚拟寻址

CPU通过访问虚拟地址(Virtual Address),经过翻译获得物理地址,才能访问内存。这个翻译过程由CPU中的内存管理单元(Memory Management Unit)MMU完成。

虚拟内存

对于每个进程来说,操作系统可以为其提供一个独立的、私有的、连续的地址空间,这就是所谓的虚拟内存。它保护了进程的地址空间,使得进程之间不能够越权进行互相地干扰。对于每个进程来说,操作系统通过虚拟内存进行“欺骗”,进程只能够操作被分配的虚拟内存的部分。与此同时,进程可见的虚拟内存是一个连续的地址空间,方便了程序员对内存进行管理。
虚拟内存可以映射到物理内存以及硬盘的任何区域。由于硬盘读写速度不如内存快,所以操作系统会优先使用物理内存,当物理内存空间不足时,就会将部分内存数据交换到硬盘上去存储,这就是所谓的Swap内存交换机制。相比于物理寻址,虚拟寻址利用了硬盘空间拓展了内存空间。
虚拟内存保护了每个进程的地址空间、简化了内存管理、利用硬盘空间拓展了内存空间。

内存分页

虚拟内存和物理内存建立了映射关系,为了方便映射和管理,虚拟内存和物理内存都被分割成相同大小的单位,物理内存的最小单位被称为帧(Frame),虚拟内存的最小单位被称为页(Page)。
支持了物理内存的离散使用,虚拟内存对应的物理内存可以任意存放,方便了操作系统对物理内存的管理,能够最大化利用物理内存。

三、iOS内存机制

使用虚拟内存机制,内存有限,单应用可用内存大。
iOS系统给每个进程分配的虚拟内存足够大,移动设备通常使用的大容量存储器是闪存(Flash),读写速度远远小于电脑的硬盘,所以iOS不支持内存交换机制。
内存警告:当内存不够用时,iOS的处理是会发出内存警告,告知进程去清理自己的内存didReceiveMemoryWarning。
OOM崩溃:如果进程发生了内存警告并清理了之后,物理内存还是不够就会发生Out of Memory Crash。
iOS是一个从BSD衍生而来的系统,其内核是Mach。其中内存警告以及OOM崩溃的处理机制就是Jetsam机制,也被称为Memorystatus。Jetsam会始终监控内存整体使用情况,当内存不足时会根据优先级、内存占用大小杀掉一些进程,并记录成JetsamEvent。
内核会调起一个内核优先级最高的线程:
维护两个列表,一个是基于优先级的进程列表,另一个是每个进程消耗的内存页的列表。与此同时,它会监听内核pageout线程对整体内存使用情况的通知,在内存告警时向每个进程转发内存警告didReceiveMemoryWarning;杀掉进程触发OOM主要是通过memorystatus_kill_on_VM_page_shortage,有同步和异步两种方式,同步会立刻杀掉进程,先根据优先级杀掉低优先级的进程,同一优先级根据内存大小杀掉内存占用大的进程;异步只会标记当前进程,通过专门的内存管理线程去杀死。

iOS系统的内存占用(Memory Footprint)

内存分页分为clean memory、dirty memory,iOS还有compressed memory。
clean memory在iOS中是定义为可被重新创建的内存,所有不属于clean memory的内存都是dirty memory,dirty memory不能被重新创建,所有会始终占据物理内存,直到物理内存不够用之后,系统便会开始清理。当物理内存不够用时,iOS会将部分物理内存压缩,需要读写时再解压,已达到节约内存的目的,压缩后的内存就是compressed memory。
NSCache相对于NSDictionary不仅线程安全,而且对存在compressed memory情况下的内存警告做了优化,可以由系统自动释放内存。

进程内部的内存管理iOS进程内存结构

代码区、常量区、静态区由系统自动加载,在进程结束之后被系统释放。
栈区一般存放局部变量、临时变量,由编译器自动分配和释放,每个线程对应一个栈。
堆区用于动态内存的申请,由程序员控制和释放。
栈区由系统托管,速度更快,但是使用不如堆区灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C Primer Plus第六版 学习笔记】第十四章 结构和其他数据形式

有基础,进阶用,个人查漏补缺 建立结构声明:描述该对象由什么组成,即结构布局 格式: 关键字 标记(可选){结构 }; 举例: struct book{char title[2];char author[4];float …

Xcode 编译速度慢是什么原因?如何提高编译速度?

作为一个开发者,我们都希望能够高效地开发应用程序,而编译速度是影响开发效率的重要因素之一。然而,有时候我们会发现在使用 Xcode 进行开发时,译速度非常慢,这给我们带来了不少困扰。那么,为什么 Xcode 的…

分页合理化是什么?

一、前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 只要是干过后台系统的同学应该都做过分页查…

神经网络介绍

目录 知识点介绍 知识点介绍 前馈神经网络:(前馈网络的数据只向一个方向传播) RNN循环神经网络,下图中多个 RNN 层都是“同一个层”,这一点与之前的神经网络是不一样的。

怎么下载landsat 8影像并在ArcGIS Pro中进行波段组合

Landsat 8(前身为Landsat数据连续性任务,或 LDCM)于2013年2月11日由 Atlas-V火箭从加利福尼亚州范登堡空军基地发射升空,这里为大家介绍一下该数据的下载的方法,希望能对你有所帮助。 注册账号 如果之前已经注册过的…

5、IDEA集成Git

IDEA集成Git 1. 配置Git忽略文件2. 定位Git程序3. 初始化本地库、添加暂存区、提交到本地库4. 切换版本5. 创建分支和切换分支6. 合并分支7. 解决冲突 1. 配置Git忽略文件 问题1:为什么要忽略他们? 与项目的实际功能无关,不参与服务器上部署…

学习笔记12——Spring的注解配置

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/192486.html SSM框架——注解配置(Component Autowired 加载SpringConfig) 注解开发(Component注解、config扫描 加载SpringConfig&a…

https密钥认证、上传镜像实验

一、第一台主机通过https密钥对认证 1、安装docker服务 (1)安装环境依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 (2)设置阿里云镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/do…

EB tresos 配置I2c - 实现与PF8200的读写操作

文章目录 前言一、EB工具链配置1、I2c模块1)新建模块2)配置General3)配置I2cChannel 2、Port模块1)配置SDA2)配置SCL 二、代码分析1、申明一个I2c配置结构体数组,用于I2c所有读操作。2、搭建读操作函数 三、…

GitLab 删除或移动项目

首先明说,删除后无法恢复 第一步:找到要删除的项目 第二步:进入目录后,左侧菜单,设置 >>> 通用,拉到最下面找到“高级”,点击右侧“展开” 第三步:点击“展开”后往下拉&a…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 王炸产品 Amazon Q,你的 AI 助手

意料之中 2023年9月25日,亚马逊宣布与 Anthropic 正式展开战略合作,结合双方在更安全的生成式 AI 领域的先进技术和专业知识,加速 Anthropic 未来基础模型的开发,并将其广泛提供给亚马逊云科技的客户使用。 亚马逊云科技开发者社…

Python 实现Excel和CSV之间的相互转换

通过使用Python编程语言,编写脚本来自动化Excel和CSV之间的转换过程,可以批量处理大量文件,定期更新数据,并集成转换过程到自动化工作流程中。本文将介绍如何使用第三方库Spire.XLS for Python 实现: 使用Python将Exc…

ServletConfig对象.

是什么 ServletConfig是javax.servlet.包下的一个接口,ServletConfig它是Servlet的一个配置对象; ServletConfig是由tomcat容器创建,通过init方法传入给Servlet; ServletConfig对象如何获取? 在GenericServlet里面定义了&#x…

根据DCT特征训练CNN

记录一次改代码的挣扎经历: 看了几篇关于DCT频域的深度模型文献,尤其是21年FcaNet:基于DCT 的attention model,咱就是说想试试将我模型的输入改为分组的DCT系数,然后就开始下面的波折了。 第一次尝试&#xf…

【SpringCloud】-OpenFeign实战及源码解析、与Ribbon结合

一、背景介绍 二、正文 OpenFeign是什么? OpenFeign(简称Feign)是一个声明式的Web服务客户端,用于简化服务之间的HTTP通信。与Nacos和Ribbon等组件协同,以支持在微服务体系结构中方便地进行服务间的通信&#xff1b…

互联科技:全域托管云赋能百行百业的数字化转型

在这个数字经济时代,云计算技术为企业提供了更加高效的业务管理机会,百行百业加速上云。对比几种云网方案,目前公有云方案存在可控性低、数据暴露风险、个性化需求难以满足、服务受限等问题;私有云方案存在建设成本高、建设周期长…

TCP服务器的演变过程:IO多路复用机制select实现TCP服务器

IO多路复用机制select实现TCP服务器 一、前言二、新增使用API函数2.1、select()函数2.2、FD_*系列函数 三、实现步骤四、完整代码五、TCP客户端5.1、自己实现一个TCP客户端5.2、Windows下可以使用NetAssist的网络助手工具 小结 一、前言 手把手教你从0开始编写TCP服务器程序&a…

文献研读|Prompt窃取与保护综述

本文介绍与「Prompt窃取与保护」相关的几篇工作。 目录 1. Prompt Stealing Attacks Against Text-to-Image Generation Models(PromptStealer)2. Hard Prompts Made Easy: Gradient-Based Discrete Optimization for Prompt Tuning and Discovery&#…

Linux - 记录问题:怎么通过安装包的方式安装gRPC

适用场景 当docker 构建环境不能链接到github 的时候,就可以使用本地构建的方式 完成对应服务的构建需求。 参考案例 使用本地安装包的方式安装 gRPC 注意: 在Docker构建过程中,某些软件包可能会尝试配置时区,这通常需要交互式…

性能优化,让用户体验更加完美(渲染层面)

前言 上一篇我们已经围绕“网络层面”探索页面性能优化的方案,接下来本篇围绕“浏览器渲染层面”继续开展探索。正文开始前,我们思考如下问题: 浏览器渲染页面会经过哪几个关键环节?“渲染层面”的优化从哪几方面着手&#xff1f…