Linux是怎样工作的
上QQ阅读APP看书,第一时间看更新

第1章 计算机系统的概要

本章将简要说明什么是 OS,以及 OS 与硬件设备的关系。本章有很多比较抽象的描述,因此读者也可以暂时跳过本章,在需要时再回来查看相关内容。

世界上充满了各种计算机系统,比如大家身边的个人计算机、智能手机、平板电脑,以及平时不怎么接触的商用服务器等。虽然这些计算机系统上的硬件结构存在各种各样的差异,但大体上为如图 1-1 所示的结构。

图 1-1 计算机系统的硬件结构

在计算机系统运行时,在硬件设备上会重复执行以下步骤。

① 通过输入设备或网络适配器,向计算机发起请求。

② 读取内存中的命令,并在 CPU 上执行,把结果写入负责保存数据的内存区域中。

③ 将内存中的数据写入 HDD(Hard Disk Drive,硬盘驱动器)、SDD

(Solid State Disk,固态硬盘)等存储器,或者通过网络发送给其他计算机,或者通过输出设备提供给用户。

④回到步骤①。

由这些重复执行的步骤整合而成的对用户有意义的处理,就称为程序。程序大体上分为以下几种。

  • 应用程序:能让用户直接使用,为用户提供帮助的程序,例如计算机上的办公软件、智能手机和平板电脑上的应用
  • 中间件:将对大部分应用程序通用的功能分离出来,以辅助应用程序运行的程序,例如 Web 服务器、数据库系统
  • OS:直接控制硬件设备,同时为应用程序与中间件提供运行环境的程序,例如 Linux

以上这些程序如图 1-2 所示相互协作着运行。

图 1-2 各种程序相互协作着运行

通常情况下,程序在 OS 上以进程为单位运行。每个程序由一个或者多个进程构成(图 1-3)。包括 Linux 在内的大部分 OS 能同时运行多个进程。

图 1-3 程序由一个或者多个进程构成

下面我们来介绍一下 Linux,以及 Linux 与硬件设备的关系。虽然下面的很多内容不仅适用于 Linux,也适用于其他 OS,但为了便于说明,在此不作具体区分。

调用外部设备(以下简称“设备”)是 Linux 的一个重要功能。如果没有 Linux 这样的 OS,就不得不为每个进程单独编写调用设备的代码(图 1-4)。

图 1-4 当不存在 OS 时的设备调用

在这种情况下,会存在以下缺点。

  • 应用程序开发人员必须精通调用各种设备的方法
  • 开发成本高
  • 当多个进程同时调用设备时,会引起各种预料之外的问题

为了解决上述问题,Linux 把设备调用处理整合成了一个叫作设备驱动程序的程序,使进程通过设备驱动程序访问设备(图 1-5)。

图 1-5 进程通过设备驱动程序访问设备

虽然世界上存在各种设备,但对于同一类型的设备,Linux 可以通过同一个接口进行调用(图 1-6)。

图 1-6 通过同一个接口调用同一类型的设备

在某个进程因为 Bug 或者程序员的恶意操作而违背了“通过设备驱动程序访问设备”这一规则的情况下,依然会出现多个进程同时调用设备的情况。为了避免这种情况,Linux 借助硬件,使进程无法直接访问设备。具体来说,CPU 存在内核模式用户模式两种模式,只有处于内核模式时才允许访问设备。另外,使设备驱动程序在内核模式下运行,使进程在用户模式下运行(图 1-7)。

图 1-7 进程在用户模式下运行,设备驱动程序在内核模式下运行

除此之外,还有许多不应被普通进程调用的处理程序,如下所示。

  • 进程管理系统
  • 进程调度器
  • 内存管理系统

这些程序也全都在内核模式下运行。把这些在内核模式下运行的 OS 的核心处理整合在一起的程序就叫作内核。如果进程想要使用设备驱动程序等由内核提供的功能,就需要通过被称为系统调用的特殊处理来向内核发出请求。

需要指出的是,OS 并不单指内核,它是由内核与许多在用户模式下运行的程序构成的。关于 Linux 中的在用户模式下运行的功能,以及作为进程与内核的通信接口的系统调用,我们将在第2章具体说明。

第3章将对负责创建与终止进程的进程管理系统进行说明。

内核负责管理计算机系统上的 CPU 和内存等各种资源,然后把这些资源按需分配给在系统上运行的各个进程(图 1-8)。

图 1-8 内核管理着 CPU 和内存等资源

图 1-8 中负责管理 CPU 资源的进程调度器的相关内容将在第4章详细说明,负责管理内存的内存管理系统的相关内容将在第5章详细说明。

在进程运行的过程中,各种数据会以内存为中心,在 CPU 上的寄存器或外部存储器等各种存储器之间进行交换(图 1-9)。这些存储器在容量、价格和访问速度等方面都有各自的优缺点,从而构成被称为存储层次的存储系统层次结构。从提高程序运行速度和稳定性方面来说,灵活有效地运用各种存储器是必不可少的一环。存储层次的相关内容将在第6章详细说明。

图 1-9 数据在各种存储器之间交换

虽然可以通过设备驱动程序访问外部存储器中的数据,但为了简化这一过程,通常会利用被称为文件系统的程序进行访问(图 1-10)。文件系统的相关内容将在第7章详细说明。

图 1-10 通常利用文件系统访问外部存储器

对于计算机系统来说,外部存储器是不可或缺的。在启动系统时,首先需要做的就是从外部存储器中读取 OS1。此外,为了防止在关闭电源时丢失系统运行期间在内存上创建的数据,必须在关闭电源前把这些数据写入外部存储器。第8章将详细介绍这些外部存储器的性能与特性,以及用于提高其性能的内核的功能。

1准确地说,在读取 OS 之前,还存在以下操作:①通过 BIOS(Basic Input Output System,基本输入 / 输出系统)或 UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)这种固化在硬件上的软件来初始化硬件设备;②运行引导程序来选择需要启动的 OS。