购买
下载掌阅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服务能力、蓝牙服务能力等网络服务能力,以及组网、传输和进程间通信等能力,为多终端的统一管理和调度建立基础通信环境。

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



1.3 国产操作系统概述

1.3.1 国产操作系统的发展历程

操作系统在软硬件生态中扮演着承上启下的作用,具有衔接下层物理设备及资源和上层软件应用及服务的作用。因此操作系统国产化是自主可控软硬件生态的根本保障。

国产操作系统的研发可以追溯到20世纪70年代,杨芙清院士于1973年率领软件课题组设计出了150机整套操作系统软件,运行在我国第一台百万次集成电路计算机上,打破了西方的封锁。1981 年,她又主持完成了我国第一个用高级语言编写的大型机操作系统——240机操作系统。杨芙清院士是中国在软件开发领域做出显著贡献的第一个程序员。

20世纪80年代末,我国探讨并提出打造自主通用操作系统,后经过专家研究论证,制定了以跟踪Unix操作系统为技术路线的计划,并在“八五”攻关计划中正式立项。20世纪90年代初,我国正式推出COSIX 1.0操作系统,随后正式提出包括中文、微内核和系统安全等特色功能的COSIX 2.0操作系统。当时国产操作系统以学习UNIX等国外先进操作系统的相关概念和进行实验性的设计为主。

COSIX操作系统项目出色地完成了国产操作系统实验性的设计工作及人才队伍建设,而UNIX操作系统因为版权问题陷入商业纠纷,为其发展前景蒙上了阴影。20世纪90年代,随着自由软件运动一起发展的Linux操作系统发展势头迅猛,它通过克隆UNIX操作系统解决了版权问题,并迅速占领了操作系统的技术高地。2000年前后,基于Linux的国产操作系统迅猛发展,诞生了一批国产Linux操作系统产品,比如中软Linux(COSIX Linux)、红旗Linux和蓝点Linux(BluePoint Linux)等。这一阶段,国产操作系统确立了以Linux内核为基础的技术路线,产品脱离实验阶段,步入实用化阶段。

经历了Linux系统发展热潮之后,受到微软Windows操作系统的冲击,也受国内外经济和政策环境的影响,国产操作系统发展势头趋缓,一些缺乏商业化运营支撑的国产操作系统产品逐步被市场淘汰。然而经过行业洗牌,个别技术和运营都较为扎实的国产操作系统还是得到了一些市场机会,比如麒麟软件旗下的麒麟操作系统、深度科技旗下的Deepin操作系统、统信软件旗下的统信UOS等都发展势头良好,这表明国产操作系统正走向成熟,逐步成为真正可用的产品。

2018年以来发生的美国制裁中兴事件、芯片断供和对华为等中国高科技公司的各种打压,再次揭示了国产化软硬件生态的重要性,掀起了国产操作系统发展的新一轮热潮,其中最具代表性的就是华为鸿蒙系统(HarmonyOS)和欧拉系统(openEuler)。经过多年的发展,国产操作系统已取得长足进步,从“能用”走向“好用”,也从追赶走向有了一点引领操作系统发展方向的苗头。

国产操作系统积极因应外部国际环境和借助国家国产化的政策导向,向市场化发起了新一轮的冲击,相信不久的将来国产操作系统及其承上启下的软硬件生态将在以国内大循环为主体、国内国际双循环相互促进的新发展格局中大放异彩。

国产Linux操作系统发展历程如图1-4所示。国产Linux操作系统始于20世纪90年代,大多数基于Fedora、CentOS、Debian/Ubuntu等国外Linux发行版进行二次开发,直到2019年,华为公司开源了openEuler操作系统,它是自主演进的根操作系统,不是基于其他任何Linux发行版的二次开发,这是它与其他国产Linux操作系统的主要差异。

图1-4 国产Linux操作系统发展历程

1.3.2 openEuler操作系统

openEuler是一款开源操作系统,它的前身是华为公司发展近10年的服务器操作系统EulerOS,2019年开源,更名为openEuler。

当前openEuler内核源于Linux,支持鲲鹏及其他多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智能等应用场景。同时,openEuler是一个面向全球的操作系统开源社区,通过社区合作,打造创新平台,构建支持多处理器架构、统一和开放的操作系统,推动软硬件应用生态繁荣发展。

openEuler以年月为版本号,以便用户了解版本发布时间,例如openEuler 22.03表示发布时间为2022年3月。

openEuler 22.03基于Linux Kernel 5.10内核构建,在进程调度、内存管理等方面有10余处创新,包括深度优化调度、I/O、内存管理,提供ARM64、x86、RISC-V等更多算力支持;新增启动选项preempt=none/voluntary/full,允许内核动态切换抢占模式;通过移动PMD/PUD级别的表项,加速映射大块内存的速度;采用per memcg lru_lock,减少云原生容器实例锁竞争,提升系统性能;通过共享映射方式将HugeTLB管理页中无实际作用的tail页释放掉,从而降低管理结构的开销,降低大页管理自身内存占用;本地TLB和远端TLB刷新并行,优化TLB shootdown流程,加速TLB刷新,提升业务性能;对于超过基本内存页面大小的空间进行vmalloc()分配时,会尝试使用大页而不是基本页来映射内存,可以极大地改善TLB的利用,降低TLB miss;使用配置CONFIG_UCE_KERNEL_RECOVERY打开,在copy_from_user场景下消费UCE时,使用kill关联用户态进程取代内核panic,该特性默认是关闭的,可通过内核启动参数cmdline接口(uce_kernel_recovery=[0,4])和proc接口动态开关(/proc/sys/kernel/uce_kernel_recovery)进行配置。

openEuler 22.03增加了新介质文件系统Eulerfs,该文件系统创新元数据软更新技术,基于指针的目录双视图计数机制,减少元数据同步开销,有效提升文件系统create、unlink、mkdir、rmdir系统调用性能。

openEuler 22.03做了内存分级扩展,支持多种内存、存储介质扩展系统内存容量,降低内存使用成本。

openEuler 22.03新增用户态交换支持,通过etMem的策略配置,对于淘汰的冷内存,通过用户态swap功能交换到用户态存储中,达到用户无感知,性能优于内核态swap。

openEuler 22.03新增gazelle用户态协议栈,无须应用程序修改和重新编译即可使用,支撑上层业务获得高性能、低时延的网络传输。gazelle用户态协议栈基于dpdk和lwip,实现支持无锁、多线程的高性能用户态协议栈,加速应用程序的网络性能,无须修改适配和重新编译即可使用。

openEuler 22.03做了云原生调度增强,在云业务场景中,交互类应用对延时敏感,在线业务存在潮汐现象,CPU资源利用率普遍较低(不足15%),在线和离线业务混合部署是提升资源利用率的有效方式。在现有的内核资源分配和管理机制上,通过QAS可以确保在线任务对CPU的快速抢占、确定性的调度运行,同时压制离线任务干扰;通过OOM回收支持优先级,优化OOM时内存回收调度算法,在发生OOM时,优先对低优先级的进程组进行内存回收,保障在线业务的正常运行;通过容器混合部署框架,对K8s集群下的混合部署,openEuler用户仅需给业务打上在线或离线的标签,系统即能自动感知业务的创建,并根据业务优先级进行配置,实现资源的隔离和抢占。

openEuler 22.03支持QEMU热补丁机制,即支持libcareplus热补丁机制,提供一种在线修复进程bug的技术,使得QEMU进程能够在不影响虚拟机业务的情况下,在线解决QEMU进程bug。

openEuler 22.03支撑了容器化操作系统KubeOS,实现云原生集群OS的统一容器化管理。包括OS容器化管理、对接K8s容器和OS统一管理、原子化的生命周期管理,以及OS轻量化裁剪,减少不必要的冗余包,可实现快速升级、替换等。

openEuler 22.03支持轻量安全容器增强,基于StratoVirt轻量虚拟化技术,实现容器级别的低负载和虚拟机的高安全。包括支持UEFI启动、ACPI表的构建以及为虚拟机添加包括virtio-pci在内的PCIe/PCI设备;支持VFIO,提供将host上物理设备直通给虚拟机的能力,使虚拟机获得接近裸设备的高性能;支持直通设备热插拔,即支持virtio-blk-pci、virtio-net-pci和VFIO等设备的热插拔,有效避免更换外设引起的系统停机和业务中断。

openEuler 22.03具有iSulad增强,shimv2收编了kata-runtime、kata-shim和kata-proxy进程,通过加载一次运行时并通过RPC调用来处理各种容器生命周期管理命令来简化架构,不必为每个容器一直运行一个容器运行时。

openEuler 22.03具有eggo支持容器管理双平面部署,eggo是openEuler云原生Sig组K8s集群部署管理项目,提供高效、稳定的集群部署能力。包括集群配置版本化管理,配置统一Git repo版本化管理,使用仓库汇总和跟踪集群的配置信息,以及x86/ARM双平面,实现OS双平面集群化部署、监控、审计等场景。

openEuler 22.03支持边缘计算,提供跨边云的协同框架(KubeEdge+),实现边云之间的应用管理与部署、跨边云通信等基础能力。包括管理协同—— 实现单集群设备统一管理,应用秒级发放;网络协同—— 支持跨边云双向通信,私有子网中的边缘节点通信;边缘自治—— 实支持边缘自治,确保网络不稳定状态下边缘节点正常工作,支持边缘节点元数据持久化和快速恢复;边缘轻量化—— 内存占用少,可在资源受限情况下工作。

openEuler 22.03支持嵌入式镜像,具有轻量化能力,开放yocto小型化构建裁剪框架,支撑OS镜像轻量化定制,提供OS镜像小于5 M和小于5 s快速启动等能力;具有多硬件支持,新增支持树莓派4B作为嵌入式场景通用硬件;具有软实时内核,基于Linux-5.10内核提供软实时能力,软实时中断响应时延为微秒级;可以混合关键性部署,实现SoC内实时和非实时多平面混合部署,并支持zephyr实时内核;具有分布式软总线基础能力,集成鸿蒙的分布式软总线,实现欧拉嵌入式设备之间的互联互通;具有嵌入式软件包支持,新增80+嵌入式领域常用软件包的构建。

openEuler 22.03支持secPaver,它是一款SELinux安全策略开发工具,用于辅助开发人员为应用程序开发安全策略,提供高阶配置语言,根据策略配置文件内容生成SELinux策略文件,降低SELinux使用门槛。

openEuler 22.03支持NestOS,它是一款在openEuler社区CloudNative sig组孵化的云底座操作系统,专注于提供最佳的容器主机,大规模下安全地运行容器化工作负载。NestOS是开箱即用的容器平台,搭载了iSulad、docker、podman、cri-o等主流容器基础平台;NestOS具有简单易用的安装配置过程,采用了Ignition技术,提供个性化配置;NestOS具有安全可靠的包管理方式,使用rpm-ostree进行包管理;NestOS具有友好可控的自动更新代理,采用zincati实现无感升级;NestOS有紧密配合的双系统分区,此分区设计确保系统安全。

openEuler 22.03具有很多第三方应用支持,比如KubeSphere,它是在Kubernetes之上构建的以应用为中心的容器平台,完全开源,由青云科技发起,并由openEuler社区SIG-KubeSphere提供支持和维护;比如OpenStack Wallaby,Wallaby是2021年4月份发布的OpenStack的最新稳定版本,包含nova、kolla、cyborg、tacker等核心项目的重要更新;比如OpenResty,它是基于Nginx与Lua的高性能Web平台。

openEuler 22.03具有对多种桌面环境的支持,提供更多的开发桌面选择和更好的开发体验。包括DDE新增支持画板、音乐和影院应用;UKUI新增支持中文输入法和多媒体;kiran-desktop支持麒麟信安桌面系统;支持GNOME桌面系统。

openEuler操作系统的发布件包括ISO发布包、虚拟机镜像、容器镜像、嵌入式镜像和repo源等,方便不同用户的安装和使用。 MYxdGbFjlR6oMOOfCJB0IBEfOzbN3VbZlb6Y5M5QbgURoNzlMkgh1glMQFPWKQwi

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