系统架构


在对Mac OS X设计时的一个关键性考虑是:需要把不同的一组技术集成到一起(其中某些技术在发展历史上有着很大的差异),并将这套统一整合后的技术建立在一个高级内核环境的基础上。本章针对使上述设计构想成为可能的系统架构,进行了概括性的探究。

Mac OS X架构的主要特点是系统软件和接口的分层结构,其中一层依赖于它的下一层。Mac OS X有四个截然不同的系统软件层(按照从属关系区分):

核心服务层、应用服务层以及Carbon、Cocoa应用程序环境在包罗框架中被打包(在 “包罗框架”一章中有详细介绍)。内核环境的许多公共API可以在位于/usr/include文件夹中的头文件中找到。

作为前面几段的总结,在本章的第一部分从系统软件分层的角度阐述了Mac OS X的架构思想。接下来的静态透视图则可以动态得来呈现系统内部对用户事件的整个处理过程。当用户通过输入设备,如鼠标或键盘,进行操作时,就在Mac OS X中产生了一个典型的事件。设备驱动程序通过I/O Kit产生一个低级事件,并把这个事件放入视窗服务器的事件队列中,同时通知视窗服务器。视窗服务器把事件传递给目标进程的特定运行循环端口。在那里事件被Carbon事件管理器接收并转发给相应的应用程序环境下的事件处理机制。事件也可以是异步传输的,例如一个包含有配置信息的网络数据包。

 

分层透视图


分析复杂软件的一种通用方式就是把软件的各个部分分解成不同的“层”。直观地看来,一层位于另一层之上,最基础的层位于最底端。这种视图暗示了软件层与层之间的一般接口与依赖关系。软件中位置越高的层就越接近于实际的应用程序代码,其下又紧紧依赖于其他层的支持,层层累加,高层依赖于低层。

Mac OS X可以简述为这样一种透视图。图3-1描述了Mac OS X系统软件的一般结构,以及库、框架和服务之间的相互依赖关系。

图 3-1 Mac OS X的层结构

尽管该图对于理清整个架构体系的思路有所帮助,但免不了有对架构内容的阐述过于简化之嫌。不同的应用程序所使用的Mac OS X服务和子系统,以及它们被使用的方式,可能会有很大差别。因此不同标准下的依赖关系与接口可以视程序对程序的个别需要和具体情况而定。

把警告先放在一边,让我们对这张图所描述的层进行深入了解。

在图3-1中,最上面的一排方块表示了Mac OS X的不同应用程序(或执行)环境。有五种这样的环境。其中,Classic环境和BSD命令环境与系统底层之间进行交互的方式是非常独特的:

Classic“兼容性”环境是指用户在该环境下可以运行Mac OS 8 或 Mac OS 9应用程序。在这张图中,Classic环境不再是位于应用服务之上,而是用线与其他各层相连。这些连接表明Classic环境是以“硬布线方式连入Mac OS X的;它不是一种为开发人员在Mac OS X上提供特定代码编译的环境。换句话说,该环境在Mac OS X系统上没有公共的可被编译的Mac OS 8或Mac OS 9 API(非Carbon方式的)。关于Classic环境的更多资料参见“安装与整合”一章中的“Classic环境和您的应用程序”。

对Mac OS X开发者而言Carbon、Cocoa和Java是三个主要的应用程序环境:

系统软件的各个层可直接支持Carbon、Cocoa和Java环境,这些层为所有应用程序环境提供服务。这些层以宽度递减的方式堆加,应用程序代码可以访问较低位置的层,而无需中间层的介入。(然而,关于包罗框架外部连接的警告,请参见“包罗框架”一章中的“子框架连接限制”

这些层的第一层是应用服务层。它包含了Mac OS X的图形和视窗环境,主要由Quartz和QuickDraw来实现。这个环境负责处理屏幕渲染、打印、事件处理、低级别的视窗和指针管理。并且它也包含了用来实现图形用户界面的库、框架和后台服务器。详情参见“图形和视窗环境”以及“其他应用服务”。

QuickTime是对操作系统的一种扩展,它在结构上跨越了系统软件的不同层。它是一个交互的多媒体环境,QuickTime具备了针对图形环境和应用程序环境的一致特点和功能性。图3-1显示QuickTime跨越了应用服务层和应用程序环境层。在执行时,QuickTime需要一个主应用程序环境(或浏览器),但由QuickTime所提供的具有独特性和成熟性的多媒体构件通常只存在于应用程序环境中。

应用服务层位于核心服务层之上。在核心服务层中,通常的服务与图形用户界面没有直接的联系。在这里您会发现一些跨环境执行的与编程相关的基本抽象概念,例如:字符串、运行循环和集合。在核心服务中,也有用来管理进程、线程、资源、虚拟内存和用来与文件系统进行交互的API。“核心服务”讨论了软件系统的这一层。

内核环境是系统软件中最低的一个阶层,正好位于核心服务层的下面。内核环境为它上面的层提供了重要的操作系统功能,例如:

它是一个高性能和高度模块化的内核,可以支持设备驱动程序的动态装载、网络扩展和文件系统。内核环境由五个主要部件构成:

正如在“系统技术”一章中的“Darwin和开放源码开发”里所说,内核环境是Darwin(苹果的开放源码技术)的一个子集。Darwin包含了Mac OS X内核环境、BSD命令和BSD命令环境中的基本库。关于Mac OS X内核环境和它与Darwin关系的更多内容参见“Inside Mac OS X: Kernel Programming(内核编程)”。

Mac OS X的内核环境、核心服务和应用程序服务层作为包罗框架被打包。它的两个主要应用程序环境Carbon和Cocoa也作为包罗框架被打包。关于该主题的更多内容参见“包罗框架”。

 

应用程序环境


一个应用程序环境是由框架、库和服务(和相关的API)来组成的。它为使用这些相关API所开发的程序在运行时的执行,提供了必要的环境支持。应用程序环境依赖于系统软件的所有基础层。

Mac OS X目前有五个应用程序环境:Classic、BSD命令、Carbon、Cocoa和Java。本节将对Carbon、Cocoa和Java进行概述。

 

Carbon

Carbon是一套源于早期的Mac OS API的编程接口,并已被修改以获得对Mac OS X的支持,尤其是支持Mac OS X的内核环境。Carbon继承了大部分Mac OS已有的管理器和API,特别是继承了全部函数的70%,及典型应用程序所经常使用函数的95%。

由于Carbon API非常庞大和复杂,所以我们无法在这里对它进行充分详尽的描述。但尽管如此,Carbon和它的Mac OS祖辈之间的一些区别还是值得注意的。

内存 为了适应内核环境的某些特性,例如高级虚拟内存和内存保护,许多API,尤其是内存管理器(Memory Manager),都经过了一些改进,限制和取消了API对系统内存或临时内存等区域的使用。举例来说,在Mac OS X中分配的临时内存也被分配在应用程序地址空间中。尽管不再有访问系统堆栈的功能,但新提供的规则被允许分配共享内存和永久内存。另外,Mac OS X中的虚拟内存系统还引入了许多寻址模式方面的变化。(关于这一主题的更多内容参见“Inside Mac OS X: Kernel Programming(内核编程)”)。

硬件接口 常用于硬件低级访问的Mac OS 9管理器,例如,ADB管理器、设备管理器和以太网驱动程序,没有在Mac OS X中实现。由I/O Kit提供的不同的设备驱动程序架构来协调所有对硬件设备的低级访问。

资源 因为在Mac OS X中没有ROM,所以访问在ROM中的资源的相关功能在Carbon中是不被支持的。资源管理器也对资源映射访问设置了更严格的约束。

必需替换的管理器 表3-1所列的Carbon技术现在已取代了先前的技术,使用新的库是必需的。

表 3-1 必需替换的管理器

以前
现在
AppleTalk Manager
(AppleTalk 管理器)
Open Transport
(开放传输)
PPC Toolbox
(PPC 工具箱)
Apple events
(Apple 事件)
Standard File Package
(标准文件包)
Navigation Services
(浏览服务)
QuickDraw 3D OpenGL
Help Manager
(帮助管理器)
Carbon Help Manager
(Carbon 帮助管理器)

Apple Guide
(Apple 手册)

Apple Help
(苹果帮助)

Printing Manager
(打印管理器)

Carbon Printing Manager
(Carbon 打印管理器)
各种驱动管理器 I/O Kit (输入/输出工具箱)
QuickDraw GX Quartz 和 Apple Type Services for Unicode Imaging
(针对Unicode的Apple字体打印服务)
Vertical Retrace Manager
(垂直回描管理器)
Time Manager
(时间管理器)

 

推荐替换的管理器 表3-2所列的Carbon技术比先前的技术提供了更多的强大功能。推荐使用新的Carbon库,但也可继续使用先前的技术。

表 3-2推荐替换的管理器

以前
现在
TextEdit

Multilingual Text Engine (多语言文本引擎)

QuickDraw

Quartz

Event Manager
(事件管理器)

Carbon Event Manager
(Carbon 事件管理器)

Font Manager
(字体管理器)

Apple Type Services for Fonts
(Apple字体打印服务)

QuickDraw Text
(QuickDraw 文本)

Multilingual Text Engine (多语言文本引擎) 或 Apple Type Services for Unicode Imaging(针对Unicode的Apple字体打印服务)

Resource Manager
(资源管理器)

Interface Builder Services
(Interface Builder 服务)

Script Manager
(语系管理器)

Unicode Utilities
(Unicode 工具)

普通变化 Carbon中,多种管理器中的许多功能已经被改变或删除。(具体内容参见“Carbon 规范”

Carbon管理器或者由Carbon API所创建的各种守护进程、应用程序和框架都是Mac OS X的常用部件。举例来说,在Mac OS X中,控制事件和管理应用程序进程的系统进程是由Carbon管理器来实现的,核心服务层的许多管理器也是基于Carbon的(参见“核心服务”),而且Finder也是一个Carbon应用程序。

关于Carbon的更多信息,请查阅Carbon文档网站

http://developer.apple.com/techpubs/Carbon/carbon.html。详细内容可参考“Inside Carbon: Carbon Porting Guide(Carbon 移植手册)”,其中包含了有关向Mac OS X应用程序模型转换代码的详细信息。同时“Carbon Specification(Carbon 描述)”给出了在Carbon中所被支持的各种管理器和函数的详细介绍。

 

Cocoa

Cocoa应用程序环境基于两个面向对象框架:Foundation 基本框架(Foundation.framework)与 Application Kit 应用程序工具箱框架(AppKit.framework)。这些框架都提供了面向Java和Objective-C的API(其中大部分的Java类只是简单地“桥接”了他的Objective-C实现)。

对与核心服务层和应用服务层的各自关系来说,Foundation 与 Application Kit在某些方面有着相似之处。Foundation框架中的类提供了不对用户界面产生影响的对象和功能;Foundation框架直接基于Core Foundation。而 Application Kit 中的类提供了所有能够影响用户界面上所呈现内容的对象和动作,例如:窗口和按钮、对鼠标和键盘的响应。 Application Kit 直接依赖于Foundation框架。

Foundation框架的类可归为以下几种类别:

正如所期待的一样,许多Application Kit类被设计成用于创建和管理显示在图形用户界面上的对象。在这些类中,包括了窗口、对话框、按钮、图表、文本框、滚动条、弹出式菜单、滚动图、应用程序(下拉)菜单,甚至是用于QuickTime流的电影播放界面。

然而,Application Kit所拥有的特性与功能使得它远比作为一个用户界面对象的类集合更为有用。

其他的 Cocoa 框架还能用于支持脚本、网络管理和其他用途。

Cocoa包罗框架(Cocoa.framework)中引入了Foundation框架和Application Kit框架。如果您正在编写一个应用程序,可以连接Cocoa框架。而如果您正在编写一个没有图形用户界面的Cocoa程序(例如:后台服务器),那么您至少需要连接Foundation框架。

关于Cocoa的更多信息,请查阅Cocoa文档网站

http://developer.apple.com/techpubs/macosx/Cocoa/CocoaTopics.html。

 

Java

Java应用程序环境允许您在Mac OS X上开发和执行Java程序,包括100%的纯Java应用程序和applets。该环境由一个统一的工业化标准所实现--那就是包括了Java虚拟机(VM)在内的最新版本的Java开发工具(JDK)。因为这个原因,在该环境下生成的Java应用程序是可移植的。您可以把它复制到一个硬件完全不同,操作系统也不同的机器上,只要该系统具有兼容的Java 虚拟机,您的应用程序就可以在该系统上运行。另外,Java applet可以在任何性能合适的互联网浏览器中运行。

注意:Cocoa应用程序环境中包含了适应Application Kit和Foundation框架的Java包。这些包允许您使用Java作为开发语言来开发Cocoa应用程序。(出于某种原因)您可以混合使用这些包里的API和本机Java API(不包括AWT或Swing API)。关于Cocoa应用程序环境的更多内容,参见“Cocoa”。另外,苹果公司的Jdirect和Sun公司的JNI(Java Native Interface)编程界面允许您的Java程序调用其他框架,包括Carbon。并且您可以使用QuickTime for Javala来为Mac OS和Windows平台编写多媒体Java应用程序。

Mac OS X内的Java应用程序环境有三个主要的构件:

这些包中较为重要的是java.awt和javax.swing,通常它们被称为AWT(Abstract Windowing Toolkit) 和Swing。AWT包实现了标准的用户界面组件(例如:按钮和文本框)、基本绘图组件、布局管理器和事件处理机制。Swing包则极大的扩展了这套用户界面组件。这些组件能自动呈现出符合其宿主平台的外观风格(look and feel)。Swing在基于当前版本的AWT组件集的基础上扩充了一组高级组件,例如目录视图、列表框和分页框。AWT和Swing的包位于JavaVM.framework/Classes/classes.jar中的jar归档文件中。

图 3-2 显示了一个更为详尽的 Java 环境视图

图 3-2 Java 环境的体系结构

比较起Carbon和Cocoa环境,Java虚拟机连同最基本的Java包(java.lang、java.util和java.io)等同于系统软件中的核心服务层。它们从内核环境中获得资源以实现低级别的服务(例如:进程管理、线程和输入/输出),而不必访问系统软件中的核心服务层(Open Transport,Core Foundation,等等)。

Mac OS X中Java的所有其它部分被分层置于虚拟机和基本Java包之上。如果一个Java程序不具用户界面(或者说它是一个工具或应用服务器),那么它仅仅只需要使用这些基本的Java包。但是100%的纯Java应用程序或applet(根据定义,applet具有图形用户界面)必须使用AWT或Swing,这两者均与系统软件应用服务层中的许多框架和库绑定在一起。Swing自身也被分层置于AWT包的原始部分之上。AWT和Swing在结构上等同于面向GUI的工具箱或框架,例如Carbon的人性化接口工具箱(Human Interface Toolbox)或Cocoa的Application Kit。

如同任何一个Carbon或Cocoa应用程序一样,Java应用程序也可以是能双击执行的束(double-clickable bundle),您可以使用MRJAppBuilder工具软件来绑定Java应用程序。另外,用户也可以在命令行环境中运行Java程序,或者通过系统exec调用和Java Runtime.exec 方法来执行Java应用程序。对于后一种情况,所启动Java程序的进程名会被显示成用于启动可执行Java程序的工具,即:java,或针对applet的appletviewer (例如,在Process Viewer中察看)。

 

图形和视窗环境


Mac OS X的抢占式应用服务是对图形和视窗环境的一种补充。从它的本质来说,应用程序必须通过图形用户界面来显示它的视窗,并允许用户来使用它的控件。图形和视窗环境“无偿”提供给应用程序这些基本能力,以减轻它们在自己的环境中实现这些功能的负担。除了对屏幕上所显示的视窗进行文本和图像渲染(以及文本和图形打印),该环境也提供了重要的低级别功能,例如:初始事件路由以及指针管理。

在Mac OS X中,图形和视窗环境的核心部分称为Quartz。正如图3-3中所描述的那样,Quartz有两个部分:Quartz 2D和Quartz Compositor。(Quartz Extreme层被整合到Quartz Compositor中。)

图3-3 Quartz和图形视窗环境

Quartz的Quartz 2D部分是提供图形渲染服务的图形库之一。它是为展现二维文本和图形所设计的。图形和多媒体库包括

QuickTime是一种交互式多媒体环境,具有图形环境和应用程序环境上的功能和特性。尽管考虑到它在Mac OS X架构中所处的混合状态,但是在这一节中,作为简单的概括,我们仍将把它看作为是与Quartz 2D、QuickDraw和OpenGL地位同等的图形库。

所有的渲染库都直接依赖于Quartz的另外部分,即Quartz Compositor层。然而,QuickTime和OpenGL却几乎不依赖于Quartz Compositor层,因为它们有它们自己的某种特定视窗实现机制。

Quartz Compositor由Mac OS X视窗服务器和由它所实现的(当前私有的)系统编程接口(SPI)来组成。视窗服务器对显示和窗口全面负责,其中包括它们的合成、配置和基本管理。同时,它也执行低级别的指针管理和事件路由。

很大程度上Quartz是在核心图形框架(CoreGraphics.framework)中实现的。如图3-4所示,这一框架中的动态共享库,包含客户端API和服务器SPI,其中服务器SPI是由视窗服务器自身实现的。应用程序或应用程序环境与Quartz 2D库的客户方相链接,这些库用于渲染屏幕、生成PDF和其它服务。所有对服务器SPI的访问都是由客户端API来转交的。

在某种程度上,Cocoa环境和Java环境为访问Quartz 2D和其它渲染库提供了它们自己的编程接口。您既可以使用Cocoa和Java接口,也可以使用在应用服务层上的编程接口。

这一节的余下部分所讨论的是,在图形和视窗环境下的Quartz所扮演的角色。关于QuickDraw、QuickTime和OpenGL的概念内容请参考相关的Apple开发文档(developer.apple.com)。

图3-4 核心图形框架

 

Quartz Compositor

Mac OS X的Quartz Compositor层由视窗服务器和由视窗服务器所实现的(私有的)系统编程接口(SPI)所组成。这一层负责对初始屏幕显示、视窗合成与管理、事件路由和指针管理进行响应。

视窗服务器是一个单独的系统范围内的进程,用于协调低级别的视窗动作,并强制保持在屏幕上所显示视窗的基本一致性。它是一个轻量级的服务器,因为它自己不能进行渲染,但可以与位于其上层的客户图形库进行通讯。从绘画模型方面来说,它是“不会发表意见的”。

视窗服务器与其它系统服务和库几乎没有依赖关系。它依赖于内核环境中的I/O Kit(尤其是,用I/O Kit构建的设备驱动程序),为的是与框架缓冲器、输入设备的底层结构和输入输出设备进行通讯。它也与核心服务的某些框架相链接,以获取进程管理服务,如基本进程的激活。

视窗服务器的一个首要职责是视窗合成。当视窗在被绘制、被重画、覆盖和被覆盖时,由它来合成每一个应用程序的视窗像素。每个视窗都被描述成一幅位图,它包括了半透明(alpha通道)和抗锯齿信息。位图作为缓冲器允许视窗服务器去“记住” 一个应用程序的视窗内容,并在不干涉应用程序的情况下将它进行再合成。然而,视窗服务器(Quartz Compositor)没有记忆那些被图形库(例如Quartz 2D)用来创建视窗和其它图象的矢量信息。取而代之的是,位图被应用程序和视窗服务器所共享,应用程序直接对共享位图进行绘画操作,并相应地由视窗服务器来合成该位图。

在它的Quartz Compositor组件中,Quartz以一个分层式的合成引擎来作为视窗系统的模型。传统的视窗系统使用"交换"模型,在这个模型中屏幕上的每一个像素完全属于一个视窗(或桌面)。因为这种模型,转变就必然很突然;举个例子来说,当您关闭一个视窗时,它会立刻消失。在另一方面,一个分层式合成视窗系统基于“图像(视频)混合”模型。在这个模型上,屏幕中的每一个像素都能够被视窗和视窗间实时共享(尤其是在半透明和抗锯齿特性上)。这种模型允许平滑地在图形用户界面的状态间进行转换,这是Aqua体验所带来的与众不同的特性之一。

对于视窗服务器在事件操作中的角色,参阅“追踪用户事件”

 

Quartz 2D

Quartz的Quartz 2D是一个具有矢量特性的图形库。它的API允许您通过指定一系列命令和数学程式来生成文本与图像。这些命令和程式用来在二维空间内绘制线段,几何形状,颜色,阴影,半透明效果和其它图形属性,而您无需为每一个特定像素指定属性。作为结果,一个几何形状可有效地以一系列路径和属性的方式来定义,而不是以位图的方式来定义。

通过使用矢量,Quartz 2D也能使用一种坐标系来作为绘画的参照,比方说这种坐标系是以英寸或厘米为单位的,而不是基于像素栅格。这种坐标体系很灵活,允许不同的度量标准,并且当它不与任何一个屏幕分辨率绑定时,它具有一定程度的显示独立性。它还使用了浮点坐标。优先于Quartz Compositor的合成,Quartz 2D把以坐标系来表现的矢量图像信息转化为像素值。

Quartz 2D API是设备独立的,这意味着,绘画操作的最终目的文件可以是窗口位图,也可以是可移植文档格式(PDF)文件、PostScript文件或其它输出格式。当使用QuickDraw或其它输入机制来显示PDF文件时,应用程序可以直接或间接地调用Quartz 2D API。

图3-5 Quartz 2D的输入和输出

用于Quartz 2D的主要输入方式是由QuickDraw和本机C API所生成的绘画命令和程式。(将来,更多的前端API可能会被支持)使用QuickDraw的应用程序可以通过CGContextRef接口来调用Quartz 2D,从而获得它的功能。而QuickDraw使应用程序可以由GrafPort接口来得到CGContextRef。

来自QuickDraw或本机API的命令和程式被即刻转换为所需的输出格式,这些输出格式既可以是屏幕渲染的位图数据、PostScript(PostScript打印机的打印数据格式),也可以是其它类型打印机的光栅数据。打印预览时,还可以自动发布PDF。将来,更多的后端转换器可能会被支持,例如:绘图仪。

正如前一段所提出的,Quartz 2D是Mac OS X打印系统的底层引擎。打印工作常常被分成二个步骤。Quartz 2D用于解释那些由本机C或QuickDraw API所构建的文本和图形,并将它们保存为PDF格式(主要的脱机打印格式)。这时,PDF可再次通过Quartz 2D,将其转换为适当的输出格式。

 

打印系统


Mac OS X打印系统为Macintosh开发人员提供了一个灵活而强大的全新打印环境。这种体系结构有利于应用程序开发人员在他们的程序中更好地提供对打印功能的支持,同时也有利于打印机供应商编写驱动程序和扩展打印对话框。Mac OS X的打印系统有着许多优于Mac OS 8和9的优点,包括如下:

这个全新打印系统在设计上的一个关键之处在于它对Carbon应用程序的强健支持。由于Mac OS X中的Carbon打印管理器与Mac OS 8和9中的打印管理器一样被很好的支持,所以正如预期的那样,Carbon应用程序能够在两种环境中执行相同的打印任务。举个例子来说,当运行Mac OS 8或Mac OS 9时,应用程序使用传统的用户界面和驱动程序;而在Mac OS X中,应用程序将自动利用到新打印系统中更为一致、灵活的打印对话框和打印架构。有关打印的更多信息参见“Inside Mac OS X: About the Mac OS X Printing System(关于Mac OS X打印系统)”。

 

打印系统的用户界面

Mac OS X打印系统的用户界面为执行打印相关任务提供了一个一致和易于使用的环境。这些 打印相关任务包括:查找本地和网络打印机,配置新打印机,选择打印机和管理打印作业。新打印系统的人性化接口允许用户处理简单的日常打印任务,和复杂的、多文档的、多打印机的打印作业。

打印系统的用户界面由以下部分组成:

相对于Mac OS 8和9的打印模型来说,在易用性和稳定性方面,新打印系统的接口包含了许多重要的改进。在处置打印机时,以前的Chooser(选配器)容易让用户混淆了大部分的公共资源,现在Chooser被Print Center(打印中心)所替代。打印中心结合了许多Chooser和桌面打印的功能特性,组成为一个独立的集成化接口。与Chooser不同,打印中心是一个独立于Finder的单一应用程序,它不再需要用Finder来支持打印接口,并简化了代码,提高了系统稳定性。针对所有的打印机,页面设置和打印对话框被充分标准化。而且,新打印系统允许通过第三方定制来方便地进行打印功能扩展。

 

打印架构概要

Mac OS X打印价构由9个模块组成。从概念上来说,这些模块可以被分为客户端模块和服务器模块。应用服务框架和Carbon框架组成客户端模块,为应用程序提供绘画和打印API。打印中心和可选的打印机浏览器模块在打印循环中处理客户响应。余下的5个模块,打印模块服务器、打印作业管理器、转换器、打印模块和I/O模块,组成打印系统服务器的后端,它从本地客户端接受打印作业并把它们交给目标打印机。打印模块和它们之间的关系如图3-6。

图3-6 Mac OS X打印系统

在此,对图3-6进行简单说明。

 

打印机搜索

在用户选择打印机之前,打印中心必须首先列出有效的打印机。通过打印中心查找可用打印机的过程被称为“打印机搜索”。

在打印机搜索过程中,打印中心列举出所有安装在/System/Library/Printers和/Library/Printers目录中的I/O模块和打印机浏览器模块。打印服务器把从打印浏览器模块中得到的对不同连接类型的字符串描述传递给打印中心,打印中心则把这些字符串显示在关于连接类型的弹出式菜单中。

当用户选择一个连接类型时,打印中心列出所有安装在/System/Library/Printers和/Library/Printers目录中的打印模块,并询问每个打印机模块是否支持用户所选择的连接类型。如果支持的话,打印中心会从中查找信息。在搜索被支持连接类型的打印机时,打印机浏览器模块使用此信息作为搜索标准,并且在屏幕上显示这些信息。

当用户点击某个打印机,以把它添加到打印机列表中时,打印中心从打印机浏览器模块中得到该打印机的地址、图标和打印机模块信息。接着,打印中心使用此信息来生成一个新的打印队列,并将该打印机添加到列表中。

 

打印过程

一个应用程序把关于一个打印作业的信息存储在一个或多个打印对象中。打印对象包含了关于打印作业的信息,例如纸张大小和纸张来源,并且用于给打印服务器传送信息。打印系统提供了对默认的打印对象进行访问的功能,并可由应用程序对该打印对象进行修改。页面设置和打印对话框使用打印对象来获取对当前打印作业的用户设置。

在用户需要打印时,应用程序会显示页面设置和打印对话框。应用程序使用了Carbon框架中的函数以显示这些对话框。Carbon应用程序能够利用打印对话框扩展(PDF)来扩展对话框。打印对话框扩展让Carbon应用程序可以定义一些可选项目,用于指定应用程序的绘画环境,例如自定义页面布局。

当用户关闭打印对话框时,应用程序服务器框架从应用程序处接收绘画命令(QuickDraw、Core Graphics或一个 PDF文件),并把它们放入脱机文件。应用程序把脱机文件连同打印对象一起传递给打印系统。在获得应用程序数据之前,打印系统生成作业券以管理打印作业的设置和状态,然后把作业券连同脱机文件一起传送给打印服务器。打印服务器再把数据传送给打印作业管理器,由它对余下的打印过程进行管理。在把作业传送给打印服务器之前,应用程序已经完成了在整个打印过程中它所应负责的那部分工作。所有与打印作业有关的错误都会被异步传送回打印中心,以反馈给用户。

打印作业管理器首先查阅作业券以确定目标打印机,并询问目标打印机的相关打印模块,以找出它所要求的数据格式。如果有需要,打印作业管理器使用转换器来把所导入数据转换为目的打印模块所能接受的数据格式。接着,打印作业管理器把数据传送给打印模块,打印模块负责把所导入数据转换成打印机将用于渲染数据的原始命令。最后打印作业管理器从打印模块接收到打印机专有数据,并利用适合打印机连接类型的I/O模块把数据发送给打印机。

 

其他应用服务


应用服务层中的其它系统服务,通过提供能影响图形用户界面的各种对象和动作,来支持所有的应用程序环境。这一节将探讨这些服务的突出特点。由于Mac OS X的自然演进,应用服务层的组成结构也将会随时间的过去而有所变化。学习其当前所包含的内容,请查看应用服务包罗框架(ApplicationServices.framework)中的各个子框架。

 

进程管理器

Mac OS X中,由进程管理器来管理所有的进程。它对共享资源的访问进行控制,管理应用程序的调度和执行,并允许多个应用程序共享CPU时间和其它资源。当用户双击一个应用程序或一个文档图标时,Finder使用进程管理器来启动应用程序。进程管理器也提供了许多机制,允许您控制进程的执行,启动进程并获得有关进程的信息。

对于进程管理器的相关内容参见“多样性环境下的问题和可选项”一章中的“任务和进程”。

 

Carbon事件管理器

Carbon事件管理器把事件分配给合适的事件处理器,这种分配是基于事件类型和目标应用程序环境的。视窗服务器把它接收到的事件放到目标应用程序进程的运行循环端口中。Carbon事件管理器从端口获得事件,把它打包成合适的形式,并把它传递给应用程序(可以是 Carbon、Cocoa和Java)事件处理结构的最低层“容器”。要实现这一点,Carbon事件管理器需要经常确定哪个窗口是当前的活动窗口,在窗口上是否有键盘输入的焦点,等等。

更多关于Mac OS X事件处理的介绍,参见“追踪用户事件”。

 

Apple 事件

Apple事件是一种高级事件,应用程序可以把它发送到本地或者远程计算机上的其它应用程序中,甚至可以发送给它们自己。Apple事件是Mac OS X中应用程序间通讯的主要机制。应用程序主要用它们来对其它应用程序的服务和信息发出请求,或者对这些请求提供响应。

系统级的脚本语言AppleScript,作为一项相关的技术同样也是Mac OS X的一部分。用户可以使用AppleScript发送Apple事件给应用程序。

关于Apple事件的更深入探讨,参见“多环境下的问题与选择”一章中的“内部进程通讯”

 

剪贴板

Mac OS X中的剪贴板(也被称为“粘贴板”)是一种后台服务程序,它允许在应用程序间转移数据。在某些方面它与Mac OS 9中的剪贴板相似,但也有一些不同的地方。Mac OS X中的剪贴板可以对同一数据保留多种表现形式。它被所有正在执行的应用程序所共享使用,剪贴板中包含了用户进行剪切或复制的数据。当一个应用程序要把数据传送给另一个应用程序时,剪贴板同样也能帮助实现这一功能。剪贴板用于复制-剪切-粘贴操作,并在拖拽操作中作为一种数据传送机制。同时它也被服务用于在应用程序间的数据传送。

 

核心服务(Core Services)


核心服务层包含了那些与图形用户界面无关的系统服务。该层包括Core Foundation、Carbon Core、CFNetwork 、Web服务和Open Transport。核心服务层主要由两个框架构成--核心服务包罗框架(CoreServices.framework)和核心基础框架(CoreFoundation.framework)。这一节讲的是在这些框架中比较突出的技术;对于其它技术(如:核心安全服务)不进行探讨。

 

核心基础(Core Foundation)

Core Foundation是一种提供底层软件服务的框架(CoreFoundation.framework),所提供的这些底层软件服务不论对应用服务、应用程序环境还是对应用程序本身都是十分有用的。使用Core Foundation所带来的一个好处就是:提高了在不同环境和层中的框架、库和应用程序之间共享代码和数据的性能。Core Foundation也能够通过Unicode字符串来容易地实现国际化,并提供了用于实现操作系统独立性的抽象概念。

在Core Foundation中需要使用隐含类型,您可以用这些类型来创建“对象”,每一个对象都有它自己的独立标识和值(或一系列值)。在创建这些对象时,Core Foundation为内存分配提供了特定工具。并且,它还具备了一些通用基本类型和多态函数,用以实现类型间操作。

Core Foundation包括了与一些编程实体相符合的隐含类型,这些编程实体如字符串、数组、代码字典、日期、整数和树。它还具备了一种用于插件的标准体系结构,以及一种用于动态查找、装载代码和位置相关资源的机制(和一套与其相对应的API)。另外,它所拥有的服务能够通过URL访问本地和远程资源,设立分布式通知中心,读写XML属性列表,解析XML以及读写每个用户和每台机器的预置参数。

表3-3 列出了Core Foundation的服务和它的相关隐含类型

表3-3 Core Foundation 的服务

服务
类型
描述
基本服务
Base Services
CFAllocator, 基本类型 定义了在整个Core Foundation API中被使用的基本类型和多态函数。
束服务
Bundle Services
CFBundle 提供了一种极好的方法,用来组织、定位程序中不同类型的资源,包括:图像,声音,本地化字符串,和可执行代码。
集合服务
Collection Services
CFArray, CFDictionary, CFTree, CFSet, CFBag 提供了对于常用数据结构连同相关功能的一种高级抽象,这些数据结构包括:数组、字典(关系数组或向量)和树。
通知服务
Notification Services
CFNotificationCenter 一种实现分布式通知的机制,它允许一个进程发送消息(通知)给同一台机器上的另外一个进程。
插件服务
Plug-in Services
CFPlugIn 为Mac OS X应用程序(和Mac OS 9应用程序)提供了一种标准插件体系结构。
预置服务
Preferences Services
CFPreference 允许程序保存和获取用户的预置参数。参见“软件配置”一章中的“预置系统”。
属性列表服务
Property List Services
  提供了一种把数据组织成某种形式的方法,这种组织形式具有高度的结构化,可传递,可存储,和易于访问的特点,并能保持尽可能的高效。属性列表API允许基本数据类型的分层组织结构与标准XML之间的相互转换。
运行循环服务
Run Loop Services
CFSocket, CFRunLoop (and related) 提供了低级事件处理和分派服务。
字符串服务
String Services
CFString, CFCharacter- Set 提供了一整套快速高效的字符串处理和转换功能。字符串服务提供了对Unicode的完全支持,因此大大简化了国际化的过程。它同样也增强了字符串数据在Carbon和Cocoa应用程序之间的共享。
URL服务
URL Services
CFURL CFURLAccess 允许程序通过URL来访问储存在本地或远程的资源。
实用工具服务
Utility Services
CFDate, CFTimeZone, CFNumber, CFUUID, CFByteOrder 提供了各种杂项服务,例如:日期和时间的计算和显示,数字的“对象” 封装,字节交换和UUID的生成。
XML解析器
XML Parser
CFXMLParser 为读取和分析XML文档的数据提供了一个XML解析器。

 

Carbon核心(Carbon Core)

Carbon 核心是CoreServices.framework的一部分,包括许多Carbon管理器,并为所有应用程序环境提供低级服务。这些服务包括协作和抢占线程、资源管理、内存管理和文件系统操作。

表3-4 核心服务层中的Carbon管理器

管理器
描述
替身管理器
Alias Manager
使用替身来帮助定位指定的文件、目录或者卷。提供了创建和解析文件系统替身记录的规则。
集合管理器
Collection Manager
提供了一种存储信息集合的抽象数据类型。
组件管理器
Component Manager
使得您的应用程序在运行时能够找到并使用不同的软件对象(组件)。同时允许创建和管理组件。
日期,时间和度量单位工具
Date, Time, and Measurement Utilities
允许应用程序获取和处理日期时间、地理位置、时区和度量单位。
文件管理器
File Manager
赋予了程序访问储存在物理卷(包括硬盘,CD,和Zip碟)上的文件的能力。它能适应HFS+(Mac OS Extended)、HFS(Mac OS Standard)、UFS、NFS和其它被支持的文件格式。文件管理器能用于创建,打开,更新,保存和关闭文件;搜索特定的文件或目录;获取有关文件或目录的信息;和执行其它与文件有关的高级操作。文件管理器也支持Unicode,并且它的API是线程安全的。
文件夹管理器
Folder Manager
允许程序搜索和创建文件夹,并且控制文件在文件夹之间的移动。它新增了对域的支持。
内存管理工具
Memory Management Utilities
提供了一些实用的专用程序,用来检测或控制内存环境的某些方面。
内存管理器
Memory Manager
在应用程序的受保护地址空间内控制内存的动态分配。它包含了用来分配共享内存和永久内存的新规则,以及与Mac OS X中虚拟内存相关的各项功能。
多进程服务
Multiprocessing Services
使程序能够创建和管理单独的抢占式时序线程。另外,它还包含了同步服务和原子指令。
资源管理器
Resource Manager
为新建、删除、打开、读取、修改、写入和获取资源文件的有关信息提供了一些程序。它包括了对基于数据分支的资源的支持。
文本编码转换管理器
Text Encoding Conversion Manager
提供了两个工具--文本编码转换器和Unicode转换器,应用程序可以用它们来实现文本转换。
文本工具
Text Utilities
提供了一整套工具用来实现对文本的不同操作,含概了从字符串排序到单词边界查找的各种操作。
线程管理器
Thread Manager
允许程序创建和管理协同式时序线程。
时间管理器
Time Manager
赋予程序以一种方法,用于在指定时间定时执行程序(可以是只执行一次,也可以是重复多次)。这种执行时间相关任务的机制是与硬件相独立的。
Unicode 工具
Unicode Utilities
Performs various operations on Unicode text, including Unicode key translation.实现对Unicode文本的多种操作,包括Unicode key 翻译。

 

CFNetwork

CFNetwork是CoreServices.framework的一部分,是用于用户级联网和通讯的首选API。CFNetwork提供了一套用于生成、串行化、非串行化和管理协议消息的函数。这些协议消息可以在客户端和服务器间进行常规的交换。CFNetwork使得您不必为了要交换协议消息而去学习和实现一个协议的具体细节。

CFNetwork的设计支持很多协议,包括:HTTP、SMTP、LDAP和FTP。CFNetwork的当前实现提供了处理http消息的功能。

 

Web服务

Web服务是CoreServices.framework的一部分,允许您调用互联网或本地企业内部网上的远程程序。Web服务使用如 SOAP(Simple Object Access Protocol,简单对象访问协议)和XML-RPC的标准协议,通过HTTP传递服务请求。这些标准协议允许在其它完全不同的计算平台之间进行通讯,也允许创建分布式服务。Web服务核心框架定义了一组API,用来发送请求给使用那些协议的远程服务器和处理有关响应。

应用程序开发人员也可以把Web服务机能结合到他们使用了Apple Event管理器和AppleScript的应用程序中。更多信息参见“Inside Mac OS X: Making XML-RPC and SOAP Requests With AppleScript(用 AppleScript 来创建 XML-RPC 和 SOAP 请求)”。

 

Open Transport

Open Transport是CoreServices.framework中的Carbon兼容性API,它提供了对传统联网和通讯技术的支持。Open Transport使应用程序能够同时使用更多的网络系统(例如:AppleTalk与网络打印机进行通讯,TCP/IP连接到互联网)。有了Open Transport,用户就可以保存和修改不同的网络配置,也可以方便地在它们之间进行切换。

Mac OS X中的Open Transport版本支持Mac OS 8和Mac OS 9中那些普遍被使用的接口。例如,它支持IP协议的Open Transport终端规则。尽管如此,它不包括面向连接并基于事务的终端特性(这将只影响到AppleTalk协议的用户,例如ASP)。而且它既不支持本地XTI(X/Open Transport接口)接口也不支持BSD流的接口。

来自于Open Transport早期版本的一个重要变化是为许多功能附加了客户端上下文参数。每一个Open Transport客户端现在都拥有它自己的上下文,以使得Open Transport可以代表客户端来跟踪它所分配的资源。在这种情形中,客户端是一个应用程序或共享库,而资源则是像终端、计时任务和内存块那样的对象。

 

追踪用户事件


图3-1给出了Mac OS X系统软件层的结构关系,充分说明了系统各部分的通用接口和依赖关系。但它没有充分传达出操作系统的本质,换句话来说,就是Mac OS X是如何典型“工作”的。为了解Mac OS X的这张静态视图,可以用追踪在系统中运行的假定用户事件来作为一个切入点。

从鼠标点击到该事件在合适的应用程序环境里被合适的函数或方法来处理,追踪用户事件的轨迹贯穿了系统的不同层,通过函数请求引发了一个假定的事件链,作为结果,如可以在屏幕上绘制一个新对象(如,对话框)。

图 3-7 描述了一些环境和子系统,用以生成、重新打包和转发用户事件到目的地。

图 3-7 控制Mac OS X用户事件

当设备驱动程序所控制的输入设备(例如:鼠标或键盘)探测到一个用户动作时,会触发一个低级事件。在Mac OS X中,由构成所有设备驱动程序基础的I/O Kit来创建事件,并把它们放入视窗服务器的事件队列中(对视窗服务器的探讨参见“Quartz Compositor”)。这个队列被放置在由I/O Kit和视窗服务器所共享使用的内存块中。一旦I/O Kit把一个事件放入队列中,它就通过Mach进程间通讯机制(IPC)通知视窗服务器。

这时,视窗服务器把事件从队列中取出,并查询当前打开窗口的数据库。视窗服务器再把事件发送到隶属于一个特定进程的运行循环的事件端口中,而该特定进程拥有事件发生所在窗口的所有权。Carbon事件管理器从运行循环端口获得事件,以合适的形式把事件打包,发送给特定的应用程序环境下的该进程的事件处理机制。这种机制确保了事件可由所点击控件(或按键)的相关函数和方法来进行处理。

事件处理机制对于每个应用程序环境都是不同的:

关于在Carbon和Cocoa之间如何处理事件的更多信息,参见“nside Mac OS X: Integrating Carbon and Cocoa in Your Application(在您的应用程序中集成Carbon和Cocoa)”。

 

[ 返回 ]