Mac OS X 应用安装与多线程编程全解析
1. 应用安装基础
在 Mac OS X 系统中,应用安装方式多样。简单的应用安装可通过拖放完成,用户仅需将应用程序包从磁盘映像文件拖动到“应用程序”文件夹即可。卸载时,只需从磁盘中移除应用程序包。同时,Finder 支持“应用程序打包”键,开发者构建应用时可在应用的信息属性列表(Info.plist)中指定这些键及其对应值。用户选择应用并打开 Finder 的“信息”窗口时,“应用程序文件”面板会列出组件,用户能选择安装或卸载哪些组件。
2. 安装程序的使用
并非所有应用都适合简单的拖放安装。有些应用准备执行的要求复杂,或者使用安装程序有显著优势,如:
- 压缩功能,减小安装包体积。
- 安装过程中显示 Read Me 文件,提供必要信息。
- 要求用户在安装前同意许可协议。
- 要求用户以管理员身份进行身份验证。
- 呈现更专业的安装界面。
不过,建议尽可能采用简单的拖放手动安装方式,仅在应用需要在其程序包外部安装项目时使用安装程序。
若决定使用安装程序,不同类型的应用有不同选择:
- Cocoa 或 Java 应用,以及仅在 Mac OS X 上安装的 Carbon 应用,可使用 Mac OS X 的原生安装技术。
- 若 Carbon 应用要同时安装在 Mac OS 9 和 Mac OS X 上,有两种方法:
- 两个平台都使用已移植到 Mac OS X 的第三方安装程序。
- Mac OS X 使用原生安装技术,Mac OS 9 使用第三方安装程序。
Mac OS X 的原生安装程序是 Installer,位于 /Applications/Utilities 中。用户双击安装包时,Installer 会启动,通过一系列面板引导用户完成安装,如身份验证、指定安装位置和自定义安装等,还能显示材料清单和安装日志。
3. 安装包的结构与创建
Mac OS X 上准备好安装的软件原生形式是包,扩展名为 .pkg。它本质是文件夹,但对用户呈现为文件,包含以下组件:
| 文件类型 | 描述 |
| ---- | ---- |
| 材料清单(.bom) | 二进制格式文件,描述包的内容。 |
| 信息文件(.info) | 文本文件,包含创建包时在 Package Maker 应用中输入的信息。 |
| 存档文件(.pax) | 要安装的完整文件集的存档,若压缩则有 .gz 后缀。 |
| 大小计算文件(.sizes) | 文本文件,包含未存档软件的压缩和未压缩大小,便于安装程序计算安装所需空间。 |
| 其他可选资源 | 如图标、Read Me 文件、许可信息、安装前后脚本等,安装时使用但不随软件安装。 |
创建安装包的一般步骤如下:
1. 创建分发目录,将待安装软件复制到其中。例如,构建的框架要安装在 /Library/Frameworks,可创建 ~/dstroot/Library/Frameworks 目录并复制框架。
2. 可选步骤,创建安装资源目录,放入 Read Me 文件、许可协议和安装脚本等。这些文件可以是 .txt、.html 或 .rtf 格式,使用能保存为 Unicode 编码的文本编辑器创建。若 Read Me 文件名为 ReadMe.ext,许可文件名为 License.ext,Installer 会自动识别并处理。
3. 启动 Package Maker 应用,填写其提供的表单。表单的前两个字段“包根目录”和“包资源目录”应指向之前创建的分发目录和资源目录的根路径。
graph LR
A[开始] --> B[创建分发目录]
B --> C[复制软件到分发目录]
C --> D{是否创建资源目录}
D -- 是 --> E[创建资源目录]
D -- 否 --> F[启动 Package Maker]
E --> F
F --> G[填写 Package Maker 表单]
G --> H[完成安装包创建]
4. 系统级资源安装
若捆绑的可执行文件有必须安装在程序包外部的资源,安装程序需处理。例如字体,Apple Type Solution(ATS)系统通过在系统、本地、网络和用户文件系统域的 Library/Fonts 中查找字体来管理。同时,资源可能有使用限制,如许可证限制的字体若仅供单个用户使用,应安装在用户的 ~/Library/Fonts 文件夹,而非 /Library/Fonts 文件夹。
安装程序应了解系统级资源的推荐域位置,将资源安装在适当位置或用户可选择的位置。若位置需要系统管理员权限,安装程序应验证用户身份。Mac OS X 安装技术允许安装可选子包或安装在应用程序包外部位置的子包,使用元包(扩展名为 .mpkg)管理这些子包集合,安装程序会为基于元包的可安装包提供“自定义”按钮。
Mac OS X 应用安装与多线程编程全解析
5. 多环境下的任务与进程
Mac OS X 是高度分层的系统,不同层有等效机制,这可能导致不同技术、API 甚至术语的差异。“任务”和“进程”的概念就是典型例子,不同组件有不同的术语,如 Mach 任务、BSD 进程、Carbon 进程管理器(CPM)进程和多处理服务任务等。
实际上,存在这样的关系:Mach 任务 = BSD 进程 = Carbon 进程管理器进程。Mach 任务是“包含一组线程的容器”,负责管理内存、地址空间和其他与线程执行相关的资源,每个 Mach 任务有 4GB 的虚拟地址空间且受保护。
一个 Carbon 进程管理器(CPM)进程基于一个 BSD 进程,这种分层使 CPM API 得以实现。每个 Carbon、Cocoa 和 Java 应用进程同时也是 Mach 任务、BSD 进程(有自己的进程 ID)和 CPM 进程(有自己的进程序列号)。不过,经典进程是一对一进程模型的例外,在经典环境中运行的应用每个都有自己的 CPM 进程,但这些多个进程基于一个 BSD 进程。
Cocoa 和 Carbon 在其 API 中也使用“任务”这个术语。Cocoa 中的“任务”和“进程”遵循 Mach 和 BSD 的概念,Foundation 框架的 NSTask 类创建的对象与从父进程派生的子进程相关联,是有自己的线程和地址空间的独立可执行实体。多处理服务将其用户级抢占式线程称为“任务”,主要是为了避免与线程管理器的协作线程冲突。
| 类型 | 说明 |
|---|---|
| Mach 任务 | 包含一组线程,管理内存、地址空间等资源,有 4GB 虚拟地址空间且受保护 |
| BSD 进程 | 与 Mach 任务等同,有自己的进程 ID |
| Carbon 进程管理器(CPM)进程 | 基于 BSD 进程,有自己的进程序列号 |
| 多处理服务任务 | 用户级抢占式线程 |
graph LR
A[Mac OS X 系统] --> B[Mach 任务]
A --> C[BSD 进程]
A --> D[Carbon 进程管理器进程]
A --> E[多处理服务任务]
B <--> C
C <--> D
E -.-> D
6. 线程包
线程是进程内的执行上下文,与调用栈和处理器状态相关,与进程的其他线程共享虚拟地址空间和其他任务级资源。线程可以被抢占式调度,在对称多处理环境中可以并发运行,基于内核的线程模型可以使用各种同步机制实现协作式线程行为。
多线程编程能提高程序效率并简化某些任务的编程,但也会使一些事情变得复杂。Mac OS X 为开发者提供了多种多线程编程模型和接口,这些包之间存在依赖关系,部分包基于其他包构建。
| 线程包 | 描述 |
|---|---|
| POSIX 线程 | 内核环境中用于实现抢占式调度线程的包,是行业标准线程模型之一,包含在 System 框架中 |
| 多处理服务 | 用于 Carbon 的抢占式调度线程包,基于 POSIX 线程,是 Core Services 层的一部分 |
| 线程管理器 | 用于 Carbon 的协作式调度线程包,基于 POSIX 线程,是 Core Services 层的一部分 |
| NSThread | Cocoa 应用中用于包装抢占式调度线程的类,基于 POSIX 线程,由 Foundation 框架提供 |
| java.lang.Thread | Java 应用中用于包装抢占式调度线程的类,基于 POSIX 线程 |
graph LR
A[Mach 线程] --> B[POSIX 线程]
B --> C[多处理服务]
B --> D[线程管理器]
B --> E[NSThread]
B --> F[java.lang.Thread]
7. 线程包的使用建议
在可能的情况下,应始终使用客户端 API 而非 Mach API。BSD POSIX 线程包(Pthreads)在 Mach 线程之上构建自己的多线程环境,对线程进行抢占式调度,并保持 Mach 线程和 POSIX 线程的一对一映射。
应用环境的线程包基于 POSIX 线程构建,多处理服务和 NSThread 类提供的线程是抢占式调度的,与底层 POSIX 线程一对一映射;而线程管理器的线程则“多路复用”到单个 POSIX 线程上,只能进行协作式调度。
使用线程包的建议如下:
1. 应用进程启动时会自动获得一个线程。若要实现多线程应用,大多数情况下应使用适合应用环境的线程包,对于 Carbon 应用,还需根据所需线程类型(抢占式或协作式)选择。
2. 若希望源代码与其他操作系统有最大兼容性,应使用 POSIX 线程。例如,许多 BSD 代码使用 POSIX 线程,与 Mac OS X 中的实现兼容。
3. 除特殊情况(如调试器)外,项目应避免创建和管理 Mach 线程。因为 Mach 线程缺乏 POSIX 线程提供的许多基础设施,使用 Mach 线程可能导致后续兼容性问题。
综上所述,Mac OS X 提供了丰富的应用安装和多线程编程机制,开发者需要根据具体需求和场景选择合适的方法和工具,以确保应用的顺利安装和高效运行。
超级会员免费看
84万+

被折叠的 条评论
为什么被折叠?



