什么是操作系统

站在一万米的代码空间维度看

现在的通用操作系统是一个复杂的系统软件,比如 Linux 操作系统达到了千万行的 C 源代码量级。在学习操作系统的初期,我们没有必要去分析了解这样大规模的软件。但这样的软件也是有其特有的一些特征。首先,它称为系统软件,简单理解它就是在一个计算机系统范围内使用的软件,管的是整个计算机系统。如果这样来看,一个编辑软件,如 Vi Emacs 就不能算了。 而在计算机中安装的 Rust 标准库(类似的有 C 标准库 libc 等)可以算是一个。

如果我们站在一万米的高空来看 操作系统 ,可以发现操作系统这个软件干的事主要有两件:一是向下管理计算机硬件和各种外设,二是向上给应用软件提供各种服务帮助。我们可对其进一步描述:操作系统是一个可以管理CPU、内存和各种外设,并管理和服务应用软件的软件。这样的描述也是大多数操作系统教材上对操作系统的一个比较概括的定义。为了完成这些工作,操作系统需要知道如何与硬件打交道,如何更好地面向应用软件做好服务,这就有一系列操作系统相关的理论、抽象、设计等来支持如何做和做得好的需求。

../_images/computer-hw-sw.png

如果看看我们的身边, Android 应用运行在 ARM 处理器上 Android 操作系统的执行环境中,微软的 Office 应用运行在 x86-64 处理器上 Windows 操作系统的执行环境中,Web Server应用运行在 x86-64 处理器上 Linux 操作系统的执行环境中, Web app 应用运行在 x86-64 或 ARM 处理器上 Chrome OS 操作系统的执行环境中。而在一些嵌入式环境中,操作系统以运行时库的形式与应用程序紧密结合在一起,形成一个可在嵌入式硬件上单一执行的嵌入式应用。所以,在不同的应用场景下,操作系统的边界也是不同的,我们可以把运行时库、图形界面支持库等这些可支持不同应用的系统软件 (System Software) 也看成是操作系统的一部分。

站在应用程序的角度来看,我们可以发现常见的应用程序其实是运行在由硬件、操作系统、运行时库、图形界面支持库等所包起来的一个 执行环境 (Execution Environment) 中,应用程序只需根据与系统软件约定好的应用程序二进制接口 (ABI, Application Binary Interface) 来请求执行环境提供的各种服务或功能,从而完成应用程序自己的功能。基于这样的观察,我们可以把操作系统再简单一点地定义为: 应用程序的软件执行环境 。从这个角度出发,操作系统可以包括运行时库、图形界面支持库等系统软件,也能适应在操作系统发展的不同历史时期对操作系统的概括性描述和定义。

../_images/EE.png

站在计算机发展的百年时间尺度看

虽然电子计算机的出现距今才仅仅七十年左右,但计算机技术和操作系统已经发生了巨大的变化。从计算机发展的短暂的历史角度看,操作系统也是从无到有地逐步发展起来的。操作系统主要完成控制硬件控制和为应用程序提供服务这些必不可少的功能,它的历史与计算机的发展史密不可分。操作系统的内涵和功能随着历史的发展也在一直变化、改进中。如今在二十一世纪初期的大众眼中,操作系统就是他们的手机/终端上的软件系统,包括各种应用程序集合,图形界面和网络浏览器是其中重要的组成部分。

其实,操作系统的内涵和外延随着历史的发展也一直在变化,并没有类似于“1+1=2”这样的明确定义。参考生物的进化史,我们也给操作系统的进化历史做一个简单的概述,从中可以看到操作系统在各个时间段上包含什么,具有什么样的特征。但无论操作系统的内在实现和具体目标如何变化,其管理计算机硬件,给应用提供服务的核心定位没有变化。

寒武纪生物大爆发时代

电子计算机在 1946 年最开始出现的时候是没有操作系统 (Operating System) 的,只有操作员 (Operator) 。启动,扳开关,装卡片/纸带等比较辛苦的工作都是计算机操作员或者用户自己完成。操作员/用户带着记录有程序和数据的卡片 (Punch Card) 或打孔纸带去操作机器。装好卡片/纸带后,启动卡片/纸带阅读器,把程序和数据读入计算机内存中之后,计算机就开始工作,并把结果也输出到卡片/纸带或显示屏上,最后程序停止。

由于过低的人工操作效率浪费了计算机的宝贵机时,所以就引入监控程序 (Monitor) 辅助完成输入、输出、加载、运行程序等工作,这是现代操作系统的起源,类似寒武纪生物大爆发中的“三叶虫”。一般情况下,计算机每次只能执行一个任务, CPU 大部分时间都在等待人的缓慢操作。这个初级的“辅助操作”过程一直持续到 20 世纪 50 年代。

注解

可以在 本书第一章 看到初级的“三叶虫”操作系统其实就是一个给应用提供各种服务(比如输出字符串)的库,方便了单一应用程序的开发与运行。

泥盆纪鱼类时代和二叠纪两栖动物时代

在 20 世纪 50~60 年代,计算机发展到大型机阶段,而所对应的早期操作系统非常多样化、专用化,生产商生产出针对各自硬件的专用操作系统,大部分用汇编语言编写,这导致操作系统的进化比较缓慢,但进化在持续进行,从“手工操作”进化到了“批处理”阶段和“多道程序”阶段。在 1964 年, IBM 公司开发了面向 System/360 系列机器的统一可兼容的操作系统—— OS/360 ,它是一种批处理操作系统。为了能充分地利用计算机系统,应尽量使该系统连续运行,减少空闲时间,所以批处理操作系统把一批作业(古老的术语,可理解为现在的程序)以脱机方式输入到磁带上,并使这批作业能一个接一个地连续处理,流程如下:

  1. 将磁带上的一个作业装入内存;

  2. 操作系统把运行控制权交给该作业;

  3. 当该作业处理完成后,控制权被交还给操作系统;

  4. 重复1-3的步骤处理下一个作业直到所有作业处理完毕。

批处理操作系统分为单道批处理系统和多道批处理系统。单道批处理操作系统只能管理内存中的一个(道)作业,无法充分利用计算机系统中的所有资源,致使系统整体性能较差。多道批处理操作系统能管理内存中的多个(道)作业,可比较充分地利用计算机系统中的所有资源,提升系统整体性能。

多道批处理操作系统为此采用了多道程序设计技术,就是指允许同时把多个程序放入内存,并允许它们交替在 CPU 中运行,它们共享系统中的各种硬、软件资源。当一道程序因 I/O 请求而暂停运行时, CPU 便立即转去运行另一道程序。

虽然批处理操作系统提高了系统的执行效率,但其缺点是人机交互性差。如果程序员的代码出现错误,必须重新编码,上传内存,再执行。这需要花费以小时和天为单位的时间开销,使得程序员修改和调试程序很不方便。

注解

可以在 本书第二章 看到批处理操作系统的设计实现,以及支持一个一个地执行应用程序的运行过程。而在 本书第三章 的前三节可以看到支持协作式多道程序的操作系统的设计实现,以及支持应用程序主动放弃 CPU 以提高系统整体执行效率的过程。

侏罗纪与白垩纪的爬行动物时代

20 世纪 60 年代末,提高人机交互方式的分时操作系统越来越崭露头角。分时是指多个用户和多个程序以很小的时间间隔来共享使用同一台计算机上的 CPU 和其他硬件/软件资源。1964 年由贝尔实验室、麻省理工学院及美国通用电气公司所共同参与研发目标远大的MULTICS (MULTiplexed Information and Computing System) 操作系统是一套安装在大型主机上多人多任务的操作系统。 MULTICS 以兼容分时系统 (CTSS) 做基础,建置在美国通用电力公司的大型机 GE-645 ,目标是连接 1000 部终端机,支持 300 位用户同时上线。因 MULTICS 项目的工作进度过于缓慢,1969 年 AT&T 的 Bell 实验室从 MULTICS 研发中撤出。但贝尔实验室的两位软件工程师 Thompson 与 Ritchie 借鉴了一些重要的 MULTICS 理念,以 C 语言为基础发展出 UNIX 操作系统。UNIX 操作系统的早期版本是完全免费的,可以轻易获得并随意修改,所以它得到了广泛的接受。后来,它成为开发小型机操作系统的起点。由于早期的广泛应用,它已经成为分时操作系统的典范。

注解

可以在 本书第三章 的第四节可以看到分时操作系统的设计实现,以及操作系统可强制让应用程序被动放弃 CPU 使得应用可以公平共享系统中的软硬件资源。并且 UNIX 还有虚存、文件、进程等当前操作系统的关键特性,这些内容也在本书的第四章~第七章中有详细的设计描述。

古近纪哺乳动物时代

20 世纪 70 年代,微型处理器的发展使计算机的应用普及至中小企及个人爱好者,推动了个人计算机 (PC, Personal Computer) 的发展,也进一步推动了面向个人使用的操作系统的出现。其代表是由微软公司在 20 世纪 80 年代为个人计算机开发的 DOS/Windows 操作系统,其特点是简单易用,特别是基于 Windows 操作系统的 GUI 界面,极大地简化了一般用户使用计算机的难度,使得计算机得到了快速的普及。这里需要注意的是,第一个带 GUI 界面的个人计算机原型起源于伟大却又让人扼腕叹息的施乐帕洛阿图研究中心 (PARC, Palo Alto Research Center) ,PARC 研发出的带有图标、弹出式菜单和重叠窗口的图形交互界面 (GUI, Graphical User Interface),可利用鼠标的点击动作来进行操控,这是当今我们所使用的 GUI 系统的基础。支持便捷的图形交互界面也成为自 20 世纪 70 年代以来操作系统的主要特征之一。

注解

目前支持 GUI 交互接口的操作系统设计实现在本书中还没有对应的章节。但其操作系统的内核其实与分时操作系统的设计实现思路基本是一致的。如果在本书设计的简单分时操作系统的基础上,添加一个图形外设的驱动和一个简单的 GUI 窗口系统,也许是一个有趣的实验内容。

第四纪智人时代

21 世纪以来, Internet 和移动互联网的迅猛发展,使得在服务器领域和个人终端的应用与需求大增。iOS 和 Android 操作系统是21世纪个人终端操作系统的代表,Linux 在巨型机到数据中心服务器操作系统中占据了统治地位。以 Android 系统为例,Android 操作系统是一个包括 Linux 操作系统内核、基于 Java 的中间件、用户界面和关键应用软件的移动设备软件栈集合。这里介绍一下广泛用在服务器领域和个人终端中的操作系统内核–Linux 操作系统内核。1991 年 8 月,芬兰学生 Linus Torvalds (林纳斯·托瓦兹) 在 comp.os.minix 新闻组贴上了以下这段话:

"你好,所有使用 minix 的人 -我正在为 386 ( 486 ) AT 做一个免费的操作系统 ( 只是为了爱好 )…″

而他所说的“爱好″成为了大家都知道的 Linux 操作系统内核。这个时代的操作系统的特征是联网,发挥网络的吞吐量和低延迟是这个时代的网络操作系统追求的目标。

注解

目前支持联网的操作系统设计实现在本书中还没有对应的章节。但其操作系统的内核其实与分时操作系统的设计实现思路基本是一致的。如果在本书设计的简单分时操作系统的基础上,添加一个网卡外设的驱动和一个简单的网络协议栈,也许是另一个有趣的实验内容。

二十一世纪神人时代

当前,大数据、人工智能、机器学习、高速移动互联网络、AR/VR 对操作系统等系统软件带来了新的挑战。如何有效支持和利用这些技术是未来操作系统的方向。

在 2020 年,我们看到了华为逐步推出的鸿蒙系统;小米也推出了物联网软件平台小米 Vela ;阿里推出了 AliOS Thing;腾讯推出了Tencent OS;苹果公司接连推出 A14、M1 等基于 ARM 的 CPU,逐步开始淘汰 X86CPU;微软推出 Windows 10 IoT,Google 推出 Fuchsia OS,也都在做着各种云、边、端的技术调整和创新。

大家好像都意识到,不仅仅是人工智能和机器学习,下一个具有分布式特征的操作系统的新突破即将到来,并试图通过这种具有分布式特征的操作系统带来的连贯用户体验,打通从数据中心、服务器、桌面、移动端、边缘设备等的整个 AI 和物联网 (IoT, Internet of Things) 的生态。也许这个时代的未来操作系统与之前的操作系统相比,其最大的不同是跳出了单个设备节点,通过高速的无线网络从多种维度来管理多个设备,形成分布式操作系统。

注解

目前支持AIoT的操作系统设计实现在本书中还没有对应的章节,不过我们的同学也设计了 zCore操作系统 , 欢迎看完本书的同学能够尝试参与或独立设计面向未来的操作系统。

注解

本节内容部分参考了尤瓦尔·赫拉利所著的“人类简史”、“未来简史” 。