跳转到内容

Copland (操作系统)

维基百科,自由的百科全书
Copland
开发者苹果公司
操作系统家族麦金塔操作系统
运作状态历史性版本,不支援
源码模式闭源
前一代System 7
后一代Mac OS 8

Copland操作系统苹果公司在1994年至1996年间开发的一款操作系统,专为Macintosh计算机设计,它原本计划以System 8的名称发布,而在苹果的命名规则变化后,计划命名为Mac OS 8,可是该系统最终未能上市。其时,System 7操作系统已经显得老旧,苹果计划以Copland接替System 7。它引入了诸如内存保护、抢占式多任务等新的底层操作系统功能,同时保持与现有Mac应用程序的兼容性。Copland的暂定继任者代号为Gershwin,计划引入更先进的功能,例如应用级多线程处理。

开发工作正式开始于1994年3月。在接下来的几年里,Copland的预览版引起了大量媒体关注,让Mac用户了解到了操作系统的一些新概念,如面向对象、抗崩溃设计和多任务处理。1995年8月,高级副总裁David Nagel在Macworld Expo上宣布,Copland会于1996年中期发布。随后在1996年5月,吉尔·阿梅利奥表示,Copland是公司的主要重点,目标是在年底发布。然而,内部开发工作面临许多问题,由于公司人员和项目管理失调,苹果一再错过开发里程碑和开发者版本发布的预定日期。

这个系统在开发过程中不断引入新特性,并在内部测试版本中表现出严重的不稳定。埃伦·汉考克临危受命,试图将项目带回正轨,然而汉考克很快得出结论,认为该项目永远无法完成。1996年8月,Copland项目宣布取消,苹果公司将从公司外寻觅一个新操作系统。在众多选择中,他们选择了NeXTSTEP,并在1997年收购了NeXT以获得该系统。NeXTSTEP被着手移植到Mac平台上,在这段过渡期内,苹果公司于1997年发布了相对保守的Mac OS 8,将一些来自于Copland的组件融入其中;随后,苹果在1999年发布了Mac OS 9,最终,Mac OS X于2001年成为苹果公司的下一代操作系统。

Copland的开发工作被视作是需求蔓延的一个例子。2008年,《PC World》将Copland列入IT历史上最失败项目的榜单中。

设计

经典Mac OS

要理解Copland的背景,就必须了解经典Mac OS,以及经典Mac OS需要解决的架构问题。

麦金塔和麦金塔操作系统始于1984年,在一开始,它们就是设计给单用户的单任务操作系统,这可以大大简化硬件研发。由于这种单应用模型,最初的Mac开发人员能够利用一些妥协性的简化措施,从而显著提升性能,使其运行速度甚至超过了更昂贵的Lisa。然而,这种设计也导致了未来发展的若干问题。

由于假设系统一次只运行一个程序,工程师们能够忽略可重入性这一概念。可重入性指的是一个程序(或代码库)能够在任何时刻被中断、执行其他任务,然后返回到原始任务中。为了实现可重入性,任何本地数据和状态在另一个程序调用代码时必须被保存下来,而如果不要求可重入性,就不用保存状态。例如,对于QuickDraw来说,这意味着系统可以在库中存储状态信息,如窗口的当前位置或线条样式,因为这些信息只会在当前程序控制下发生变化。更进一步,工程师们将大部分状态留在应用程序内部,而不是存储在QuickDraw中,这样就无需在应用程序和库之间来回复制这些数据。程序可以将这些设定的更改存储到自己的内部存储中,QuickDraw则通过在应用程序中查找已知位置的值来获取这些数据。

这种共享内存的概念是程序错误和崩溃的重要来源。如果一个应用程序向这些共享的区域写入了错误数据,就会导致QuickDraw崩溃,结果便是整台电脑崩溃。同样,QuickDraw中的任何问题都可能导致它覆写应用程序中的数据,从而再次引发崩溃。在单应用程序操作系统的情况下,这并不是一个很大的问题,因为在这种情况下,无论是应用程序还是计算机出现问题,都需要重启。

另外一个主要的问题是早期的Mac没有内存管理单元(MMU),这阻碍了一些基本现代功能的实现。MMU可以提供内存保护,保证程序不会意外覆写其他程序的内存,事先提供的共享内存允许数据被轻易地在库之间传递。由于没有共享内存,API被设计为操作系统和应用程序共享所有内存,这使得QuickDraw能够检查应用程序的内存,以获取诸如线条绘制模式或颜色等设置。

Macintosh缺乏多任务处理能力,但试图伪装成多任务系统,同时它坚持使用复杂的用户界面,但将许多工作留给应用程序去完成。这些都是很严重的缺陷,很难想象有什么优雅的解决方案。

——亚当·布鲁克斯·韦伯,Byte (1986年9月)[1]

这些限制意味着,如果不重写整个系统和应用程序代码,支持多任务功能将十分困难。然而,这样做又会使得操作系统在现有硬件上慢得令人难以忍受。因此,苹果公司在1987年采用了一种名为MultiFinder的系统,它仍然像之前一样,让正在运行的应用程序控制计算机,但允许通过点击窗口快速切换到另一个应用程序。处于后台的程序会定期获得短时间的运行机会,但和之前一样,整个过程仍由应用程序控制,而不是操作系统。

由于操作系统和应用程序都共享一块内存空间,任何一个程序错误都有可能破坏整个操作系统,导致电脑崩溃。在MultiFinder下,任一地方的崩溃都会使得所有正在运行的内存崩溃。多任务运行提高了崩溃的可能性,让系统更加脆弱。

用于给操作系统增加功能的补丁机制则更是令情况雪上加霜。这些机制被称为CDEVs和INITs(或称为控制面板和扩展)。第三方开发者也利用这一机制来增加功能,包括屏幕保护程序和分层Apple菜单。其中一些第三方控制面板几乎变得无处不在,例如流行的After Dark屏幕保护程序包。由于这些补丁的使用没有统一标准,一些附加功能,甚至苹果公司自己对操作系统的扩展都有可能使用相同的补丁并相互干扰,从而导致更多的崩溃。

Copland的设计

Copland在一个名为Nukernel的微内核上运行Mac OS,Nukernel负责处理基本任务,如应用程序启动和内存管理,将所有其他任务交给一系列被称为服务端的半特殊程序。例如,网络和文件服务不会由内核本身提供,而是由服务端提供,这些服务端通过应用程序间通信来发送请求。Copland系统整体由Nukernel、各种服务端和一套应用程序支持库组成,以实现著名的经典Macintosh编程接口。

应用程序服务通过一个官方称为“协作式程序地址空间”(Cooperative Program Address Space)的程序提供。Mac程序在CPAS环境中运行方式类似于System 7,协作式任务也可照常使用非可重入的Toolbox调用。最坏的情况是,CPAS环境中的一个应用程序崩溃时,可能会导致整个环境崩溃。然而,这不会导致整个系统崩溃,CPAS环境会自动重启。

而在编写时就考虑到Copland的新应用程序,可以直接与系统的服务端通信,从而在性能和可扩展性方面获得许多优势。它们还可以与内核直接交互,以启动单独的应用程序或线程,这些应用程序或线程作为独立进程在受保护的内存中运行,就像大多数现代操作系统一样。可是,这些独立运行的应用程序不能使用非可重入调用,例如QuickDraw,也因此无法提供用户界面。苹果建议较大的程序可以将用户界面放入一个普通的Macintosh应用中,然后再在外部启动一个工作线程。


  1. ^ Webber, Adam Brooks. Amiga vs. Macintosh. Byte. Vol. 11 no. 9. September 1986: 249–256.  (Adam Webber was the programmer responsible for porting TrueBASIC to the Amiga and Macintosh)