← 返回知识库

基础知识:操作系统

一、什么是操作系统

操作系统是一组长期运行的系统软件,位于应用程序与计算机硬件之间。它向上为应用程序提供稳定、统一、受保护的运行环境;向下管理并调度 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. 打开并保存一个文件

应用通过系统调用请求打开文件,操作系统检查权限、查找目录和文件信息、缓存磁盘数据,最后由设备驱动完成实际读写。

对应概念:文件系统、权限、缓存、输入输出

下一步练习

从上面任选一个案例,用 「谁发起请求 → 哪个进程处理 → 哪些线程工作 → 操作系统管理什么资源」 的顺序,画一张自己的流程图。看懂一次日常操作背后的进程、线程、系统调用与资源变化,就是最好的入门实践。