操作系统基础知识:进程管理、死锁、存储管理、文件管理、设备管理、作业调度
操作系统是计算机系统中承上启下的核心系统软件,它向下管理硬件资源,向上为应用程序提供运行环境。在软件设计师考试中,操作系统知识不仅是上午选择题的必考内容,更是理解并发编程、性能优化和系统设计的基石。本章围绕六大核心主题展开:进程管理解决CPU如何高效分配的问题,死锁处理应对资源竞争中的僵局,存储管理负责内存空间的合理划分与调度,文件管理组织海量数据的持久化存储,设备管理屏蔽硬件差异并提供统一接口,作业调度则决定用户任务如何进入系统并被执行。这六大主题相互关联,共同构成操作系统的资源管理全景图。
进程管理:并发执行的核心
核心原理:进程是程序在某个数据集合上的一次执行过程,是系统进行资源分配和调度的独立单位。每个进程在内核中对应一个进程控制块(PCB),PCB记录了进程标识符、状态、程序计数器、寄存器上下文、内存限制、打开文件列表等关键信息。进程在其生命周期中经历三种基本状态:就绪态(已具备运行条件,等待CPU)、运行态(正在CPU上执行)、阻塞态(等待某事件完成,如I/O操作)。状态转换的触发条件包括:时间片耗尽(运行→就绪)、等待I/O(运行→阻塞)、I/O完成(阻塞→就绪)、调度器选中(就绪→运行)。
进程同步与互斥:当多个进程共享资源时,必须解决两个问题——互斥(同一时刻仅允许一个进程访问临界资源)和同步(多个进程按特定顺序协作)。经典解决方案包括:信号量机制(P操作申请资源、V操作释放资源)、管程(将共享变量和操作封装为模块)、原子操作(如Test-and-Set指令)。PV操作必须成对出现,否则会导致死锁或资源泄漏。
| 调度算法 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 先来先服务(FCFS) | 按到达顺序执行 | 公平、实现简单 | 短作业等待时间长 | 批处理系统 |
| 短作业优先(SJF) | 优先执行预计运行时间最短的作业 | 平均等待时间最短 | 长作业可能饥饿 | 批处理系统 |
| 时间片轮转(RR) | 每个进程分配固定时间片 | 响应时间短、公平 | 时间片设置影响性能 | 分时系统 |
| 优先级调度 | 按优先级高低执行 | 可区分紧急程度 | 低优先级可能饥饿 | 实时系统 |
| 多级反馈队列 | 多个队列,优先级递减,时间片递增 | 兼顾响应与吞吐 | 参数调优复杂 | 通用操作系统 |
死锁:资源竞争的僵局
核心原理:死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干预,它们都将无法推进。死锁产生的四个必要条件缺一不可:互斥条件(资源一次只能被一个进程使用)、请求与保持条件(进程已持有至少一个资源,又提出新的资源请求)、不可剥夺条件(进程已获得的资源在未使用完之前不能被强行剥夺)、循环等待条件(存在一个进程等待环,每个进程都在等待环中下一个进程持有的资源)。
死锁处理策略:操作系统通常采用四种策略应对死锁:预防(破坏四个必要条件之一,如资源一次性分配、可剥夺资源、按序分配资源)、避免(在资源分配前判断是否会导致不安全状态,典型算法为银行家算法)、检测与解除(允许死锁发生,通过资源分配图检测,然后采用资源剥夺、撤销进程或回退方式解除)、鸵鸟策略(忽略死锁,因为死锁发生概率低且处理代价高,Windows和Linux均采用此策略)。
银行家算法核心逻辑:系统维护Available(可用资源)、Max(最大需求)、Allocation(已分配)、Need(还需资源)四个数据结构。每次分配前检查:是否存在安全序列,使得每个进程的Need都能被当前Available满足。若存在安全序列则分配,否则拒绝请求。该算法的时间复杂度为O(n²×m),其中n为进程数,m为资源类型数。
存储管理:内存空间的科学分配
核心原理:存储管理的主要任务包括:内存空间的分配与回收、地址转换(逻辑地址到物理地址)、内存扩充(虚拟内存)、内存保护。常见的连续分配方式有单一连续分配(仅适合单用户单任务)、固定分区分配(分区大小固定,易产生内部碎片)、动态分区分配(按需分配,易产生外部碎片,常用首次适应、最佳适应、最坏适应算法)。现代操作系统普遍采用分页存储管理:将内存划分为固定大小的页框(通常4KB),进程的逻辑地址空间也划分为等大小的页,通过页表实现地址映射。
虚拟内存与页面置换:虚拟内存允许进程在部分装入的情况下运行,当访问的页面不在内存时触发缺页中断,由操作系统将所需页面从磁盘调入。若内存已满,则需进行页面置换。常用置换算法包括:最佳置换(OPT)(淘汰未来最长时间不被访问的页面,理论最优但无法实现)、先进先出(FIFO)(淘汰最早进入的页面,实现简单但可能产生Belady异常)、最近最久未使用(LRU)(淘汰最长时间未被访问的页面,性能好但硬件开销大)、时钟算法(Clock)(LRU的近似实现,使用访问位循环检测)。
| 管理方式 | 地址空间 | 碎片类型 | 内存保护 | 共享 | 典型系统 |
|---|---|---|---|---|---|
| 分页 | 一维 | 内部碎片 | 页表控制 | 困难 | Linux、Windows |
| 分段 | 二维(段号+段内偏移) | 外部碎片 | 段表控制 | 容易 | 早期Unix |
| 段页式 | 二维+页内偏移 | 少量内部碎片 | 段表+页表 | 较容易 | 现代Unix/Linux |
文件管理:数据的持久化组织
核心原理:文件系统负责管理外存(磁盘)上的数据,提供文件的逻辑组织、物理存储、目录管理和存取控制。文件的逻辑结构分为有结构文件(如顺序文件、索引文件、索引顺序文件)和无结构文件(流式文件)。文件的物理结构决定了数据在磁盘上的存储方式:连续结构(文件数据连续存放,支持随机访问但易产生外部碎片)、链接结构(每个块包含指向下一块的指针,无外部碎片但仅支持顺序访问)、索引结构(为每个文件建立索引块,支持随机访问且无碎片,但索引块本身占用空间)。
目录与存储空间管理:目录结构从单级目录发展为两级目录、树形目录(当前主流),再到无环图目录(支持共享)。文件存储空间管理常用方法包括:空闲表法(记录连续空闲区)、空闲链表法(将空闲块链接成链表)、位示图法(用二进制位表示每个物理块是否空闲,1表示已分配,0表示空闲)、成组链接法(Unix系统采用,将空闲块分组管理)。位示图法在考试中最为常见,需要掌握盘块号与位示图位置的换算关系。
du -sh *发现日志目录占用60%空间。进一步分析发现,大量小文件(平均4KB)导致每个文件至少占用一个4KB块,而文件系统块大小为4KB,造成严重内部碎片。解决方案:将日志文件按日期归档压缩,并调整文件系统块大小为1KB(若文件系统支持)。优化后空间占用降低45%。复盘要点:文件系统块大小的选择需权衡——块越大,内部碎片越严重,但I/O效率越高;块越小,空间利用率高,但元数据开销增大。
设备管理:屏蔽硬件差异的抽象层
核心原理:设备管理的主要目标是:提高I/O效率、统一设备接口、实现设备分配与回收。I/O控制方式经历了四个发展阶段:程序直接控制方式(CPU轮询设备状态,效率极低)、中断驱动方式(设备完成操作后发中断通知CPU,CPU不再忙等)、DMA方式(直接存储器访问,设备与内存直接传输数据,仅在开始和结束时需要CPU干预)、通道方式(通道是专门处理I/O的处理器,可执行通道程序,实现CPU与I/O并行)。
SPOOLing技术:假脱机技术(Simultaneous Peripheral Operations On-Line)利用磁盘作为缓冲,将独占设备改造为共享设备。以打印机为例:当多个进程请求打印时,SPOOLing系统将每个进程的打印数据先写入磁盘的打印缓冲区(形成打印队列),然后由输出进程统一调度打印。这样,进程不再直接与打印机交互,而是与磁盘交互,从而将独占设备虚拟化为共享设备,显著提高设备利用率。
缓冲区管理:缓冲区用于缓解CPU与I/O设备之间的速度不匹配。常见缓冲技术包括:单缓冲(一个缓冲区,设备和CPU交替使用)、双缓冲(两个缓冲区,设备与CPU可并行操作)、循环缓冲(多个缓冲区组成环形队列)、缓冲池(系统统一管理多个缓冲区,按需分配)。缓冲区大小直接影响I/O性能:过小导致频繁中断,过大浪费内存。
作业调度:从提交到执行的完整链路
核心原理:作业调度(高级调度)决定哪些作业从后备队列调入内存,并创建进程。它涉及三个层次:高级调度(作业调度)——从外存后备队列选择作业调入内存,频率较低(秒级到分钟级);中级调度(内存调度)——决定进程是否被调入/调出内存(挂起/激活),用于平衡内存负载;低级调度(进程调度)——从就绪队列选择进程分配CPU,频率最高(毫秒级)。
作业调度算法:除前述进程调度算法外,作业调度还常用先来先服务(按提交顺序)、短作业优先(预计运行时间最短者优先,可证明平均等待时间最短)、响应比最高者优先(HRRN)(响应比 = (等待时间 + 要求服务时间) / 要求服务时间,兼顾长短作业)、优先级调度(按作业优先级)。HRRN算法是FCFS和SJF的折中,既照顾短作业,又避免长作业饥饿。
| 调度层次 | 调度对象 | 频率 | 主要目标 | 典型算法 |
|---|---|---|---|---|
| 高级调度 | 作业(外存→内存) | 低(秒~分钟) | 控制多道程序度 | FCFS、SJF、HRRN |
| 中级调度 | 进程(内存↔外存) | 中(分钟级) | 平衡内存负载 | 基于内存使用率 |
| 低级调度 | 进程(就绪→运行) | 高(毫秒级) | 响应时间与吞吐量 | RR、优先级、多级队列 |
vmstat发现r(运行队列)持续大于8,但CPU空闲;② 使用iostat发现磁盘util接近100%;③ 使用pidstat定位到大量进程处于D状态(不可中断睡眠,等待I/O)。根因:系统采用SJF调度,大量短事务进程频繁触发磁盘I/O,导致磁盘成为瓶颈。优化方案:① 将数据库日志和数据文件分离到不同磁盘;② 调整进程调度策略为CFS(完全公平调度);③ 增加内存缓存,减少磁盘访问。结果:交易响应时间恢复至60ms以内,吞吐量提升3倍。复盘要点:调度算法的选择需结合I/O密集型与CPU密集型进程的混合比例,单一指标优化可能引发新瓶颈。