目录

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)。 这样应用程序就不需要关心底层硬件的细节,可以更专注于实现自己的功能。

因此,在实现操作系统时,有如下三个主要命题:

  1. Virtualization (虚拟化):将物理资源抽象成更易用的虚拟资源。
    • 让每个应用程序都觉得自己独占了计算机资源。
  2. Concurrency (并发):允许多个程序同时运行。
  3. Persistence (持久化):确保数据在程序终止后仍然存在。
    • 文件系统,硬盘等。

操作系统的结构

简单来说,操作系统可以分为两大部分:

  • 内核 (Kernel):操作系统的核心部分,负责管理硬件资源和提供基本服务。
  • 用户空间 (User Space):运行用户应用程序的区域。

也由此产生了多个操作系统结构模型

  • 单体内核 (Monolithic Kernel)
  • 层次化内核 (Layered Kernel)
  • 微内核 (Microkernel)
  • 模块化内核 (Modular Kernel)
  • 混合内核 (Hybrid Kernel)

内核态与用户态 (Kernel Mode & User Mode)

CPU 有(至少)两种工作模式:

  1. 内核态 (Kernel Mode)

    • 也称为特权态 (Privileged Mode) 监控态 (Supervisor Mode)。
    • 允许执行所有CPU指令和访问所有内存地址。
    • 操作系统内核运行在内核态下。
    • 具有最高的权限。
  2. 用户态 (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 内核

参考资料