13.3.3 正交性

良好的系统设计在于单独的概念可以独立地组合。例如,在C语言中,存在基本的数据类型,包括整数、字符和浮点数,还存在用来组合数据类型的机制,包括数组、结构和联合。这些概念独立地组合,允许拥有整数数组、字符数组、浮点数的结构和联合成员等。实际上,一旦定义了一个新的数据类型,如整数数组,就可以如同一个基本数据类型一样使用它,例如作为一个结构或者一个联合的成员。独立地组合单独的概念的能力称为正交性(orthogonality),它是简单性和完整性原理的直接结果。

正交性概念还以各种各样的伪装出现在操作系统中,Linux的clone系统调用就是一个例子,它创建一个新线程。该调用有一个位图作为参数,它允许单独地共享或复制地址空间、工作目录、文件描述符以及信号。如果复制所有的东西,我们将得到一个进程,就像调用fork一样。如果什么都不复制,则是在当前进程中创建一个新线程。然而,创建共享的中间形式同样也是可以的,而这在传统的UNIX系统中是不可能的。通过分离各种特性并且使它们正交,是可以做到更好地控制自由度的。

正交性的另一个应用是Windows Vista中进程概念与线程概念的分离。进程是一个资源容器,既不多也不少。线程是一个可调度的实体。当把另一个进程的句柄提供给一个进程时,它拥有多少个线程都是没有关系的。当一个线程被调度时,它从属于哪个进程也是没有关系的。这些概念是正交的。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

正交性的最后一个例子来自UNIX。在UNIX中,进程的创建分两步完成:fork和exec。创建新的地址空间与用新的内存映像装载该地址空间是分开的,这就为在两者之间做一些事情提供了可能(例如处理文件描述符)。在Windows Vista中,这两个步骤不能分开,也就是说,创建新的地址空间与填充该地址空间的概念不是正交的。Linux的clone加exec序列是更加正交的,因为存在更细粒度的构造块可以利用。作为一般性的规则,拥有少量能够以很多方式组合的正交元素,将形成小巧、简单和精致的系统。