免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6976 | 回复: 4
打印 上一主题 下一主题

苹果开发人员技术文档连载之-系统架构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-26 17:10 |只看该作者 |倒序浏览
在对Mac OS X设计时的一个关键性考虑是:需要把不同的一组技术集成到一起(其中某些技术在发展历史上有着很大的差异),并将这套统一整合后的技术建立在一个高级内核环境的基础上。本章针对使上述设计构想成为可能的系统架构,进行了概括性的探究。

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

  ·应用程序环境 包含了五种应用程序(或执行)环境:Carbon、Cocoa、Java、Classic和BSD命令行。对于开发者来说,前三种环境是最重要的。Mac OS X提供了为这五种环境所设计的开发工具和运行时环境。
  ·应用服务 包含了那些与图形用户界面有关的系统服务,它们对所有的应用程序环境开放。应用服务层包括Quartz、QuickDraw、OpenGL和一些基础的系统管理器。
  ·核心服务 包含了那些与图形用户界面无关的系统服务。它包括Core Foundation、Open Transport和Carbon的某些核心部分。
  ·内核环境 为Mac OS X提供基础层。它主要由Mach和BSD组成,但它同时也包括了网络协议栈、网络服务、文件系统和设备驱动程序。内核环境为开发设备驱动(I/OKit)和可装载内核扩展提供了工具,其中的可装载内核扩展包括了网络内核扩展(Network Kernel Extensions , NKE)。

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

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


分层透视图

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

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

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

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

在图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方式的)。

  ·BSD命令环境提供了一个可以在命令行上执行BSD程序的外壳。标准的BSD工具、脚本以及自定义或第三方程序在该环境上都有效。该图显示了BSD命令环境与内核环境层之间有着直接的联系。注意,您可以在命令行上运行建立在非BSD环境中的程序,例如基于Cocoa Foundation框架上的程序。
  ·内核环境通过usr/lib中的系统库把BSD服务输出给系统的高层(头文件在/usr/include内)。BSD命令对开发者也是有用的;然而,在某些已安装的Mac OS X中,可能没有包含BSD命令。这是因为BSD命令环境是一个特殊的可选择的环境,在这篇文档中并不做更深入的描述。

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

  ·Carbon是为Mac OS X设计的,并能适应Mac OS 9的API和库。它保留了大部分先前的 API(70%的函数)以及包括一些专门为Mac OS X开发的API和服务。
  ·Cocoa是一组先进的面向对象的API集合。可以用Java和Objective-C来开发Cocoa应用程序。
  ·Java环境是用于开发和部署100%纯Java及混合API 的Java应用程序和applet的。

系统软件的各个层可直接支持Carbon、Cocoa和Java环境,这些层为所有应用程序环境提供服务。这些层以宽度递减的方式堆加,应用程序代码可以访问较低位置的层,而无需中间层的介入。

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

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

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

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

  ·抢占式多任务处理
  ·具有内存保护和和动态内存分配的高级虚拟内存
  ·对称多处理(SMP)
  ·多用户访问
  ·基于VFS的文件系统(虚拟文件系统)
  ·设备驱动程序
  ·网络
  ·基本的线程包

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

  ·Mach 提供了对任务、线程、端口、虚拟地址、内存管理和任务间通信的基本抽象概念和具体实现。Mach也是操作系统的一部分,用于管理处理器的使用,控制时序安排及强制内存保护。另外,它为操作系统的其他部分提供了计时服务、同步基本单元和以消息为中心的底层构造。
  ·BSD BSD的4.4版本用于支持Mach的抢占式多任务处理、内存保护、动态内存分配和对称多处理。在Mac OS X中,BSD构成网络和文件系统的基础。它所提供或支持的一些其他方面的特性,包括:进程的生成与管理、信号处理、系统启动与关闭、一般输入/输出设备的操作、基本文件的操作,以及对终端和其它设备的处理。它也能实现用户和组的身份识别技术,以及对文件和其他资源进行访问限制的相关功能。BSD提供了许多POSIX API。
  ·设备驱动程序和I/O Kit 在Mac OS X中,设备驱动程序由I/O Kit生成。I/OKit是一种提供面向对象编程模型(基于限制性的C++形式)以改善设备驱动程序开发效率的框架。I/O Kit已经考虑到了潜在的操作系统特性,例如:虚拟内存、内存保护和抢占权,因此减轻了程序员对编写驱动程序的额外负担。内核环境包括有许多现成的设备驱动程序。(参见“系统技术”一章)
  ·网络 内核环境实现了许多的本地网络协议以及功能,该内容在“系统技术”一章的“网络与互联网”里有详细介绍。作为网络内核扩展(NKE),实现了一些Mac OSX的网络功能和协议栈。并且可以在不进行重新编译和重新连接的情况下动态地对内核的网络底层结构进行扩展。
  ·文件系统 内核环境支持许多不同类型的文件系统和卷格式,包括Mac OS扩展文件系统(HFS+)、Mac OS标准文件系统(HFS)、UFS、NFS和ISO 9660 CD-ROM。Mac OS扩展文件系统是默认的文件系统,且Mac OS X通常由其引导,并将其作为"根"(即内核使用在一个HFS+卷上的文件系统作为首先装载的文件系统)。通过使用虚拟文件系统(VFS)底层构造,开发者可以编写内核扩展以增加对其他文件系统的更多支持。有关对支持格式的概述,参见“系统技术”一章中的“文件系统”。

正如在“系统技术”一章中的“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中的虚拟内存系统还引入了许多寻址模式方面的变化。

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

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

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

必需替换的管理器
以前
现在的对比:
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(时间管理器)  


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

推荐替换的管理器
以前
现在的对比

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提供了可用于获取和设置字段数据的accessor函数,也包括了能用于创建和解除数据结构的一些函数。
  ·预定义过程 (Definition procedures) 在Carbon中,视窗管理器、菜单管理器、控制管理器和列表管理器仍然允许用户创建和使用标准的和自定义的预定义过程(WDEF、MDEF、CDEF和LDEF),但您必须确保把它们编译为PowerPC代码。另外,这些管理器为预定义过程的创建与打包提供了新的规则。
  ·68K代码 Mac OS X不支持68K代码(除了在Classic环境下)。由于这个原因,陷阱管理器(和trap table)、混合模式管理器和Patch管理器在Carbon中都不能使用,或者在很大程度上限制了对它们的使用。基于同样的原因,许多其它功能也从Cabon中被去除了。

Carbon管理器或者由Carbon API所创建的各种守护进程、应用程序和框架都是MacOS X的常用部件。举例来说,在Mac OS X中,控制事件和管理应用程序进程的系统进程是由Carbon管理器来实现的,核心服务层的许多管理器也是基于Carbon的,而且Finder也是一个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框架的类可归为以下几种类别:

  ·用于基本编程类型和操作的对象包装(或“助手(helper)”),包括:字符串、数组、字典、数字、字节交换、解析和异常处理等。
  ·用于内核环境实体和服务的对象包装,例如任务、端口、运行循环、计时器、线程和锁。
  ·对象相关功能,尤其是内存管理(自动释放缓冲区),远程调用、存档和串行化。
  ·文件系统和I/O功能,包括了URL处理、文件查找和代码以及本地化资源的动态装载。
  ·其他服务,例如分布式通知、取消(和重做)、格式化数据、使用系统日期和时间。

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

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

  ·它有着对事件处理、应用程序管理与文档管理的成熟机制。
  ·它提供了对色彩、字体和打印进行管理与整合的应用方式(甚至提供了针对这些功能的对话框)。
  ·它允许以许多不同的图形格式来合成图像,还为绘画、矢量图处理提供了框架。
  ·它具有针对拼写检查、拖拽和复制粘贴等操作所提供的工具。

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

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


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编译器(javac)和Java调试器(jdb)以及其它工具,包括:javap、javadoc和appletviewer等。这个"命令行"环境需要一个BSD shell,例如它可以由苹果的终端应用程序来提供。苹果还提供了Project Builder应用程序,作为这个环境的前端开发工具,而且第三方也可以使用他们自己的前端开发工具。命令行工具位于JavaVM.framework/Commands子目录下,并提供符号连接来将其连接到目录/usr/bin中。
  ·运行时环境由Sun公司的高性能Hotspot Java虚拟机、“just-in-time”(JIT)字节码编译器和基本的Java包所组成。Java虚拟机位于/System/Library/Frameworks/JavaVM.framework/Libraries目录下。这些基础包包括 ava.lang、java.util、java.io和java.net;它们都在同一框架下的Classes目录中的classes.jar归档文件中。
  ·一个应用程序框架含有为建立一个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归档文件中。


比较起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中。)

2.gif (5.38 KB, 下载次数: 11)

图2 Java 环境的体系结构

图2 Java 环境的体系结构

1.gif (6.38 KB, 下载次数: 11)

图1 Mac OS X的层结构

图1 Mac OS X的层结构

论坛徽章:
0
2 [报告]
发表于 2004-07-26 17:33 |只看该作者

苹果开发人员技术文档连载之-系统架构

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

  ·渲染二维图像的QuickDraw
  ·既可以渲染二维图像也可以渲染三维图像的OpenGL
  ·表现数字视频流和其他多媒体的QuickTime

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)。


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。

用于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的优点,包括如下:

  ·打印系统使用Quartz 2D进行渲染和转换服务。Quartz 2D支持具有独立分辨率的PDF绘画模型,允许应用程序在所有级别的光栅和PostScript打印机上的进行高品质和经过颜色管理的打印件输出。
  ·漂浮对话框允许同时打开多个打印对话框,并向一个打印机队列中发送多个打印作业。
  ·打印对话框可以由打印对话框扩展来定制。页面设置对话框可以由应用程序开发人员来扩展,同时打印机供应商及应用程序开发人员都可以扩展打印对话框。
  ·打印机模块代替了打印机驱动程序。打印机模块要比打印机驱动程序更易于编写,因为驱动程序中的大量代码现在已经为您预先编写好了,它们被存放在苹果公司所提供的I/O模块和打印系统的一些其它部分中。
  ·打印应用程序编程接口(API)包含对Carbon应用程序的强健支持。Carbon开发人员可以编写一个能在Mac OS X中运行的应用程序,同时它也能在Mac OS 8和9中运行。Cocoa开发人员通过使用Cocoa对象和方法来支持打印功能。Cocoa方法调用了Carbon打印管理器API.

这个全新打印系统在设计上的一个关键之处在于它对Carbon应用程序的强健支持。由于Mac OS X中的Carbon打印管理器与Mac OS 8和9中的打印管理器一样被很好的支持,所以正如预期的那样,Carbon应用程序能够在两种环境中执行相同的打印任务。举个例子来说,当运行Mac OS 8或Mac OS 9时,应用程序使用传统的用户界面和驱动程序;而在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模块,组成打印系统服务器的后端,它从本地客户端接受打印作业并把它们交给目标打印机。


·Carbon框架 实现了可供应用程序使用的Carbon打印管理器API。用于显示打印和页面设置对话框,从应用程序取得绘画信息,并把打印数据传递给打印服务器。
  ·应用服务框架 包含用于Carbon、Cocoa和BSD UNIX应用程序的通用打印功能。这一框架不实现任何打印对话框界面,但这些界面会在Carbon框架中得到实现。
  ·打印对话框扩展(PDE) 通过它对打印或页面设置进行扩展,并让第三方添加用户界面元素来支持特定的打印机。PDE与打印机模块或Carbon应用程序相对应,它对由PDE提供的用户设置进行解释和应用。
  ·打印中心 允许用户查找和选择打印机,也可以控制和获取打印作业的状态信息。
  ·打印机浏览模块(PBM) 通过添加对其它打印连接方式(例如SCSI和FireWire)的UI支持,扩充了打印中心的功能。PBM与I/O模块相对应,该模块实现了对传送类型的支持。
  ·打印服务器 处理从应用程序中发出的打印作业队列。对打印中心的请求进行响应,处理或返回队列中的打印作业的状态信息。
  ·打印作业管理器 管理着那些能把单个打印作业转换成最终打印输出的不同进程。打印作业管理器宿主于打印模块和I/O模块。
  ·转换器 一个可选模块,通过转换打印作业的数据格式,来协助打印作业管理器。举例来说,一个转换器可以把PDF转换成光栅格式。
  ·打印模块 用于格式化打印机数据(例如:PostScript或PCL),处理打印机状态和错误状况。打印机模块一般由打印机供应商提供,以支持一台或一系列特定的打印机。
  ·I/O模块 为一种传输类型实现一个标准接口。苹果公司为NetInfo、USB、TCP/IP和AppleTalk提供了I/O模块。第三方也可以创建支持其他传输类型的模块。
  ·作业券(Job ticket) 包含所有控制打印作业所必需要的参数。由应用服务框架中的打印功能来控制作业券的创建。在打印过程的每一个步骤中,特定组件会更新作业券的状态。


打印机搜索


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

在打印机搜索过程中,打印中心列举出所有安装在/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的自然演进,应用服务层的组成结构也将会随时间的过去而有所变化。学习其当前所包含的内容,



进程管理器

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事件给应用程序。



剪贴板

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以及读写每个用户和每台机器的预置参数。

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管理器,并为所有应用程序环境提供低级服务。这些服务包括协作和抢占线程、资源管理、内存管理和文件系统操作。

核心服务层中的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的应用程序中。


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可以代表客户端来跟踪它所分配的资源。在这种情形中,客户端是一个应用程序或共享库,而资源则是像终端、计时任务和内存块那样的对象。


追踪用户事件

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

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

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

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

  ·Carbon Carbon具有几种供应用程序来处理事件的机制。主要的机制是使用EventRefs,这种隐含的低级事件结构。EventRefs的处理程序被安装在用户界面对象上(包括人性化接口工具箱的默认对象),这些处理程序自动接收全部或部分指定到这些对象上的事件。处理程序可以忽略事件、处理事件或把它传递给外围容器内的下一个处理程序。事件处理使用DefProc消息,并且可以使用函数回调。

  ·Cocoa 在Cocoa中,事件作为NSEvent对象被打包。该对象被送到能负责对一个应用进程进行全面管理的应用程序对象中。应用程序对象把NSEvent对象转发给事件发生所在窗口的第一响应程序(first-responder)视图。通过顺次响应程序(next-responder)机制,如果事件没有被处理的话,事件对象将在窗口视图中被逐级传送,直到它到达应用程序对象自身。如果事件与一个用户界面控件所关联,它的典型处理方式是通过一个称为“目标动作(target-action)”的机制来进行的。

  ·Java 在Java中事件处理是通过java.awt.Event和java.awt.Component类来实现的。

论坛徽章:
0
3 [报告]
发表于 2004-08-17 19:59 |只看该作者

苹果开发人员技术文档连载之-系统架构

又有好文章了,谢谢AKi

论坛徽章:
0
4 [报告]
发表于 2004-09-03 11:39 |只看该作者

苹果开发人员技术文档连载之-系统架构

怎么没有续篇了?

论坛徽章:
0
5 [报告]
发表于 2004-10-14 17:44 |只看该作者

苹果开发人员技术文档连载之-系统架构

胜利就是坚持到最后的你!              涛
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP