type
status
date
slug
summary
tags
category
icon
password
操作系统概念系统层次结构视图分时/实时操作系统分时操作系统(Time-Sharing Operating System)实时操作系统(Real-Time Operating System, RTOS)批处理操作系统(Batch Operating System) 定义相关设施作业控制语言(JCL)作业说明书两者关系与区别总结工作流程主要特点典型结构图应用场景与其他系统比较历史意义操作系统结构分类单体式结构(Monolithic Architecture)层次式结构(Layered Architecture)虚拟机结构(Virtual Machine Architecture)微内核结构(Microkernel Architecture)客户/服务器结构(Client/Server Architecture)结构对比总结进程的三状态/七状态模型三状态模型(最基础)七状态模型(更精细)七种状态及说明: 状态转换简图: 两者的区别与联系七状态模型存在的意义可重入程序可重入程序的关键特性为什么可重入很重要?可重入程序 vs. 线程安全程序例子其他补充与体系兼容性修正
本文由ChatGPT 4o生成
完全面向考试的补充, 不在体系之内.
操作系统概念
OS是计算机系统的公共软件基础设施, 所有应用程序共用OS服务, 且OS内核是反应式reactive机 制(即中断驱动的).
“脱机控制”和”联机控制/交互控制”是一组相对概念, “脱机”指用户输入程序后脱离控制(如批处理系统).
作业控制语言(脱机)/操作控制命令(联机)
系统层次结构视图


分时/实时操作系统
分时操作系统和实时操作系统是两种不同类型的操作系统, 它们针对不同的应用场景设计, 具有不同的特性和目标. 以下是对它们的介绍:
分时操作系统(Time-Sharing Operating System)
定义:
分时操作系统是一种允许多个用户(或任务)通过终端共享计算机资源的操作系统. 它通过快速切换CPU的使用权, 使每个用户感觉自己独占系统.
主要特点:
- 多用户支持: 允许多个用户同时在线交互.
- 快速响应: 每个用户都能在较短时间内获得系统响应(通常在几百毫秒以内).
- 时间片轮转: 系统按时间片分配CPU, 轮流为各任务服务.
- 公平性: 系统尽力确保所有用户或任务都能获得均等的资源使用机会.
应用场景:
- 多用户系统(如早期的Unix系统)
- 交互式开发环境
- 教学或科研系统
实时操作系统(Real-Time Operating System, RTOS)
定义:
实时操作系统是一种能在严格时间限制内完成任务的操作系统. 它的关键在于任务的确定性, 而不仅仅是速度.
主要特点:
- 确定性: 系统行为在时间上是可预测的, 响应时间是有上限的.
- 高可靠性: 通常用于对安全性、可靠性要求极高的系统.
- 任务优先级管理: 支持基于优先级的任务调度, 实时任务优先.
- 抢占式调度: 高优先级任务可以随时打断低优先级任务.
实时系统分类:
- 硬实时系统: 任务必须在截止时间之前完成, 否则后果严重(如航天器控制).
- 软实时系统: 尽量满足时限, 偶尔失败可接受(如视频播放).
应用场景:
- 工业控制系统(如PLC)
- 航空航天系统
- 汽车电子控制系统(如ABS)
- 医疗设备
总结对比:
特性 | 分时操作系统 | 实时操作系统 |
核心目标 | 多用户交互、公平性 | 时间确定性、响应及时 |
响应时间 | 一般在毫秒级别 | 严格时间约束(微秒到毫秒) |
应用领域 | 教育、科研、办公系统 | 工业控制、嵌入式、航天等 |
调度方式 | 时间片轮转 | 基于优先级的抢占调度 |
批处理操作系统(Batch Operating System)
一种早期的操作系统类型, 主要用于自动顺序地执行一批作业, 用户将任务提交后无需干预, 系统自动完成任务的处理.
定义
批处理操作系统是指:
把一批需要执行的作业集中起来按照一定顺序依次自动处理
在批处理操作系统中, 为了让系统知道如何处理一个作业, 用户必须提供详细的说明信息. 这些说明通常通过作业控制语言(Job Control Language, JCL)和作业说明书来表达.
相关设施
作业控制语言(JCL)
定义:
作业控制语言是用户与批处理操作系统之间的接口语言, 用于描述作业的控制信息, 如要执行的程序、所需资源、输入输出文件等.
主要功能:
- 指示操作系统作业的开始与结束
- 指定要运行的程序名或命令
- 描述输入/输出设备(如磁带、打印机)
- 指定资源需求(如内存大小、CPU时间)
- 控制作业调度和作业的步骤顺序
结构特点:
- JCL语句通常由一系列控制命令行组成
- 每一行描述一个操作或参数
- 通常是非交互式的文本命令
举例(简化形式):
在实际系统中(如IBM大型机), JCL会更加复杂, 例如:
作业说明书
描述对一次计算机求解任务的控制方式
定义:
作业说明书是对整个作业的非形式化文档描述, 通常以书面或文档形式提供给操作员或系统, 说明作业的目的、步骤、输入输出要求等.
内容包括:
- 作业的功能说明(如“工资处理”、“库存更新”)
- 所需程序及其执行顺序
- 输入/输出文件名和格式
- 所需资源(如磁带数量、打印份数)
- 出错时的处理办法
- 特殊说明(如运行时间窗口)
举例:
两者关系与区别
项目 | 作业控制语言(JCL) | 作业说明书 |
作用 | 提供机器可读的控制指令 | 提供人工可读的作业执行说明 |
面向对象 | 操作系统 | 操作员或系统管理员 |
表达方式 | 严格格式的语言语句 | 自然语言或文档形式 |
是否参与执行 | 是(直接控制作业调度和资源) | 否(只是指导和辅助) |
在哪里使用 | 随作业一起提交, 供操作系统解析 | 附加文档或说明, 供人工阅读参考 |
总结
- 作业控制语言(JCL)是批处理系统中用于控制作业运行的正式语言;
- 作业说明书是人工用于说明作业背景、目的、结构的辅助文档;
- 二者配合使用, 是早期大型机和批处理系统中作业管理的核心手段.
工作流程
- 用户提交作业(通常是通过打孔卡或磁带).
- 作业输入被收集成一批(batch), 由操作系统统一调度处理.
- 系统依次执行每个作业, 并将结果输出到指定设备(如打印机).
- 用户查看处理结果, 通常在作业完成一段时间之后.
主要特点
- 无交互性: 作业执行过程中用户无法干预.
- 自动化高: 系统自动完成作业的调度和执行.
- 吞吐量高: 适合大量作业集中处理, 提高资源利用率.
- 响应时间长: 作业从提交到结果输出需要较长时间.
- 作业调度机制简单: 一般使用先来先服务(FCFS)或最短作业优先(SJF)等简单策略.
典型结构图
应用场景
- 早期的大型机系统(如IBM 7090、UNIVAC等)
- 科学计算、工程分析
- 银行、财务、工资处理系统
- 现代系统中的定期批处理任务(如日志分析、报表生成)
与其他系统比较
特性 | 批处理操作系统 | 分时操作系统 | 实时操作系统 |
用户交互 | 无 | 有 | 有 |
响应时间 | 长(分钟到小时) | 快(毫秒级) | 非常快(确定时限) |
作业处理方式 | 顺序自动执行 | 多用户并发 | 按优先级、时限 |
适用场景 | 批量处理、后台计算 | 多用户终端、开发环境 | 工控、嵌入式、航天 |
历史意义
批处理操作系统是操作系统发展的重要阶段, 奠定了作业调度、内存管理、I/O管理等现代操作系统的基础概念.
操作系统结构分类
下面是操作系统常见的几种体系结构: 单体式结构、层次式结构、虚拟机结构、微内核结构、客户/服务器结构 的简要介绍与对比:
单体式结构(Monolithic Architecture)
定义:
单体式操作系统将所有操作系统的功能(如进程管理、内存管理、文件系统、驱动程序等)全部集成在一个大模块中运行在内核态.
特点:
- 所有模块共享内核空间, 函数调用效率高
- 模块间耦合度高, 系统修改困难
- 易于实现, 但安全性和稳定性较差
代表系统:
- Unix早期版本(如Version 6 Unix)
- MS-DOS
层次式结构(Layered Architecture)
定义:
操作系统被划分为若干层, 每层只与相邻层交互. 下层为上层提供服务, 层与层之间有明确接口.
特点:
- 层次清晰, 便于调试和维护
- 信息隐藏良好, 高层无需关心底层细节
- 系统设计更复杂, 对层次划分要求高
典型结构示意:
代表系统:
- THE系统(最早的层次式OS)
- Multics(部分层次)
- Linux中部分模块设计也具有层次性
虚拟机结构(Virtual Machine Architecture)
定义:
通过在硬件之上加入一个虚拟层(如VMM, 虚拟机监视器), 为每个用户创建一个完整的“虚拟计算机”环境, 多个虚拟机可以共享物理资源.
特点:
- 每个虚拟机看起来像一台真实计算机
- 安全性强, 各虚拟机之间相互隔离
- 资源利用率高, 可运行不同操作系统
代表系统:
- IBM VM/370
- 现代的 VMware、VirtualBox、KVM
微内核结构(Microkernel Architecture)
定义:
将操作系统的基本功能(如进程管理、内存管理、IPC)保持在极小的内核中, 其他功能(文件系统、驱动等)移出内核, 作为用户态服务运行.
特点:
- 结构简洁, 内核小巧稳定
- 系统更容易扩展和移植
- 用户态与内核态频繁通信, 性能开销大
代表系统:
- Mach(微内核理论的代表)
- Minix 3
- QNX(商用微内核)
客户/服务器结构(Client/Server Architecture)
定义:
操作系统按功能划分为服务器(提供资源和服务)与客户端(发起请求), 通常以进程或模块的形式存在, 采用消息传递通信.
特点:
- 松耦合、可扩展、灵活的模块设计
- 易于将部分服务分布在网络中
- 常与微内核或分布式系统结合使用
代表系统:
- Windows NT系列部分服务采用C/S结构
- 分布式操作系统 Amoeba、Chorus
结构对比总结
结构类型 | 核心特点 | 优点 | 缺点 | 代表系统 |
单体式 | 所有模块集成在一个内核中 | 效率高, 设计简单 | 不易维护, 稳定性差 | Unix早期、MS-DOS |
层次式 | 模块分层, 按层次调用 | 易调试、清晰结构 | 分层不当可能引入性能问题 | THE、Multics |
虚拟机 | 模拟多个独立计算环境 | 隔离性强, 资源利用好 | 管理复杂, 性能略低 | VM/370、VirtualBox |
微内核 | 内核仅保留核心功能 | 可移植、安全性高 | 通信开销大 | Mach、Minix、QNX |
客户/服务器 | 服务模块化, 消息传递通信 | 模块解耦, 支持分布式 | 通信复杂、设计难度大 | Windows NT、Amoeba |
进程的三状态/七状态模型
进程的状态模型用于描述操作系统在调度和管理进程时, 进程可能处于的不同状态. 常见的模型有三状态模型和更精细的七状态模型.
三状态模型(最基础)
三种状态:
- 就绪(Ready)
- 进程已分配资源, 等待CPU执行.
- 运行(Running)
- 进程获得CPU, 正在执行.
- 阻塞(Blocked)/等待(Waiting)
- 进程在等待某个事件(如I/O完成), 无法运行或进入就绪队列.
状态转换图:
七状态模型(更精细)
为更准确描述进程在复杂调度系统中的行为, 七状态模型对三状态模型进行了扩展.
七种状态及说明:
- 新建(New)
- 进程正在创建, 还未加入就绪队列.
- 就绪(Ready)
- 进程已准备好执行, 等待CPU分配.
- 运行(Running)
- 进程正在CPU上执行.
- 阻塞(Blocked/Waiting)
- 等待某个事件完成(如I/O操作), 暂时无法继续执行.
- 就绪挂起(Ready Suspended)
- 就绪状态的进程被换出内存, 暂时保存在磁盘中.
- 阻塞挂起(Blocked Suspended)
- 阻塞状态的进程被换出内存, 保存到磁盘中.
- 终止(Terminated)
- 进程执行完毕或被强制结束, 进入清理阶段.
状态转换简图:
两者的区别与联系
项目 | 三状态模型 | 七状态模型 |
状态数量 | 3 | 7 |
管理粒度 | 粗略(基本调度过程) | 精细(包括挂起和创建/终止过程) |
是否区分挂起状态 | 否 | 是(就绪挂起/阻塞挂起) |
是否体现进程生命周期 | 部分(不含新建/终止) | 全部(从新建到终止) |
适用场景 | 教学/简单操作系统 | 多用户、虚拟内存等复杂系统 |
七状态模型存在的意义
- 支持虚拟内存与进程换出机制
- 明确进程的创建与终止过程
- 更好地管理系统资源与调度策略
可重入程序
一个可重入程序(Reentrant Program)是一种特殊的子程序或函数, 它可以在执行过程中被中断, 然后重新进入(即再次调用), 而不会导致错误或不一致的结果. 更重要的是, 即使有多个线程或进程同时调用它, 它也能正确执行.
可重入程序的关键特性
要成为可重入的, 一个程序必须满足以下关键条件:
- 不修改自身代码:
- 可重入程序在执行过程中不能修改自身的指令代码. 这意味着它不能在运行时修改其程序段的任何部分.
- 这通常通过将代码存储在只读内存区域来实现.
- 不修改共享数据:
- 可重入程序不能修改全局或静态变量(即在多次调用之间共享的数据), 除非这些共享数据是受保护的(例如, 通过互斥锁).
- 理想情况下, 可重入程序应该只操作局部变量, 这些变量在每次函数调用时都在栈上分配, 并且只对当前调用可见.
- 如果确实需要访问全局或静态数据, 那么这些数据必须是只读的, 或者通过参数传递给函数, 或者通过线程本地存储 (Thread Local Storage, TLS) 来实现每个线程独立的数据副本.
- 不依赖前一次执行的状态:
- 每次调用可重入程序都应该是独立的, 不依赖于之前调用的任何内部状态.
- 它不应该使用静态的非局部变量来存储状态信息, 这些信息可能会影响后续调用.
- 不调用非可重入函数:
- 如果一个可重入程序调用了其他函数, 那么这些被调用的函数也必须是可重入的. 如果它调用了非可重入函数, 那么整个程序就变得不可重入了.
为什么可重入很重要?
可重入性在以下场景中至关重要:
- 多线程/多进程环境:
- 在并发系统中, 多个线程或进程可能同时尝试执行同一段代码. 如果代码是可重入的, 那么它们可以安全地共享和调用它, 而无需担心数据损坏或竞态条件. 例如, 操作系统内核中的许多系统调用都是可重入的.
- 中断服务程序 (ISR) 或信号处理程序:
- 当一个程序正在执行时, 可能会发生中断, 导致中断服务程序被调用. 如果中断服务程序和被中断的程序共享代码, 那么这些代码必须是可重入的, 以确保中断处理完成后, 原程序能够正确恢复执行.
- 同样, 在 Unix/Linux 中, 信号处理程序可以在任何时候被调用来响应一个信号. 如果信号处理程序和它可能中断的程序共享代码, 那么这些代码必须是可重入的.
- 递归调用:
- 递归函数通常是可重入的, 因为它们主要通过栈来管理局部变量和返回地址, 每次递归调用都有自己独立的栈帧.
可重入程序 vs. 线程安全程序
这两个概念经常被混淆, 但它们是不同的:
- 可重入程序 (Reentrant Program):
- 强调的是函数自身的特性, 即它不依赖于前一次执行的状态, 并且可以被中断后安全地重新进入.
- 主要关注的是没有副作用, 不修改共享数据或自身的代码.
- 一个可重入函数通常也是线程安全的(假设它不调用非可重入函数), 因为它不使用共享可变状态.
- 线程安全程序 (Thread-Safe Program):
- 强调的是在多线程环境下, 对共享资源的访问是同步的, 不会导致数据损坏.
- 线程安全可以通过多种机制实现, 包括互斥锁 (Mutexes)、信号量 (Semaphores)、读写锁 (Read-Write Locks) 等.
- 一个线程安全函数不一定是可重入的. 例如, 一个函数可能通过加锁来保护对某个全局变量的访问, 使其在多线程环境下是安全的. 但如果这个函数在加锁后被中断, 然后再次被调用(在同一个线程中), 它可能会尝试再次加锁, 导致死锁(如果锁不可重入)或不正确的行为.
总结:
- 所有可重入函数都是线程安全的.
- 并非所有线程安全函数都是可重入的.
例子
非可重入函数示例:
如果两个线程同时调用
increment_counter
, 可能会导致 global_counter
的值不正确. 此外, 如果 increment_counter
被中断, 然后又被调用, 它会修改同一个 global_counter
, 这可能在某些上下文中导致问题. 可重入函数示例:
add_numbers
函数是可重入的. 它只使用传入的参数和自己的局部变量, 不依赖于任何全局状态, 也不修改自身代码. 无论何时被调用, 或者被多少个线程同时调用, 它都会给出正确的结果. 理解可重入性对于编写健壮的并发程序、操作系统内核以及嵌入式系统代码至关重要.
其他补充与体系兼容性修正
- “n道程序系统”只允许内存中驻留n个程序(就绪态+运行态进程的总数不超过n, 如果已有任务不会被踢出, 则有新来的必须等待前面的运行完毕)
- 中断分类:
- 程序性中断 → 由执行指令引起的中断(算数异常, 非法指令, 非法存取, 终止指令, 缺页异常)
- 外中断 → 由外设信号引起的中断, 如时钟中断, 设备报到与结束中断, 键盘鼠标信号和关机重启中断等
- I/O中断 → 来源于外设, 用于报告I/O状态(I/O完成时)
- 访管中断 → 执行Trap指令引起中断(自愿)
- “间接盘块”专指间接指针最终索引到的数据块, 存放简介索引的盘块不属于间接盘块
- 文件读写偏移放在系统打开文件表里
- 课程里面讲的是多级反馈队列中若不被抢占(没有其他进程竞争)就不降优先级, 且每层内部按照先来先服务顺序调度, 第i层时间片长度为, 从第0层开始往下
- 系统管理员同时可用用户指令和特权指令, 所以特权指令是指执行可能有损系统安全性的指令而非系统管理员可用的指令
- LRU是最近最久未使用, 而不是翻译的”最近最少用”
- “静态重定位”的时机是程序装入时, 装入程序一次性修改整个程序中所有指令的地址引用
- “可以被装入内存的任意地址处” 等价于 “可动态链接(地址没有写死)”
- 只有内存能和外设直接交换数据
- 解决CPU和外设速度矛盾的技术是缓冲技术
- 使多个进程能有效同时处理输入和输出的技术是缓冲池结构的缓冲技术
- 目的: 主要用于缓存来自低速存储介质(如磁盘)的数据, 以提高数据访问速度和减少I/O操作. 它关注的是如何高效地管理一块内存区域来存储不确定顺序和大小的、来自外部源的数据块.
- 结构:
- 通常是一块预先分配好的大块内存区域.
- 被划分为固定大小的页/块(Pages/Blocks), 这些块的大小通常与底层存储介质的I/O单元大小一致(例如, 数据库中的数据页).
- 配备复杂的管理机制:
- 哈希表: 快速查找某个数据块是否已在缓冲池中.
- 管理链表: 如LRU(最近最少使用)、LFU(最不经常使用)等淘汰算法链表, 用于在缓冲池满时决定哪个数据块被替换出去.
- 脏页链表: 跟踪被修改但尚未写回磁盘的数据块.
- 空闲链表: 管理可用的空闲缓冲块.
- 使用场景:
- 数据库系统: 缓存表数据、索引数据.
- 操作系统: 文件系统缓存、虚拟内存管理.
- 网络文件系统(NFS): 缓存远程文件数据.
- 特点:
- 非顺序性: 缓存的数据块通常不是按照顺序存取的, 而是根据应用程序的请求随机存取.
- 淘汰机制: 当空间不足时, 需要复杂的淘汰算法来决定哪些数据块被移除, 以最大化缓存命中率.
- 持久性考虑: 需要处理脏页的写回策略(Write-back Cache).
- 目的: 主要用于在生产者和消费者之间进行数据流的传递, 实现解耦和异步通信. 它关注的是如何高效地、连续地存储和读取按顺序产生和消费的数据流.
- 结构:
- 通常是一块固定大小的连续内存区域, 逻辑上形成一个环形.
- 使用两个指针(或索引):
- 写入指针/头指针(Head Pointer / Write Pointer): 指向下一个数据将要被写入的位置.
- 读取指针/尾指针(Tail Pointer / Read Pointer): 指向下一个数据将要被读取的位置.
- 当写入指针到达缓冲区末尾时, 它会“回绕”到起始位置, 形成一个环. 读取指针也类似.
- 使用场景:
- 数据流处理: 音频/视频流、网络数据包.
- 线程间通信: 生产者-消费者模型中, 一个线程生产数据, 另一个线程消费数据.
- 日志系统: 临时存储日志事件.
- I/O驱动: 设备驱动程序和应用程序之间的数据交换.
- 特点:
- 顺序性: 数据通常按照生产顺序写入, 并按照消费顺序读取.
- 无淘汰算法: 数据通常在被读取后就“消失”或被覆盖, 没有复杂的缓存淘汰逻辑.
- 溢出/欠载处理: 需要处理生产者写满缓冲区(溢出)或消费者读空缓冲区(欠载)的情况, 通常通过阻塞或丢弃数据来处理.
- 简单高效: 指针操作非常快, 没有复杂的查找和管理开销.
缓冲池(Buffer Pool)和循环缓冲(Circular Buffer, 也叫环形缓冲区或环形队列)都是常见的缓冲技术, 但它们在目的、结构和使用场景上有显著的区别.
1. 缓冲池 (Buffer Pool)
2. 循环缓冲 (Circular Buffer / Ring Buffer)
核心区别总结:
特征 | 缓冲池 (Buffer Pool) | 循环缓冲 (Circular Buffer) |
主要目的 | 缓存来自低速存储的数据, 提高访问速度和I/O效率 | 顺序地传递数据流, 解耦生产者-消费者 |
数据特性 | 不确定顺序、随机访问的数据块 | 顺序产生和消费的数据流 |
管理复杂性 | 高(哈希表、淘汰算法、多链表) | 低(两个指针即可) |
空间管理 | 灵活, 需要淘汰策略 | 固定大小, 数据在被读取后被逻辑删除或覆盖 |
典型应用 | 数据库、文件系统缓存 | 数据流处理、线程间通信、日志系统 |
I/O模式 | 优化随机I/O, 批量写入, 预读 | 顺序读写, 实现数据流的生产消费 |
简而言之, 缓冲池是为随机访问的持久性数据提供高性能缓存, 而循环缓冲是为顺序流动的数据提供高效的中间缓冲区. 它们在系统设计中扮演着不同的角色, 但都旨在通过利用内存速度来优化性能.
- SPOOLing技术的系统中用户的打印结果首先被传送到磁盘的固定区域
- 大多数低速设备都属于独享设备
- 磁盘是直接存取的存储设备(直接存取等价于随机存取, 与顺序存取相对)
- SPOOLing技术的实质是将独享设备转化为共享设备
- SPOOLing技术中用于代替打印机(物理设备)的部分是虚拟设备
- 将系统中的每一台设备按某种原则进行统一的编号, 这些编号作为区分硬件和识别设备的代号, 该编号称为设备的绝对号
- 通道程序由一系列通道指令组成, 运行于I/O通道
- 文件系统用目录组织文件
- 物理文件: 文件的物理结构和组织, 包含顺序文件/连接文件/直接文件(散列文件)/索引文件; 逻辑文件: 文件的逻辑结构, 分为流式文件和记录式文件(定长记录/变长记录/跨块记录, 成组和分解)
- 试述操作系统中三个最基础的抽象, 并回答为什么要引⼊它们? 三个抽象: 进程抽象、虚存抽象、⽂件抽象 原因: ⽅便了系统对资源的管理、控制和调度
- 进程映像包括哪些组成部分? 进程程序块、进程数据块、核⼼栈、进程控制块(PCB) 三个块一个栈
- 系统形成死锁的四个必要条件 互斥条件、占有和等待条件、不剥夺条件、循环等待条件
- 死锁定理:进程-资源分配图是不可简化的——>用于死锁检测
- 磁盘调度: 扫描是来回的, 循环扫描是单向的, 循环扫描回去的路线也算移臂量
- 段: 不定长的连续内存区域
- Linux: 基于伙伴系统的slab分配器, 为小数据对象服务.
- 作者:JAY
- 链接:https://notion-next-353pmh21m-jays-projects-ab02da23.vercel.app//article/2093690b-3830-80f1-9705-cacad5cc813d
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。