OSTEP第0期: 操作系统概述
前言
下学期要上 COMP3230 Principles of Operating Systems 这门课程了, 所以打算先把 OSTEP (Operating Systems: Three Easy Pieces) 这本书的内容过一遍, 以便更好地理解课程内容。
本文是 OSTEP 学习笔记 的第0期,主要是介绍一下操作系统的基本概念。
本系列文章列表:
什么是操作系统
操作系统 (Operating System, OS) 简单来说,就是管理计算机硬件和软件资源的程序。他控制着其他软件的运行(例如运行多久、使用多少内存等),并提供用户与计算机交互的界面。
所以,操作系统最基本的两个功能是:
- 资源管理 (Resource Management) 管理资源包括CPU、内存、存储设备、文件等。
- 应用与硬件间的接口 (Interface) 把应用与硬件隔离开来,提供统一的应用程序接口 (Application Program Interfaces, APIs)。 这样应用程序就不需要关心底层硬件的细节,可以更专注于实现自己的功能。
因此,在实现操作系统时,有如下三个主要命题:
- Virtualization (虚拟化):将物理资源抽象成更易用的虚拟资源。
- 让每个应用程序都觉得自己独占了计算机资源。
- Concurrency (并发):允许多个程序同时运行。
- Persistence (持久化):确保数据在程序终止后仍然存在。
- 文件系统,硬盘等。
操作系统的结构
简单来说,操作系统可以分为两大部分:
- 内核 (Kernel):操作系统的核心部分,负责管理硬件资源和提供基本服务。
- 用户空间 (User Space):运行用户应用程序的区域。
也由此产生了多个操作系统结构模型:
- 单体内核 (Monolithic Kernel)
- 层次化内核 (Layered Kernel)
- 微内核 (Microkernel)
- 模块化内核 (Modular Kernel)
- 混合内核 (Hybrid Kernel)
内核态与用户态 (Kernel Mode & User Mode)
CPU 有(至少)两种工作模式:
内核态 (Kernel Mode)
- 也称为特权态 (Privileged Mode) 监控态 (Supervisor Mode)。
- 允许执行所有CPU指令和访问所有内存地址。
- 操作系统内核运行在内核态下。
- 具有最高的权限。
用户态 (User Mode)
- 用户应用程序运行在用户态下。
- 只能执行受限的CPU指令,不能直接访问硬件资源。
- 确保用户程序不会干涉系统或是其他用户程序。
那么,用户程序如何使用操作系统提供的服务呢?这就需要通过系统调用 (System Call)。
系统调用 (System Call)
系统调用是用户程序与操作系统内核之间的接口。用户程序通过系统调用请求内核执行特权操作 通过系统调用,系统在用户态和内核态之间切换,并执行内核中的对应系统调用处理程序。
这往往通过一种称为陷阱 (Trap) 的机制实现。陷阱是一种特殊的中断, 当用户程序执行系统调用时,会触发陷阱,CPU切换到内核态,执行内核中的系统调用处理程序。 执行完毕后,CPU会切换(return-from-trap)回用户态,继续执行用户程序。
操作系统结构模型
单体内核 (Monolithic Kernel)
所有系统组件都包含在内核中。 传统来说,操作系统不会明确模块化它的组件,所以所有的组件都被包含在一个运行在内核态的单一大程序中。 优点: - 组件之间可以直接通讯调用(例如函数调用) - 数据结构可以被简单地共享 - 性能往往更高 缺点: - 组件与硬件直接交互,移植性差 - 组件之间耦合度高,维护困难 案例: - 早期的Unix系统 - Linux内核 - MS-DOS
层次化内核 (Layered Kernel)
将操作系统划分为多个层次,每一层只与其直接上下层交互。 进程的调用会穿过多个层次,直到被处理位置。 效率可能比单体内核低。
优点: - 每一层只与其直接上下层交互,模块化更好 - 易于调试和维护 - 信息隐藏:每一层只暴露必要的接口 缺点: - 由于层次间的调用,性能可能较低 - 设计复杂,划分层次不易 - 不够灵活 - 模型与现实的不服:真实系统过于复杂,难以抽象(参见 Windows NT Story) 案例: - Windows NT (3.x) 的第一次发布
虚拟机 (Virtual Machine):层次化实现的案例
虚拟机 (Virtual Machine, VM) 是一种抽象的计算机系统,它通过软件模拟硬件资源, 允许多个操作系统实例在同一物理硬件上运行。
Virtual Machine Monitor (VMM),也称为Hypervisor,是管理虚拟机的软件层。 它虚拟化了底层硬件资源,并为每个虚拟机提供独立的运行环境,就像 OS for OSs 一样。
容器 (Container) 是一种轻量级的虚拟化技术,它允许多个应用程序在同一操作系统内核上运行, 但每个应用程序都在隔离的用户空间中运行。容器共享主机的内核,但每个容器都有自己的文件系统、网络接口和进程空间。
微内核 (Microkernel)
把许多组件从内核中剥离出来,运行在用户态下,称为服务器 (Servers)。 内核只保留最基本的功能,如 调度 (Scheduling)、虚拟内存 (Virtual Memory) 和 进程间通信 (Inter-Process Communication, IPC)。
优点:
- 易扩展,易移植,易维护
- 更为安全可靠(内核态代码更少)
缺点:
- 性能更低(频繁的用户态与内核态切换,IPC开销)
模块化内核 (Modular Kernel)
大多数线代化操作系统仍旧使用单体内核结构,但通过模块化设计来组织内核组件。
每个核心组件都被分离和实现为独立的模块,而整个系统内核是由这些模块的集合组成的。
总体优点: - 每个模块都独立,受到接口封装保护 - 模块之间可以高效通讯(因为都在内核态) - 可以动态加载/卸载模块 - 更易于扩展维护,新模块可以轻易的添加到系统中
案例:Solaris, Linux 和 传统的 Unix 内核