购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 操作系统成长记

1.2.1 操作系统诞生的背景

为了深入理解操作系统,不仅需要学习操作系统原理,还需要从操作系统成长的过程说起。图1-2简要梳理了操作系统的成长过程。

图1-2 操作系统的成长过程

最初并没有操作系统。IBM 701开放式计算站(open shop)是由使用者手动操作的,工作效率很低。为了有效利用IBM 701,每个用户被分配了最低15分钟的计算时间。在这15分钟里,使用者通常要为配置设备花掉10分钟,等准备工作完成后,经常最多只有5分钟来做实际的计算工作,大约浪费了2/3的时间。每个月因浪费计算时间造成的损失高达14.6万美元。

为了减少计算时间的浪费并使开发人员从计算机房中解放出来,开发人员被要求在穿孔卡上准备程序和数据,然后提交到计算中心去执行。开放式计算站由此变成了封闭式计算站(closed shop)。最初的操作系统可以认为是封闭式计算站里的操作员。

1.2.2 早期的软件操作系统

早期的软件操作系统只是一些API函数库,并且大多重要的工作还是由操作员来完成。开发人员在编写每个程序时都需要处理一些共同的事情,比如系统初始化和I/O相关的底层代码等,自然就总结出一些常用的库函数以便直接调用,这些API函数就是软件操作系统的源头。如果早期操作系统只是一些API函数,那么当时操作系统最核心的功能(即任务管理)是怎么做的呢?

这些大型机通常由操作员来管理控制,一次运行一个程序。以IBM 7094的工作流程(如图1-3所示)为例,首先操作员从开发人员那里收集一组组穿孔卡片,使用卫星计算机1401把卡片上的作业输入磁带;然后操作员将这个磁带安装到一个与主计算机7094相连接的磁带机上,这便是输入(Input);其后主计算机按照程序在磁带中出现的顺序,每次运行一个,并将数据输出到另一个磁带上;最后输出数据的磁带被操作员移动到卫星计算机1401中,并通过行式打印机打印出来,这便是输出(Output)。

图1-3 IBM 7094工作流程示意图

当主计算机7094执行程序的时候,两台卫星计算机同时做着输入和输出的工作。操作员完成了现代操作系统需要做的主要工作,比如决定程序运行的顺序,也就是任务调度。如果想让你的程序得到优先执行,就得通过操作员想办法插队。

这种计算模式就是批处理(batch processing)系统,IBM 7094所使用的共享操作系统(shared operating system)是早期的批处理系统。一般批处理系统先做好准备工作,然后由操作员以分批的方式来执行程序。这时的计算机还没有以交互方式使用,因为早期的计算机非常昂贵,要有效利用计算机机时,而批处理方式可以最大限度地充分利用计算机机时。

1.2.3 系统调用的概念

系统调用(system call)概念的诞生是操作系统发展的一个重要里程碑。Atlas Supervisor 是第一个提出现代操作系统诸多概念的系统,它率先采用了系统调用的工作机制。

系统调用和API函数的过程调用(procedure call)有何不同呢?系统调用的工作机制将程序的执行权限进行了划分,就像Linux系统分为用户态和内核态,系统调用将用户程序和操作系统内核进行了隔离,通过添加一些特殊的硬件指令和硬件状态让用户程序进入操作系统的过程更加正式、可控,这样有效保护了操作系统提供的底层代码,使得整个系统更加稳定,不会让用户程序的错误造成整个系统的崩溃,而普通的API函数过程调用没有任何保护机制。

系统调用和函数过程调用之间的关键区别:系统调用将执行操作跳转到操作系统内核中,同时提高硬件执行指令的特权级别(进入内核态),用户程序在用户态运行,这意味着硬件限制了用户程序的功能。在用户态运行的用户程序通常不能直接发起I/O请求,不能直接访问任何物理内存或向网络上发送数据包。用户程序只能通过系统调用来访问底层硬件提供的功能,通常通过一个称为陷阱(trap)的特殊指令,比如32位x86指令集中的int $0x80,硬件将控制权跳转到预先指定的陷阱处理程序,即系统调用处理入口,同时将特权级别提升到内核态,在内核态,操作系统具有访问系统硬件的权限。当操作系统完成系统调用请求的服务时,会通过特殊的陷阱返回指令(比如x86指令集中的iret指令)将控制权交还给用户程序,返回到用户态,回到用户程序离开的地方继续执行。

1.2.4 多道程序操作系统

多道程序(multiprogramming)从根本上改变了操作系统。在大型机时代之后,进入小型机(minicomputer)时代,像数字设备公司(DEC)的PDP系列就是小型机的经典,这时计算机的成本更低,同时硬件功能也日趋强大。这些变化同时也使处理器开始能够支持程序的并发执行和控制。中断技术能够使一个处理器控制多道程序的并发执行,这时多道程序操作系统开始出现。

多道程序操作系统不是一次只运行一个程序,而是将大量程序加载到内存中并在它们之间快速切换,从而提高CPU的利用率。这种切换是非常重要的,因为I/O访问速度很慢,在I/O访问过程中CPU空闲。CPU空闲的时候为什么不切换执行其他用户程序呢?通过快速切换不同的用户程序,CPU的利用率可以得到极大提高。

1.2.5 笼罩在UNIX上的阴影

小型机时代最成功的操作系统当属UNIX操作系统,它汇集了众多操作系统的思想,尤其是继承了Multics系统的诸多思想。

1969年,Dennis Ritchie和Ken Thompson在贝尔实验室开始尝试寻找Multics的替代品。1971年年底,他们开发的UNIX系统能够在PDP-11小型机上支持3位用户。然而,直到1973年UNIX内核用C语言重写之后人们才开始知道它的存在,1974年之前根本没有出版过任何关于UNIX的文献。随着计算机的小型化,小型机(尤其是PDP-11)催生了一批新用户,他们对现存的操作系统软件感到失望,这群人更倾向于UNIX系统。UNIX操作系统提供的功能都不是全新的,而是使已有的操作系统的功能使用起来更简便。UNIX系统提供了C语言编译器,开发人员很容易编写自己的程序并分享源代码,这使得UNIX非常受欢迎。UNIX成为开放源代码软件的早期形式,很重要的原因是作者向所有请求的人免费提供源代码。源代码的可读性也非常重要,UNIX是用C语言编写的内核,比较容易理解,因此比较容易吸引其他人为UNIX添加新的、很酷的功能。到了20世纪80年代中期,UNIX已经成为操作系统中领先的、事实上的行业标准,并诞生了诸多UNIX版本,比如由加利福尼亚大学伯克利分校团队发布的BSD版本,还有Sun公司的Solaris、IBM公司的AIX、HP公司的HP-UX等。

至此操作系统的内在成长告一段落,它从无到有,从弱到强,直到UNIX操作系统诞生并统治小型机时代。操作系统从幼年到成年的过程不仅经历了硬件环境的不断升级,还经历了诸多新思想、新方法的洗礼,日趋成熟、稳定和强大。

随着UNIX带来的市场蛋糕越来越大,AT&T及贝尔实验室与这些不同的UNIX厂商产生了有关UNIX版权的法律纠纷,导致UNIX的传播速度有所放缓,从而使很多人怀疑UNIX能否存活下去,这成为笼罩在UNIX上的阴影。

另外,操作系统的发展在个人计算机兴起的初期出现了一次大的倒退。

1.2.6 早期个人计算机操作系统的大倒退

在UNIX笼罩阴影的同时,出现了一种称为个人计算机(personal computer,PC)的机器,相对于小型机来说,这种机器价格便宜且性能不错,非常适合大众。在苹果公司的Apple Ⅱ和IBM PC的引领下,这种可以放到桌面上的个人计算机很快占领了主流市场。由于早期的PC操作系统开发人员忘记了或者从未知道小型机时代的经验教训,导致PC操作系统在发展过程中出现了诸多痛苦的经历。早期的PC操作系统,比如微软的DOS,由于没有重视内存保护,造成恶意或非恶意的用户程序能够完全访问整个内存;再比如第一代macOS的进程调度策略,常常意外陷入无限循环占用整个系统导致重新启动。

PC操作系统经历过一段时间的痛苦历程后很快就重新站在了前辈操作系统打下的地基上。微软的Windows操作系统采用了操作系统历史上的伟大思想,特别是从Windows NT开始,微软在操作系统技术上有了巨大的飞跃。乔布斯重新回到苹果公司时带着基于UNIX的NEXTSTEP操作系统,并以此为基础打造了macOS X,使得UNIX在台式计算机和笔记本计算机上非常流行。

1.2.7 移动互联网和AIoT时代的操作系统

移动互联网时代,手机操作系统没有走弯路,而是直接站在了UNIX之上。手机操作系统的市场被谷歌公司的Android操作系统和苹果公司的iOS操作系统垄断了。Android是基于Linux内核的手机操作系统,而Linux是UNIX的克隆版本;iOS操作系统的源头更是可以直接追溯到UNIX系统。至此操作系统发展到了巅峰。

然而伴随着万物互联、车联网、5G、AI等新应用和新技术的出现,操作系统似乎开始进入“中年危机”,在应对更加复杂的分布式计算环境时显得力不从心。因此在单机操作系统的基础上,逐渐发展出了云端分布式操作系统和终端分布式操作系统,操作系统注定将重新开启新的生命历程。

云端分布式操作系统是以虚拟化和容器技术为基础的,比较有代表性的就是openEuler操作系统引入的StratoVirt技术和iSula通用容器引擎。StratoVirt是计算产业中面向云数据中心的企业级虚拟化平台,实现了一套架构支持虚拟机、容器、Serverless三种场景。相比Docker,iSula 通用容器引擎是一种新的容器解决方案,提供统一的架构设计来满足CT和IT领域的不同需求。相比Golang编写的Docker,轻量级容器使用C/C++实现,具有轻、灵、巧、快的特点,不受硬件规格和架构的限制,底噪开销更小,可应用领域更为广泛。此外,还出现了Hadoop、Spark、OpenStack和Kubernetes等不同用途的云端分布式操作系统。

终端分布式操作系统以华为鸿蒙系统最具代表性。鸿蒙系统引入了分布式软总线技术。此技术旨在提供通信相关的能力,包括WLAN服务能力、蓝牙服务能力等网络服务能力,以及组网、传输和进程间通信等能力,为多终端的统一管理和调度建立基础通信环境。

在终端和云端之间还有边缘计算,未来的操作系统将面临多终端、边缘计算和云计算等多种复杂环境的挑战。 cZIBOkjGFzB4OJCx3oyUVfz2uzd6CPA2JY1CIhY5F7nUBg3TDfn7egXHINy95iQo

点击中间区域
呼出菜单
上一章
目录
下一章
×