操作系统的发展历史
操作系统的发展历史
复习定位
操作系统的进化不是"新功能"的简单叠加。每一次重大变更(引入分时、引入虚拟内存、引入图形界面、引入微内核)都是对前一代无法满足的新应用需求(交互、多用户、多媒体、高可靠)的回应。
批处理系统(1950s-1960s)
不需要"交互"的时代——用户将作业写在卡片上交给计算中心操作员——操作员将成批卡片送入计算机——计算机逐个执行——直到完成所有作业后一次性输出结果(打印纸/穿孔卡片)。批处理系统的核心效率指标是CPU利用率——尽可能让CPU一直处理作业而不空转——因为当时的计算机(IBM7090等大型机)极为昂贵——CPU空闲一秒都是浪费。
批处理监控程序——第一代操作系统的雏形——常驻内存的一个小程序——在新作业启动时自动加载并运行——不需要操作员手动按下LOAD按钮——自动化了作业间切换。但没有并发和交互——用户提交作业后几个小时甚至第二天才能拿到结果——限制了编程调试的效率。
多道程序与分时(1960s-1970s)
多道程序(IBM OS/360,1964)允许内存中同时存放多道用户程序——当一道程序在等待磁带机或打印机等I/O时——CPU切换到另一道程序执行。此举显著提升了CPU利用率。但这还不是交互式——用户在提交作业到拿回结果的反馈周期仍然是小时级别。
分时系统(CTSS, 1961; MULTICS, 1965开始)将CPU时间切成若干时间片——每个用户通过交互终端轮流获得一段极短的CPU时间。每一个用户都感觉自己在独享这台计算机。CTSS的成功证明了交互式计算效率远高于批处理——尽管同一个时间点仍然只有一个作业在执行——但各用户间轮转快速以至于无人注意到系统的延迟。
UNIX(1969,Ken Thompson和Dennis Ritchie 贝尔实验室)是分时系统影响力的顶峰。UNIX是MULTICS的小型化——吸取了MULTICS过于复杂的教训——UNIX保持了简洁统一的哲学(一切皆文件、用小工具的管道组合完成复杂任务)。C语言(1972年Ritchie发明)使UNIX具有了可移植性——UNIX成为第一个运行在多种硬件平台(从PDP-11到VAX到x86)的操作系统。
个人计算机操作系统(1980s-1990s)
CP/M(1974,Gary Kildall)为8位微型计算机(Altair)开发——是第一个被广泛使用的PC操作系统。1981年IBM选择MS-DOS——微软从QDOS购买基础再改造——为Intel 8088的单任务环境设计——没有虚拟内存、没有保护模式、让应用直接访问硬件地址——系统稳定性全部依赖于应用故意不做非法操作。
Windows前期(1.0/2.0/3.x)不是操作系统——它们是在MS-DOS之上的一个GUI外壳——16位、实模式、仍然没有内存保护。Windows NT(1993)才是微软的第一个现代操作系统——32位、完全保护模式、真正的多任务线程设计——其混合内核结构延续至今。
Linux(1991,Linus Torvalds)——Linus受MINIX(一个教学用微内核、Andrew Tanenbaum)的启发——开发了一个基于宏内核设计的UNIX兼容操作系统并接受了GNU的GPL许可证。Linux弥补了GNU操作系统Hurd开发过慢而导致的生态真空——GNU+Linux的组件在x86服务器上以极低的成本提供了UNIX级别的性能和兼容性——直接撬动了整个Web 1.0服务器的底层基础。
学习开发的现实关联
从发展史对照现在的日常开发——Linux下的各种命令行操作(shell组合管道)直接继承自UNIX的"小工具组合"思想;Windows NT的项目经理David Cutler曾参与VAX VMS的研究——所以NT内核的"Registry"概念和VMS的关联关系常常被研究操作系统内核设计的资深人员所津津乐道。了解操作系统的演进帮助开发者理解这个语法为什么这样设计——而不仅仅是记住它。
复习检查
批处理系统为什么在早期的巨型机上具有压倒性优势——而没有出现今天日用的桌面交互系统?
分时系统将CPU时间切片——一个用户的时间片内、其他用户完全停止——这是否意味着实时、高速的交互在早期是极快轮转而非真正的并行多核?
UNIX"一切皆文件"的设计哲学——一个进程管理(像
kill一般指的是向进程发出信号——信号作为一种"文件"写入行为)如何体现了"文件抽象"的广泛应用?为什么Linux在GNU Hurd已经开发多年但迟迟无法完成的时候快速占据了x86服务器生态——核心的架构决策(宏内核 vs 微内核)在其中扮演什么角色?
Windows NT的设计初衷是"可移植操作系统"——它确实曾经被移植到x86、MIPS、Alpha、PowerPC。移植到其他平台的主要工作量集中在哪里?
操作系统的萌芽期——从手工操作到监控程序
最早的计算机(1940s)没有操作系统——程序员直接操作硬件——用机器码在纸带上打孔输入程序。一个作业运行时——CPU完全执行该程序。作业完成后——操作员手动装载下一张纸带——期间CPU空闲。这种模式的效率极低——CPU的利用率可能只有百分之几——因为操作员的手工插线换纸带的时间远大于程序运行时间。
随着计算机性能的提高——程序运行时间缩短——手工操作的瓶颈越来越严重。第一个操作系统——批处理监控程序(Monitor)——在20世纪50年代应运而生。监控程序常驻内存——自动将下一个作业从外部装载入内存并将控制交给它——不需要操作员的手工干预。虽然监控程序简化了作业切换——但没有改变作业的顺序执行性质——CPU仍然在I/O等待时处于空闲。
推动操作系统进一步发展的动力来自两个方面:硬件进步(晶体管、集成电路、内存容量扩大、磁盘的出现)和用户需求(多用户交互、实时响应、资源共享)。
分时操作系统的诞生与UNIX的崛起
MIT在1961年开发的CTSS(兼容分时系统)实现了第一个分时系统——多个用户同时通过终端使用计算机。MIT、GE和贝尔实验室联合启动了MULTICS(MULTiplexed Information and Computing Service)项目——目标是建立一个大型的分时操作系统——支持数百个用户。但MULTICS过于庞大和复杂——项目拖延严重——贝尔实验室退出了该项目。
贝尔实验室的Ken Thompson、Dennis Ritchie和Brian Kernighan在退出MULTICS后——借鉴MULTICS的思想但保持极简——在PDP-7小型机上开发了UNIX(1969)。UNIX的核心设计原则包括:
1. 一切皆文件——设备、管道、socket都通过文件描述符访问
2. 小工具组合——每个工具做一件事并做好,通过管道组合
3. KISS原则——简洁清晰的接口设计
4. 可移植性——用C语言编写(1973年重写)UNIX的成功除了技术原因——还有法律原因:AT&T因反垄断法限制不能销售软件——因此AT&T以极低的价格将UNIX源代码提供给大学——大学操作系统和系统编程课程因此纷纷以UNIX为教学平台——这为UNIX培养了大量精通的操作系统开发者——也间接催生了BSD(加州伯克利)和后来的Linux。
个人计算机时代——从单用户到现代操作系统
1980年代——个人计算机的普及催生了面向个人用户的单任务操作系统:MS-DOS和早期的Mac OS。这些系统没有内存保护、没有虚拟内存、没有抢占式调度——一个应用程序崩溃可能导致整个系统死机。
Windows NT(1993)是由前DEC VMS首席架构师David Cutler领导的开发团队开发的——采用了微内核/混合内核架构——支持多CPU对称多处理、NTFS文件系统、用户态和内核态分离、抢占式调度。NT的架构比同时期的Windows 3.x/9x(利用MS-DOS封装的系列产品)在系统可靠性上有了质的飞跃——为Windows在服务器领域的推广建立了基础。
Linux(1991)作为UNIX的克隆——选择宏内核结构——但采用了可加载内核模块的模块化机制——在单内核的优良性能和稳定性之间取得了好的平衡。Linux以GPL许可证发布——任何人都可以查看、修改和重新发布源代码。GNU+Linux+Apache Web服务器成为互联网时代服务器端的标准技术栈。
操作系统的演进规律总结
批处理系统(CPU效率提升) →
多道程序(I/O与CPU重叠) →
分时系统(交互响应) →
个人计算机OS(单用户易用性) →
网络OS(资源共享与通信) →
分布式OS(透明性扩展性)每代操作系统解决了前一代的核心痛点——从CPU利用率→并发效率→交互体验→易用性→协作性→可扩展性。这个演进不仅受到技术驱动——也受到硬件成本下降(晶体管数量提升)和新应用需求(从科学计算到个人办公到Web服务到移动/云计算)的双重推动。
复习检查(续)
批处理系统到分时系统的转型驱动力——用户对交互响应时间的要求——批处理在小时级返回结果——分时将响应时间缩短到秒级或亚秒级——使程序员可以快速调试程序。
UNIX"一切皆文件"的设计——open/read/write/close系统调用可以操作普通文件、设备文件、管道、socket、目录——统一了I/O操作——降低了程序员的学习成本和操作系统的复杂度。
Linux为什么选择宏内核而非微内核——性能是主要考量——函数调用比IPC快得多——在1990年代硬件性能相对有限——宏内核的优势更明显。
Windows NT混合内核的设计——将部分核心服务(调度/内存管理)放内核态——文件系统和网络栈也在内核态——但图形子系统放在用户态——隔离了显示驱动的故障范围。
分时系统的响应时间和时间片的关系——当一个时间片过大时(比如500ms)——用户会明显感知到交互延迟——时间片过小(比如1ms)时——上下文切换的开销会比重过大降低总系统吞吐量。
操作系统在移动设备上的演化
2000年代后期——移动操作系统成为新的增长点。iOS(iPhone,2007)和Android(基于Linux内核,2008)针对移动设备的触摸屏交互、续航管理、传感器集成和有限的内存/计算能力做了深度优化。移动操作系统引入了应用沙箱——每个应用运行在独立的用户ID下、独立的文件空间——应用间不能随意访问对方数据——这在继承自UNIX的安全传统之外还加入了移动应用生态需要的权限管理模式。
嵌入式RTOS(FreeRTOS, VxWorks, QNX)则更注重实时性和确定性——通常为单进程/单线程/多线程模型——调度策略是严格优先级抢占——保证高优先级任务的中断响应时间在微秒级。
云计算时代的操作系统
在2000年代中期起——虚拟化技术在服务器和云平台中发挥越来越大的作用。Hypervisor(Xen/KVM/VMware ESXi)允许多个操作系统在同一硬件上并行运行——而容器(如Docker/Virtualization光容器Engine)利用Linux内核的namespace和cgroup技术实现了更轻量的操作系统级虚拟化技术——每个容器共享宿主机内核但仍保持独立。云计算时代的操作系统需要处理好资源分配、多租户隔离和并发送性能兼顾的问题——对内核的资源管理(cgroup/CFS)、网络虚拟化(veth/bridge/OVS)和存储虚拟化(持久化存储管理等)提出了更高的要求。
操作系统的历史给程序员的启示
操作系统的发展历史不是枯燥的知识点——它反映了计算机科学的系统性:一个新技术被创造出来——通常是为了解决前一代技术创造的新瓶颈。理解这个演化逻辑——当程序员的应用程序遇到性能瓶颈时——就可以沿着相似的脉络思考——是CPU瓶颈?内存瓶颈?I/O瓶颈?——然后选择相对应的优化方向。同时——操作系统发展史也是一个"向后兼容"与"向前革新"的长期平衡过程——很多当前系统中的设计决策(进程模型、文件系统层次、网络协议栈)都是在数十年演进中不断积累和重构的结果。
复习检查(续二)
移动操作系统与传统桌面操作系统的核心安全差异——iOS/Android中的应用沙箱隔离是默认设计——传统Linux桌面以用户为单位隔离——移动端更严格地控制了应用间的权限边界——以防敏感权限越界。
嵌入式RTOS和通用操作系统在调度策略上的差异——RTOS使用严格优先级抢占——高优先级任务可以在微秒时间内抢占CPU——通用OS使用时间片轮转/CFS——优先保证交互响应和公平性——实时中断响应延迟不确定(毫秒级)。
Hypervisor和容器技术(Virtualization)区别——Hypervisor提供硬件级虚拟化——每个VM有独立的内核——容器共享宿主机内核——容器更轻量但隔离性比VM弱。
Linux的cgroup在操作系统历史和云原生中的作用——2006年Google引入——起初是用于限制一组进程的资源(CPU/内存/I/O)使用量——后来被Docker等容器技术采用——成为容器资源管理的基础——也间接促成了WSL等Linux兼容层技术在本机上的应用。
操作系统的发展与编程语言的演进交互作用——C语言与UNIX的相互促进、Java的"一次编译到处运行"与操作系统的平台无关性需求、Go语言对CSP并发模型的选择对多核CPU操作系统的映射——编程语言的抽象层次持续升高——底层对操作系统的接口依赖逐渐隐蔽在运行时环境中。
操作系统主要版本时间线
1956 GM-NAA I/O —— 第一个批处理OS
1961 CTSS —— 第一个分时系统
1964 IBM OS/360 —— 多道程序系列OS
1969 UNIX —— 可移植分时OS
1981 MS-DOS 1.0 —— 个人计算机OS
1984 Mac OS System 1 —— 图形界面单任务OS
1987 MINIX —— 教学用微内核UNIX
1991 Linux 0.01 —— 类UNIX宏内核开源OS
1993 Windows NT 3.1 —— 32位现代Windows的开端
2000 Windows 2000 —— 商用稳定版本的NT
2001 Mac OS X —— 基于Mach微内核+BSD的UNIX认证OS
2007 iOS —— 移动触摸OS
2008 Android —— 基于Linux的开放式移动OS这张时间线展示了操作系统从面向单机、面向企业计算转向面向个人、面向移动和云原生的趋势——同时各个操作系统在相互借鉴功能和架构的基础上发展。
复习检查(续三)
Linux 0.01版本(1991年)发布的代码行数大约多少行——约10000行——主要包含进程调度、内存管理和文件系统的最基本功能——展示了即使是个小团队也可以从底层开始构建一个现代操作系统的可能性。
从GM-NAA I/O到iOS/Android的演进——操作系统从"单道作业自动装载"发展到"多用户分时交互"再到"移动触摸+应用商店生态"——设备形态和交互方式的变革驱动力。
Windows NT内核团队的核心成员对NT设计的影响——David Cutler曾是DEC VAX/VMS的首席架构师——NT中借鉴了VMS的很多设计(如注册表与VMS的目录结构思路的关联、NTFS与VMS的RMS的关联)——但是NT的实现是完全独立的。
分时系统的核心技术创新——时钟中断(实现了定时的进程切换)——决定性的硬件中断系统引入——使操作系统可以在一定时间间隔后干预已经拿到了CPU的进程——从而实现多个进程共享CPU。
个人计算机操作系统在哪些方面推动了计算机的普及——图形界面降低了使用门槛——提供了易于安装的系统软件生态——使得非专业人士可以便捷地使用计算机进行网上冲浪和办公。计算机从"专业人员用设备"变成了"人人可用的工具"。
操作系统历史对不同时代程序员的学习意义
不同时代的程序员接触操作系统的路径不同:1990年代的程序员需要理解中断向量表、实模式/保护模式切换、设备端口编程——因为操作系统对硬件的抽象层次较低。2000年后的程序员通过Windows API/POSIX API编程——对底层硬件不再熟悉。2010年后的程序员通过框架和云API编程——对操作系统本身的依赖更加间接(但不意味着无关——操作系统仍然管理着所有的底层资源)。在容器化和Serverless兴起后——很多底层资源管理的复杂性被运行时框架进一步封装——但理解进程、内存、文件、网络、调度仍然是疑难/性能排查时不可或缺的知识。
复习检查(续四)
操作系统发展早期的封闭源和开源模式的对比——早期操作系统(1960s-1970s)通常与绑定具体硬件(IBM OS/360系列与IBM大型机)——用户无法获取源代码——1980s桌面OS也长期封闭——相比之下UNIX在大学中的源码公开让这一操作系统的设计被上万名学生所学习——孵化了一代软件开发者和架构设计者。
微软从MS-DOS到Windows NT的演进反映出了什么样的商业和技术思路——MS-DOS是授权给IBM PC的开端——Windows 1.0-3.x是DOS上的GUI——NT是完全独立重写的现代操作系统内核——沿此路径微软建立起桌面+服务器的完整操作系统产品线。
微内核和宏内核的争论(Tanenbaum vs Torvalds,1992)对操作系统发展的影响——该辩论公开于新闻组——Tanenbaum预测微内核将成为未来——Torvalds认为宏内核在x86上性能更好——后来的发展说明混合内核(在宏内核基础上引入了某些微内核设计)成为了现代操作系统的主流。
操作系统的"分层设计"思想源自哪一时期的OS项目——THE操作系统(E.W.Dijkstra,1968)引入了严格的层次结构(内存管理→进程调度→设备管理→文件系统→用户——每一层仅依赖下层)这一设计现在在操作系统内部还能用到——如VFS(虚拟文件系统)提供了抽象层在文件的操作上跨越和抹平了下层不同文件系统具体实现的差异。
中国在操作系统研发方面的努力——早期有Hopen/Linux内核社区参与——近期有华为的HarmonyOS(OpenHarmony开源项目)——它们在微内核、分布式技术方面尝试把面向IoT场景的API设计融合渐进式的OS架构。生态系统建设仍然是国产OS面临的长期挑战。