是什么让操作系统成为“类 Unix”?

one*_*ing 22 linux unix-philosophy

我经常在许多网站上遇到“类unix”这个词。

没有标准;这只是它的行为方式。

但是如果我从头开始开发一个内核,是什么让它被认为是“类unix”的?

基本上,使编写的代码像 Unix 的东西是什么?

gol*_*cks 19

没有标准;这只是它的行为方式。

我相信大多数“类 Unix”操作系统确实非常认真地努力遵守POSIX 标准,该标准由 Open Group 监督,Open Group 也控制Single UNIX Specification定义“真正 UNIX”。前者是后者的核心。

因此,事实上,有一个标准定义了类Unix的实用性操作系统。查看维基百科关于 POSIX 的文章末尾的“完全”和“大部分”兼容操作系统列表。

有一些明显的原因,特别是linux可能不被单一 Unix 规范 (SUS) 视为完全兼容或可认证的,但这并不是因为任何给定的 linux 系统都必然与其不兼容。维基百科文章以这种方式总结了规范:

SUSv3 总共约 3700 页,按主题分为四个主要部分:

基本定义 (XBD) - 规范中使用的定义和约定列表以及兼容系统必须提供的 C 头文件列表。总共提供了84个头文件。

Shell 和实用程序 (XCU) - 实用程序列表和 shell 描述,sh。总共指定了 160 个实用程序。

系统接口 (XSH) - 包含作为系统调用或库函数实现的各种函数的规范。总共指定了1123个系统接口。

基本原理 (XRAT) - 标准背后的解释。

标准的用户命令行和脚本接口是 POSIX shell,它是基于 Korn Shell 早期版本的 Bourne Shell 的扩展。

其他用户级程序、服务和实用程序包括 awk、echo、ed、vi 和数百个其他程序。所需的程序级服务包括基本 I/O(文件、终端和网络)服务。

测试套件伴随着标准。它被称为 PCTS 或 POSIX 认证测试套件。

此外,SUS 还包括 CURSES (XCURSES) 规范,该规范指定了 372 个函数和 3 个头文件。总之,SUSv3 指定了 1742 个接口。

这显然是指许多不属于 linux 内核的用户空间组件(例如 shell)。所以 linux.org 等是不可能的。阿尔。可以单独认证内核——从这个意义上说,它根本不是一个操作系统。当然,他们可以尝试使用内核来认证某个特定系统,但鉴于一般的分发方案,这将毫无意义:内核和维护它的人独立于维护用户区核心 (GNU) 的人他们独立于维护实际组装的操作系统发行版(Debian、Fedora 等)的人员。

我想 Debian 或 Fedora 本身可以参与认证过程(例如,RedHat Enterprise 可以成为“经过认证的 unix”),但这引出了一个问题,即这实际上是可取的。我认为 SUS 系统的主要原因是运行(商业规模,非消费者)为此编写的软件,这根本不是 linux 的利基——这样做的人将为操作系统的每个许可证支付数千美元,包括很多支持等,因为他们还为每个许可证支付数万或数十万美元,以购买他们想要在系统上运行的任何其他软件。另一方面,Linux 和其他异常值的设计目标已经超出了商业目的的简单合规性,并且有各种示例,例如(来自http://en.wikipedia.org/wiki/STREAMS):

STREAMS 是符合单一 UNIX 规范版本 1 (UNIX 95) 和 2 (UNIX 98) 所必需的,但由于 BSD 和 Linux 开发人员拒绝提供 STREAMS,[需要引用] 被标记为 POSIX 的可选Austin Group 在版本 3 (UNIX 03) 中的合规性。

一个有趣的调整强调了 SUS 和 The Open Group != linux, != BSD 等。

  • 请注意,获得认证不同于遵守。例如,由于成本和开发速度,Linux 基金会对每个内核版本进行认证是不切实际的。但这并不意味着它(内核)不完全或大部分遵守。 (3认同)
  • @strugee 单一 Unix 规范适用于用户界面。当然最终涉及内核,但我的评论是关于您关于 Linux 基金会获得内核认证的声明。内核无法通过认证,它缺少认证过程与之交互的所有组件。可以认证(或至少尝试使其尽可能合规)的是操作系统,即 Linux 社区中通常称为发行版的东西。 (3认同)
  • @strugee POSIX 标准不适用于或关心内核。标准化的是命令(shell、ls、cat 等)和 API(libc 提供的内容,线程)。使基于 Linux 的发行版与 Unix 相似的主要是 GNU 组件(命令和 glibc)。内核不在认证/合规范围内。 (2认同)
  • 不是反驳而是澄清(我从我对 illuminÉ 回答的评论中重复这一点):标准是“什么”,内核是“如何”。我只阅读了一些标准,但我认为它们根本不涉及“内核”(它只是“系统”)。所以 WRT 认证和合规性:它是内核/操作系统“做什么”,而不是“如何”做它。 (2认同)
  • @strugee 这将是可能的原因,但是快速翻转并不是那么重要,而是没有承诺确保不添加不兼容的更改。例如 Solaris 10 是兼容的,保证这种兼容性,并且自从它通过 Unix03 认证以来已经有十几个更新。此外,Gnu/Linux 组合试图尽可能地/想要但不更多地兼容。它(几乎)从未尝试过认证,因为它既是一个昂贵的过程,而且无论如何都不会遵守,因为(故意)缺少某些要求并且某些扩展不兼容 (2认同)

小智 13

要扩展有关 POSIX 的第一个答案,要了解“类 unix”的含义,首先应该尝试了解 UNIX 到底是什么。查看拥有 Unix 商标的Open Group的文档,您将找到有关Single UNIX 规范演变的详细信息- 这是UNIX03

UNIX 03 产品标准是符合单一 UNIX 规范第 3 版的系统的标志。它是 UNIX 98 产品标准的显着增强版本。强制性增强包括与 ISO/IEC 9989:1999 C 编程语言、IEEE Std 1003.1-2001 和 ISO/IEC 9945:2002 保持一致。本产品标准包括以下强制性产品标准:国际化系统调用和库扩展 V3、命令和实用程序 V4、C 语言 V2 和国际化终端接口。

UNIX98

UNIX 98 产品标准是 UNIX 95 产品标准的显着增强版本。强制性增强包括 (1) 线程接口,(2) 多字节支持扩展 (MSE),(3) 大文件支持,(4) 动态链接,(5) 更改以删除硬件数据长度依赖性或限制,以及 (6) ) 2000 年的变化。此外,还包括以下可选增强功能: 软件管理工具和一组用于实时支持的 API。本产品标准包括以下强制性产品标准:国际化系统调用和库扩展 V2、命令和实用程序 V3、C 语言、传输服务 (XTI) V2、套接字 V2 和国际化终端接口。此外,它还可能符合软件管理产品标准。

UNIX95(我的重点):

本产品标准定义了一个统一的平台,用于支持最初为一类操作系统开发的广泛应用程序,这些操作系统源自最初由 AT&T 开发UNIX 操作系统代码和/或接口,以及提供的设施。按基本产品标准。它的范围比 Base 更广。本产品标准包括以下产品标准:国际化系统调用和扩展库、命令和实用程序 V2、C 语言、传输服务 (XTI)、套接字和国际化终端接口。

在某些情况下,标准的服务器版本会添加 Internet 服务器和 IPv6。

所以我们当然看到了对AT&T 贝尔实验室的引用,C 语言是 UNIX 的核心:C 语言、模块化基础工具和 shell,以及内核、文件系统和其他关键操作系统组件是如何设计和实现的.

在此处输入图片说明

在此处输入图片说明

这就是Maurice J. Bach所著的《UNIX 操作系统的设计》一书成为无价之书的地方,因为此时它已成为历史问题。当然,值得注意的是这与其他发明(如 C 语言)的关系。C 是由 AT&T Bell 开发的,用一种可以像汇编一样快但可以跨不同硬件移植的语言来实现 Unix,并且许多 POSIX 是标准 C 的扩展。

就内核本身而言,您经常会找到这样的概念图来说明 UNIX 内核的传统含义:

在此处输入图片说明

以下是巴赫先生讨论 UNIX System V 内核基础的经典著作 (1986) 的一些摘录:

然而,它们 [应用子系统和程序] 都使用最终由内核提供的较低级别的服务,并且它们通过系统调用集来利用这些服务。System V中大约有64个系统调用,其中经常使用的不到32个。它们具有简单的选项,使它们易于使用,但为用户提供了强大的功能。系统调用集和实现它们的内部算法构成了内核的主体[...]

[...] 它的两个主要组件是文件子系统和进程子系统。

文件被组织成文件系统,文件系统被视为逻辑设备;一个物理设备(如磁盘)可以包含多个逻辑设备(文件系统)。每个文件系统都有一个描述文件系统结构和内容的超级块,文件系统中的每个文件都由一个提供文件属性的inode描述。操作文件的系统调用通过 inode 进行。[和缓冲池]

[...] inode 有两个版本:在文件未使用时存储 inode 信息的磁盘副本和记录有关活动文件的信息的 in-core 副本。

UNIX 系统上用户进程的执行分为两个层次:用户和内核。当进程执行系统调用时,进程的执行模式从用户模式变为内核模式:操作系统执行并尝试为用户请求提供服务[...]

[...] UNIX 系统的理念是提供操作系统原语,使用户能够编写小型模块化程序,这些程序可用作构建块来构建更复杂的程序。shell 用户可见的一种原语是重定向 I/O的能力。

[...] 除了为系统调用提供服务外,内核还为用户社区做一般簿记、控制进程调度、管理主内存中进程的存储和保护、处理中断、管理文件和设备以及处理系统错误状况。

如果您对类 Unix 操作系统中内核的不同实现感兴趣,您还可以查看 FreeBSD实现(4.4BSD) 或Mach 内核,或者查看它们功能的比较

您对 UNIX 的设计了解得越多,就越能理解下图中关于 UNIX 的起源及其历史发生了什么。Bach 先生在他的书中主要谈论 System V,但他也讨论了 BSD:

在此处输入图片说明

还有更多的这种比满足眼睛真的。例如,Mac OSX 已通过 UNIX03认证,但您是否看到它连接到任何纯 UNIX(大部分为红色)?

在此处输入图片说明

在上面您可以看到 BSD、GNU、Microsoft 和不同的个人如何为这个世界做出贡献。尽管 GNU 和最终的 linux 与 UNIX 没有直接的联系,但您会看到GNU正在努力在开源世界中重新设计来自已关闭的商业 UNIX 的工具和软件。因此,查看GNU 维护的软件可以提供例如初始原型应用程序和库的想法。

许可战争在 UNIX 的发展(有时是停滞)中发挥了作用。您可以立即看到 UNIX 是根据许可证类型排列的 - 封闭与 BSD(BSD 允许使代码封闭源代码...请参阅 OSX)和GPL,它允许 Linux 和 GNU 在 copyleft 世界中相互补充。这是最初由 Linus Torvalds 开发的 linux 内核的经典地图,它也揭示了内核在类 Unix 操作系统中“可以”做什么:

在此处输入图片说明

这暗示了这样一种想法,即“内核”设计类型不是 UNIX 标准的原因,也不是定义类 Unix 操作系统的原因。许多类 Unix 操作系统可能具有单体内核或微内核这一事实证明了这一点——单体是 UNIX 的经典设计类型。事实上,即使在纯 UNIX 中,HPUX 也具有单片内核,而 AIX 使用微内核。这场关于设计的争论是关于性能的,与 Unix 血统或身份无关。另一方面,在 UNIX/unix 类操作系统下,有一种传统的概念方法来为软件提供服务、处理文件系统等。

我相信这些考虑将为您问题的操作系统部分添加上下文。

  • +1 这里有一些优点:1)关于 C 和 Unix 之间的关系(补充:C 是由 AT&T Bell 开发的,用一种可以像汇编一样快但可以跨不同硬件移植的语言来实现 Unix,以及许多 POSIX是标准 C 的扩展)。2)内核设计独立于标准。标准是“什么”,内核是“如何”。 (4认同)