计算机组成

我们可以将计算机的核心硬件逻辑地划分为三大主要部分:

  1. 中央处理器 (CPU)
  2. 内存 (Memory)
  3. I/O 设备 (Input/Output Devices)

为了更直观地理解它们之间的关系,我们可以把计算机想象成一家高效运转的餐厅:

  • 中央处理器 (CPU):就是餐厅里的厨师。它是所有核心计算和逻辑处理的执行者,负责处理每一道“菜品”(即执行指令)。
  • 内存:就是厨师身边的案板或工作台。厨师在烹饪时需要随时取用的食材(数据)和菜谱(指令)都必须临时放在案板上,以便快速存取。案板的大小直接决定了厨师能同时处理多少道菜。
  • I/O 设备:是所有其他非核心处理部件的统称。它对应餐厅里的所有其他物品和通道,比如存放长期食材的仓库(硬盘)、服务员把菜送给顾客的窗口(显示器/网络)、顾客点菜的菜单(键盘/鼠标)等。它们负责数据的输入(进货)和输出(上菜)。

操作系统的角色

操作系统的核心目标是让计算机系统既高效又易用。具体来说,它扮演着以下几个关键角色:

桥梁与抽象层

从硬件与软件交互的角度来看,操作系统可以被视为硬件和应用软件之间的桥梁

底层的硬件操作极其繁琐且富有挑战性(例如,直接操作磁盘控制器特定的寄存器来读取一个字节)。操作系统通过层层封装,将这些复杂的底层硬件操作集转化为一系列易于使用的接口(如 API)提供给上层应用程序。这样,开发者无需关注硬件细节,便可以安全、快捷地开发和使用丰富的应用程序,极大地提高了开发效率。

拓展机 (The Extended Machine)

我们也可以把操作系统看作是一台“拓展机”或“虚拟机”,它通过两种核心手段来扩展硬件的功能:抽象化 (Abstraction)虚拟化 (Virtualization)

1. 抽象化 (Abstraction)

想想看,如果一个用户要读写某个文件,从底层的角度来看,其操作十分枯燥和复杂:

  1. 确定文件在磁盘上的物理位置(磁道、扇区)。
  2. 检查内存空间,如果有必要,清理出足够的空间来容纳读写的数据。
  3. 向磁盘控制器发送指令,移动磁头到指定位置。
  4. 检查磁头读取是否越界。
  5. 检查内存操作是否合法。
  6. 启动 DMA 传输,将文件数据从磁盘传送到内存。

操作系统运用抽象化技术,将这些底层的繁琐细节全部隐藏掉,取而代之的是向用户提供一个简单、高层的接口。例如:用户应用程序只需调用一个简单的 read("/path/to/file") 函数,便可轻松获取文件内容,而无需关心磁头具体在哪个扇区。

2. 虚拟化 (Virtualization)

所谓虚拟化,就是操作系统通过软件手段,让每个运行的进程都“感觉”自己独占了计算机的资源,即使实际上这些资源是被多个进程共享的。

例如,在内存管理中,操作系统会为每个进程模拟一个连续的、私有的虚拟内存地址空间。对进程来说,它在自己的虚拟空间中读写数据。但是,实际上物理内存中对应的地址位置和这个模拟出来的虚拟地址是完全不同的,甚至可能有一部分数据被临时存放在硬盘上。操作系统负责维护这种虚拟地址到物理地址的映射关系。

资源管理 (Resource Management)

操作系统同时也是一个庞大的、高效的资源管理器。它需要管理 CPU 时间、内存空间、I/O 设备等各种稀缺资源,确保它们在多个并发运行的程序之间得到公平、合理的分配。

最好的资源管理例子就是多任务处理 (Multitasking):虽然在旧的单核 CPU 上,同一时刻只能有一个程序在真正执行,但操作系统通过极快地在不同程序之间来回切换(时间片轮转),使得用户感觉多个程序在同时作业。

用我们餐厅的例子来说,这就像是这位厨师懂得统筹时间:在等待某一个菜炖煮(I/O 等待)的过程中,他不会闲着,而是利用这段时间去切另一道菜的配菜(处理另一个进程的计算)。

操作系统的结构

操作系统是一个庞大且复杂的软件系统。其中有一些特别核心、最基本的功能是必不可少的,这些功能被集中在一起,称之为内核 (Kernel)

为了保障系统的安全性,防止应用程序直接操作硬件或破坏其他程序,现代 CPU 的指令集被分为两种:

  1. 特权指令 (Privileged Instructions):这类指令具有很高的权限,可以直接操作硬件、修改内存管理设置等。出于安全考虑,特权指令只能由操作系统内核来使用。
  2. 非特权指令 (Non-privileged Instructions):这类指令权限较低,通常包括算术运算、逻辑运算等,应用程序只能使用这类指令。

为了保证这样的安全性,CPU 提供了两种主要的工作模式,并在它们之间进行切换:

  • 内核态 (Kernel Mode)(或称核心态、特权态):当 CPU 处于内核态时,它可以执行特权指令和非特权指令,拥有对计算机所有硬件资源的完全访问权限。操作系统内核代码就在此模式下运行。
  • 用户态 (User Mode):当 CPU 处于用户态时,只能操作非特权指令。普通的应用程序(进程)在此模式下运行。

操作系统内核架构图

如上图所示,所有和各种硬件直接沟通的操作(如读写磁盘、网络收发、内存分配等),都必须由系统内核来完成。操作系统经过层层封装和抽象,向用户态提供了一套安全、便捷的系统调用库 (System Libraries Calls / System Calls)

上层的应用程序可以通过系统调用来“请求”内核代为执行这些特权操作。此外,更多其他的库(如通用图形库、网络协议库)也会被进一步封装,供程序调用。当然,上层的库和应用程序也是可以直接执行 CPU 指令的,但其范围被严格限制在非特权指令之内。