UNIX/Linux:简史与标准化

UNIX/Linux:简史与标准化

1. Unix 标准与手册页

  • 背景引入

    • 在学习进程、线程编程之前,通常接触过文件 I/O。
    • 常用函数:open 是一个系统调用(System Call)。
    • 在手册页(man page)中查看 open(Section 2)时,会看到系统调用层面的描述。
    • 在手册页中查看 opencreat 函数时,会看到符合多种标准的标注:
      • SVR4 (System V Release 4)
      • 4.3BSD (Berkeley Software Distribution)
      • POSIX (Portable Operating System Interface)
      • POSIX.1-2001
      • POSIX.1-2008
    • 核心问题:为什么手册页要单独列出这些标准?这些标准存在的意义是什么?
  • 本节目标

    • 理解 Unix 系统的诞生与普及。
    • 理解 Unix 的两个重要分支:BSDSystem V
    • 理解标准化的必要性及主要标准(POSIX, SUS)。
    • 理解 Linux 下如何实现这些标准。

2. Unix 系统的诞生与普及

  • 诞生历程

    • 1969 年:Unix 系统诞生,由 Bell Labs(贝尔实验室)的 Ken Thompson 教授开发,最初使用汇编语言编写。
    • 1972 年Dennis Ritchie 设计实现了 C 语言(基于 B 语言)。
    • 1973 年:贝尔实验室使用 C 语言重写了 Unix 系统。
      • 意义:后续的 Unix 系统(包括 Linux)主要使用 C 语言编写,提高了可移植性。
    • 早期硬件:早期的 Unix 运行在类似工作台的早期计算机上,与现代实现虽有技术传承,但形态区别较大。
  • 早期普及与许可

    • 所属公司:Bell Labs 隶属于 AT&T 公司。
    • 业务特点:AT&T 主营业务不包括操作系统,因此早期 Unix 呈现“免费”(打引号)特点。
    • 许可模式:收取象征性费用,发放软件许可(知识产权许可)。
    • 高校推广:AT&T 向各大高校发放许可。
      • 截至 1977 年,约有 500 个站点使用 Unix。
      • 覆盖全美及海外,包括 125 所大学。
      • 主要用途:教学目的。

3. Unix 的两大重要分支

随着 Unix 的普及和商业化,出现了众多版本,但主要关联到两个核心版本分支:

  • 分支一:BSD (Berkeley Software Distribution)

    • 来源加州大学伯克利分校 (UC Berkeley) 是活跃的许可证获得者之一。
    • 贡献
      • 对 Unix 系统做出了重大贡献。
      • 套接字 (Sockets):最早由伯克利分校研究生设计实现,用于网络通信。
      • Vi 编辑器:最早由伯克利分校研究生实现(新版为 Vim)。
    • 商业化演变:随着 Unix 商业化加重,伯克利分校演化出 Berkeley Software Distribution 公司。
    • 版本:常见的 BSD 4.2BSD 4.3 即指该分支的版本。
  • 分支二:System V (系统五)

    • 背景:美国通过反托拉斯法案,AT&T 被强制拆分。
    • 商业化销售:独立后的新 AT&T 公司开始正式销售 Unix 系统,并进行迭代更新。
    • 版本发布
      • 1982 年:发布 System III
      • 1983 年:发布 System V (Unix 系统的第五个版本)。
    • 重要性:System V 版本应用广泛,对软件行业发展重要。手册页中的 SVR4 即指 System V Release 4(系统五的第 4 个版本)。

4. 标准化的需求与背景

  • 问题背景

    • 时间点:20 世纪 80 年代末。
    • 现状:Unix 已商业化,不同计算机厂商基于 BSD 或 System V(或两者兼容)实现自己的 Unix 系统。
    • 碎片化:厂商在基础系统上添加额外的私有特性。
    • 后果:软件及技术人员在不同 Unix 系统间转移变得困难(可移植性差)。
    • 类比:如同编程语言不统一,阻碍交流与发展。
  • 事实标准 (De Facto Standards)

    • 在正式标准出台前,存在事实上的标准:
      • 基于 BSD 的系统需实现 BSD 相关接口。
      • 基于 System V 的系统需实现 System V 相关接口。
    • 手册页标注 SVR44.3BSD 即表示该接口符合相应版本的事实标准,确保兼容性。
  • C 语言标准

    • 背景:大家均使用 C 语言,语法基本统一(基于 K&R C 语言书籍),但库函数接口不统一。
    • ANSI 标准:美国国家标准委员会组织制定新的 C 语言标准。
      • C89:后来所说的标准 C 语言(ANSI C)。
      • 后续版本:C99, C17 等。
    • 规定内容
      1. C 语言的语法和语义。
      2. C 语言库函数操作。
    • 局限性:标准 C 主要规定语言层面和标准库,但文件 I/O(如 open)、进程、线程、网络等 API 属于系统级别,不在标准 C 规定范围内。

5. 系统级标准:POSIX 与 SUS

为解决系统级 API 的标准化问题,出现了以下标准:

  • POSIX 标准 (Portable Operating System Interface)

    • 组织IEEE (电气电子工程师协会)。
    • 目标:提升应用程序在源码级别的可移植性
      • 确保 A 系统和 B 系统的 API 行为一致(如 open 函数参数、行为)。
      • 不规定源码如何实现,只规定函数行为和规范。
    • 覆盖范围:进程、线程、网络等 API 接口。
  • SUS 规范 (Single UNIX Specification)

    • 组织The Open Group (由多家国际计算机厂商组成的联盟)。
    • 背景:Unix 商标版权最终转到 The Open Group 手中。
    • 目的:实现操作系统在不同计算机厂商间的运行兼容性。
    • 与 POSIX 关系
      • SUS 在 POSIX 标准之上做了更严格的定义。
      • Austin Group:IEEE 和 The Open Group 联合组成的工作组,统一了 POSIX 和 SUS 标准。
      • 版本对应
        • POSIX.1-2001 取代了 SUSv2 及早期 POSIX 标准。
        • 该标准也被称为 SUSv3
        • 结论:POSIX 标准和 SUSv3 本质上是同一个标准,两个名字
  • 手册页中的标准标注意义

    • 标注 SVR4:符合 System V 第 4 版标准。
    • 标注 4.3BSD:符合 BSD 4.3 版本标准。
    • 标注 POSIX / POSIX.1-2001:符合 POSIX 标准(即 SUSv3)。
    • 作用:开发者可知该接口的适用性和兼容性范围。
  • 现状

    • POSIX 标准不仅用于 Unix,Windows 系统也声称支持许多 POSIX 标准接口。
    • POSIX 已逐渐成为计算机系统的通用标准。

6. Linux 与 GNU 项目

  • 开源软件运动背景

    • 80-90 年代,商业操作系统(如早期 Unix、Windows)价格贵且源码不开放,阻碍技术发展。
    • GNU 计划:由 Richard Stallman 发起。
    • 目标:创建完全自由的类 Unix 操作系统(Unix-like)。
      • 注意:不能直接拷贝 Unix 源码(侵犯知识产权),需自行实现。
    • GNU 贡献
      • 制定 GNU GPL 标准。
      • 实现 GNU 编译器 (GCC)。
      • 实现 Shell (Bash)。
      • 实现 C 库 (glibc):包含 C 标准库函数及 POSIX 标准库函数。
      • 缺失:缺少系统内核。
  • Linux 内核

    • 开发者Linus Torvalds
    • 实现:开发了一个操作系统内核(最初未命名为 Linux,后定为 Linux)。
    • 结合:Linux 内核 + GNU 工具链 = 完整的 Linux 操作系统
    • 归属:Linux 内核很快归入 GNU 项目,成为其一部分。
  • Linux 与 Unix 的关系

    • 继承角度:Linux 源自 Unix 思想(如 Minix 教学系统影响),属于 类 Unix (Unix-like) 系统。
    • 版权角度
      • Unix 商标归 The Open Group 所有。
      • 符合 SUS 标准并通过认证的系统才能称为官方 Unix 系统(如 macOS 已拿到 Unix 认证)。
      • Linux 未通过官方 Unix 认证,因此严格来说 Linux 是 Linux,Unix 是 Unix。
    • 语境区别
      • 技术继承上:Linux 属于 Unix 体系。
      • 商业版权上:Linux 与 Unix 区分明确。

7. Linux 下标准的实现与查看

  • POSIX 标准在 Linux 下的实现方式

    1. 系统调用 (System Call)
      • 部分 POSIX API 直接由内核实现。
      • 例如:open 在 Linux 下是系统调用。
    2. 库函数 (Library Function)
      • 部分 POSIX API 封装在 glibc 库中。
      • 例如:某些 POSIX 标准接口作为 C 库函数实现。
    3. 系统组件
      • Shell:Linux 实现了 POSIX 规定的 Shell(如 Bash)。
      • 工具:实现了系统级工具命令(如 grep, report 等)。
  • 手册页 (Man Pages) 的使用与区分

    • 查看 Linux 实现
      • 命令:man 2 open
      • 内容:查看 Section 2,即 系统调用 层面的描述,反映 Linux 具体实现。
    • 查看 POSIX 标准
      • 命令:man 3 open
      • 内容:查看 Section 3,即 库函数 层面,通常对应 POSIX 标准描述。
      • 注意:POSIX 手册页会提醒细节可能与 Linux 具体实现有出入。
    • 安装 POSIX 手册页
      • 默认可能未安装 POSIX 标准手册页。
      • 安装命令(Ubuntu/Debian 示例):
        sudo apt-get update
        sudo apt-get install man-pages-posix-dev
        
      • 安装后可查看符合 POSIX 标准下的接口描述及实现细节。
  • 总结

    • 学习 Linux 编程需理解标准(POSIX/SUS)与具体实现(Linux Kernel/glibc)的关系。
    • 查阅文档时注意区分是查看系统调用(Section 2)还是库函数/标准描述(Section 3)。
    • 本课程重点学习 POSIX 标准中关于进程、线程相关的内容。
静态库与动态库 2026-03-04
进程、程序 2026-03-04

评论区