1. 这四个名称,其实不完全是同一类概念
谈到操作系统时,我们经常会同时听到 Windows、Mac、Unix 和 Linux。但严格来说,这几个名称所指的对象并不完全相同。
Windows 是微软开发的一个操作系统家族,平时说的 Win 通常就是它的简称。
Mac 是苹果公司的个人电脑系列。这些电脑通常运行的操作系统叫作 macOS。
Unix 既指一个历史上的操作系统,也涉及由它发展而来的系统家族和技术传统。大写的 UNIX 还有正式认证的含义。
Linux 严格来说是一个内核。不过,日常交流中,人们也会用 Linux 来指代围绕这个内核构建的完整操作系统。
要理解它们的区别,我们需要从桌面背后,看看操作系统的基础结构。
2. 操作系统不只是你看到的桌面
操作系统负责管理计算机资源,并向应用程序提供服务。
它组织程序对处理器、内存、文件、存储设备和其他硬件的访问,也帮助防止程序之间互相干扰。
内核是操作系统的核心部分。它处理内存管理、安排线程使用处理器等基本工作。线程可以理解为运行中的程序内部的一条执行流程。
但一个完整的操作系统,除了内核,还有其他组成部分。
它还包括系统服务、软件库、管理工具,以及供用户操作计算机的交互方式。软件库是一组可以被其他程序调用的可重复使用的代码。
桌面就是其中一种交互界面。改变桌面的外观,并不一定会改变底层的内核。
两台电脑可以看起来很不一样,却使用同一个内核家族。两个系统也可以看起来很相似,但内部设计完全不同。
3. Unix:许多故事的起点
Unix 于 1969 年在贝尔实验室起步,Ken Thompson 和 Dennis Ritchie 是其中的重要创造者。
它在文件、进程、权限和软件工具方面的设计,对后来的操作系统产生了深远影响。
进程是一个正在运行的程序实例。权限则规定哪些用户或程序可以访问某些资源。
Unix 支持多个用户,也支持多个任务。它还鼓励把工具设计成专注于特定工作的程序,再让这些工具互相配合。
一个典型例子是管道。管道可以把一个命令的输出,连接到另一个命令的输入。一个工具负责列出信息,另一个负责筛选,再由第三个负责排序。
到了二十世纪七十年代,Unix 的大量代码被改写为 C 语言。这让它更容易适配不同计算机,不过,与硬件有关的部分仍然需要专门处理。
后来,Unix 发展出多个分支。BSD 是 Berkeley Software Distribution 的缩写,中文通常称为伯克利软件发行版,起源于加州大学伯克利分校开展的 Unix 工作。System V 则成为另一个重要分支。
因此,Unix 不只是一个古老操作系统的名字。它的设计思想和后续分支,参与塑造了现代计算机世界。
4. Unix、类 Unix 和 UNIX 认证有什么区别?
这里有三个容易混淆的概念:历史血缘、类 Unix 特征,以及 UNIX 认证。
历史血缘,关注的是一个系统的设计和代码从哪里发展而来。
类 Unix,英文是 Unix-like,描述的是遵循许多 Unix 习惯的系统,例如树状目录、进程、权限,以及相近的编程接口。
UNIX 认证则是另一回事。The Open Group 依据 Single UNIX Specification,也就是统一 UNIX 规范,对系统进行认证。这套规范规定了系统接口和行为方面的要求。
认证针对的是明确的产品和配置,并不意味着所有通过认证的系统都使用相同的内核。
苹果曾为指定的 macOS 版本和硬件配置取得 UNIX 认证。普通 Linux 发行版通常被称为类 Unix 系统,而不是取得 UNIX 认证的系统。相关记录可查看 The Open Group 的 UNIX 认证名录。
你还可能遇到 POSIX。它是一组定义操作系统接口和行为的标准,目的是帮助软件在兼容的系统之间移植。
这些标准可以让源代码更容易移植,但不能保证一个已经编译好的应用程序,在所有系统上都能直接运行。
5. Linux:独立开发的类 Unix 内核
Linus Torvalds 于 1991 年开始开发 Linux。
Linux 借鉴了 Unix 风格的设计思想,但它是重新开发的内核,并不是沿用原始 Unix 源代码继续发展出来的一个分支。Linux 项目对自身的介绍也明确说明,它是从头编写的。参见 Linux Kernel Archives 的介绍。
不过,只有内核,还不是大多数人安装的完整桌面或服务器系统。
Linux 发行版会把 Linux 内核与其他组件组合起来,例如软件库、命令行工具、系统服务,以及软件安装工具。桌面发行版通常还会提供图形界面。
Ubuntu、Debian、Fedora 和 Red Hat Enterprise Linux,都是 Linux 发行版的例子。
许多发行版使用了 GNU 项目提供的工具。GNU 在 Linux 出现之前,就已经开始建设自由的 Unix 兼容操作系统。这种组合经常被称为 GNU/Linux,不过,并不是所有基于 Linux 的系统都使用同一套工具。
Linux 是开源的。它的源代码按照相应许可证公开,允许人们在遵守许可证的条件下查看、修改和重新分发。
因此,不同组织可以围绕同一个内核家族,构建不同的操作系统。
6. macOS:拥有 Unix 渊源的苹果操作系统
macOS 是苹果公司为 Mac 电脑提供的操作系统。
它的现代技术基础来自 NeXT 的操作系统技术,并包含 Mach 和 BSD 的技术渊源。更早的经典 Mac OS,则属于不同的系统架构路线。
Darwin 是 macOS 底层的开源基础,包含 XNU 内核和其他核心组件。
Mach 是卡内基梅隆大学开发的一种内核技术。BSD 则来自 Unix 技术传统。苹果的 XNU 把 Mach 技术、BSD 组件和其他功能结合在一起。参见 苹果公开的 XNU 源代码仓库。
这里最需要记住的一点是:macOS 使用的不是 Linux 内核。
macOS 和 Linux 遵循许多相同的 Unix 习惯,因此,同一个用户可能会觉得它们的命令行环境很熟悉。
但 macOS 在底层基础之上,还加入了苹果自己的桌面、应用框架和系统整合功能。应用框架是一套相互配合的代码和接口,用来帮助开发者构建应用程序。
完整的 macOS 产品并不是开源系统,尽管它的一些重要基础组件是开源的。
拥有相近的 Unix 渊源或使用习惯,并不意味着 macOS 和 Linux 是同一个操作系统。
7. Windows:另一条操作系统发展路线
现代 Windows 属于 Windows NT 家族。
早期面向普通消费者的 Windows 版本,与微软较早的操作系统 MS-DOS 有密切关系。但不能把现代 Windows 理解为简单地运行在 DOS 上面的图形界面。
Windows NT 的架构发展路线,与 Unix 和 Linux 不同。
它拥有自己的系统接口、安全机制、驱动程序架构和应用程序环境。
应用程序编程接口,简称 API,是软件请求某种功能或服务时遵循的调用方式。Windows 应用程序通常依赖 Windows 提供的 API。
设备驱动程序,是了解如何与某种设备或某类设备通信的软件。Windows 驱动程序通常不能直接安装到 Linux 或 macOS 上,因为这些系统提供的驱动接口不同。
Windows 与类 Unix 系统承担着许多相同的基本任务:运行程序、管理内存、组织文件,以及控制硬件。
但承担相同的任务,并不意味着它们采用相同的内部实现方式。
8. 它们的内核有什么不同?
Linux 使用模块化宏内核,也叫模块化单体内核。
宏内核的意思是,许多核心操作系统服务,包括大量驱动程序和文件系统组件,都运行在内核的特权环境中。
模块化的意思是,部分功能可以通过内核模块来添加或移除。内核模块是一种可以扩展运行中内核功能的组件。
宏内核不意味着整个内核只有一个巨大的函数,也不意味着它的源代码没有内部结构。
Windows NT 和苹果的 XNU 通常被称为混合内核。这个名称描述的是结合不同架构思路的设计,而不是严格遵循微内核模式。
微内核的目标,是只把较少的基础功能保留在内核中,把更多服务放到独立进程里运行。
在实际系统中,Windows 和 macOS 仍然有大量操作系统功能运行在内核权限下。“混合内核”并不意味着大多数服务一定都在内核之外运行。
至于 Unix,它并没有一个所有 Unix 系统共同使用的统一内核架构。
这些名称可以帮助我们理解系统如何组织,但仅凭这些分类,不能判断哪个系统一定更快、更安全或更稳定。
9. 为什么 macOS 和 Linux 的命令经常很像?
在 macOS 和许多 Linux 系统中,你都可以使用 ls、cd 和 pwd 等命令。
ls 用来列出目录内容。cd 用来切换当前目录。pwd 用来显示当前目录的路径。
这些相似性来自共同的 Unix 使用习惯和工具传统。
终端应用程序提供一个进行文字交互的窗口。Shell,也叫命令解释器,是负责解释命令的程序。Bash 和 Zsh 都是 Shell 的例子。
终端、Shell 和内核,是不同的组件。
有些命令由 Shell 自己实现,另一些命令则是由 Shell 启动的独立程序。
即使 macOS 和 Linux 提供同名命令,它们支持的选项和具体行为也可能不同。macOS 的许多工具具有 BSD 渊源,而许多 Linux 发行版使用 GNU 版本。
Windows 同样提供命令行环境,例如命令提示符和 PowerShell。
图形桌面和命令行,只是与系统交互的不同方式。它们本身不能决定底层是什么操作系统。
10. 为什么同一个应用程序不能自动到处运行?
假设两台电脑使用同一种处理器,一台运行 Windows,另一台运行 Linux。
为什么它们不能自动运行同一个应用程序?
因为程序依赖的,不只是处理器能够执行的机器指令。
它还可能依赖可执行文件格式、系统 API、软件库,以及操作系统的具体行为。
可执行文件格式,规定了编译后的程序如何组织,以及操作系统应该如何加载它。
应用程序二进制接口,简称 ABI,规定了编译后的软件需要遵循的底层约定,例如函数如何接收参数,以及程序如何与系统组件配合。
Windows、macOS 和 Linux 在这些方面都存在区别。
开发者可能可以重复使用一个应用程序的大部分源代码,但仍然需要为不同操作系统分别构建版本。源代码是人可以阅读的程序文本,编译后的可执行文件则是面向机器运行的结果。
处理器架构还会增加另一层要求。为 x86-64 编译的程序,通常不能直接在 ARM64 处理器上执行,除非有合适的指令翻译或模拟机制。
因此,程序兼容性同时取决于硬件和软件环境。
11. 这些系统如何互相配合?
不同操作系统可以通过共同的网络协议交换信息。
协议就是通信双方约定的信息交换规则。Windows 上的浏览器可以访问 Linux 服务器上的网站,因为双方实现了兼容的网页通信协议。
不同系统也可以通过虚拟化技术配合。
虚拟机会提供一套虚拟硬件,让另一个操作系统在其中运行。运行在虚拟机里面的系统,通常称为客户操作系统。
这样,一台电脑就可以容纳另一个操作系统环境。
兼容层采用另一种办法:提供或转换某些接口,让原本为另一种系统编写的应用程序有机会运行。
Windows Subsystem for Linux,简称 WSL,可以在 Windows 中提供 Linux 环境。WSL 2 在受管理的轻量级虚拟机中运行真正的 Linux 内核,但它并不会替换 Windows NT 内核。参见 微软的 WSL 官方说明。
类似地,Android 使用 Linux 内核,但它的应用程序环境与常见的桌面 Linux 发行版不同。
这些例子说明,共用一台电脑、采用同一个内核家族,或者使用相同的通信协议,都不意味着两个操作系统完全相同。
12. 结语
Windows、macOS、Unix 和 Linux,通过计算机历史、共同思想、技术标准,以及互相通信和配合的能力联系在一起。
Windows 是微软的操作系统家族,现代版本采用 NT 架构。
Mac 是苹果电脑系列,macOS 才是它的操作系统。macOS 的基础包含 Darwin 和 XNU 内核,并具有 Unix 技术渊源。
Unix 是一个影响深远的操作系统家族和技术传统的历史起点。UNIX 同时也是正式认证体系所使用的名称。
Linux 是独立开发的类 Unix 内核。Linux 发行版把这个内核与其他软件组合起来,形成完整操作系统。
它们之间的区别远不止桌面外观,还包括内核设计、系统接口、应用兼容性、软件许可,以及整个系统的组装方式。
理解这些关系之后,那些看起来矛盾的现象就容易解释了:命令相似,可以来自共同的技术传统;应用程序不能通用,则可能来自不同的系统接口。
欢迎访问 Gate & Kernel,继续学习计算机基础知识。
