iOS底层原理系列01-iOS系统架构概览-从硬件到应用层

1. 系统层级结构

iOS系统架构采用分层设计模式,自底向上可分为五个主要层级,每层都有其特定的功能职责和技术组件。这种层级化结构不仅使系统更加模块化,同时也提供了清晰的技术抽象和隔离机制。

在这里插入图片描述

1.1 Darwin层:XNU内核、BSD、驱动

Darwin层是iOS操作系统的基础,也是最接近硬件的层。这一层主要包含以下核心组件:

XNU内核

XNU(X is Not Unix)是iOS和macOS的混合内核,由三个主要部分组成:

  • Mach微内核:负责基础系统服务,如处理器调度、虚拟内存管理和进程间通信
  • BSD层:提供POSIX API、系统调用接口、网络协议栈和文件系统访问
  • IOKit框架:面向对象的设备驱动框架,提供硬件抽象层

XNU内核是一个混合内核实现,将微内核的模块化与宏内核的性能优势相结合,实现了内核资源的高效管理。

BSD子系统

BSD子系统基于FreeBSD实现,提供了UNIX标准兼容层,包括:文件系统操作,网络协议栈,用户权限管理,进程与线程管理API

设备驱动

Darwin层包含设备驱动程序,通过IOKit框架实现硬件控制:电源管理驱,传感器驱动,存储设备驱动,网络设备驱动

1.2 Core OS层:基础服务与系统管理

Core OS层构建于Darwin之上,提供底层系统服务和硬件抽象,包括:

安全服务框架

  • Secure Enclave:安全隔离的协处理器,负责处理指纹、面容ID等生物识别数据
  • Keychain Services:安全存储敏感数据的机制
  • 证书、密钥和信任服务:管理数字证书和加密操作

系统管理框架

  • Accelerate Framework:提供高性能的数学和DSP功能
  • Core Bluetooth:低功耗蓝牙接口
  • External Accessory Framework:与外部硬件配件通信的接口

底层网络服务

  • CFNetwork:基于C语言的网络协议实现
  • Bonjour:零配置网络服务发现
  • 网络扩展框架:VPN和内容过滤功能支持

1.3 Core Services层:底层功能抽象

Core Services层为应用程序提供基础服务抽象,包括:

数据管理服务

  • Core Data:对象图和持久化框架
  • CloudKit:iCloud数据同步框架
  • SQLite:轻量级关系型数据库

位置服务

  • Core Location:地理位置服务框架
  • 地图服务:地图显示和地理编码功能
  • 运动服务:检测用户活动状态

网络与通信服务

  • Foundation网络类:NSURLSession等高级网络API
  • 多点连接:点对点设备通信框架
  • Web服务支持:JSON解析和REST服务交互

1.4 Media层:图形与多媒体处理

Media层负责图形渲染、音频处理和视频处理等多媒体功能:

图形与动画框架

  • Core Animation:动画和组合引擎
  • Metal:低级GPU加速图形API
  • Core Graphics:二维绘图引擎

音频处理

  • Core Audio:低延迟音频处理
  • AVAudioEngine:高级音频处理管线
  • 音频单元:音效和音频处理模块

视频与图像处理

  • AVFoundation:媒体捕获和处理框架
  • Core Image:图像处理和滤镜
  • Core Video:视频处理管线

1.5 Cocoa Touch层:用户交互框架

Cocoa Touch是最上层的应用框架,提供用户界面和应用程序行为支持:

用户界面框架

  • UIKit:UI组件和事件处理
  • SwiftUI:声明式UI框架
  • 视图控制器生命周期管理

应用服务

  • 通知中心:本地和远程通知
  • 应用生命周期管理
  • 后台执行:后台任务和刷新

高级功能框架

  • ARKit:增强现实
  • HealthKit:健康数据
  • HomeKit:智能家居控制

2. 系统启动流程分析

iOS设备的启动过程是一个多阶段流程,从硬件初始化到应用程序启动,每个阶段都有特定的任务和责任。

在这里插入图片描述

2.1 iBoot加载过程

iBoot是iOS设备的二级引导程序,负责系统的早期初始化和安全验证:

启动阶段

iOS设备启动顺序如下:

  • Boot ROM (SecureROM)
    • 硬件只读内存启动程序
    • 执行初始硬件初始化
    • 加载LLB (Low Level Bootloader)
    • 验证LLB的签名
  • LLB (Low Level Bootloader)
    • 初始化更多硬件组件
    • 加载并验证iBoot
  • iBoot
    • 完成设备初始化
    • 执行安全检查和验证
    • 加载内核和设备树
    • 将控制权交给XNU内核

安全启动链

iOS实现了安全启动链,确保只有经过Apple签名的代码才能在设备上运行:

SecureROM → LLB → iBoot → 内核 → 用户空间

每一步都会验证下一阶段的签名,确保代码完整性和来源合法性。

2.2 内核初始化机制

XNU内核是iOS系统的核心,其初始化过程涉及多个关键步骤:

内核加载过程

  1. iBoot加载XNU内核:加载内核到内存,验证内核签名,准备内核执行环境
  2. 基础系统初始化:初始化中断控制器,建立虚拟内存系统,配置内存管理单元(MMU)
  3. 核心子系统初始化:初始化Mach子系统,初始化BSD子系统,启动IOKit设备树构建

内核扩展(kext)

内核扩展是动态加载的驱动程序,扩展内核功能:

kext结构:
├── Info.plist (元数据和依赖信息)
├── MacOS/ (二进制代码)
└── Resources/ (资源文件)

2.3 系统服务启动序列

内核初始化完成后,系统开始启动用户空间服务:

launchd: 系统进程管理器

launchd是iOS的第一个用户空间进程(PID 1),负责启动和管理其他系统服务:

  1. 配置加载:读取启动配置文件
  2. 启动系统守护进程:按顺序启动关键系统服务
  3. 管理服务依赖:确保服务按正确顺序启动
  4. 重启失败服务:监控并重启崩溃的系统服务

关键系统服务

iOS启动过程中初始化多种系统服务:

  • configd:网络配置服务
  • securityd:安全服务守护进程
  • mediaserverd:媒体服务
  • locationd:位置服务
  • mDNSResponder:网络服务发现

用户界面初始化

最后启动SpringBoard(iOS桌面管理器):

  1. 加载主屏幕:显示应用图标和界面
  2. 恢复应用状态:恢复之前运行的应用
  3. 初始化通知中心:准备接收通知
  4. 建立事件处理循环:处理用户交互事件

2.4 应用启动优化技术

iOS应用启动过程分为预热、主阶段和首次渲染几个阶段:

应用启动流程

main() → UIApplicationMain() → 应用初始化 → viewDidLoad() → viewWillAppear() → viewDidAppear()

启动性能优化技术

现代iOS应用采用多种技术优化启动性能:

  1. 静态分析优化

    • 针对二进制大小的优化
    • 无用代码和资源移除
    • 链接器优化
  2. 动态加载优化

    • 懒加载资源
    • 推迟非关键路径初始化
    • 动态库预加载

启动性能测量

使用Instruments和Xcode提供的工具监控和优化启动性能:

  • Pre-main时间:二进制加载到main()函数执行前的时间
  • main到首次渲染:从main()到首个界面显示的时间
  • 交互就绪时间:应用可以响应用户交互的时间点

3. 进程与线程管理机制

iOS的进程和线程管理系统构建在XNU内核之上,提供了多层次的并发抽象。

在这里插入图片描述

3.1 iOS进程模型

iOS采用严格的进程模型,管理系统资源分配和应用生命周期:

进程状态与生命周期

iOS应用进程可以处于以下几种状态:

  • 未运行:应用尚未启动或已被终止
  • 前台活跃:应用在前台运行且接收事件
  • 前台不活跃:应用在前台但不接收事件(如锁屏时)
  • 后台:应用在后台执行任务
  • 挂起:应用在后台但不执行代码,保留在内存中
  • 终止:系统终止进程以释放资源

进程资源限制

iOS对应用进程实施严格的资源限制:

  • 内存限制:不同设备型号有不同的应用内存限制
  • CPU使用限制:防止后台应用消耗过多CPU资源
  • 后台执行时间限制:通常为30秒(特殊情况除外)
  • 存储空间配额:应用可以使用的存储空间限制

进程优先级

iOS根据应用状态分配不同的优先级:

优先级应用状态特点
最高前台活跃获得最多资源,几乎不会被终止
前台不活跃资源分配较高,不易被终止
后台(执行任务)有限资源,可能被挂起
后台(挂起)最少资源,最容易被终止

3.2 线程调度算法

XNU内核负责线程调度,决定何时执行哪个线程:

优先级和QoS

iOS使用QoS(Quality of Service)机制管理线程优先级:

  • User Interactive:用户交互线程,最高优先级
  • User Initiated:用户启动的任务,高优先级
  • Default:默认优先级
  • Utility:长时间运行且不需要立即结果的任务
  • Background:后台任务,最低优先级

调度算法核心机制

XNU内核的调度器基于以下原则:

  1. 优先级驱动:高优先级线程优先执行
  2. 时间片分配:每个线程获得一定的CPU时间片
  3. 上下文切换:当时间片用完或线程阻塞时切换到另一个线程
  4. 负载均衡:在多核系统上分配线程到不同CPU核心

能效管理

iOS设备的调度系统考虑能耗因素:

  • 性能核心与能效核心:根据任务复杂度分配到不同类型的处理器核心
  • CPU频率调整:根据系统负载动态调整CPU频率
  • 空闲状态管理:尽可能让CPU进入低功耗状态

3.3 进程间通信(IPC)技术

iOS提供多种机制实现进程间安全通信:

XPC(跨进程通信)服务

XPC是Apple操作系统(macOS、iOS等)中使用的一种特定的IPC机制,专为Apple平台设计、提供轻量级、安全的进程间通信:

// 创建XPC连接
NSXPCConnection *connection = [[NSXPCConnection alloc] initWithServiceName:@"com.example.service"];
connection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(MyServiceProtocol)];
[connection resume];// 调用远程方法
id<MyServiceProtocol> remoteObject = [connection remoteObjectProxyWithErrorHandler:^(NSError *error) {// 处理连接错误
}];
[remoteObject performTaskWithCompletion:^(id result) {// 处理结果
}];

XPC服务具有进程隔离特性,增强了系统安全性和稳定性。

Mach消息

底层IPC机制,基于消息传递:

  • 端口:通信的基本单元,类似于通信管道
  • 消息:在端口之间传递的数据包
  • 权限:严格的发送/接收权限控制

其他IPC机制

iOS还支持其他IPC方法:

  • Apple分布式通知:基于Darwin通知中心
  • App Groups:同一开发者的应用之间共享数据
  • URL Schemes:应用间通过URL调用
  • 剪贴板:通过系统剪贴板共享数据
  • 文件共享:通过共享容器目录交换文件

3.4 GCD(Grand Central Dispatch)

GCD是 Apple 开发的一种低级 API,是iOS并发编程的核心技术。

核心特点

GCD由以下核心组件组成:

  • 任务抽象:GCD 使用"任务"(也称为闭包或块)作为工作单元
  • 队列系统:任务被提交到队列中进行执行,队列可以是串行或并行的
  • 自动线程管理:GCD 维护一个全局线程池,根据系统负载自动调整线程数量
  • QoS(服务质量):允许开发者指定任务的优先级和重要性

GCD工作原理

GCD工作流程如下:

  1. 任务提交:将任务(块)提交到队列
  2. 队列管理:队列存储并管理任务
  3. 调度决策:GCD决定何时执行任务
  4. 线程分配:从线程池分配一个线程执行任务
  5. 任务执行:线程执行任务代码
  6. 线程回收:任务完成后线程返回池中

示例代码:

// 串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serial", DISPATCH_QUEUE_SERIAL);// 并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrent", DISPATCH_QUEUE_CONCURRENT);// 同步执行
dispatch_sync(serialQueue, ^{// 在当前线程上执行,会阻塞当前线程NSLog(@"同步执行任务");
});// 异步执行
dispatch_async(concurrentQueue, ^{// 在另一个线程上执行,不阻塞当前线程NSLog(@"异步执行任务");
});// 获取高优先级队列
dispatch_queue_t userInteractiveQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);// 延迟执行
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC);
dispatch_after(delay, dispatch_get_main_queue(), ^{NSLog(@"延迟2秒后执行");
});// 任务组
dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, concurrentQueue, ^{// 任务1
});dispatch_group_async(group, concurrentQueue, ^{// 任务2
});dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"所有任务完成");
});

总结

iOS系统架构是一个精心设计的分层体系,从底层Darwin到用户交互的Cocoa Touch层,每一层都有其明确的职责和功能。系统启动过程涉及多个阶段,从安全启动链到应用初始化,确保了系统的安全性和高效运行。iOS的进程和线程管理机制则提供了强大的并发处理能力,通过严格的资源管理和先进的调度算法,在保证用户体验的同时优化设备能耗。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu从源代码编译安装QT

1. 下载源码 wget https://download.qt.io/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz tar xf qt-everywhere-src-5.15.2.tar.xz cd qt-everywhere-src-5.15.22. 安装依赖库 sudo apt update sudo apt install build-essential libgl1-mesa-d…

深度学习基础:线性代数本质4——矩阵乘法

两个矩阵相乘的意义就是复合变换 1. 复合变换 例如先进行旋转变换再进行剪切变换&#xff0c;这很明显是两个变换&#xff0c;但是从总体上看可以看作是一个复合变换&#xff0c;是旋转和剪切作用的总和。 和其他线性变换一样&#xff0c;我们也可以通过记录变换后的 i j 来实…

前端技巧第五期JavaScript函数

函数定义 1. 传统定义方式 // 1. 函数声明&#xff08;存在提升&#xff09;function sum(a, b) { return a b;} // 2. 函数表达式const multiply function(a, b) { return a * b;}; // 3. 构造函数&#xff08;不推荐&#xff09;const div new Function(a, b, return …

钉钉(excel)能让表格中不是‘北京’的字符串自动加亮显示(方便查看)以及隔行填充严颜色是斑马色(方便查看)嘛

在钉钉在线表格中&#xff0c;虽然功能相对Excel有所简化&#xff0c;但仍然可以通过条件格式实现对特定内容的高亮显示。以下是具体步骤&#xff1a; 一、在钉钉在线表格中设置条件格式 1. 打开钉钉在线表格 登录钉钉&#xff0c;进入“钉钉在线表格”应用。 打开你需要操作…

王者荣耀道具页面爬虫(json格式数据)

首先这个和英雄页面是不一样的&#xff0c;英雄页面的图片链接是直接放在源代码里面的&#xff0c;直接就可以请求到&#xff0c;但是这个源代码里面是没有的 虽然在检查页面能够搜索到&#xff0c;但是应该是动态加载的&#xff0c;源码中搜不到该链接 然后就去看看是不是某…

基于Python+SQLite实现(Web)验室设备管理系统

实验室设备管理系统 应用背景 为方便实验室进行设备管理&#xff0c;某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录&#xff0c;查看现有的所有设备&#xff0c; 增加设备等功能。 开发环境 Mac OSPyCharm IDEPython3Flask&#xff…

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…

基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别

【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目&#xff0c;以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别&#xff08;应该还有好多种其他方式是我不知道的&#xff0c;主要应该就是要知道关键的流程步骤&#xff…

UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法

有些差异 这么牛逼的引擎&#xff0c;居然有这种入门级别的问题&#xff0c;一触发清理&#xff0c;大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题&#xff0c;挺烦人的 实在忍不了了&#xff0c;这次&#xff0c;今天 就想问问有什么好的处理方法么&#xff1f;&#x…

学习 springboot -Bean 管理(注册条件)

前言 上一篇 博客 :学习springboot-Bean管理&#xff08;Bean 注册&#xff0c;Bean 扫描&#xff09;-CSDN博客我们了解了 bean 注册需要使用到 Bean 和Import 将第三方jar 包的对象 注入到ioc 容器 如下图所示 通过图片&#xff0c;可以看到Country 对象和Province 对象已…

【云原生技术】编排与容器的技术演进之路

一、编排与容器的技术演进之路 1.1 DockerClient 此时 K8s 只是编排领域的一个选择&#xff0c;而 Docker 此时一家独大&#xff0c;所以 K8s 的客户端只 是作为 Docker 的客户端来调用 Docker 引擎来完成服务。 1.2 RUNC&Shim OCI催生 runcrunc&#xff0c;剥离 Docke…

安卓投屏到mac操作

1. 安装 brew install scrcpy2. 打开手机usb调试 3. 安装 brew install android-platform-tools 4. 重启终端&#xff0c;运行命令 adb devices scrcpy 参考&#xff1a;https://zhuanlan.zhihu.com/p/682491037https://zhuanlan.zhihu.com/p/682491037

c#知识点补充

1.静态类无法被继承 2.线程join方法的使用 作用就是让多个线程&#xff0c;按顺序执行 3.线程里lock的作用 保证每次只执行一次 4.线程池的使用

3分钟复现 Manus 超强开源项目 OpenManus

文章目录 前言什么是 OpenManus构建方式环境准备克隆代码仓库安装依赖配置 LLM API运行 OpenManus 效果演示总结个人简介 前言 近期人工智能领域迎来了一位备受瞩目的新星——Manus。Manus 能够独立执行复杂的现实任务&#xff0c;无需人工干预。由于限制原因大部分人无法体验…

电路原理(电容 集成电路NE555)

电容 1.特性&#xff1a;充放电&#xff0c;隔直流&#xff0c;通交流 2.电容是通过聚集正负电荷来存储电能的 3.电容充放电过程可等效为导通回路 4.多电容并联可以把容量叠加&#xff0c;但是多电容串联就不会&#xff0c;只会叠加电容的耐压值。 6.电容充放电时相当于通路&a…

【redis】hash基本命令和内部编码

文章目录 表示形式命令HSET 和 HGET HEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSETNXHINCRBYHINCRBYFLOAT命令小结内部编码 表示形式 Redis 自身已经是键值对结构了 Redis 自身的键值对就是通过哈希的方式来组织的 把 key 这一层组织完成之后&#xff0c;到了 value 这一层&…

学习路之TP6 --重写vendor目录下的文件(新建命令)

[TOC](学习路之TP6 --重写vendor目录下的文件(新建命令)) 一、新建命令文件 php think make:command CustomWorker二、修改 复制vendor\topthink\think-worker\src\command\Server.php 内容到app\command\CustomWorker.php 修改继承类&#xff1a;class CustomWorker exten…

Python----数据可视化(Pyecharts三:绘图二:涟漪散点图,K线图,漏斗图,雷达图,词云图,地图,柱状图折线图组合,时间线轮廓图)

1、涟漪特效散点图 from pyecharts.globals import SymbolType from pyecharts.charts import EffectScatter from pyecharts.faker import Faker from pyecharts import options as opts from pyecharts.globals import ThemeType # 绘制图表 es (EffectScatter(init_optsop…

Linux内核网络层分析

网络访问层仍受到传输介质的性质以及相关适配器的设备驱动程序的影响很大。网络层与网络适配器的硬件性质几乎完全分离。为什么说几乎&#xff1f;因为该层不仅负责发送和接收数据&#xff0c;还负责在彼此不直接连接的系统之间转发和路由分组。查找最佳路由并选择适当的网络设…

OpenHarmony子系统开发 - Rust编译构建指导

OpenHarmony子系统开发 - Rust编译构建指导 一、Rust模块配置规则和指导 概述 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C…