【考查目标】
1.掌握操作系统的基本概念、方法和原理,了解操作系统的结构、功能和服
务,理解操作系统所采用的策略、算法和机制。
2.能够从计算机系统的角度理解并描述应用程序,操作系统内核和计算机硬
件协作完成任务的过程。
3.能够运用操作系统原理,分析并解决计算机系统中与操作系统相关的问
题。
一、操作系统概述
这部分是操作系统的"绪论",旨在建立对OS的整体认知框架。它解释OS是什么、为什么需要它、它是如何构建和启动的。理解这些概念对后续学习进程、内存、文件等具体模块至关重要。
(一) 操作系统的基本概念
-
定义 :操作系统(OS)是管理计算机硬件与软件资源的系统软件,是用户与计算机硬件之间的接口。
-
核心角色:
-
管理者 :管理CPU、内存、文件、设备等资源。目标是安全、高效。
-
服务提供者:通过系统调用(System Call)为应用程序提供服务。
-
接口:为用户提供使用计算机的接口(命令行接口CLI、图形用户界面GUI)。
-
虚拟机/扩展机:将复杂的硬件操作封装起来,提供一个更简洁、强大、统一的抽象接口(如文件、进程),使得程序员和用户无需关心底层硬件细节。
-
-
四大核心功能(对应后续章节) :进程管理 、内存管理 、文件管理 、设备管理。
-
408真题常见考点:
-
选择题:直接考查OS的定义、目标和主要功能。
-
(与后续结合)判断某项具体功能(如处理机调度、地址映射、创建文件)属于OS哪个管理模块。
-
(二) 操作系统的发展历程
理解发展史是为了理解现代OS设计选择的动因 。推动力是:提高资源利用率、方便用户使用。
-
手工操作阶段:人机矛盾突出,CPU等待人工操作,利用率极低。
-
批处理系统:
-
单道批处理 :引入监督程序 (OS雏形),实现作业的自动切换。解决了人机矛盾,但CPU与I/O设备速度不匹配,CPU在I/O时仍空闲。
-
多道批处理 :划时代的意义 。内存中同时驻留多道程序,当一道程序因I/O请求阻塞时,CPU立即切换到另一道程序。实现了CPU与I/O设备的并行工作 ,极大提高了系统吞吐量和资源利用率。核心挑战:需要解决资源竞争和管理(内存分配、CPU调度、同步互斥)。
-
-
分时系统 :为了满足人机交互 需求。将CPU时间划分为很短的时间片 ,轮流为多个终端用户服务。由于人的反应时间远慢于计算机,每个用户感觉像是独占计算机。目标 :及时响应。Unix是典型代表。
-
实时系统 :应用于需要严格时限 控制的领域(如工业控制、导弹制导)。分为硬实时 (错过时限会导致灾难性后果)和软实时(容忍偶尔错过)。
-
现代OS发展:网络操作系统、分布式操作系统、嵌入式操作系统等。
-
重难点与关联:
-
多道程序技术 是理解现代OS并发性 的基础。它直接导致了进程 概念的产生和进程管理的复杂性。
-
对比批处理 (追求吞吐量)、分时 (追求响应时间)、实时(追求时限)的不同设计目标。
-
(三)程序运行环境 - 硬件基础与OS接口
这是连接《计算机组成原理》与《操作系统》的关键桥梁,是理解OS如何实现"管理"和"保护"的基石。
-
1. CPU运行模式(模式位)
-
用户模式(User Mode, 目态):
-
应用程序运行的模式。
-
权限受限 :不能执行某些特权指令(如直接操作硬件、修改CPU模式位、开关中断等),只能访问自己的内存空间。
-
-
内核模式(Kernel Mode, 管态/核心态):
-
操作系统内核运行的模式。
-
拥有最高权限:可以执行所有指令,访问所有内存空间。
-
-
目的 :实现保护 。防止应用程序有意或无意地破坏系统或其他程序。这是操作系统安全性的基石。
-
模式切换 :用户程序通过系统调用/中断/异常进入内核,硬件自动将模式从用户态切换为核心态;从内核返回用户程序时,再切换回用户态。
-
-
2. 中断和异常的处理
-
中断(外部) :来自CPU外部,与当前执行指令无关,用于处理外部设备事件。可屏蔽。
-
异常(内部) :由CPU正在执行的指令直接引发 ,如除零、缺页、非法指令、系统调用指令(
int 0x80/syscall)。不可屏蔽。 -
处理流程(硬件+软件):
-
检测:硬件在每个指令周期末尾检测。
-
响应 :保存现场(PC, PSW等),关中断(可嵌套时再开),根据中断/异常向量号查表。
-
处理 :跳转到对应的中断服务程序(ISR) 或异常处理程序(OS内核代码)执行。
-
恢复:恢复现场,开中断,返回被中断点。
-
-
重要性 :中断/异常是操作系统获得CPU控制权的唯一途径 。没有中断,多道程序就无法实现并发。这是OS实现并发 和主动管理的硬件机制。
-
-
3. 系统调用
-
定义 :OS提供给应用程序的编程接口(API) ,是应用程序主动请求OS内核提供服务的唯一方式。
-
与库函数/API的关系:
-
API(如C库的
printf)是函数定义。 -
部分API(如
open,fork)内部封装了系统调用。 -
系统调用是进入内核的特定指令 (如
int 0x80或syscall)。 -
关系:
用户程序 -> 库函数API -> 系统调用 -> OS内核服务。
-
-
执行过程:
-
用户程序传递系统调用号和参数。
-
执行陷入指令 (Trap Instruction),触发一个软中断/异常。
-
CPU切换到核心态,根据系统调用号查系统调用表,跳转到对应服务例程。
-
内核执行服务(如读文件、创建进程)。
-
返回结果,恢复用户态,继续执行用户程序。
-
-
408真题常见考点:
-
区分系统调用 和库函数调用。
-
理解系统调用过程中模式切换 、堆栈切换 、参数传递等细节。
-
-
-
4. 程序的链接与装入 & 5. 程序运行时内存映像与地址空间
-
链接 :将多个目标文件(.o)和库文件合并成一个可执行文件。解决外部符号引用。方式:静态链接 (运行时独立)、装入时动态链接 、运行时动态链接。
-
装入 :将可执行文件加载到内存。方式:绝对装入 (早期)、可重定位装入 (静态重定位, 装入时修改地址)、动态运行时装入 (动态重定位, 需要MMU硬件支持, 在指令执行时才进行地址转换)。
-
地址空间:
-
逻辑地址(虚拟地址):程序员看到的地址,从0开始编址。
-
物理地址:内存单元的实际地址。
-
-
内存映像:一个进程在内存中的典型布局(由低地址到高地址):
-
代码段(Text):只读,存放程序指令。
-
数据段(Data):存放已初始化的全局/静态变量。
-
BSS段:存放未初始化的全局/静态变量(内容全0)。
-
堆(Heap):动态分配的内存,向高地址增长。
-
栈(Stack):函数调用时使用,存放局部变量、返回地址等,向低地址增长。
-
内核空间(每个进程虚拟地址空间的高位部分,映射到相同的物理内核内存)。
-
-
重要性 :这部分是学习内存管理(第四章) 的绝对前提。必须理解地址空间的抽象是OS提供的重要抽象之一,它让每个进程感觉自己独占整个内存。
-
-
408真题常见考点:
-
综合应用题:给出进程的内存布局图,要求计算某个变量(如局部变量、全局变量、
malloc分配的指针)的大致地址范围。 -
选择题:比较静态链接与动态链接的优缺点。
-
(四)操作系统结构
-
1. 分层结构 :将OS分为若干层,每层基于其下层提供的服务构建,并为上层提供服务。优点 :易于理解和调试,依赖清晰。缺点:层间通信开销可能影响效率。
-
2. 模块化/宏内核(单体结构) :如传统Unix、Linux。将OS所有主要功能(进程管理、内存管理、文件系统等)作为一个大的整体运行在内核空间。
-
优点 :模块间直接函数调用,性能高。
-
缺点:内核庞大,耦合度高,一个模块的错误可能导致整个系统崩溃;难以扩展和维护。
-
-
3. 微内核结构 :如Mach、Minix。将内核最小化,只保留最核心的功能(进程间通信IPC、少量内存管理、基本的调度)。其他服务(文件系统、设备驱动、网络协议栈)作为独立的用户态进程(服务器) 运行。
-
优点 :内核小,可靠性高、可扩展性好、易于移植。
-
缺点 :服务间需要通过IPC通信,性能(尤其是频繁通信时)可能成为瓶颈。
-
-
4. 外核结构 :一种研究性思想。外核负责将硬件资源安全地多路复用 给多个应用程序,而将资源管理的策略(如如何调度CPU、如何组织文件)交给用户态的库。目标是给应用程序更大的灵活性和控制权。
-
408真题常见考点:
- 比较宏内核 和微内核在性能、可靠性、可扩展性等方面的优缺点。这是高频选择题考点。
(五)操作系统引导
-
过程(以x86为例):
-
BIOS/UEFI阶段 :计算机加电,CPU从固定地址(如
0xFFFF0)执行固件代码。进行加电自检(POST) ,然后按照启动顺序读取启动设备 的第一个扇区(主引导记录MBR 或UEFI分区中的引导程序)到内存固定位置(如0x7C00)。 -
Bootloader阶段 :MBR中的小程序(如GRUB)被执行。它的任务是加载操作系统内核映像到内存中。现代Bootloader功能复杂,可以显示菜单、加载模块、解压内核等。
-
内核初始化阶段 :CPU控制权交给内核入口点。内核进行自身初始化 (解压、设置页表、初始化中断描述符表IDT、初始化关键子系统),最终创建第一个用户进程(如
init或systemd),完成引导。
-
-
重难点 :理解这是一个从"裸机"到"有管理能力环境"的逐层搭建过程,每一步都依赖于前一步建立的环境。
(六)虚拟机
-
基本概念 :通过虚拟机监控程序(VMM/Hypervisor) 在物理硬件上创建出多个隔离的、完整的计算机系统(虚拟机)的软件环境。
-
类型:
-
类型一(裸金属) :Hypervisor直接运行在硬件上(如VMware ESXi, Xen, KVM+Linux)。性能高,用于服务器虚拟化。
-
类型二(托管型) :Hypervisor作为应用程序运行在宿主OS之上(如VMware Workstation, VirtualBox)。易于安装使用。
-
-
关键技术:
-
虚拟化CPU :通过陷入再模拟技术。当虚拟机中的OS执行特权指令时,会陷入到Hypervisor,由Hypervisor模拟指令行为。
-
虚拟化内存 :需要维护虚拟物理地址 到真实物理地址的映射(影子页表或硬件辅助如Intel EPT)。
-
-
与容器技术的对比 :虚拟机虚拟化完整的硬件和操作系统,隔离性强但开销大 ;容器(如Docker)共享宿主OS内核,只虚拟化运行环境,轻量、快速启动、资源占用少,但隔离性较弱。
-
408真题常见考点:
-
区分两类虚拟机的架构和应用场景。
-
理解虚拟机与容器(Container)的本质区别。
-
总结与408备考策略
-
建立宏观框架:本章是OS的"地图"。必须清晰理解OS的定义、目标、四大管理功能,以及发展历程背后的逻辑。
-
攻克核心枢纽 :"(三)程序运行环境" 是本章乃至本学科最核心、最基础的部分。必须透彻理解:
-
CPU双模式 :它是OS实现保护的硬件基础。
-
中断/异常 :它是OS实现并发 和主动管理的硬件机制。
-
系统调用 :它是OS对上层提供服务的标准接口。
-
地址空间 :它是OS为进程提供的最重要抽象,是内存管理的前提。
-
-
理解结构演化 :对宏内核/微内核的对比,以及虚拟机/容器的概念,反映了计算机系统设计在性能、可靠性、灵活性、资源开销之间不断权衡与演进的思想。
-
真题导向:本章真题多为选择题和概念性简答题。重点在于辨析概念(如系统调用 vs API)、理解过程(如引导过程)、比较优劣(如内核结构、虚拟化技术)。
掌握好概述部分,就如同掌握了操作系统这座大厦的设计蓝图和地基原理,后续学习进程、内存等具体楼层时,才能明白每一部分在整个系统中的地位和作用。
二、进程管理
进程管理是操作系统的核心,它解决了"如何在单CPU上实现多任务并发"这一根本问题。
(一)进程与线程
-
1. 进程与线程的基本概念
-
进程 :资源分配的基本单位 。进程是程序的一次执行过程,是动态的 。进程实体(又称进程映像)包括:PCB(进程控制块)、程序段、数据段。
-
线程 :CPU调度的基本单位 。线程是进程中的一个执行流,共享进程的资源(内存、文件等),但拥有独立的线程ID、程序计数器PC、寄存器集合、栈。
-
为什么引入线程?
-
减少并发开销:创建/切换线程比进程开销小得多。
-
提高并发粒度:一个进程内的多个线程可以并发执行(如Web服务器同时处理多个请求)。
-
充分利用多核:线程可以映射到不同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) :一种异步 通知机制,用于通知进程某个事件 已发生(如
SIGKILL,SIGINT(Ctrl+C))。处理简单,但不能携带大量信息。
-
-
408真题常见考点:
-
选择题:进程/线程的定义、区别,状态转换的原因。
-
综合题:分析用户级/内核级线程在系统调用阻塞 和多核利用场景下的表现。
-
给出一段代码(如
fork),分析进程/线程的创建和执行流。
-
(二)CPU调度与上下文切换
-
1-3. 调度的基本概念、目标与实现
-
调度的层次:
-
高级/作业调度 :从外存后备队列中选择作业调入内存,创建进程。发生频率最低。
-
中级/内存调度 :将暂时不能运行的进程调至外存"挂起",反之调入。引入了挂起态。
-
低级/进程/CPU调度 :从就绪队列中选择一个进程,分配CPU。发生频率最高(毫秒级),是本章重点。
-
-
调度方式:
-
非抢占式 :进程一旦获得CPU,就一直运行直到终止或主动阻塞。实现简单,但响应慢。
-
抢占式 :OS可以强行暂停 正在运行的进程,将CPU分配给更重要的进程。现代OS通用方式,能提供更好的响应性。
-
-
闲逛进程 :当就绪队列为空时,调度器会执行一个特殊的、优先级最低的闲逛进程 。它执行一条特殊的指令(如
HLT),使CPU进入低功耗状态,直到下一个中断发生。
-
-
4. CPU调度算法 - 必考计算题
-
评价指标 :CPU利用率、系统吞吐量、周转时间(提交到完成)、带权周转时间(周转时间/运行时间,衡量公平性)、等待时间、响应时间(提交到首次响应)。
-
经典算法:
-
先来先服务(FCFS) :非抢占,对长作业有利,对短作业不利(护航效应),可能导致平均等待时间很长。
-
短作业优先(SJF/SPF) :理论上平均等待时间最短 。非抢占(SJF)或抢占(SRTN-最短剩余时间优先)。难点 :需要预知作业运行时间,可能导致长作业饥饿。
-
优先级调度:可为进程设置静态或动态优先级。可能导致低优先级进程饥饿。
-
时间片轮转(RR) :专为分时系统 设计。将所有就绪进程排成FIFO队列,轮流执行一个时间片 。性能高度依赖于时间片大小:太大退化为FCFS;太小导致频繁上下文切换,开销大。
-
多级队列(MLQ) :将就绪队列分为多个独立队列(如前台交互队列-RR,后台批处理队列-FCFS),每个队列有自己的调度算法。队列间可采用固定优先级 或时间片划分。
-
多级反馈队列(MLFQ) :综合了RR和优先级,且能动态调整 。是最通用、最接近实际OS的算法。
-
规则:进程初始进入最高优先级队列;用完时间片未结束则降级 到下一队列;在低优先级队列等待时间过长可能被升级(防止饥饿)。
-
优点:短作业能快速完成,长批处理作业也能得到执行,I/O密集型(交互型)进程保持在高优先级队列获得良好响应。
-
-
-
408真题风格 :给出一组进程的到达时间、运行时间、优先级,要求手工模拟调度过程,计算完成时间、周转时间、带权周转时间、平均等待时间等。
-
-
5. 多处理机调度 :更复杂,考虑负载均衡 、缓存亲和性(尽量让进程在同一个CPU上运行以减少缓存失效)等。
-
6. 上下文切换机制 - 核心过程
-
上下文:一个进程/线程运行时,CPU中所有寄存器的值(PC, SP, 通用寄存器等)和状态。
-
切换过程(发生在内核态):
-
保存当前进程的上下文到其PCB中。
-
修改当前进程状态(如从运行改为就绪/阻塞),并将其PCB移到相应队列。
-
调度器选择一个新进程,修改其状态为运行。
-
从新进程的PCB中恢复其上下文到CPU寄存器。
-
切换地址空间(切换页表寄存器,这是开销较大的部分)。
-
跳转到新进程被中断的代码位置继续执行。
-
-
开销:上下文切换需要时间和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. 死锁的基本概念
-
定义 :一组进程因竞争资源 而陷入相互等待的状态,若无外力作用,它们都将无法向前推进。
-
必要条件(同时成立):
-
互斥:资源独占。
-
请求和保持:持有资源的同时请求新资源。
-
不可剥夺:资源只能由持有进程主动释放。
-
循环等待:存在进程-资源的环形等待链。
-
-
资源分配图 :判断死锁的可视化工具 。如果图中存在环路且所有资源都是单实例的,则死锁发生。如果是多实例资源,有环路不一定死锁,还需要进一步判断。
-
-
2. 死锁预防 :破坏四个必要条件中的至少一个。
-
破坏请求和保持:一次性申请所有资源("全有或全无"),资源利用率低。
-
破坏不可剥夺:强行抢占资源,实现复杂,代价高。
-
破坏循环等待:资源有序分配法(最佳实用方法):给所有资源类型编号,进程必须按编号递增顺序申请资源。这样就不会形成环路。
-
-
3. 死锁避免 :在资源分配时动态检测 ,确保系统始终处于安全状态。
-
银行家算法 :核心算法 。需要预知进程的最大需求。
-
数据结构 :
Max,Allocation,Need,Available。 -
安全性算法 :检查系统是否存在一个安全序列。
-
资源请求算法:当进程提出资源请求时,模拟分配,并调用安全性算法检查是否安全。只有安全时才真正分配。
-
-
缺点 :需要预知信息,进程数、资源数固定,实际系统很少使用。
-
-
4. 死锁检测和解除
-
检测 :允许系统进入潜在的不安全状态,但定期运行检测算法 (类似于银行家算法中的安全性算法,但
Need矩阵用Request矩阵代替,检查是否有进程无法完成)。 -
解除:检测到死锁后采取措施。
-
资源剥夺:挂起某些进程,抢占其资源。
-
进程终止 :终止所有死锁进程 (简单粗暴)或逐个终止进程直到死锁解除(代价最小)。
-
进程回退:让进程回退到之前某个检查点重新执行。
-
-
-
408真题常见考点:
-
选择题:判断死锁必要条件,分析资源分配图。
-
综合应用题 :银行家算法的手工模拟。给出现状和一系列资源请求,判断是否安全、请求能否立即批准。这是另一个几乎每年必考的大题。
-
总结与408备考策略
-
两大核心支柱 :本章所有知识围绕两大支柱展开------进程/线程的抽象与管理 ,以及并发带来的同步互斥问题。
-
三条主线:
-
进程/线程的生命周期:创建、状态转换、调度、终止。
-
并发控制:从硬件原语(TS指令)到高级抽象(信号量),再到解决经典问题(生产者-消费者)。
-
死锁问题:从产生原因到预防、避免、检测与解除。
-
-
408必考题型与应对:
-
调度算法计算 :反复练习,特别是多级反馈队列(MLFQ) 的手工模拟。
-
信号量同步大题 :重中之重。务必亲手写出生产者-消费者、读者-写者的正确解法,理解每一行代码、每一个信号量的含义。尝试用管程(如果考纲要求)来表述。
-
银行家算法:务必熟练计算安全序列,判断请求的合法性。数据结构(矩阵)要清晰。
-
-
建立深刻理解:不要死记硬背。要理解为什么需要线程、为什么需要抢占式调度、为什么自旋锁和睡眠锁适用场景不同、为什么P操作顺序错了会导致死锁。理解了"为什么",自然就能记住"是什么"和"怎么做"。
三、内存管理
(一)内存管理基础
-
1. 内存管理的基本概念
-
逻辑地址 vs. 物理地址:
-
逻辑地址(虚拟地址):由CPU产生的地址。进程视角,从0开始连续编址。
-
物理地址:内存单元的绝对地址。硬件视角,通过地址总线访问。
-
地址变换(重定位):将逻辑地址转换为物理地址。这是内存管理的核心工作。
-
-
内存共享:允许多个进程访问同一段物理内存(如代码共享库)。提高了内存利用率。
-
内存保护 :确保每个进程只能访问自己合法区域的内存。通常通过越界检查 和访问权限位(读/写/执行) 实现,由硬件(MMU)支持。
-
内存分配与回收:管理空闲内存,响应进程的分配请求,并在进程终止后回收其内存。
-
-
2. 连续分配管理方式(已过时,但有助于理解基本问题)
-
单一连续分配 :早期单道系统,内存分为系统区和用户区。无外部碎片,内存利用率极低。
-
固定分区分配 :将内存预先划分为若干固定大小的分区。存在内部碎片(进程小于分区大小时,分区内未用部分)。
-
动态分区分配 :根据进程实际大小动态创建分区。存在外部碎片(进程结束后释放的内存块过小,无法满足新进程需求)。分配算法包括:
-
首次适应(First Fit):从低地址开始,找到第一个足够大的空闲区。
-
最佳适应(Best Fit) :找到能满足需求的最小空闲区。容易产生大量极小外部碎片。
-
最坏适应(Worst Fit) :找到最大的空闲区。可以减少小碎片,但大分区容易被破坏。
-
-
重定位 :在连续分配下,地址变换通过基址寄存器(重定位寄存器) 完成:
物理地址 = 逻辑地址 + 基址。通过界限寄存器检查越界。
-
-
3. 页式管理 - 非连续分配的核心
-
基本原理 :将进程的逻辑地址空间 划分为固定大小的页 。将物理内存空间 划分为同样大小的页框(Frame)。进程的页可以离散地装入内存的任一可用页框。
-
核心数据结构 :页表(Page Table) 。每个进程一张页表,存储在内存中。页表项(PTE)记录了逻辑页号 到物理页框号的映射,以及状态位(有效位、访问位、修改位、保护位等)。
-
地址变换过程(基本流程):
-
CPU给出逻辑地址
A,由硬件自动分离出页号P和页内偏移W。 -
以
P为索引查找进程的页表,得到物理页框号F。 -
拼接物理地址:
物理地址 = F * 页面大小 + W。
-
-
优点 :无外部碎片,内存利用率高;便于共享(只需让不同进程的页表项指向同一物理页框)。
-
缺点 :存在内部碎片 (进程最后一页可能不满);每次访存都需要访问页表(额外一次内存访问) ,速度慢。这是页式管理的核心性能问题。
-
快表(TLB) :为解决访问速度问题而引入。TLB是高速缓存 ,存放最近使用的页表项。先查TLB,命中则无需访问内存中的页表,极大加快了地址变换。
-
-
4. 段式管理
-
基本原理 :按照程序的逻辑结构 (如代码段、数据段、堆栈段)将进程地址空间划分为长度可变的段。每个段有段名、段基址、段长。
-
核心数据结构 :段表(Segment Table)。段表项包含段基址和段长。
-
地址变换 :逻辑地址 =
<段号S, 段内偏移W>。-
以
S为索引查找段表。 -
检查
W < 段长(越界保护)。 -
物理地址 = 段基址 + W。
-
-
优点 :按逻辑划分,易于共享和保护(如代码段只读,数据段可写)。
-
缺点 :存在外部碎片;地址变换开销大(需查段表);内存分配算法复杂。
-
-
5. 段页式管理
-
基本原理 :结合两者优点。先将进程按逻辑模块分段 ,再将每个段分页。
-
地址变换 :需要段表 和页表 两级查找。逻辑地址 =
<段号S, 页号P, 页内偏移W>。-
查段表,得到该段的页表基址。
-
查该段的页表,得到物理页框号。
-
拼接物理地址。
-
-
特点 :兼具了段的逻辑性和页的物理管理便利性,但地址变换最复杂,需要三次访存(段表、页表、目标数据)。同样需要TLB来加速。
-
408真题常见考点:
-
计算逻辑地址结构:给定地址空间大小、页面大小,计算逻辑地址中页号、页内偏移各占多少位。
-
计算页表大小:给定逻辑地址空间、页面大小、页表项大小(如4B),计算一个进程的页表最大需要多少内存。
-
TLB命中率对有效访存时间的影响计算:
EAT = TLB命中时间 + (1 - 命中率) * (TLB访问时间 + 内存访问时间) + 内存访问时间。
-
-
(二)虚拟内存管理 - 核心中的核心
-
1. 虚拟内存的基本概念
-
定义 :在具有层次存储结构 的计算机系统中,操作系统为用户进程提供了一个比实际物理内存大得多的、统一的、连续的虚拟地址空间。
-
核心思想:
-
部分装入:进程无需全部装入内存即可开始运行。
-
按需调页 :当进程访问的数据不在内存时,由操作系统动态地从外存(通常是硬盘的交换区Swap)调入。
-
页面置换 :当需要调入新页而内存已满时,需要将内存中某个暂时不用的页换出到外存。
-
-
特征 :多次性 、对换性 、虚拟性。
-
优势:提供了巨大的地址空间,允许运行比物理内存大的程序;提高了内存利用率(更多进程可驻留);简化了编程(程序员无需关心物理内存限制)。
-
-
2. 请求页式管理(基于页的虚拟内存)
-
在基本页式管理的基础上,扩展页表项,增加了几个关键状态位:
-
有效/无效位:1表示该页在内存(对应页框号有效),0表示不在内存(此时该页表项的其他位可能用于存放该页在磁盘上的位置)。
-
访问位(引用位):用于页面置换算法(如LRU近似)。
-
修改位(脏位):该页被修改过。被换出时,若脏位为1,需要写回磁盘;为0则直接丢弃。
-
-
缺页中断 :当CPU访问一个有效位为0 的页时,硬件会触发一个缺页异常。
-
处理流程(软件,OS负责):
-
保留现场,陷入内核。
-
从磁盘找到所需页面。
-
寻找一个空闲页框。若没有,则调用页面置换算法选择一个"牺牲页"换出。
-
将所需页面从磁盘读入空闲页框。
-
更新页表 和快表(TLB)(可能需要使相关TLB项无效)。
-
恢复现场,重新执行引起缺页的指令。
-
-
注意 :缺页中断是异常 ,与普通中断处理不同,因为指令执行了一半 ,处理完后需重新执行该指令。
-
-
-
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. 虚拟存储器性能的影响因素及改进方法
-
影响因素:
-
页面大小:太小则页表过大,内部碎片少;太大则传输慢,内部碎片多。
-
TLB大小与命中率。
-
页置换算法。
-
程序局部性 :包括时间局部性 (最近访问的将来还可能访问)和空间局部性 (访问了某个位置,附近位置也可能被访问)。局部性越好,缺页率越低。
-
分配给进程的物理页框数 :太少会导致颠簸(抖动)。
-
-
颠簸(抖动) :进程频繁缺页,大部分时间用于页的换入换出,而非实际工作。原因 :分配给进程的物理页框数少于其工作集大小。
- 工作集模型:一个进程在某段时间内实际访问的页面集合。OS应确保分配给进程的页框数不小于其工作集大小。
-
改进方法:
-
采用工作集模型 或缺页率算法来动态调整分配给进程的页框数。
-
优化置换算法(如使用改进型Clock算法)。
-
增加TLB容量和命中率。
-
利用预调页策略,预测并预先读入可能需要的页面。
-
-
总结与408备考策略
-
两条发展主线 :从连续分配 到非连续分配 (页/段),再到虚拟内存。理解每一步演进所解决的问题(外部碎片、大地址空间需求)。
-
三个核心数据结构 :页表/段表 (映射)、TLB (加速)、空闲页框链表(资源管理)。
-
两大硬件机制 :缺页中断 (虚拟内存的触发与处理机制)、地址变换(MMU和TLB的协作)。
-
408必考题型与应对:
-
地址变换计算:页式/段页式下的逻辑地址分析、页表大小计算、有效访存时间计算(含TLB)。
-
页面置换算法模拟 :LRU和Clock算法是绝对重点。必须非常熟练地手工模拟,准确计算缺页率和置换次数。
-
综合题:可能结合缺页中断处理、置换算法、分配策略,分析系统性能。
-
-
建立系统观 :内存管理与进程管理 (每个进程有自己的地址空间)、文件管理(内存映射文件、交换区)紧密相连。虚拟内存是实现"进程隔离"和"大程序运行"的关键技术。
四、文件管理
文件系统提供了对计算机外部存储设备(主要是硬盘)上信息的持久化、结构化管理,是用户视角最重要的操作系统功能之一。
(一)文件
-
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. 文件的物理结构 - 操作系统视角的文件磁盘存储 - 核心重难点
- 即文件的分配方式 。决定了如何为文件分配磁盘块,直接影响磁盘访问性能 和存储空间利用率。
-
连续分配:
-
原理 :为每个文件分配一组连续的磁盘块。
-
优点 :顺序访问速度极快 (磁头移动少);实现简单,支持直接访问(
逻辑地址/块大小即可得物理块号)。 -
致命缺点 :会产生外部碎片;文件创建时必须知道最终大小,且难以增长。
-
-
链接分配:
-
原理 :为文件的每个磁盘块包含一个指向下一个块的指针。
-
隐式链接 :指针存在块内,用户不可见。缺点:只能顺序访问;可靠性差(一个指针损坏,后面全丢)。
-
显式链接 :将所有块的指针集中放在内存的一张文件分配表(FAT) 中。MS-DOS/Windows的FAT文件系统使用。
-
优点:无外部碎片,支持文件动态增长;FAT在内存中,随机访问比隐式快。
-
缺点:FAT表需常驻内存,占用空间;不适合大磁盘(FAT表会过大)。
-
-
-
索引分配:
-
原理 :为每个文件建立一个索引块,其中存放指向该文件所有数据块的指针数组。
-
优点 :完美支持直接访问和随机访问;无外部碎片,文件可动态增长。
-
缺点:索引块本身占用空间;小文件也有索引块开销。
-
多级索引与混合索引(Unix inode采用):解决大文件的索引问题。
-
直接指针:inode中有若干项直接指向数据块(如12个),满足小文件需求。
-
一级间接指针 :inode中有一项指向一个索引块,该索引块再指向数据块。
-
二级/三级间接指针:原理类似,用于支持超大文件。
-
-
408高频计算题 :给定inode结构(如12个直接指针,1个一级间接,1个二级间接,1个三级间接,块大小4KB,指针4B),求文件的最大长度。计算时需分清:直接块数、一级间接块数(一个索引块能存
块大小/指针大小个指针)、二级间接块数(一级索引块个数 × 每个一级索引块的容量)。
-
-
小结对比 :连续分配重性能,链接分配重灵活,索引分配是折中 。现代文件系统(如Ext4, NTFS)普遍采用类inode的索引分配。
(二)目录
-
1. 目录的基本概念
- 定义 :一种特殊的文件,其内容是
<文件名, 指向文件的指针(如inode编号)>的集合。目录的"数据块"里存放的是目录条目。
- 定义 :一种特殊的文件,其内容是
-
2. 树形目录
- 现代操作系统普遍采用树形(层次化)目录结构。有根目录 、子目录 、文件。路径分为绝对路径(从根开始)和相对路径(从当前目录开始)。
-
4. 硬链接和软链接(符号链接) - 核心考点
-
硬链接:
-
本质是在目录中创建一个新的条目 ,该条目指向同一个inode。
-
特点 :inode的链接计数加1 ;删除一个硬链接只是链接计数减1,只有当计数为0时,inode和数据块才会被真正释放;不能跨文件系统 (因为inode编号只在同一文件系统内唯一),不能链接目录(防止在目录树中形成环)。
-
创建 :
ln <源文件> <链接名>
-
-
软链接(符号链接):
-
本质是创建一个特殊类型的小文件 ,其内容 是另一个文件的路径名。
-
特点 :有自己的inode和数据块;删除源文件,软链接将成为"悬空链接"(
dangling link);可以跨文件系统,可以链接目录。 -
创建 :
ln -s <源文件> <链接名>
-
-
408考点 :给出一系列
ln,rm操作,要求判断inode链接计数的变化、文件是否被删除、软链接是否有效等。
-
(三)文件系统
-
1. 文件系统的全局结构(layout)
-
外存中的结构(磁盘布局):一个格式化后的磁盘分区,其空间通常被划分为以下几个连续区域:
-
引导块:存储启动代码(可能为空)。
-
超级块 :存储文件系统的元数据 (如文件系统类型、大小、空闲块数量、inode表位置等)。至关重要,损坏可能导致整个文件系统无法识别。
-
inode表区:一个连续区域,存放所有文件的inode。
-
数据区:存放文件实际内容和目录内容。
-
-
内存中的结构:为了提高性能,OS会将部分外存结构缓存在内存。
-
安装表:记录已挂载的文件系统信息。
-
目录缓存:最近访问过的目录信息。
-
系统级打开文件表:如前所述。
-
各种缓存 :页面缓存/缓冲区缓存 (缓存文件数据块), inode缓存(缓存活跃文件的inode)。
-
-
-
2. 外存空闲空间管理方法
- 如何记录磁盘上哪些块是空闲的,以便快速分配给新文件。
-
空闲表法/空闲链表法 :维护一个空闲块列表(表或链)。分配和回收简单,但效率不高。
-
位示图法(Bit Map) :最常用、最高效 。用一个二进制位(
0空闲,1已用)表示一个磁盘块的状态。-
优点:查找连续空闲块快(找连续的0);可以常驻内存,操作快。
-
缺点:位示图本身需要占据一定的存储空间。
-
408计算题:给定磁盘总容量和块大小,计算位示图需要占用多少字节。
-
-
成组链接法(Unix采用):结合了链表和索引的优点,适用于大型文件系统。将空闲块分组,用栈的方式管理。
-
3. 虚拟文件系统(VFS) - 关键抽象层
-
目的 :为上层应用程序和操作系统其他部分提供一个统一的 文件操作接口,从而支持多种不同的具体文件系统(如Ext4, NTFS, FAT32)。
-
原理 :VFS定义了一组抽象接口 (如
open,read,write)。每种具体的文件系统需要提供这些接口的实现。 -
核心数据结构:
-
超级块对象:代表一个已挂载的文件系统。
-
inode对象:代表一个文件。
-
目录项对象 :代表一个路径分量(如
/usr/bin中的usr和bin),用于加快路径查找(目录项缓存dentry cache)。 -
文件对象:代表一个打开的文件。
-
-
意义 :因为VFS的存在,
cat命令才能同时读取Ext4分区和NTFS分区上的文件。
-
-
4. 文件系统挂载(mounting)
-
定义 :将一个文件系统 (通常是磁盘分区)关联到当前系统目录树的某个空目录(挂载点)上,使得该文件系统中的文件可以通过该目录被访问。
-
过程 :OS读取该磁盘分区的超级块,初始化相关数据结构(如VFS超级块对象),将其加入挂载表,最终使挂载点成为新文件系统的根目录。
-
示例 :
mount /dev/sda1 /mnt将sda1分区挂载到/mnt目录。之后,访问/mnt就等于访问sda1分区的根目录。
-
总结与408备考策略
-
两条主线:
-
文件的组织 :从逻辑结构(用户看)到物理结构(系统看,重点是索引分配/inode)。
-
文件系统的构建:从磁盘布局到内存缓存,再到统一接口(VFS)。
-
-
三大核心机制:
-
存储:文件如何存到磁盘块(物理结构)。
-
检索:如何通过路径名找到文件(目录、inode、目录项缓存)。
-
缓存:如何利用内存加速文件访问(缓冲区缓存、inode缓存)。
-
-
408必考题型与应对:
-
计算题:
-
基于inode的最大文件长度计算(重中之重,务必掌握)。
-
位示图大小计算。
-
给定混合索引结构,求访问某个逻辑块需要的磁盘I/O次数。
-
-
概念辨析题:
-
硬链接 vs. 软链接(每年必考)。
-
各种文件分配方式(连续、链接、索引)的优缺点。
-
文件打开/关闭的内核数据结构变化。
-
-
综合应用题:可能结合目录操作、链接、文件删除,分析inode链接计数和磁盘空间的变化。
-
-
建立层次化理解 :从
/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设计的分层 与抽象思想。
-
中断处理程序 (最底层):位于OS内核。当I/O完成或出错时,设备控制器发中断,CPU执行对应的中断服务程序(ISR)。职责:进行最底层的设备寄存器操作,唤醒被阻塞的驱动程序。
-
设备驱动程序 (与硬件直接对话):内核模块,与具体的设备型号/控制器 一一对应。职责 :向上提供统一的设备操作接口(如
read,write);向下将OS的通用I/O请求翻译为针对特定设备的、一系列具体的控制器命令(写入特定寄存器),并排队、启动I/O操作。- 关键点 :驱动程序是内核中唯一知道设备控制器细节的部分。
-
设备独立软件(设备无关软件层) :OS内核中与具体设备无关的部分。核心层。
-
职责:
-
设备命名与保护 :将用户友好的设备名(如
/dev/sda)映射到具体的驱动程序。 -
提供统一的系统调用接口 (如
open,read)。 -
缓冲区管理(见后文)。
-
错误报告。
-
分配与释放独占设备。
-
提供与设备无关的块大小(如上层认为所有块设备块大小都是4KB,由驱动程序负责与实际物理扇区大小转换)。
-
-
-
用户层I/O软件 :库函数(如C语言的
printf,fread)和SPOOLing系统(见后文)。它们封装系统调用,提供更友好的API。
-
4. 输入输出应用程序接口(API)
-
块设备接口 :提供
read/write等面向块的接口。文件系统建立在块设备接口之上。 -
字符设备接口 :提供
get/put等面向字符流的接口。也可能实现read/write。 -
网络设备接口 :通常通过套接字(Socket) 接口访问,支持
bind,listen,send,recv等操作。 -
阻塞/非阻塞I/O:
-
阻塞I/O :进程发起I/O请求后,若数据未就绪,则主动阻塞,让出CPU。
-
非阻塞I/O :进程发起I/O请求后,无论数据是否就绪都立即返回 。进程需要轮询检查状态。
-
异步I/O :进程发起I/O请求后立即返回,继续执行。当I/O操作完成后 ,系统会通知 进程(如通过信号或回调函数)。真正的"后台"操作。
-
408考点 :区分这三种I/O模型。阻塞/非阻塞关注等待数据时的行为 ,同步/异步关注数据就绪后的通知方式。
-
-
(二)设备独立软件
-
1. 缓冲区管理 - 核心性能优化手段
-
目的:
-
缓和CPU与I/O设备速度不匹配的矛盾。
-
减少对CPU的中断频率(DMA/块设备一次传输一块数据才中断一次)。
-
提高CPU与I/O设备的并行性。
-
解决数据粒度不匹配(如网络数据包与磁盘块大小不同)。
-
-
单缓冲区 :分配一个缓冲区。当进程需要数据时,先将磁盘块读入缓冲区,然后进程从缓冲区取数据。处理一块数据的总时间 ≈
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(外部设备联机并行操作)。
-
核心思想 :利用高速的共享设备(磁盘) 模拟低速的独占设备(如打印机)。
-
工作原理(以打印为例):
-
当用户进程请求打印时,SPOOLing系统 将数据快速输出到磁盘的"输出井"(一个特定区域)。
-
用户进程认为打印已完成,可以继续执行。
-
后台的SPOOLing进程 负责在打印机空闲时 ,从输出井中取出数据,真正地、顺序地送给打印机打印。
-
-
特点:
-
将物理的独占设备 变成了逻辑的共享设备。
-
实现了虚拟设备功能。
-
-
应用:打印机共享、早期批处理系统的输入/输出井。
-
-
4. 设备驱动程序接口
-
设备独立软件层通过一组标准的、与设备无关的函数调用接口来调用驱动程序。驱动程序的编写者需要实现这些接口。
-
在类Unix系统中,这个接口通常表现为一个包含函数指针(如
open,read,ioctl)的数据结构(如file_operations)。驱动程序初始化时,向内核注册这个结构。
-
(三)外存管理
-
1. 磁盘 - 传统机械硬盘,I/O性能的瓶颈所在
-
结构 :由多个盘片 叠加,每个盘面有对应的磁头 。数据存储在磁道 上,多个盘面的同一磁道组成柱面 。磁道划分为扇区(通常512B或4KB)。
-
访问时间 :
访问时间 = 寻道时间 + 旋转延迟 + 传输时间。-
寻道时间 :磁头移动到目标磁道的时间。最长、影响最大。
-
旋转延迟:盘片旋转,使目标扇区到达磁头下方的时间。平均为旋转半圈的时间。
-
传输时间:读写数据的时间。
-
-
磁盘调度算法 - 核心考点,目标是减少平均寻道时间
-
先来先服务(FCFS) :按请求顺序服务。公平但性能差,寻道时间长。
-
最短寻道时间优先(SSTF) :总是选择当前磁头位置距离最近 的请求。性能优于FCFS,但可能导致饥饿(边缘磁道的请求可能长时间得不到服务)。
-
扫描算法(电梯算法,SCAN) :磁头从一端开始,单向 移动到另一端,沿途服务所有请求;到达另一端后立即反向 移动并继续服务。性能好,无饥饿,但对刚扫描过的区域响应慢。
-
循环扫描算法(C-SCAN) :改进SCAN。磁头单向移动 服务请求,到达另一端后立即快速返回起点 (不服务),重新开始单向扫描。提供了更均匀的等待时间。
-
LOOK与C-LOOK算法 :SCAN和C-SCAN的优化 。磁头移动无需到达磁盘端点 ,只需移动到最远的一个请求 就立即反向(LOOK)或返回(C-LOOK)。现代系统实际采用的方式。
-
-
408真题风格 :给出一系列柱面请求序列和初始磁头位置,要求手工模拟上述调度算法,计算磁头移动的总柱面数(寻道距离)。
-
-
2. 固态硬盘(SSD)
-
读写性能特性:
-
以页为单位读写 (如4KB, 8KB),以块为单位擦除(通常由几十上百个页组成)。
-
读快,写慢,擦除极慢。
-
随机读写性能远超机械硬盘(无寻道和旋转延迟)。
-
-
磨损均衡 :SSD的每个存储单元(Cell)有写入次数限制 。磨损均衡技术旨在将写操作均匀分布到所有存储单元上,避免部分单元过早损坏。
-
动态磨损均衡:写入时,选择擦除次数最少的块。
-
静态磨损均衡:当检测到某些块很少被更新时,主动将冷数据移到写次数多的块,腾出冷块来接收新数据。
-
-
与操作系统的交互:现代操作系统(如Windows的TRIM命令)需要感知SSD特性,在删除文件时通知SSD,以便其内部进行垃圾回收和磨损均衡,维持性能。
-
408考点:比较SSD与HDD的特性差异;理解磨损均衡的必要性。
-
总结与408备考策略
-
明确两个视角 :本章内容是**《组成原理》I/O硬件控制** 的软件延续。硬件决定"能不能做"(DMA),软件决定"如何高效、统一地做"(驱动、缓冲、调度)。
-
抓住三个性能核心:
-
减少中断开销 -> DMA。
-
缓和速度矛盾 -> 缓冲区管理。
-
减少机械延迟 -> 磁盘调度算法。
-
-
理解四大抽象/改造:
-
设备无关性抽象(设备独立软件层)。
-
共享化改造(SPOOLing)。
-
块设备抽象(文件系统的基础)。
-
网络设备抽象(Socket)。
-
-
408必考题型与应对:
-
磁盘调度算法计算 :与进程调度类似,给请求序列,模拟SCAN(LOOK) 和C-SCAN(C-LOOK) 算法,计算磁头移动距离。SSTF也要掌握。
-
DMA/中断开销计算:结合《组成原理》知识,计算CPU时间利用率。
-
缓冲区工作分析:理解单/双缓冲区的工作原理和时间计算。
-
概念辨析选择题:I/O控制方式比较、I/O软件层次功能、阻塞/非阻塞/异步I/O、SPOOLing原理。
-
I/O管理章节的知识点相对分散但逻辑清晰,核心在于理解操作系统如何通过软件分层、缓冲、调度等一系列策略,来管理和优化性能差异巨大、种类繁多的I/O设备。真题中的计算题(磁盘调度、DMA)和概念题是复习的重点。
10