一、什么是操作系统
操作系统是一组长期运行的系统软件,位于应用程序与计算机硬件之间。它向上为应用程序提供稳定、统一、受保护的运行环境;向下管理并调度 CPU、内存、磁盘、网卡等真实硬件。macOS、Windows、Linux、Android、iOS 都是操作系统。
它的职责可以归为四句话:
- 封装硬件:把杂乱的硬件细节藏起来,暴露出标准接口,让上层应用不用关心每种屏幕、每种磁盘怎么操作。
- 管理资源:控制整个计算机系统的硬件资源,进行合理组织、调度与分配。
- 服务用户:为用户提供良好的界面和接口,方便对计算机的使用。
- 辅助观测:提供任务管理器、活动监视器、终端工具等辅助功能,让用户能掌控系统运行状态。
1.1 核心功能
操作系统做的事看起来多,拆开看其实就六块。
| 功能 | 在做什么 | 关键词 |
|---|---|---|
| 进程与线程管理 | 创建、暂停、结束进程与线程,决定哪个线程下一刻使用 CPU | 调度、上下文切换 |
| 内存管理 | 分配、映射、保护和回收内存,让每个进程拥有相对独立的地址空间 | 虚拟内存、页表 |
| 文件与存储管理 | 把磁盘组织成文件和目录,维护名称、位置、权限、读写状态 | 文件系统、缓存 |
| 设备与输入输出 | 借助驱动统一控制屏幕、键盘、磁盘、摄像头、网卡等不同设备 | 驱动、中断、I/O |
| 通信与网络 | 帮助同一台电脑上的进程交换数据,也负责与外部计算机通信 | 管道、套接字、IPC |
| 权限与安全 | 管理用户身份和资源访问权限,用隔离机制限制程序能执行的操作 | 用户、权限、隔离 |
1.2 运行时常用概念
几个容易混的词,分开记清楚:
- 程序 vs 应用程序:程序是躺在磁盘上的代码与数据,是静态的;还没运行时它不是进程。应用程序是面向用户完成某类任务的软件产品,运行时可能包含一个或多个进程。
- 进程 vs 线程:进程是程序的一次运行实例,也是分配和隔离资源的容器。线程是进程中真正执行代码的工作流;同一进程的线程共享大部分资源,但各有自己的调用栈。
- 父子进程与 PID / PPID:一个进程创建另一个进程时,前者是父、后者是子,仍是两个独立进程。PID 是进程的唯一编号,PPID 是其父进程的编号。
- 系统调用、用户态、内核态:系统调用是应用向内核请求服务的受控入口(创建进程、读文件、申请内存……)。用户态是普通应用运行的受限状态;内核态是操作系统执行受保护服务时使用的高权限状态。
- 进程间通信、并发、并行:进程间通信是不同进程通过管道、套接字、共享内存、Mach Port 等机制交换数据。并发是多个任务交替推进;并行是多个任务在多个 CPU 核心同一时刻真正执行。
二、操作系统的组成架构
从应用一路向下,可以看到四层在协作:
应用层 浏览器 · 编辑器 · 微信 · 终端 → 提出"打开文件、创建进程、发送数据"等请求
↓
接口层 系统调用 → 用户程序进入内核服务的安全入口
↓
内核层 进程调度 · 内存管理 · 文件系统 · 网络 · 驱动 → 决定谁能使用什么资源、何时使用
↓
硬件层 CPU · 内存 · 磁盘 · 网卡 · 屏幕 → 真正完成计算、存储、通信与输入输出
每一层只对上一层负责,应用并不直接操作硬件。
内核层内部又按资源类型拆成若干子系统,对应前面那六项核心功能:
- CPU —— 进程与线程管理:应用请求创建线程,操作系统决定谁何时运行、在哪个 CPU 核心上运行、何时暂停。
- Memory —— 内存管理:为每个进程提供看似独立的地址空间,分配、映射、保护、回收,避免应用随意读写彼此的数据。
- Storage —— 文件系统:把磁盘块组织成文件和目录,并管理名称、权限、缓存、读写位置,以及崩溃后的数据一致性。
- I/O —— 设备与通信:通过驱动使用硬件,通过管道、套接字、Mach Port 等机制帮助进程间安全通信。
一个容易混淆的点:活动监视器里的”端口”主要指 macOS 用于进程间通信的 Mach Port,不是网站常说的 80、443、8000 等 TCP/UDP 网络端口。两者单词一样、概念不同。
三、操作系统的发展历程
操作系统的发展,本质上是在效率、易用性、隔离性与规模之间不断取舍。新机制往往不是凭空出现,而是为了解决上一代系统暴露出的具体问题。
1940s–1950s 手工操作与批处理
早期计算机一次只运行一个任务,操作员手工装载程序。
批处理随后把任务排成队列,减少机器等待人的时间。
1960s 多道程序与分时系统
多个程序同时驻留内存;当一个任务等待 I/O 时,CPU 转去运行另一个。
分时进一步让多个用户感觉自己独占计算机。
1969–1970s Unix 与可移植系统
Unix 形成了进程、文件、管道等影响深远的抽象,并主要用 C 重写,
使操作系统更容易移植到不同硬件。
1980s 个人计算机与图形界面
计算机从机房走向个人桌面,操作系统开始重点解决交互、图形界面、
外设支持与普通用户的易用性。
1990s 现代内核与网络普及
Linux、Windows NT 等系统发展壮大,内存保护、多任务、权限和网络
成为桌面及服务器的基础能力。
2000s–现在 多核、移动、云与安全
操作系统需要充分利用多核 CPU,并支撑手机、虚拟机、容器和大规模
云服务;隔离、能耗与安全的重要性持续上升。
读历史的方法不是背年份。每看到一个新机制,都问三件事:当时遇到了什么问题?旧方案为什么不够?新方案又付出了什么代价?
四、身边的应用案例
把上面的抽象放回到每天使用的 Mac,可以更直观地看到操作系统在做什么。
A. 打开 WorkBuddy
主进程负责应用生命周期,Renderer 进程绘制页面,GPU 进程处理图形任务;每个进程内部又有多个线程。操作系统为它们分配 PID、隔离内存并调度线程。
对应概念:应用、多进程、线程、进程间通信
B. 在终端运行命令
Shell 创建子进程来执行命令,通常等待它结束,再读取退出状态并显示新的提示符。用管道连接两个命令时,操作系统还要负责在进程之间传递数据。
对应概念:父子进程、系统调用、管道、文件描述符
C. 播放音乐同时操作界面
播放器可以让不同线程分别处理界面、音频解码和声音输出。即使后台正在解码,界面线程仍能立即响应暂停按钮。
对应概念:并发、线程调度、共享内存、设备驱动
D. 打开并保存一个文件
应用通过系统调用请求打开文件,操作系统检查权限、查找目录和文件信息、缓存磁盘数据,最后由设备驱动完成实际读写。
对应概念:文件系统、权限、缓存、输入输出
下一步练习
从上面任选一个案例,用 「谁发起请求 → 哪个进程处理 → 哪些线程工作 → 操作系统管理什么资源」 的顺序,画一张自己的流程图。看懂一次日常操作背后的进程、线程、系统调用与资源变化,就是最好的入门实践。