408操作系统考纲知识点

【考查目标】

1.掌握操作系统的基本概念、方法和原理,了解操作系统的结构、功能和服

务,理解操作系统所采用的策略、算法和机制。

2.能够从计算机系统的角度理解并描述应用程序,操作系统内核和计算机硬

件协作完成任务的过程。

3.能够运用操作系统原理,分析并解决计算机系统中与操作系统相关的问

题。

一、操作系统概述

这部分是操作系统的"绪论",旨在建立对OS的整体认知框架。它解释OS是什么、为什么需要它、它是如何构建和启动的。理解这些概念对后续学习进程、内存、文件等具体模块至关重要。

(一) 操作系统的基本概念
  • 定义 :操作系统(OS)是管理计算机硬件与软件资源的系统软件,是用户与计算机硬件之间的接口。

  • 核心角色

    1. 管理者 :管理CPU、内存、文件、设备等资源。目标是安全、高效

    2. 服务提供者:通过系统调用(System Call)为应用程序提供服务。

    3. 接口:为用户提供使用计算机的接口(命令行接口CLI、图形用户界面GUI)。

    4. 虚拟机/扩展机:将复杂的硬件操作封装起来,提供一个更简洁、强大、统一的抽象接口(如文件、进程),使得程序员和用户无需关心底层硬件细节。

  • 四大核心功能(对应后续章节)进程管理内存管理文件管理设备管理

  • 408真题常见考点

    • 选择题:直接考查OS的定义、目标和主要功能。

    • (与后续结合)判断某项具体功能(如处理机调度、地址映射、创建文件)属于OS哪个管理模块。

(二) 操作系统的发展历程

理解发展史是为了理解现代OS设计选择的动因 。推动力是:提高资源利用率、方便用户使用

  1. 手工操作阶段:人机矛盾突出,CPU等待人工操作,利用率极低。

  2. 批处理系统

    • 单道批处理 :引入监督程序 (OS雏形),实现作业的自动切换。解决了人机矛盾,但CPU与I/O设备速度不匹配,CPU在I/O时仍空闲。

    • 多道批处理划时代的意义 。内存中同时驻留多道程序,当一道程序因I/O请求阻塞时,CPU立即切换到另一道程序。实现了CPU与I/O设备的并行工作 ,极大提高了系统吞吐量和资源利用率。核心挑战:需要解决资源竞争和管理(内存分配、CPU调度、同步互斥)。

  3. 分时系统 :为了满足人机交互 需求。将CPU时间划分为很短的时间片 ,轮流为多个终端用户服务。由于人的反应时间远慢于计算机,每个用户感觉像是独占计算机。目标及时响应。Unix是典型代表。

  4. 实时系统 :应用于需要严格时限 控制的领域(如工业控制、导弹制导)。分为硬实时 (错过时限会导致灾难性后果)和软实时(容忍偶尔错过)。

  5. 现代OS发展:网络操作系统、分布式操作系统、嵌入式操作系统等。

  • 重难点与关联

    • 多道程序技术 是理解现代OS并发性 的基础。它直接导致了进程 概念的产生和进程管理的复杂性。

    • 对比批处理 (追求吞吐量)、分时 (追求响应时间)、实时(追求时限)的不同设计目标。

(三)程序运行环境 - 硬件基础与OS接口

这是连接《计算机组成原理》与《操作系统》的关键桥梁,是理解OS如何实现"管理"和"保护"的基石。

  • 1. CPU运行模式(模式位)

    • 用户模式(User Mode, 目态)

      • 应用程序运行的模式。

      • 权限受限 :不能执行某些特权指令(如直接操作硬件、修改CPU模式位、开关中断等),只能访问自己的内存空间。

    • 内核模式(Kernel Mode, 管态/核心态)

      • 操作系统内核运行的模式。

      • 拥有最高权限:可以执行所有指令,访问所有内存空间。

    • 目的 :实现保护 。防止应用程序有意或无意地破坏系统或其他程序。这是操作系统安全性的基石

    • 模式切换 :用户程序通过系统调用/中断/异常进入内核,硬件自动将模式从用户态切换为核心态;从内核返回用户程序时,再切换回用户态。

  • 2. 中断和异常的处理

    • 中断(外部) :来自CPU外部,与当前执行指令无关,用于处理外部设备事件。可屏蔽

    • 异常(内部) :由CPU正在执行的指令直接引发 ,如除零、缺页、非法指令、系统调用指令(int 0x80/syscall)。不可屏蔽

    • 处理流程(硬件+软件)

      1. 检测:硬件在每个指令周期末尾检测。

      2. 响应 :保存现场(PC, PSW等),关中断(可嵌套时再开),根据中断/异常向量号查表。

      3. 处理 :跳转到对应的中断服务程序(ISR)异常处理程序(OS内核代码)执行。

      4. 恢复:恢复现场,开中断,返回被中断点。

    • 重要性 :中断/异常是操作系统获得CPU控制权的唯一途径 。没有中断,多道程序就无法实现并发。这是OS实现并发主动管理的硬件机制。

  • 3. 系统调用

    • 定义 :OS提供给应用程序的编程接口(API) ,是应用程序主动请求OS内核提供服务的唯一方式。

    • 与库函数/API的关系

      • API(如C库的printf)是函数定义。

      • 部分API(如open, fork)内部封装了系统调用

      • 系统调用是进入内核的特定指令 (如int 0x80syscall)。

      • 关系:用户程序 -> 库函数API -> 系统调用 -> OS内核服务

    • 执行过程

      1. 用户程序传递系统调用号和参数。

      2. 执行陷入指令 (Trap Instruction),触发一个软中断/异常

      3. CPU切换到核心态,根据系统调用号查系统调用表,跳转到对应服务例程。

      4. 内核执行服务(如读文件、创建进程)。

      5. 返回结果,恢复用户态,继续执行用户程序。

    • 408真题常见考点

      • 区分系统调用库函数调用

      • 理解系统调用过程中模式切换堆栈切换参数传递等细节。

  • 4. 程序的链接与装入 & 5. 程序运行时内存映像与地址空间

    • 链接 :将多个目标文件(.o)和库文件合并成一个可执行文件。解决外部符号引用。方式:静态链接 (运行时独立)、装入时动态链接运行时动态链接

    • 装入 :将可执行文件加载到内存。方式:绝对装入 (早期)、可重定位装入 (静态重定位, 装入时修改地址)、动态运行时装入 (动态重定位, 需要MMU硬件支持, 在指令执行时才进行地址转换)。

    • 地址空间

      • 逻辑地址(虚拟地址):程序员看到的地址,从0开始编址。

      • 物理地址:内存单元的实际地址。

    • 内存映像:一个进程在内存中的典型布局(由低地址到高地址):

      1. 代码段(Text):只读,存放程序指令。

      2. 数据段(Data):存放已初始化的全局/静态变量。

      3. BSS段:存放未初始化的全局/静态变量(内容全0)。

      4. 堆(Heap):动态分配的内存,向高地址增长。

      5. 栈(Stack):函数调用时使用,存放局部变量、返回地址等,向低地址增长。

      6. 内核空间(每个进程虚拟地址空间的高位部分,映射到相同的物理内核内存)。

    • 重要性 :这部分是学习内存管理(第四章) 的绝对前提。必须理解地址空间的抽象是OS提供的重要抽象之一,它让每个进程感觉自己独占整个内存。

  • 408真题常见考点

    • 综合应用题:给出进程的内存布局图,要求计算某个变量(如局部变量、全局变量、malloc分配的指针)的大致地址范围。

    • 选择题:比较静态链接与动态链接的优缺点。

(四)操作系统结构
  • 1. 分层结构 :将OS分为若干层,每层基于其下层提供的服务构建,并为上层提供服务。优点 :易于理解和调试,依赖清晰。缺点:层间通信开销可能影响效率。

  • 2. 模块化/宏内核(单体结构) :如传统Unix、Linux。将OS所有主要功能(进程管理、内存管理、文件系统等)作为一个大的整体运行在内核空间。

    • 优点 :模块间直接函数调用,性能高

    • 缺点:内核庞大,耦合度高,一个模块的错误可能导致整个系统崩溃;难以扩展和维护。

  • 3. 微内核结构 :如Mach、Minix。将内核最小化,只保留最核心的功能(进程间通信IPC、少量内存管理、基本的调度)。其他服务(文件系统、设备驱动、网络协议栈)作为独立的用户态进程(服务器) 运行。

    • 优点 :内核小,可靠性高、可扩展性好、易于移植

    • 缺点 :服务间需要通过IPC通信,性能(尤其是频繁通信时)可能成为瓶颈

  • 4. 外核结构 :一种研究性思想。外核负责将硬件资源安全地多路复用 给多个应用程序,而将资源管理的策略(如如何调度CPU、如何组织文件)交给用户态的库。目标是给应用程序更大的灵活性和控制权。

  • 408真题常见考点

    • 比较宏内核微内核在性能、可靠性、可扩展性等方面的优缺点。这是高频选择题考点。
(五)操作系统引导
  • 过程(以x86为例)

    1. BIOS/UEFI阶段 :计算机加电,CPU从固定地址(如0xFFFF0)执行固件代码。进行加电自检(POST) ,然后按照启动顺序读取启动设备 的第一个扇区(主引导记录MBR 或UEFI分区中的引导程序)到内存固定位置(如0x7C00)。

    2. Bootloader阶段 :MBR中的小程序(如GRUB)被执行。它的任务是加载操作系统内核映像到内存中。现代Bootloader功能复杂,可以显示菜单、加载模块、解压内核等。

    3. 内核初始化阶段 :CPU控制权交给内核入口点。内核进行自身初始化 (解压、设置页表、初始化中断描述符表IDT、初始化关键子系统),最终创建第一个用户进程(如initsystemd,完成引导。

  • 重难点 :理解这是一个从"裸机"到"有管理能力环境"的逐层搭建过程,每一步都依赖于前一步建立的环境。

(六)虚拟机
  • 基本概念 :通过虚拟机监控程序(VMM/Hypervisor) 在物理硬件上创建出多个隔离的、完整的计算机系统(虚拟机)的软件环境。

  • 类型

    • 类型一(裸金属) :Hypervisor直接运行在硬件上(如VMware ESXi, Xen, KVM+Linux)。性能高,用于服务器虚拟化。

    • 类型二(托管型) :Hypervisor作为应用程序运行在宿主OS之上(如VMware Workstation, VirtualBox)。易于安装使用

  • 关键技术

    • 虚拟化CPU :通过陷入再模拟技术。当虚拟机中的OS执行特权指令时,会陷入到Hypervisor,由Hypervisor模拟指令行为。

    • 虚拟化内存 :需要维护虚拟物理地址真实物理地址的映射(影子页表或硬件辅助如Intel EPT)。

  • 与容器技术的对比 :虚拟机虚拟化完整的硬件和操作系统,隔离性强但开销大 ;容器(如Docker)共享宿主OS内核,只虚拟化运行环境,轻量、快速启动、资源占用少,但隔离性较弱

  • 408真题常见考点

    • 区分两类虚拟机的架构和应用场景。

    • 理解虚拟机与容器(Container)的本质区别。

总结与408备考策略

  1. 建立宏观框架:本章是OS的"地图"。必须清晰理解OS的定义、目标、四大管理功能,以及发展历程背后的逻辑。

  2. 攻克核心枢纽"(三)程序运行环境" 是本章乃至本学科最核心、最基础的部分。必须透彻理解:

    • CPU双模式 :它是OS实现保护的硬件基础。

    • 中断/异常 :它是OS实现并发主动管理的硬件机制。

    • 系统调用 :它是OS对上层提供服务的标准接口

    • 地址空间 :它是OS为进程提供的最重要抽象,是内存管理的前提。

  3. 理解结构演化 :对宏内核/微内核的对比,以及虚拟机/容器的概念,反映了计算机系统设计在性能、可靠性、灵活性、资源开销之间不断权衡与演进的思想。

  4. 真题导向:本章真题多为选择题和概念性简答题。重点在于辨析概念(如系统调用 vs API)、理解过程(如引导过程)、比较优劣(如内核结构、虚拟化技术)。

掌握好概述部分,就如同掌握了操作系统这座大厦的设计蓝图和地基原理,后续学习进程、内存等具体楼层时,才能明白每一部分在整个系统中的地位和作用。

二、进程管理

进程管理是操作系统的核心,它解决了"如何在单CPU上实现多任务并发"这一根本问题。

(一)进程与线程
  • 1. 进程与线程的基本概念

    • 进程资源分配的基本单位 。进程是程序的一次执行过程,是动态的 。进程实体(又称进程映像)包括:PCB(进程控制块)、程序段、数据段

    • 线程CPU调度的基本单位 。线程是进程中的一个执行流,共享进程的资源(内存、文件等),但拥有独立的线程ID、程序计数器PC、寄存器集合、栈

    • 为什么引入线程

      1. 减少并发开销:创建/切换线程比进程开销小得多。

      2. 提高并发粒度:一个进程内的多个线程可以并发执行(如Web服务器同时处理多个请求)。

      3. 充分利用多核:线程可以映射到不同CPU核心上真正并行。

    • 类比:进程是"车间",拥有厂房、原料(资源)。线程是"工人",在车间里工作,共享车间的资源,但各自独立完成不同工序(执行流)。

  • 2. 进程/线程的状态与转换 - 核心模型

    • 三态模型运行态、就绪态、阻塞态(等待态)

    • 五态模型(更完整,408常考) :在三态 基础上增加创建态终止态

    • 重要转换

      • 就绪 -> 运行:被调度程序选中。

      • 运行 -> 就绪:时间片用完,或被更高优先级进程抢占。

      • 运行 -> 阻塞主动请求某种资源/事件(如I/O操作、等待信号量)。

      • 阻塞 -> 就绪:等待的资源可用/事件发生(如I/O完成)。

    • 关键点阻塞是进程/线程自身的行为(主动),而调度/抢占是操作系统的行为(被动)

  • 3. 线程的实现 - 重难点

    • 内核级线程(KLT, 1:1模型) :线程的管理工作(创建、调度、同步)完全由操作系统内核 负责。用户程序通过系统调用来操作线程。

      • 优点 :内核知道所有线程,可以将一个进程的多个线程调度到多个CPU核心上实现真正并行;一个线程阻塞,内核可调度该进程的其他线程。

      • 缺点 :线程操作需要陷入内核,开销较大。

    • 用户级线程(ULT, N:1模型) :线程的管理工作由用户空间的线程库(如早期Java线程库)完成,内核对此一无所知,内核的调度单位仍然是进程。

      • 优点 :线程操作在用户态 完成,无需陷入内核,切换极快、开销极小;可自定义调度算法。

      • 致命缺点一个线程阻塞(如发起系统调用),则整个进程(包括其所有用户级线程)都被内核阻塞 ,因为内核看不到其他线程;无法利用多核CPU,因为内核调度的最小单位是进程。

    • 组合方式(N:M模型):现代系统(如Java NIO, Go goroutine)采用混合模型。用户级线程库管理大量"轻量级线程",并将其映射到少量内核级线程上执行。结合了两者优点,但实现复杂。

  • 4. 进程与线程的组织与控制

    • PCB(进程控制块) :进程存在的唯一标识,是内核中最重要的数据结构。包含:

      • 进程描述信息:PID, 用户标识。

      • 进程控制信息:状态、优先级、程序入口地址。

      • 资源信息:打开文件列表、内存分配情况。

      • CPU现场信息 :当进程被切换出去时,其寄存器内容(PC, SP等) 保存在PCB中。这是上下文切换的关键。

    • 组织方式 :通过链表索引表组织,便于调度器查找(如就绪队列、阻塞队列)。

  • 5. 进程间通信(IPC)

    • 共享内存 :多个进程映射到同一块物理内存区域。最快 的IPC方式,因为数据不需要在内核和用户空间之间复制。但需要同步机制(如信号量) 来防止竞态条件。

    • 消息传递 :进程间通过发送(send)/接收(receive) 原语交换格式化消息。分为:

      • 直接通信:显式指定发送/接收方。

      • 间接通信 :通过"信箱"(Message Queue)中转。解耦了发送和接收进程

    • 管道(Pipe) :一种特殊的文件 ,用于连接一个读进程和一个写进程,实现单向、先进先出 的字节流通信。|操作符就是管道。

      • 匿名管道:只能用于具有亲缘关系的进程(如父子进程)。

      • 命名管道(FIFO):有文件路径名,可用于任意进程。

    • 信号(Signal) :一种异步 通知机制,用于通知进程某个事件 已发生(如SIGKILLSIGINT(Ctrl+C))。处理简单,但不能携带大量信息。

  • 408真题常见考点

    • 选择题:进程/线程的定义、区别,状态转换的原因。

    • 综合题:分析用户级/内核级线程在系统调用阻塞多核利用场景下的表现。

    • 给出一段代码(如fork),分析进程/线程的创建和执行流。

(二)CPU调度与上下文切换
  • 1-3. 调度的基本概念、目标与实现

    • 调度的层次

      • 高级/作业调度 :从外存后备队列中选择作业调入内存,创建进程。发生频率最低

      • 中级/内存调度 :将暂时不能运行的进程调至外存"挂起",反之调入。引入了挂起态

      • 低级/进程/CPU调度 :从就绪队列中选择一个进程,分配CPU。发生频率最高(毫秒级),是本章重点。

    • 调度方式

      • 非抢占式 :进程一旦获得CPU,就一直运行直到终止或主动阻塞。实现简单,但响应慢

      • 抢占式 :OS可以强行暂停 正在运行的进程,将CPU分配给更重要的进程。现代OS通用方式,能提供更好的响应性。

    • 闲逛进程 :当就绪队列为空时,调度器会执行一个特殊的、优先级最低的闲逛进程 。它执行一条特殊的指令(如HLT),使CPU进入低功耗状态,直到下一个中断发生。

  • 4. CPU调度算法 - 必考计算题

    • 评价指标 :CPU利用率、系统吞吐量、周转时间(提交到完成)、带权周转时间(周转时间/运行时间,衡量公平性)、等待时间、响应时间(提交到首次响应)。

    • 经典算法

      1. 先来先服务(FCFS) :非抢占,对长作业有利,对短作业不利(护航效应),可能导致平均等待时间很长。

      2. 短作业优先(SJF/SPF)理论上平均等待时间最短 。非抢占(SJF)或抢占(SRTN-最短剩余时间优先)。难点 :需要预知作业运行时间,可能导致长作业饥饿

      3. 优先级调度:可为进程设置静态或动态优先级。可能导致低优先级进程饥饿。

      4. 时间片轮转(RR) :专为分时系统 设计。将所有就绪进程排成FIFO队列,轮流执行一个时间片性能高度依赖于时间片大小:太大退化为FCFS;太小导致频繁上下文切换,开销大。

      5. 多级队列(MLQ) :将就绪队列分为多个独立队列(如前台交互队列-RR,后台批处理队列-FCFS),每个队列有自己的调度算法。队列间可采用固定优先级时间片划分

      6. 多级反馈队列(MLFQ)综合了RR和优先级,且能动态调整 。是最通用、最接近实际OS的算法。

        • 规则:进程初始进入最高优先级队列;用完时间片未结束则降级 到下一队列;在低优先级队列等待时间过长可能被升级(防止饥饿)。

        • 优点:短作业能快速完成,长批处理作业也能得到执行,I/O密集型(交互型)进程保持在高优先级队列获得良好响应。

    • 408真题风格 :给出一组进程的到达时间、运行时间、优先级,要求手工模拟调度过程,计算完成时间、周转时间、带权周转时间、平均等待时间等。

  • 5. 多处理机调度 :更复杂,考虑负载均衡缓存亲和性(尽量让进程在同一个CPU上运行以减少缓存失效)等。

  • 6. 上下文切换机制 - 核心过程

    • 上下文:一个进程/线程运行时,CPU中所有寄存器的值(PC, SP, 通用寄存器等)和状态。

    • 切换过程(发生在内核态):

      1. 保存当前进程的上下文到其PCB中。

      2. 修改当前进程状态(如从运行改为就绪/阻塞),并将其PCB移到相应队列。

      3. 调度器选择一个新进程,修改其状态为运行。

      4. 从新进程的PCB中恢复其上下文到CPU寄存器。

      5. 切换地址空间(切换页表寄存器,这是开销较大的部分)。

      6. 跳转到新进程被中断的代码位置继续执行。

    • 开销:上下文切换需要时间和CPU资源,过于频繁会降低系统效率。

(三)同步与互斥 - 最核心、最难的部分
  • 1. 同步与互斥的基本概念

    • 临界资源:一次仅允许一个进程使用的资源(如打印机、共享变量)。

    • 临界区 :进程中访问临界资源的代码段

    • 互斥 :保证对临界资源的访问是排他的。

    • 同步 :在互斥的基础上,要求多个进程按照某种先后顺序执行(如生产者先生产,消费者才能消费)。

  • 2. 基本的实现方法

    • 软件方法 :Peterson算法、Dekker算法等。复杂且难以扩展到多进程,现代系统已不使用,但有助于理解互斥的本质

    • 硬件方法

      • 关中断 :进入临界区前关中断,离开后开中断。简单但仅适用于单核,且将权力交给用户进程很危险。

      • 硬件原子指令 :现代计算机提供的Test-and-Set(TS)指令Swap/XCHG指令 。它们是实现 等高级同步原语的硬件基础

  • 3. 锁

    • 一种最直观的互斥机制,只有"上锁"和"解锁"两种状态。

    • 忙等待锁(自旋锁):获取不到锁时,进程在循环中持续检查适用于锁持有时间极短的场景(如内核数据结构),避免上下文切换开销。

    • 睡眠锁:获取不到锁时,进程主动阻塞 ,让出CPU。适用于锁持有时间较长的场景

  • 4. 信号量(Semaphore) - 核心机制

    • 定义 :一个整数变量 S,只能通过两个不可分割的原子操作来访问:

      • P(S) / wait(S):若S>0,则S--;否则进程阻塞 ,直到S>0

      • V(S) / signal(S)S++,并唤醒一个等待在该信号量上的进程(如果有)。

    • 类型与应用

      • 互斥信号量(Mutex):初始值 = 1。用于实现互斥。

      • 同步信号量(资源信号量):初始值 = N(可用资源数)。用于实现同步和资源计数。

    • 使用信号量的核心原则P、V操作必须成对出现。互斥的P、V在同一个进程内;同步的P、V在不同进程内。

  • 5. 条件变量 :常与锁(互斥锁)配合使用。当某个条件不满足时,线程可以释放锁并进入等待 ;当条件可能被改变时,其他线程可以唤醒等待该条件的线程。

  • 6. 经典同步问题 - 必考大题

    • 生产者-消费者问题最经典、最重要 。核心是维护一个有界缓冲区

      • 信号量设置mutex(互斥访问缓冲区,初值1), empty(空槽数量,初值N), full(满槽数量,初值0)。

      • 关键对缓冲区的互斥访问(P(mutex))必须放在对资源信号量(P(empty))的后面,否则可能引发死锁。

    • 读者-写者问题:允许多个读者同时读,但写者必须独占。

      • 方案读者优先 (可能导致写者饥饿)或写者优先

      • 需要维护读者计数器 readcount,并用互斥信号量 rmutex 保护它。

      • 用一个互斥信号量 wmutex 实现读/写、写/写互斥。

    • 哲学家进餐问题:描述多个进程竞争有限资源时可能产生的死锁和饥饿。

      • 解决方案:限制同时拿起筷子的人数(如设置一个计数信号量);让奇数号哲学家先拿左筷子,偶数号先拿右筷子(破坏循环等待);使用一个"服务员"信号量实现互斥。
    • 408真题风格 :给出现实问题描述,要求用信号量机制写出正确的同步伪代码。这是每年必考的压轴大题之一,分值高,综合性强。

(四)死锁
  • 1. 死锁的基本概念

    • 定义 :一组进程因竞争资源 而陷入相互等待的状态,若无外力作用,它们都将无法向前推进。

    • 必要条件(同时成立)

      1. 互斥:资源独占。

      2. 请求和保持:持有资源的同时请求新资源。

      3. 不可剥夺:资源只能由持有进程主动释放。

      4. 循环等待:存在进程-资源的环形等待链。

    • 资源分配图 :判断死锁的可视化工具 。如果图中存在环路且所有资源都是单实例的,则死锁发生。如果是多实例资源,有环路不一定死锁,还需要进一步判断。

  • 2. 死锁预防破坏四个必要条件中的至少一个

    • 破坏请求和保持:一次性申请所有资源("全有或全无"),资源利用率低

    • 破坏不可剥夺:强行抢占资源,实现复杂,代价高

    • 破坏循环等待:资源有序分配法(最佳实用方法):给所有资源类型编号,进程必须按编号递增顺序申请资源。这样就不会形成环路。

  • 3. 死锁避免 :在资源分配时动态检测 ,确保系统始终处于安全状态

    • 银行家算法核心算法 。需要预知进程的最大需求

      • 数据结构Max, Allocation, Need, Available

      • 安全性算法 :检查系统是否存在一个安全序列

      • 资源请求算法:当进程提出资源请求时,模拟分配,并调用安全性算法检查是否安全。只有安全时才真正分配。

    • 缺点 :需要预知信息,进程数、资源数固定,实际系统很少使用

  • 4. 死锁检测和解除

    • 检测 :允许系统进入潜在的不安全状态,但定期运行检测算法 (类似于银行家算法中的安全性算法,但Need矩阵用Request矩阵代替,检查是否有进程无法完成)。

    • 解除:检测到死锁后采取措施。

      1. 资源剥夺:挂起某些进程,抢占其资源。

      2. 进程终止终止所有死锁进程 (简单粗暴)或逐个终止进程直到死锁解除(代价最小)。

      3. 进程回退:让进程回退到之前某个检查点重新执行。

  • 408真题常见考点

    • 选择题:判断死锁必要条件,分析资源分配图。

    • 综合应用题银行家算法的手工模拟。给出现状和一系列资源请求,判断是否安全、请求能否立即批准。这是另一个几乎每年必考的大题。

总结与408备考策略

  1. 两大核心支柱 :本章所有知识围绕两大支柱展开------进程/线程的抽象与管理 ,以及并发带来的同步互斥问题

  2. 三条主线

    • 进程/线程的生命周期:创建、状态转换、调度、终止。

    • 并发控制:从硬件原语(TS指令)到高级抽象(信号量),再到解决经典问题(生产者-消费者)。

    • 死锁问题:从产生原因到预防、避免、检测与解除。

  3. 408必考题型与应对

    • 调度算法计算 :反复练习,特别是多级反馈队列(MLFQ) 的手工模拟。

    • 信号量同步大题 :重中之重。务必亲手写出生产者-消费者、读者-写者的正确解法,理解每一行代码、每一个信号量的含义。尝试用管程(如果考纲要求)来表述。

    • 银行家算法:务必熟练计算安全序列,判断请求的合法性。数据结构(矩阵)要清晰。

  4. 建立深刻理解:不要死记硬背。要理解为什么需要线程、为什么需要抢占式调度、为什么自旋锁和睡眠锁适用场景不同、为什么P操作顺序错了会导致死锁。理解了"为什么",自然就能记住"是什么"和"怎么做"。

三、内存管理

(一)内存管理基础
  • 1. 内存管理的基本概念

    • 逻辑地址 vs. 物理地址

      • 逻辑地址(虚拟地址):由CPU产生的地址。进程视角,从0开始连续编址。

      • 物理地址:内存单元的绝对地址。硬件视角,通过地址总线访问。

      • 地址变换(重定位):将逻辑地址转换为物理地址。这是内存管理的核心工作。

    • 内存共享:允许多个进程访问同一段物理内存(如代码共享库)。提高了内存利用率。

    • 内存保护 :确保每个进程只能访问自己合法区域的内存。通常通过越界检查访问权限位(读/写/执行) 实现,由硬件(MMU)支持。

    • 内存分配与回收:管理空闲内存,响应进程的分配请求,并在进程终止后回收其内存。

  • 2. 连续分配管理方式(已过时,但有助于理解基本问题)

    • 单一连续分配 :早期单道系统,内存分为系统区和用户区。无外部碎片,内存利用率极低

    • 固定分区分配 :将内存预先划分为若干固定大小的分区。存在内部碎片(进程小于分区大小时,分区内未用部分)。

    • 动态分区分配 :根据进程实际大小动态创建分区。存在外部碎片(进程结束后释放的内存块过小,无法满足新进程需求)。分配算法包括:

      • 首次适应(First Fit):从低地址开始,找到第一个足够大的空闲区。

      • 最佳适应(Best Fit) :找到能满足需求的最小空闲区。容易产生大量极小外部碎片

      • 最坏适应(Worst Fit) :找到最大的空闲区。可以减少小碎片,但大分区容易被破坏

    • 重定位 :在连续分配下,地址变换通过基址寄存器(重定位寄存器) 完成:物理地址 = 逻辑地址 + 基址。通过界限寄存器检查越界。

  • 3. 页式管理 - 非连续分配的核心

    • 基本原理 :将进程的逻辑地址空间 划分为固定大小的 。将物理内存空间 划分为同样大小的页框(Frame)。进程的页可以离散地装入内存的任一可用页框。

    • 核心数据结构页表(Page Table) 。每个进程一张页表,存储在内存中。页表项(PTE)记录了逻辑页号物理页框号的映射,以及状态位(有效位、访问位、修改位、保护位等)。

    • 地址变换过程(基本流程)

      1. CPU给出逻辑地址A,由硬件自动分离出页号P页内偏移W

      2. P为索引查找进程的页表,得到物理页框号F

      3. 拼接物理地址:物理地址 = F * 页面大小 + W

    • 优点无外部碎片,内存利用率高;便于共享(只需让不同进程的页表项指向同一物理页框)。

    • 缺点存在内部碎片 (进程最后一页可能不满);每次访存都需要访问页表(额外一次内存访问) ,速度慢。这是页式管理的核心性能问题

    • 快表(TLB) :为解决访问速度问题而引入。TLB是高速缓存 ,存放最近使用的页表项。先查TLB,命中则无需访问内存中的页表,极大加快了地址变换

  • 4. 段式管理

    • 基本原理 :按照程序的逻辑结构 (如代码段、数据段、堆栈段)将进程地址空间划分为长度可变的段。每个段有段名、段基址、段长。

    • 核心数据结构段表(Segment Table)。段表项包含段基址和段长。

    • 地址变换 :逻辑地址 = <段号S, 段内偏移W>

      1. S为索引查找段表。

      2. 检查W < 段长(越界保护)。

      3. 物理地址 = 段基址 + W

    • 优点按逻辑划分,易于共享和保护(如代码段只读,数据段可写)。

    • 缺点存在外部碎片;地址变换开销大(需查段表);内存分配算法复杂。

  • 5. 段页式管理

    • 基本原理 :结合两者优点。先将进程按逻辑模块分段 ,再将每个段分页

    • 地址变换 :需要段表页表 两级查找。逻辑地址 = <段号S, 页号P, 页内偏移W>

      1. 查段表,得到该段的页表基址。

      2. 查该段的页表,得到物理页框号。

      3. 拼接物理地址。

    • 特点 :兼具了段的逻辑性和页的物理管理便利性,但地址变换最复杂,需要三次访存(段表、页表、目标数据)。同样需要TLB来加速。

    • 408真题常见考点

      • 计算逻辑地址结构:给定地址空间大小、页面大小,计算逻辑地址中页号、页内偏移各占多少位。

      • 计算页表大小:给定逻辑地址空间、页面大小、页表项大小(如4B),计算一个进程的页表最大需要多少内存。

      • TLB命中率对有效访存时间的影响计算:EAT = TLB命中时间 + (1 - 命中率) * (TLB访问时间 + 内存访问时间) + 内存访问时间

(二)虚拟内存管理 - 核心中的核心
  • 1. 虚拟内存的基本概念

    • 定义 :在具有层次存储结构 的计算机系统中,操作系统为用户进程提供了一个比实际物理内存大得多的、统一的、连续的虚拟地址空间

    • 核心思想

      1. 部分装入:进程无需全部装入内存即可开始运行。

      2. 按需调页 :当进程访问的数据不在内存时,由操作系统动态地从外存(通常是硬盘的交换区Swap)调入。

      3. 页面置换 :当需要调入新页而内存已满时,需要将内存中某个暂时不用的页换出到外存。

    • 特征多次性对换性虚拟性

    • 优势:提供了巨大的地址空间,允许运行比物理内存大的程序;提高了内存利用率(更多进程可驻留);简化了编程(程序员无需关心物理内存限制)。

  • 2. 请求页式管理(基于页的虚拟内存)

    • 基本页式管理的基础上,扩展页表项,增加了几个关键状态位:

      • 有效/无效位:1表示该页在内存(对应页框号有效),0表示不在内存(此时该页表项的其他位可能用于存放该页在磁盘上的位置)。

      • 访问位(引用位):用于页面置换算法(如LRU近似)。

      • 修改位(脏位):该页被修改过。被换出时,若脏位为1,需要写回磁盘;为0则直接丢弃。

    • 缺页中断 :当CPU访问一个有效位为0 的页时,硬件会触发一个缺页异常

      • 处理流程(软件,OS负责)

        1. 保留现场,陷入内核。

        2. 从磁盘找到所需页面。

        3. 寻找一个空闲页框。若没有,则调用页面置换算法选择一个"牺牲页"换出。

        4. 将所需页面从磁盘读入空闲页框。

        5. 更新页表快表(TLB)(可能需要使相关TLB项无效)。

        6. 恢复现场,重新执行引起缺页的指令。

      • 注意 :缺页中断是异常 ,与普通中断处理不同,因为指令执行了一半 ,处理完后需重新执行该指令

  • 3. 页框分配与回收

    • 分配策略

      • 固定分配局部置换 :每个进程分配固定数量的物理页框,缺页时只置换本进程的页。难以确定每个进程应分多少页框

      • 可变分配全局置换最常用 ):OS维护一个全局空闲页框池。发生缺页时,从全局池分配一个页框。如果全局池空,则从所有进程中 选择一个页置换(不考虑该页属于哪个进程)。实现简单,性能较好,但可能导致某个进程的页被频繁换出(抖动)

      • 可变分配局部置换 :根据进程的缺页率动态调整分配给它的页框数。缺页率高则增加页框,低则减少。性能最佳,但实现复杂

    • 驻留集 :指一个进程当前在物理内存中的页面集合。

  • 4. 页置换算法 - 必考计算题

    • 目标:选择被换出的页面,使得未来发生缺页的次数最少。

    • 最佳置换算法(OPT) :选择未来最长时间不再被访问 的页面。理论最优,但无法实现,用于评价其他算法。

    • 先进先出算法(FIFO) :选择最先调入内存的页面。实现简单,但性能差 (可能出现Belady异常:分配的物理页框数增加,缺页率反而升高)。

    • 最近最久未使用算法(LRU) :选择过去最长时间没有被访问 的页面。性能接近OPT,但实现开销大,需要硬件维护精确的访问时间戳或移动链表。

    • 时钟置换算法(Clock/NRU) :LRU的近似实现性能好且开销小 ,是实际OS最常用的算法。

      • 原理 :将所有页框组织成一个环形链表,有一个"指针"。每页有一个访问位(R位)

      • 流程:当需要置换时,检查指针指向的页:

        • R=0,则选择该页替换。

        • R=1,则将其置0,指针移向下一位。

        • 循环直到找到R=0的页。

      • 改进型Clock算法 :同时考虑访问位R修改位M 。优先淘汰(R=0, M=0)的页(既没被读也没被写)。

    • 408真题风格 :给定一个页面访问序列(如 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5)和物理页框数(如3或4),要求手工模拟各种置换算法的执行过程,计算缺页次数缺页率 。注意区分缺页置换(第一次调入不算置换)。

  • 5. 内存映射文件

    • 原理 :OS可以将一个文件(或部分)直接映射到进程的虚拟地址空间。进程可以像访问内存数组一样通过指针访问文件内容

    • 工作方式 :首次访问文件的某个"页"时,产生缺页中断,OS将该部分文件内容读入物理页框,并建立映射。对映射区的修改在未来的某个时刻(脏页回写) 会自动同步到磁盘文件。

    • 优点 :简化了文件I/O编程(无需read/write系统调用);便于实现文件共享(多个进程映射同一文件即可);利用了虚拟内存的按需调页机制,高效。

  • 6. 虚拟存储器性能的影响因素及改进方法

    • 影响因素

      1. 页面大小:太小则页表过大,内部碎片少;太大则传输慢,内部碎片多。

      2. TLB大小与命中率

      3. 页置换算法

      4. 程序局部性 :包括时间局部性 (最近访问的将来还可能访问)和空间局部性 (访问了某个位置,附近位置也可能被访问)。局部性越好,缺页率越低

      5. 分配给进程的物理页框数 :太少会导致颠簸(抖动)

    • 颠簸(抖动) :进程频繁缺页,大部分时间用于页的换入换出,而非实际工作。原因 :分配给进程的物理页框数少于其工作集大小。

      • 工作集模型:一个进程在某段时间内实际访问的页面集合。OS应确保分配给进程的页框数不小于其工作集大小。
    • 改进方法

      • 采用工作集模型缺页率算法来动态调整分配给进程的页框数。

      • 优化置换算法(如使用改进型Clock算法)。

      • 增加TLB容量和命中率。

      • 利用预调页策略,预测并预先读入可能需要的页面。

总结与408备考策略

  1. 两条发展主线 :从连续分配非连续分配 (页/段),再到虚拟内存。理解每一步演进所解决的问题(外部碎片、大地址空间需求)。

  2. 三个核心数据结构页表/段表 (映射)、TLB (加速)、空闲页框链表(资源管理)。

  3. 两大硬件机制缺页中断 (虚拟内存的触发与处理机制)、地址变换(MMU和TLB的协作)。

  4. 408必考题型与应对

    • 地址变换计算:页式/段页式下的逻辑地址分析、页表大小计算、有效访存时间计算(含TLB)。

    • 页面置换算法模拟LRU和Clock算法是绝对重点。必须非常熟练地手工模拟,准确计算缺页率和置换次数。

    • 综合题:可能结合缺页中断处理、置换算法、分配策略,分析系统性能。

  5. 建立系统观 :内存管理与进程管理 (每个进程有自己的地址空间)、文件管理(内存映射文件、交换区)紧密相连。虚拟内存是实现"进程隔离"和"大程序运行"的关键技术。

四、文件管理

文件系统提供了对计算机外部存储设备(主要是硬盘)上信息的持久化、结构化管理,是用户视角最重要的操作系统功能之一。

(一)文件
  • 1. 文件的基本概念

    • 定义 :存储在外部存储介质上的、具有文件名 标识的相关信息的集合。

    • 属性:名称、标识符(内部ID)、类型、位置、大小、保护、时间戳等。

    • 操作系统对文件的视角 :操作系统不关心文件的具体内容 ,只关心如何高效地组织、存储、检索和保护这些字节序列。文件的具体解释由应用程序负责。

  • 2. 文件元数据和索引节点(inode) - 核心概念

    • 文件控制块(FCB) :操作系统为每个文件建立的一个数据结构 ,用于存放该文件的所有元数据(除文件名和内容外的所有信息)。

    • 索引节点(inode) :在类Unix系统(如Linux, Ext系列文件系统)中,FCB的具体实现称为inode。它是一个定长 的数据结构,与文件名分离存储 。这是理解Unix/Linux文件系统的关键

    • inode包含的核心信息

      • 文件类型(普通文件、目录、符号链接等)和权限(rwx)。

      • 文件所有者(UID, GID)。

      • 时间戳(创建、最后访问、最后修改)。

      • 文件大小。

      • 最重要指向文件数据块的指针。包括直接指针、间接指针等,用于寻址文件内容。

      • 链接计数(硬链接数)。

    • 文件名与inode的关系 :在目录中,一个条目就是<文件名, inode编号>的映射。同一个文件(同一个inode)可以有多个文件名(硬链接)

  • 3. 文件的操作

    • 基本操作原语

      • create:创建一个新文件(分配FCB/inode,在目录中添加条目)。

      • delete:删除文件(减少链接计数,若为0则释放inode和数据块)。

      • open:将文件从外存"打开"到内存。系统为打开的文件在内存中维护一个打开文件表项 (包含文件偏移指针、访问模式等)。返回一个文件描述符(fd) 给进程。

      • close:关闭文件,释放内存中的打开文件表项。缓冲数据可能被写回磁盘

      • read/write:在打开的文件上,从当前文件偏移处读写数据,并更新偏移。

    • "打开文件"的数据结构

      • 系统级打开文件表 :整个系统一张,记录所有打开文件的物理信息(如磁盘位置)。

      • 进程级打开文件表 :每个进程一张,包含指向系统级表项的指针和进程特定的信息 (如当前文件偏移)。fd就是该表的索引。

      • 父子进程共享文件偏移fork()后,子进程会复制父进程的文件描述符表项 ,两者指向同一个系统级表项,因此共享文件偏移。这是一个重要考点。

  • 4. 文件的保护

    • 访问类型:读、写、执行、添加、删除、列表等。

    • 访问控制方法

      • 访问控制列表(ACL) :为每个文件维护一个列表,记录每个用户/组的权限。灵活但列表可能很长

      • Unix简化模式(最常考) :为文件所有者、同组用户、其他用户 三类主体,分别设置rwx权限位(共9位)。使用chmod命令修改。

    • 保护域:进程在某个用户ID下运行时,就拥有了该用户的访问权限。

  • 5. 文件的逻辑结构 - 用户视角的文件组织

    • 无结构文件(流式文件) :文件是字节的有序序列。操作系统提供的视角,也是最常见的类型(如文本文件、二进制可执行文件)。

    • 有结构文件(记录式文件):文件由一组相关记录组成。通常由数据库系统在流式文件的基础上实现。

    • 408考点:理解操作系统提供的是最基本的流式视图,更复杂的结构由应用程序构建。

  • 6. 文件的物理结构 - 操作系统视角的文件磁盘存储 - 核心重难点

    • 即文件的分配方式 。决定了如何为文件分配磁盘块,直接影响磁盘访问性能存储空间利用率
    1. 连续分配

      • 原理 :为每个文件分配一组连续的磁盘块。

      • 优点顺序访问速度极快 (磁头移动少);实现简单,支持直接访问(逻辑地址/块大小即可得物理块号)。

      • 致命缺点会产生外部碎片;文件创建时必须知道最终大小,且难以增长。

    2. 链接分配

      • 原理 :为文件的每个磁盘块包含一个指向下一个块的指针

      • 隐式链接 :指针存在块内,用户不可见。缺点:只能顺序访问;可靠性差(一个指针损坏,后面全丢)。

      • 显式链接 :将所有块的指针集中放在内存的一张文件分配表(FAT) 中。MS-DOS/Windows的FAT文件系统使用。

        • 优点:无外部碎片,支持文件动态增长;FAT在内存中,随机访问比隐式快。

        • 缺点:FAT表需常驻内存,占用空间;不适合大磁盘(FAT表会过大)。

    3. 索引分配

      • 原理 :为每个文件建立一个索引块,其中存放指向该文件所有数据块的指针数组。

      • 优点完美支持直接访问和随机访问;无外部碎片,文件可动态增长。

      • 缺点:索引块本身占用空间;小文件也有索引块开销。

      • 多级索引与混合索引(Unix inode采用):解决大文件的索引问题。

        • 直接指针:inode中有若干项直接指向数据块(如12个),满足小文件需求。

        • 一级间接指针 :inode中有一项指向一个索引块,该索引块再指向数据块。

        • 二级/三级间接指针:原理类似,用于支持超大文件。

      • 408高频计算题 :给定inode结构(如12个直接指针,1个一级间接,1个二级间接,1个三级间接,块大小4KB,指针4B),求文件的最大长度。计算时需分清:直接块数、一级间接块数(一个索引块能存块大小/指针大小个指针)、二级间接块数(一级索引块个数 × 每个一级索引块的容量)。

    4. 小结对比连续分配重性能,链接分配重灵活,索引分配是折中 。现代文件系统(如Ext4, NTFS)普遍采用类inode的索引分配

(二)目录
  • 1. 目录的基本概念

    • 定义 :一种特殊的文件,其内容是<文件名, 指向文件的指针(如inode编号)>的集合。目录的"数据块"里存放的是目录条目。
  • 2. 树形目录

    • 现代操作系统普遍采用树形(层次化)目录结构。有根目录子目录文件。路径分为绝对路径(从根开始)和相对路径(从当前目录开始)。
  • 4. 硬链接和软链接(符号链接) - 核心考点

    • 硬链接

      • 本质是在目录中创建一个新的条目 ,该条目指向同一个inode

      • 特点 :inode的链接计数加1 ;删除一个硬链接只是链接计数减1,只有当计数为0时,inode和数据块才会被真正释放;不能跨文件系统 (因为inode编号只在同一文件系统内唯一),不能链接目录(防止在目录树中形成环)。

      • 创建ln <源文件> <链接名>

    • 软链接(符号链接)

      • 本质是创建一个特殊类型的小文件 ,其内容 是另一个文件的路径名

      • 特点 :有自己的inode和数据块;删除源文件,软链接将成为"悬空链接"(dangling link);可以跨文件系统,可以链接目录

      • 创建ln -s <源文件> <链接名>

    • 408考点 :给出一系列lnrm操作,要求判断inode链接计数的变化、文件是否被删除、软链接是否有效等。

(三)文件系统
  • 1. 文件系统的全局结构(layout)

    • 外存中的结构(磁盘布局):一个格式化后的磁盘分区,其空间通常被划分为以下几个连续区域:

      1. 引导块:存储启动代码(可能为空)。

      2. 超级块 :存储文件系统的元数据 (如文件系统类型、大小、空闲块数量、inode表位置等)。至关重要,损坏可能导致整个文件系统无法识别。

      3. inode表区:一个连续区域,存放所有文件的inode。

      4. 数据区:存放文件实际内容和目录内容。

    • 内存中的结构:为了提高性能,OS会将部分外存结构缓存在内存。

      • 安装表:记录已挂载的文件系统信息。

      • 目录缓存:最近访问过的目录信息。

      • 系统级打开文件表:如前所述。

      • 各种缓存页面缓存/缓冲区缓存 (缓存文件数据块), inode缓存(缓存活跃文件的inode)。

  • 2. 外存空闲空间管理方法

    • 如何记录磁盘上哪些块是空闲的,以便快速分配给新文件。
    1. 空闲表法/空闲链表法 :维护一个空闲块列表(表或链)。分配和回收简单,但效率不高

    2. 位示图法(Bit Map)最常用、最高效 。用一个二进制位(0空闲, 1已用)表示一个磁盘块的状态。

      • 优点:查找连续空闲块快(找连续的0);可以常驻内存,操作快。

      • 缺点:位示图本身需要占据一定的存储空间。

      • 408计算题:给定磁盘总容量和块大小,计算位示图需要占用多少字节。

    3. 成组链接法(Unix采用):结合了链表和索引的优点,适用于大型文件系统。将空闲块分组,用栈的方式管理。

  • 3. 虚拟文件系统(VFS) - 关键抽象层

    • 目的 :为上层应用程序和操作系统其他部分提供一个统一的 文件操作接口,从而支持多种不同的具体文件系统(如Ext4, NTFS, FAT32)。

    • 原理 :VFS定义了一组抽象接口 (如openreadwrite)。每种具体的文件系统需要提供这些接口的实现

    • 核心数据结构

      • 超级块对象:代表一个已挂载的文件系统。

      • inode对象:代表一个文件。

      • 目录项对象 :代表一个路径分量(如/usr/bin中的usrbin),用于加快路径查找(目录项缓存dentry cache)。

      • 文件对象:代表一个打开的文件。

    • 意义 :因为VFS的存在,cat命令才能同时读取Ext4分区和NTFS分区上的文件。

  • 4. 文件系统挂载(mounting)

    • 定义 :将一个文件系统 (通常是磁盘分区)关联到当前系统目录树的某个空目录(挂载点)上,使得该文件系统中的文件可以通过该目录被访问。

    • 过程 :OS读取该磁盘分区的超级块,初始化相关数据结构(如VFS超级块对象),将其加入挂载表,最终使挂载点成为新文件系统的根目录。

    • 示例mount /dev/sda1 /mntsda1分区挂载到/mnt目录。之后,访问/mnt就等于访问sda1分区的根目录。

总结与408备考策略

  1. 两条主线

    • 文件的组织 :从逻辑结构(用户看)到物理结构(系统看,重点是索引分配/inode)。

    • 文件系统的构建:从磁盘布局到内存缓存,再到统一接口(VFS)。

  2. 三大核心机制

    • 存储:文件如何存到磁盘块(物理结构)。

    • 检索:如何通过路径名找到文件(目录、inode、目录项缓存)。

    • 缓存:如何利用内存加速文件访问(缓冲区缓存、inode缓存)。

  3. 408必考题型与应对

    • 计算题

      • 基于inode的最大文件长度计算(重中之重,务必掌握)。

      • 位示图大小计算

      • 给定混合索引结构,求访问某个逻辑块需要的磁盘I/O次数。

    • 概念辨析题

      • 硬链接 vs. 软链接(每年必考)。

      • 各种文件分配方式(连续、链接、索引)的优缺点。

      • 文件打开/关闭的内核数据结构变化。

    • 综合应用题:可能结合目录操作、链接、文件删除,分析inode链接计数和磁盘空间的变化。

  4. 建立层次化理解 :从/home/user/file.txt这个路径出发,理解其背后发生的所有事情:路径解析(VFS, dentry缓存)、权限检查、inode读取、数据块访问、缓存命中与回写。这能将本章所有知识点串联起来

五、输入输出(I/O)管理

I/O管理的核心目标是:在安全、正确的前提下,以统一的方式高效管理种类繁多、速度各异的I/O设备,并对上层应用提供简单易用的接口。

(一)I/O管理基础
  • 1. 设备

    • 分类(按信息交换单位)

      • 块设备 :以数据块 为单位进行读写,支持随机访问。典型:磁盘、固态硬盘(SSD)核心特征:可寻址。

      • 字符设备 :以字符 为单位进行读写,是顺序的数据流。典型:键盘、鼠标、打印机、网络接口(尽管网络也分帧)。核心特征:不可寻址,顺序访问。

      • 网络设备:可视为一类特殊的字符设备,但操作系统通常为其提供独立的访问接口(套接字Socket)。

    • I/O接口与端口 :已在《组成原理》部分详细阐述。回顾核心:I/O接口是硬件控制器;I/O端口是CPU可寻址的寄存器;编址方式有独立编址统一编址

  • 2. I/O控制方式 - 硬件层面如何传送数据

    • 程序直接控制(轮询) :CPU不断查询设备状态寄存器,直到设备就绪。CPU利用率极低

    • 中断驱动方式 :CPU发出I/O命令后继续执行其他任务,设备完成后主动中断 CPU。CPU与I/O设备部分并行 ,但每次数据单位(如1字节)的传输都需要CPU介入中断处理,对于大量数据传输开销大。

    • DMA方式划时代的改进 。DMA控制器在内存与外设之间直接建立数据通路 。CPU仅在传输开始(设置DMA控制器参数)和结束(被中断通知)时介入,中间的整块数据传输无需CPU参与。这是高速设备(如磁盘)的必然选择。

      • DMA请求/响应 :DMA与CPU通过总线仲裁 共享内存总线(通常采用周期窃取方式)。

      • 408高频计算题:给定磁盘数据传输率、DMA块大小、CPU处理DMA中断的开销,求CPU时间被I/O占用的百分比。

    • 通道方式 :可看作是增强版的、更智能的DMA,能执行简单的通道程序,独立管理更复杂的I/O操作。用于大型机。

  • 3. I/O软件层次结构 - 核心框架

    • 这是一个自底向上 的层次模型,体现了OS设计的分层抽象思想。
    1. 中断处理程序 (最底层):位于OS内核。当I/O完成或出错时,设备控制器发中断,CPU执行对应的中断服务程序(ISR)。职责:进行最底层的设备寄存器操作,唤醒被阻塞的驱动程序。

    2. 设备驱动程序 (与硬件直接对话):内核模块,与具体的设备型号/控制器 一一对应。职责 :向上提供统一的设备操作接口(如readwrite);向下将OS的通用I/O请求翻译为针对特定设备的、一系列具体的控制器命令(写入特定寄存器),并排队、启动I/O操作。

      • 关键点 :驱动程序是内核中唯一知道设备控制器细节的部分。
    3. 设备独立软件(设备无关软件层) :OS内核中与具体设备无关的部分。核心层

      • 职责

        • 设备命名与保护 :将用户友好的设备名(如/dev/sda)映射到具体的驱动程序。

        • 提供统一的系统调用接口 (如openread)。

        • 缓冲区管理(见后文)。

        • 错误报告

        • 分配与释放独占设备

        • 提供与设备无关的块大小(如上层认为所有块设备块大小都是4KB,由驱动程序负责与实际物理扇区大小转换)。

    4. 用户层I/O软件 :库函数(如C语言的printffread)和SPOOLing系统(见后文)。它们封装系统调用,提供更友好的API。

  • 4. 输入输出应用程序接口(API)

    • 块设备接口 :提供read/write等面向块的接口。文件系统建立在块设备接口之上。

    • 字符设备接口 :提供get/put等面向字符流的接口。也可能实现read/write

    • 网络设备接口 :通常通过套接字(Socket) 接口访问,支持bindlistensendrecv等操作。

    • 阻塞/非阻塞I/O

      • 阻塞I/O :进程发起I/O请求后,若数据未就绪,则主动阻塞,让出CPU。

      • 非阻塞I/O :进程发起I/O请求后,无论数据是否就绪都立即返回 。进程需要轮询检查状态。

      • 异步I/O :进程发起I/O请求后立即返回,继续执行。当I/O操作完成后 ,系统会通知 进程(如通过信号或回调函数)。真正的"后台"操作

      • 408考点 :区分这三种I/O模型。阻塞/非阻塞关注等待数据时的行为 ,同步/异步关注数据就绪后的通知方式

(二)设备独立软件
  • 1. 缓冲区管理 - 核心性能优化手段

    • 目的

      1. 缓和CPU与I/O设备速度不匹配的矛盾

      2. 减少对CPU的中断频率(DMA/块设备一次传输一块数据才中断一次)。

      3. 提高CPU与I/O设备的并行性

      4. 解决数据粒度不匹配(如网络数据包与磁盘块大小不同)。

    • 单缓冲区 :分配一个缓冲区。当进程需要数据时,先将磁盘块读入缓冲区,然后进程从缓冲区取数据。处理一块数据的总时间 ≈ max(C, T) + M,其中C是计算时间,T是传输时间,M是从缓冲区复制到用户区的时间。

    • 双缓冲区 :设置两个缓冲区。当进程从一个缓冲区取数据时,操作系统可以同时向另一个缓冲区写入数据。可实现连续输入和连续处理的重叠 。处理一块数据的时间 ≈ max(C, T)。若C < T,则可使设备连续工作;若C > T,则可使进程连续工作。

    • 循环缓冲区缓冲池 :将多个缓冲区组织成队列或公用池,由系统统一管理,动态分配。现代操作系统的主流方式

    • 408考点:缓冲区工作过程分析,计算使用缓冲区后系统处理数据的总时间。

  • 2. 设备分配与回收

    • 静态分配 :进程运行前即分配所有所需设备,运行结束后释放。简单,不会死锁,但设备利用率低

    • 动态分配 :进程在运行过程中根据需要申请设备。需要预防死锁(如使用银行家算法)。

    • 数据结构 :系统维护设备控制表(DCT)控制器控制表(COCT)通道控制表(CHCT)系统设备表(SDT) 来跟踪设备状态和分配情况。

  • 3. 假脱机技术(SPOOLing) - 将独占设备改造成共享设备

    • 全称:Simultaneous Peripheral Operations On-Line(外部设备联机并行操作)。

    • 核心思想 :利用高速的共享设备(磁盘) 模拟低速的独占设备(如打印机)

    • 工作原理(以打印为例)

      1. 当用户进程请求打印时,SPOOLing系统 将数据快速输出到磁盘的"输出井"(一个特定区域)。

      2. 用户进程认为打印已完成,可以继续执行。

      3. 后台的SPOOLing进程 负责在打印机空闲时 ,从输出井中取出数据,真正地、顺序地送给打印机打印。

    • 特点

      • 物理的独占设备 变成了逻辑的共享设备

      • 实现了虚拟设备功能。

    • 应用:打印机共享、早期批处理系统的输入/输出井。

  • 4. 设备驱动程序接口

    • 设备独立软件层通过一组标准的、与设备无关的函数调用接口来调用驱动程序。驱动程序的编写者需要实现这些接口。

    • 在类Unix系统中,这个接口通常表现为一个包含函数指针(如openreadioctl)的数据结构(如file_operations。驱动程序初始化时,向内核注册这个结构。

(三)外存管理
  • 1. 磁盘 - 传统机械硬盘,I/O性能的瓶颈所在

    • 结构 :由多个盘片 叠加,每个盘面有对应的磁头 。数据存储在磁道 上,多个盘面的同一磁道组成柱面 。磁道划分为扇区(通常512B或4KB)。

    • 访问时间访问时间 = 寻道时间 + 旋转延迟 + 传输时间

      • 寻道时间 :磁头移动到目标磁道的时间。最长、影响最大

      • 旋转延迟:盘片旋转,使目标扇区到达磁头下方的时间。平均为旋转半圈的时间。

      • 传输时间:读写数据的时间。

    • 磁盘调度算法 - 核心考点,目标是减少平均寻道时间

      1. 先来先服务(FCFS) :按请求顺序服务。公平但性能差,寻道时间长。

      2. 最短寻道时间优先(SSTF) :总是选择当前磁头位置距离最近 的请求。性能优于FCFS,但可能导致饥饿(边缘磁道的请求可能长时间得不到服务)。

      3. 扫描算法(电梯算法,SCAN) :磁头从一端开始,单向 移动到另一端,沿途服务所有请求;到达另一端后立即反向 移动并继续服务。性能好,无饥饿,但对刚扫描过的区域响应慢。

      4. 循环扫描算法(C-SCAN) :改进SCAN。磁头单向移动 服务请求,到达另一端后立即快速返回起点 (不服务),重新开始单向扫描。提供了更均匀的等待时间

      5. LOOK与C-LOOK算法 :SCAN和C-SCAN的优化 。磁头移动无需到达磁盘端点 ,只需移动到最远的一个请求 就立即反向(LOOK)或返回(C-LOOK)。现代系统实际采用的方式

    • 408真题风格 :给出一系列柱面请求序列和初始磁头位置,要求手工模拟上述调度算法,计算磁头移动的总柱面数(寻道距离)

  • 2. 固态硬盘(SSD)

    • 读写性能特性

      • 以页为单位读写 (如4KB, 8KB),以块为单位擦除(通常由几十上百个页组成)。

      • 读快,写慢,擦除极慢

      • 随机读写性能远超机械硬盘(无寻道和旋转延迟)。

    • 磨损均衡 :SSD的每个存储单元(Cell)有写入次数限制 。磨损均衡技术旨在将写操作均匀分布到所有存储单元上,避免部分单元过早损坏。

      • 动态磨损均衡:写入时,选择擦除次数最少的块。

      • 静态磨损均衡:当检测到某些块很少被更新时,主动将冷数据移到写次数多的块,腾出冷块来接收新数据。

    • 与操作系统的交互:现代操作系统(如Windows的TRIM命令)需要感知SSD特性,在删除文件时通知SSD,以便其内部进行垃圾回收和磨损均衡,维持性能。

    • 408考点:比较SSD与HDD的特性差异;理解磨损均衡的必要性。

总结与408备考策略

  1. 明确两个视角 :本章内容是**《组成原理》I/O硬件控制** 的软件延续。硬件决定"能不能做"(DMA),软件决定"如何高效、统一地做"(驱动、缓冲、调度)。

  2. 抓住三个性能核心

    • 减少中断开销 -> DMA

    • 缓和速度矛盾 -> 缓冲区管理

    • 减少机械延迟 -> 磁盘调度算法

  3. 理解四大抽象/改造

    • 设备无关性抽象(设备独立软件层)。

    • 共享化改造(SPOOLing)。

    • 块设备抽象(文件系统的基础)。

    • 网络设备抽象(Socket)。

  4. 408必考题型与应对

    • 磁盘调度算法计算 :与进程调度类似,给请求序列,模拟SCAN(LOOK)C-SCAN(C-LOOK) 算法,计算磁头移动距离。SSTF也要掌握。

    • DMA/中断开销计算:结合《组成原理》知识,计算CPU时间利用率。

    • 缓冲区工作分析:理解单/双缓冲区的工作原理和时间计算。

    • 概念辨析选择题:I/O控制方式比较、I/O软件层次功能、阻塞/非阻塞/异步I/O、SPOOLing原理。

I/O管理章节的知识点相对分散但逻辑清晰,核心在于理解操作系统如何通过软件分层、缓冲、调度等一系列策略,来管理和优化性能差异巨大、种类繁多的I/O设备。真题中的计算题(磁盘调度、DMA)和概念题是复习的重点。

10

相关推荐
liulilittle10 小时前
rinetd 端口转发工具技术原理
linux·服务器·网络·c++·端口·通信·转发
fy zs10 小时前
应用层自定义协议和序列化
linux·网络·c++
lytao12310 小时前
MySQL高可用集群部署与运维完整手册
运维·数据库·mysql·database
末日汐10 小时前
库的制作与原理
linux·后端·restful
tmacfrank10 小时前
Binder 预备知识
linux·运维·binder
cnstartech10 小时前
esxi-vmware 虚拟机互相打开
linux·运维·服务器
mcdx10 小时前
bootm的镜像加载地址与uImage镜像的加载地址、入口地址之间的关系
linux
不知疲倦的仄仄10 小时前
第四天:Netty 核心原理深度解析&EventLoop、Future/Promise 与 Pipeline
linux·服务器·网络
dajun18112345610 小时前
模型输出偏见的量化与消减
运维