深入Linux内核架构与底层原理(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
 第1章 操作系统总览

第1章 操作系统总览

1.1 操作系统简介

操作系统的发展经历了一个百花齐放的过程,现在只剩下少数的几个占据绝对市场统治地位的系统。随着我国经济的发展,国内计算机领域对于操作系统技术的需求越来越旺盛。未来,无论操作系统的市场如何变化,其底层所依赖的内核的核心算法原理都不会有太大的变化。各操作系统在调度、内存管理和中断处理这几个比较核心的方向都会趋同,这是因为它们都在彼此学习、互相演进。

人们曾经为RISC(精简指令集计算机)和CISC(复杂指令集计算机)孰优孰劣吵得不可开交,最后人们发现Intel的CISC已经吸纳了RISC的一些优势技术,RISC也在使用CISC的某些技术。

好的信息技术具备极强的传播速度。当前我们熟悉的操作系统有:Windows、Linux、Android、Fuchsia OS、HarmonyOS、Mac OS、BSD等。在这些操作系统中,有些并不只是单纯的操作系统,比如Linux实际上也是一个内核。

21世纪初,操作系统的发展主要是Windows和Linux不断地从不同的角度发现自身的局限性,并且从各自的角度出发来试图解决这些局限性。在这个发展过程中,大量的弥补措施和新机制被发明,但是Windows和Linux都要兼容旧的功能。Windows演进的过程积累了一个很重要的经验是微内核应该怎么设计,“一切皆对象”的思路指导着Windows各个功能的演进;Linux演进的过程主要是对服务质量的优化,“一切皆文件”的思想指导着整个Linux系统的发展。Linux擅长的方面,Windows也在不断地跟进;Windows擅长的方面,Linux也想与之一较高下。

在Linux内核上市之前出现过很多优秀的内核,直至今日,那些具有竞争关系的优秀内核仍然存在。比如FreeBSD和Solaris曾经炙手可热,直到现在FreeBSD仍然具有强大的生命力。

直到今天,一个软件想要获得广泛的应用,开源仍旧是很好的方式。软件通过开源的方式能够使取得更大的市场空间,但是代价就是难以找到盈利模式。近年,谷歌对Linux做了大量的改进和修复,所以Linux形成了独特的特点:求稳、求全、争做第一。

Plan 9是由贝尔实验室开发的操作系统,其设计者阵容可谓豪华:Rob Pike(目前在Google工作,负责Go语言的开发);Ken Thompson(C语言和UNIX设计者);Dennis Ritchie(C语言和UNIX设计者);Brian Kernighan(AWK之父);Doug Mcilroy(UNIX管道提出者和UNIX开发的参与者)。Plan 9的本质思想也是“一切皆文件”:CPU是一个文件、内存是一个文件、网络是一个文件,任何东西都是一个文件。

Linux和UNIX都是多用户分时操作系统,即多个用户共享一个操作系统资源。不管是CPU、内存还是网络,都需要通过调度器来分配、调度。比如A机器的文件需要使用B机器的CPU来处理,就只能通过某种协议,将A机器的文件下载到B机器中,在B机器处理完以后再回传到A机器中。Plan 9的“一切皆文件”看起来很好地解决了这个问题:A机器想使用B机器的CPU,只需要将B机器的CPU挂载到A机器的CPU的文件中就能完成这个需求了。当然,两个机器之间也可以使用“9P”协议来进行文件挂载。

Plan 9是一个分布式操作系统,它能把网络上的一切资源都当作文件来使用,这其实就是云的概念了。但是看起来好的东西在实际使用中不一定好,很多时候人们会更倾向于使用socket,就像本可以用Python语言的一行代码完成一个socket,但是在某些极端情况下还得使用C语言的socket,因为那样更加可控并且效率高。

Plan 9进程的Namespace概念被新晋操作系统Fuchsia OS几乎完整地继承了。除Plan 9之外,Linux操作系统还有很多重量级的竞争对手:Haiku、BeOS、Amiga、OS/2、Arthur、XTS-400等。Linux操作系统目前在嵌入式和服务器领域取得了成功,这两个大方向明显很适合它。

Linux内核的第一作者Linus是一位有情怀的技术人,他没有选择成立闭源的商业公司,虽然他可能会因此失去一个伟大的公司,但是他却收获了一个伟大的产品,并且极大地促进了人类信息技术的进步。

一直都有很多人纠结关于宏内核和微内核的选择。对于公司来说,想要快速产业化,使用微内核几乎是唯一选择。在Linus之前,没有人会想到宏内核能成功。直到今天,宏内核能走多远也没有人能准确预测。

微内核是一种社会性的内核,宏内核是一种技术性的内核。在性能方面,微内核能击败宏内核的概率不大,因为宏内核中的任何一个细分变更都需要整合测试,而且任何一个细分都在整体的框架内变更,包括架构风格和编码风格。但是微内核也有自己不同层面的性能优势。如果Linux内核采用微内核,其内容又会留下几个呢?最后出现的现象很可能是Linux的一部分代码被A内核拿去组建自己的系统,另外一部分代码又被B内核拿去组建自己的系统。这样的力量分散,很可能无法形成如今的Linux。

几乎可以肯定,任何一个公司在决定创造一个操作系统的时候,最佳选择都是使用微内核,且微内核的整体设计可以直接借鉴Windows的成功经验,Windows的设计代表目前商业操作系统的最广泛存在。

竞争,在本质上是市场壁垒、人员壁垒。正是由于竞争的存在,每一个操作系统都在痛苦地迭代,各自面临着痛点。操作系统这个领域正在良性地往前发展。我们应该看到的不是各个操作系统之间的区别,而是各个操作系统之间相同的地方。例如,对I/O的Cache管理、对调度的公平思路、对中断的处理等,不同的操作系统在对待这些问题时的处理细节不同,但解决方法是相似的。毕竟,每个操作系统要面对的硬件情况基本都是一样的,没有系统可以超脱IPI(Inter-Processor Interrupts)来设计SMP(Symmetric Multiprocessing),也没有系统可以超脱MMU硬件来管理内存(当然NO-MMU的技术一般用于低端嵌入式设备),更没有人可以在x86的平台上无视APIC(Advanced Programmable Interrupt Controller)来完成中断处理。

操作系统本质上是对市场上已有硬件的适应,适应的程度几乎完全受到硬件市场占有率的影响。反过来,操作系统又会对硬件的发展提出要求。两者相互作用,在这个过程中,软件与硬件配合的模式会被逐渐固化,最后就变成:操作系统就该这么写,因为硬件就是这样的;硬件就该这样,因为操作系统只支持这样的硬件。

Linux系统是一个工具、一个平台,也是最近20年对信息产业贡献非常大的开源项目。路由器、手机、监控系统、互联网的服务器,以及桌面系统都在逐渐地应用Linux系统。甚至在很多信息系统里,Linux系统都是唯一的选择。

Linux内核比较常用的机制是由用户端底层库进行封装提供的,所以当你需要底层知识时,使用的就是底层库提供的机制,如果底层库提供不了,就由内核直接提供。在通常情况下,底层库都需要尽可能地封装内核提供的功能,但是由于Linux内核的特性是尽可能地集中功能,并且直接通过文件系统暴露接口,这就使得例如/proc、/dev等文件系统可以非常方便地直接调用到内核的功能,底层库也就没有必要封装了。这里的底层库确切地说是libc,libc是内核接口的“产品经理”,其作为内核对用户空间暴露接口的一个包装,会封装它认为可以更方便用户使用的内核功能。

当我们深入到Linux时,通常会同时接触到底层库和内核的用户空间接口。而要使用这些底层功能,通常需要对这些功能本身的实现原理有一定的了解。