参考地址: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/OSX_Technology_Overview/About/About.html#//apple_ref/doc/uid/TP40001067
基于稳定强大的OSX内核以及便利的Cocoa框架,让苹果开发者们能站在巨人的肩膀上高效编程,然而如果仅仅只是局限于API的调用,不了解底层实现和原理,在面对一些问题时候难免会力不从新,当学习的知识达到一定的阶段一定要注重积累,了OSX操作系统,及其运作原理,有助于我们更好的理解iOS开发生态,更快速的学习新的姿势.
OS X整体上苹果分成了四个大的层级
如下图所示,从上至下依次分为了5个层级,越面向底层,越能提供一些定制话的服务,上层框架基本都是基于底层框架封装而来,如
UIKit
框架部分就将一些常用的CoreAnimation
动画进行了封装.-
基本层级介绍:
- Cocoa(Application):从名字上也能看出,它是一个应用层,可以快速的构建应用程序界面,响应用户交互事件,管理App的行为事件。
- Media: 包含播放、录制和编辑视听媒体以及渲染和动画二维和三维图形的专门技术。
Core Services: 包含了很多基础的技术服务,从自动引用技术,底层的网络通信,字符处理,数据格式化封装
Core OS: 定义了硬件和网络相关的编程接口,以及CPU和GPU高性能运算任务,核心操作系统层实现与应用程序安全相关的功能。如
App Sandbox
,Code Signing
Kernel and Device Drivers: 由Mach内核环境,设备驱动程序,BSD库函数(libSystem)和其他低级组件组成,包括了对
文件系统
,网络
,安全
,进程通信
,编程语言
,设备驱动程序
,内核驱动程序
,内核扩展的支持
。
-
可以创建不同种类的应用
- Apps: App应用
- Frameworks and libraries: 动态或者静态库,共享代码
- Command-line tools and daemons: 命令行工具,和守护进程充当客户端请求服务器的进程
- App plug-ins and loadable bundles: 开发扩展其他应用的插件,以及包含应用程序的Bundle,并可以在运行时加载代码和资源。
- System plug-ins: 系统插件,如音频单元、内核扩展、I/O工具包设备驱动程序、首选项窗格、聚光灯导入程序和屏幕保护程序,扩展了系统的功能。
-
在移植Cocoa-Touch应用程序时,需注意API的相似性和差异性
- Cocoa和Cocoa-Touch应用所基于的技术栈有很多相似之处,有些系统框架在每个平台中是相同的,如
CoreData
,AV Foundation
,使得一些基本的数据和底层的API功能容易移植 - 有些变化太大的API则移植起来不太方便,如
AppKit
和UIKit
框架所编写的界面.
- Cocoa和Cocoa-Touch应用所基于的技术栈有很多相似之处,有些系统框架在每个平台中是相同的,如
苹果上层框架基本大都不开源,但底层框架是开源的,可以在Open Source Development Resources找到源代码
创建Mac平台的应用
- 常见的应用: App, AppExtension,Framework,Library
- 其他应用如Plug-ins: 插件是扩展许多应用程序和系统行为的标准方法。插件是一个捆绑包,其代码动态加载到应用程序的运行时中。因为插件是动态加载的,所以用户可以添加和删除插件。
- 常用的插件介绍: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/OSX_Technology_Overview/SoftwareProducts/SoftwareProducts.html#//apple_ref/doc/uid/TP40001067-CH206-TPXREF101
Mac OS X和Device Driver的主要功能
-
XPC Interprocess Communication and Service: XPC是一种进程通信技术,通过权限分离的机制来补充应用的沙盒机制,根据每个应用程序所需要的系统访问资源将应用程序分成多个部分,这种机制叫做XPC服务.
- XPC是通过GCD的调度来实现,当创建XPC连接时,其消息将通过与GCD调度队列关联来实现通信。
- 当应用程序启动时,系统会自动找到它的每个XPC服务注册到应用程序可见的命令空间中,如Location服务,应用程序与它的一个XPC服务建立连接,并向他们发送消息,其中包含服务处理的事件.Creating XPC Services, Daemons and Services Programming Guide.
-
Caching API:
- libcache API是一个低级的可清除的缓存API。主动缓存是最大化应用程序性能的一项重要技术。但是,当缓存需求超过可用内存时,系统必须根据需要释放内存以处理新的请求
- 应用程序还可以通过创建缓存来帮助你,操作系统可以根据内存压力的需要优先清除这些缓存。libcache库和foundationframework的NSCache类可以帮助您创建这些可清除的缓存
In-Kernel Video Capture: I/O视频提供了一个内核级C++编程接口,用于编写视频捕获设备驱动程序。I/O视频取代了QuickTime序列抓取器API,作为将视频导入OS X的一种方式。
-
Mach: 它是操作系统的核心,提供了系统操作的关键功能,CPU使用率和内存,处理机调度,内存保护,并为本地和远程进程通信提供了以消息为中心的通信基础,它具有以下特点
- Protected memory: 内存保护,用户空间和系统内核空间区分,通过两种不同的状态(用户态和核心态)保护系统资源
- Preemptive multitasking: 抢占式多任务处理,合理调度任务,确保系统,应用程序有序高效的运行
- Advanced virtual memory: 维护虚拟内存的地址映射表,控制任务的虚拟地址到物理地址之间的转换,如应用程序的装入内存后的page管理
- Real-time support: 保证对时间敏感的媒体应用程序的处理器资源进行低延迟访问
Device-Driver Support: Darwin为开发设备驱动程序提供了一个面向对象的框架,称为I/okit框架。这个框架促进了OSX驱动程序的创建,并提供了他们需要的大部分基础设施。写在一个受限的C++子集,并被设计成支持一系列设备系列,I/O套件既模块化又可扩展
Network Kernel Extensions: Darwin允许开发者通过创建网络内核扩展(NKEs)向操作系统添加网络功能。NKEs工具允许您创建网络模块甚至整个协议栈,这些模块可以动态加载到内核中并从中卸载。NKEs还可以自动配置协议栈。
-
BSD: 包含了很多POSIX API,高级应用程序也可以使用这些API来实现基本的应用程序功能,
BSD
是OS X
文件系统和网络设施的基础,同时也提供了多种编程接口和服务,包括- 进程模型: 进程ID,PCB
- 基本的安全策略: 如文件权限,用户和组ID
- 线程支持: POSIX线程,TCB
- 网络支持: BSD Socket
-
IPC and Notification Mechanisms:
- File System Events: 当系统文件改变后会触发
FSEvents
- Kernel queues and kernel events: 这些机制允许截获内核级事件,以接收有关套接字、进程、文件系统和系统其他方面的更改的通知。内核队列和事件是操作系统FreeBSD层的一部分,在kqueue和kevent手册页中有描述。
- BSD notifications: 程序可以通过包括Mach端口、信号和文件描述符的机制接收BSD通知。此外,该技术轻量级、高效,并且能够合并通知。
- Sockets and ports: 套接字的端口通信,套接字表示本地或跨网络的两个进程之间通信通道的一端
- Streams: 进程之间的数据流,配合Runloop循环去检测进程之间的数据流,并分发给对应的线程进行处理
- Pipes: 通过一个管道连接父子进程,维持一个固定的缓冲区大小用于发送数据
- Shared memory: 实现进程的内存共享,所有操作系统都具备的功能,实际开发中跨平台数据访问也常用到这一点,比如Flutter中图片资源的访问和传递.如果能通过共享空间则会大大提高图片解码效率,而不用反复的从磁盘读取
- Apple Event:
- File System Events: 当系统文件改变后会触发
内核的基本架构
- 下面
Kernel environment
就是系统内核部分的组成,这里细分为如下几个部分 -
Mach:
- 非类型的进程间通信(IPC)
- 远程过程调用(RPC)
- 对称多道处理的调度程序支持(SMP)
- 支持实时服务,如流媒体
- 虚拟内存支持,物理内存到虚拟内存的映射管理
- 支持寻呼机
模块化体系结构
-
BSD:
- 文件系统: 文件管理,目录索引
- 网络: 不包括底层的硬件部分处理,基于套接字的通信
- UNIX security model:安全策略管理,如用户组权限
- syscall support: 支持系统调用,提供应用程序接口,它暴露了很多POXIS API
- 提供BSD进程模型,用于管理进程资源,信号量控制进程访问
- FreeBSD kernel APIs
- kernel support for pthreads (POSIX threads)
-
Networking
- TCP/IP堆栈和套接字API
- 支持IP和DDP(AppleTalk传输)
- 报文复用和分用
- 多播支持
- 拥塞调整
- 包过滤
Mac OS Classic支持(通过过滤器)
-
I/O Kit
- 真正的即插即用
- 动态设备管理
- 驾驶员动态(“按需”)装载
- 桌面系统和便携式设备的电源管理
- 多处理器功能