当我们打开网页浏览器、播放视频、保存文档或者运行游戏时,计算机中的许多组成部分都必须相互配合。
处理器负责执行指令,内存保存当前正在使用的数据,存储设备长期保存文件,键盘和鼠标提供输入,显示器呈现结果,网络硬件则负责与其他计算机交换数据。但是,应用程序通常不会直接控制这些硬件。
在应用程序和硬件之间,存在着计算机中最重要的软件之一:操作系统(Operating System,OS)。
Windows、Linux、macOS、Android 和 iOS 都是操作系统。它们的外观不同,面向的设备也不一样,但都承担着许多相同的基本任务。
操作系统负责管理硬件资源,为程序提供通用服务,并建立一个有组织、受控制的运行环境,让各种应用程序能够正常工作。要真正理解现代计算机,我们就需要了解操作系统到底做了什么。
-
操作系统是最主要的系统软件
计算机拥有各种硬件,但只有硬件还远远不够。
处理器可以执行机器指令,却不会自动知道怎样打开文档、显示窗口、连接 Wi-Fi,或者怎样让多个应用程序安全地同时运行。这些能力都需要软件来实现。
操作系统是协调整台计算机的主要系统软件。它在计算机启动时开始运行,在计算机工作期间保持活动,并负责管理应用程序需要使用的各种资源。
从一个简化的角度来看,计算机可以分成三个层次:应用程序、操作系统和硬件。
应用程序包括浏览器、编辑器、游戏、媒体播放器和开发工具。硬件则包括 CPU、内存、存储设备、显示器、键盘、网络适配器以及其他组件。操作系统就处在应用程序和硬件之间。
-
为什么应用程序不直接控制硬件
假设每一个应用程序都必须独立控制各种型号的硬盘、键盘、显示器和网络适配器,情况会变得非常复杂。
每一位开发者都需要了解成千上万种硬件设备。不同程序可能相互干扰、覆盖重要数据,甚至抢占处理器的全部控制权。一个应用程序中的错误,也可能轻易导致整台计算机崩溃。
因此,操作系统在应用程序和硬件之间提供了受控制的接口。
当应用程序需要读取文件、分配内存、显示图形或者发送网络数据时,它会向操作系统提出请求。操作系统检查这个请求,协调相关硬件完成工作,然后把结果返回给应用程序。
这种设计不仅降低了应用程序的开发难度,也让计算机运行得更加安全。
-
内核是操作系统的核心
操作系统的中心是内核(Kernel)。
内核是系统中拥有高权限的核心部分,负责管理关键资源。它控制对 CPU、内存和硬件设备的访问,同时维护不同运行程序之间的边界。
不过,内核并不等于整个操作系统。
一个完整的操作系统通常还包括命令行工具、图形界面、系统库、后台服务、安装程序和管理工具。内核是这些组件共同依赖的核心。
在 Linux 系统中,Linux 内核需要与大量其他工具组合,才能形成完整的操作系统。在 Windows 和 macOS 中,内核周围同样运行着大量系统服务和用户界面组件。
下一篇教程将进一步介绍内核。
-
操作系统管理 CPU
一台计算机看起来可以同时运行许多程序。我们可以一边听音乐,一边下载文件、编辑文档并接收通知。
CPU 的执行资源是有限的,操作系统需要决定哪些线程可以获得 CPU 时间。它让一个线程运行一段时间,然后可能暂停这个线程,把执行机会交给另一个线程。这个决策过程叫作调度(Scheduling)。
快速切换让我们感觉许多程序正在同时运行。在多核处理器中,多条指令流可以真正并行执行。支持同时多线程的处理器,还可以让一个物理核心同时处理来自多个硬件线程的指令,但这些线程仍然共享核心的执行资源。
无论是哪种情况,操作系统都需要进行组织和调度,避免某一个普通应用程序长期独占处理器资源。
-
操作系统管理内存
程序需要使用内存保存指令、变量、栈以及动态分配的数据。
操作系统会记录哪些内存区域正在使用,哪些区域仍然可用。程序启动时,操作系统为它建立地址空间;程序需要更多内存时,操作系统可以为它分配更多页面;程序结束后,这些资源可以被回收并重新使用。
现代操作系统使用虚拟内存(Virtual Memory),为每个进程提供各自独立而有组织的内存视图。这不仅可以隔离不同程序,也让操作系统能够更加灵活地管理物理内存。
如果某个应用程序试图访问不属于它的内存,硬件和操作系统可以阻止这次访问。因此,一个出现严重错误的应用程序通常只会导致自身崩溃,而不会立即破坏整个系统。
-
操作系统以进程的形式管理程序
存储在磁盘上的程序只是一个被动的文件,其中包含指令和数据。当程序被加载并开始运行后,操作系统会把它表示为一个进程(Process)。
进程不仅仅包含程序代码。它还拥有自己的地址空间、已经打开的文件、安全信息以及操作系统为它维护的其他资源。进程中的执行线程则具有相应的 CPU 执行状态。
操作系统负责创建进程、暂停进程、恢复进程,并最终结束和清理进程。它也提供一些机制,让不同进程在保持边界的同时进行通信。
一个应用程序还可能包含多个执行线程。进程和线程相互关联,但并不是同一个概念,后面的教程会分别介绍它们。
-
操作系统组织文件和存储空间
存储设备内部保存的是一块又一块的数据,但人和应用程序通常使用的是具有名称的文件和文件夹。
操作系统通过文件系统(File System)组织存储的信息。文件系统记录文件名、目录、大小、位置、访问权限以及其他元数据。
当应用程序打开一个文件时,它通常不会亲自搜索磁盘上的原始扇区,而是请求操作系统访问某个路径。操作系统检查访问权限,通过文件系统找到对应的数据,然后协调存储设备完成读取或写入。
不同操作系统支持不同的文件系统,例如 NTFS、APFS 和 ext4。尽管它们的内部设计不同,但都可以把原始存储空间组织成便于使用的结构。
-
设备驱动程序连接操作系统和硬件
计算机可以使用许多不同类型的硬件,包括图形处理器、声音设备、打印机、摄像头、存储控制器和网络适配器。
操作系统通过一种叫作设备驱动程序(Device Driver)的专用软件与这些设备通信。
驱动程序了解某一种设备或者一类设备所使用的寄存器、命令、中断和数据格式。它把操作系统的一般请求转换成对应硬件能够理解的具体操作。
例如,应用程序可能要求通过网络连接发送数据。操作系统中的网络子系统会处理这个请求,然后由驱动程序与网络适配器进行通信。
通过这种分层设计,应用程序通常不需要为市场上的每一种网络适配器编写不同的硬件控制代码。
-
操作系统为应用程序提供通用服务
不同应用程序经常需要使用相同的基本功能,例如打开文件、分配内存、创建进程、进行网络通信、读取输入以及显示输出。
操作系统为这些操作提供了标准的请求方式。
在应用程序与内核的边界上,应用程序通过系统调用(System Call)请求内核服务。不过,大多数开发者不会直接发出原始的系统调用,而是使用编程语言提供的库或者操作系统 API。当操作需要内核参与时,这些库和 API 会通过系统调用请求相应服务。
例如,一个 C 程序可以调用库函数打开文件,而这个库函数最终会请求操作系统完成实际操作。
系统调用是后续教程中的一个重要主题。
-
操作系统保护计算机
资源管理同时也是一个安全问题。
操作系统控制哪些用户和程序可以访问文件、内存、设备以及网络服务。它可以设置权限、隔离进程、验证用户身份,并限制敏感操作。
支持现代通用操作系统的处理器提供不同的权限级别。普通应用程序通常运行在受限的用户模式(User Mode),内核运行在高权限的内核模式(Kernel Mode)。
普通应用程序不能随意执行特权指令,也不能直接修改关键的内核内存。它必须通过受控制的接口向操作系统请求服务。
这种设计无法消除所有安全漏洞,却建立了必不可少的边界,限制了普通程序可以执行的操作。
-
操作系统提供用户界面
操作系统也为人们提供了与计算机交互的方式。
图形用户界面提供窗口、图标、菜单、鼠标指针和触控操作。命令行界面则允许用户输入文本命令。许多操作系统同时支持这两种方式。
用户界面非常直观,因此人们常常把它当成操作系统本身。但实际上,用户界面只是完整操作系统的一部分。
即使没有图形桌面,CPU 调度、内存保护、文件管理和设备控制仍然会继续运行。这也是服务器和嵌入式设备可以在没有传统桌面界面的情况下运行操作系统的原因。
-
启动一个应用程序时发生了什么
假设我们单击了浏览器图标。
用户界面识别这个操作,并请求操作系统启动浏览器。操作系统在存储设备上找到可执行文件,创建一个新进程,为它建立虚拟地址空间,并准备程序需要的代码和数据。某些页面可能会等到真正使用时才被加载。
接下来,操作系统安排初始线程运行,由调度器为它分配 CPU 时间。浏览器运行后,会申请更多内存、打开配置文件、与显示系统通信、接收键盘和鼠标输入,并通过网络发送和接收数据。
这个过程涉及许多硬件组件,但应用程序通过操作系统管理的服务来使用这些硬件。
看似简单的一次单击,实际上启动了一系列横跨软件和硬件的协调操作。
-
不同设备需要不同的操作系统
台式计算机、服务器、智能手机、汽车、路由器、工业控制器和小型嵌入式设备的需求并不相同。
桌面操作系统重视交互式应用程序以及广泛的硬件支持;服务器操作系统可能更加重视可靠性、网络、安全性和同时运行大量服务的能力;移动操作系统还必须谨慎管理电池电量、传感器、无线连接和应用程序权限。
有些嵌入式系统使用实时操作系统(Real-Time Operating System,RTOS),这类系统重视响应时间的可预测性,以满足规定的时间要求。另一些嵌入式设备则可能根本不运行完整的操作系统。
不同设备上的具体实现会发生变化,但核心思想相同:操作系统负责组织资源,并为软件提供受控制的运行环境。
-
操作系统既是管理者,也是抽象层
操作系统承担着两个密切相关的角色。
首先,它是一个资源管理者,负责决定如何分配和共享 CPU 时间、内存、存储空间以及各种设备。
其次,它提供各种抽象(Abstraction)。操作系统不会强迫每个程序处理原始的硬件细节,而是向程序提供进程、虚拟内存、文件、套接字和窗口等更容易使用的概念。
文件比一组原始存储块更容易使用,进程比一串没有组织的 CPU 指令更容易管理,虚拟内存也比直接访问任意物理内存更加方便和安全。
这些抽象是操作系统最重要的贡献之一。
总结
操作系统是连接应用程序和计算机硬件的主要系统软件。
它负责管理 CPU 时间,分配和保护内存,以进程的形式组织程序,管理文件和存储空间,通过驱动程序与设备通信,并为应用程序提供通用服务。
操作系统还会建立安全边界,并为用户提供与计算机交互的方式。因此,操作系统绝不仅仅是一个桌面、一组图标或者一个启动画面。它既是资源管理者,也是硬件之上的抽象层。
应用程序看到的是进程、文件、虚拟地址和标准接口。在这些概念的下面,操作系统正在协调处理器、内存芯片、存储设备以及许多其他硬件组件。
理解操作系统这一层,可以为继续学习内核、用户模式与内核模式、系统调用、进程、线程、调度、中断、设备驱动程序和文件系统建立基础。
下一篇教程,我们将进一步了解操作系统最重要的组成部分:内核。