操作系统复习
操作系统概述
操作系统的概念、地位、作用与定义:
- 地位: 操作系统是计算机系统中最核心的系统软件,介于用户与硬件之间,管理和控制计算机硬件和软件资源。
- 作用: 主要有两点,一是作为资源管理者(管理CPU、内存、I/O设备、文件等),二是作为用户与硬件之间的接口(提供命令行、图形界面等)。
- 定义: 操作系统是一组控制和管理计算机硬件与软件资源、合理地组织计算机工作流程以及方便用户使用的程序集合。
操作系统的分类:
多道批处理操作系统 (batch processing system)
分时操作系统 (time-sharing system)
实时操作系统 (real time system)
通用操作系统 (multi-purpose system) :同时具有分时、实时、批处理的功能
网络操作系统
分布式操作系统
多处理机操作系统
单用户操作系统
面向对象操作系统
嵌入式操作系统
智能卡操作系统
操作系统的硬件环境:
- 定时装置: 用于计时,实现分时和时间片调度。
- 堆栈、寄存器: 理解它们在程序执行和中断处理中的作用。
- 特权指令和非特权指令、处理器状态转换: 这是保护机制的基础。特权指令只能在核心态/管态/内核态执行,非特权指令可以在用户态执行。用户态到核心态的转换通常通过中断或系统调用触发,核心态到用户态通过修改程序状态字(PSW)实现。
- 地址映射机构: 将逻辑地址转换为物理地址,这是内存管理的核心。
- 存储保护: 防止程序非法访问内存,确保系统稳定。
- 中断装置: 计算机系统处理外部事件和异常的关键机制,也是操作系统实现多任务、分时、设备管理等功能的基础。
- 通道和DMA控制器: 用于实现I/O设备与内存之间的数据直接传输,减少CPU的干预,提高效率。
进程、线程和作业
操作系统的核心概念,进程,以及为了更细粒度管理并发而引入的线程。
- 多道程序设计:
- 单道程序设计的缺点: CPU利用率低,I/O设备空闲。
- 多道程序设计的提出和问题: 允许多个程序并发执行,提高资源利用率,但引入了资源共享、同步互斥、死锁等问题。
- 进程:
- 概念: 进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。它不仅仅是代码,还包括数据和进程控制块(PCB)。
- 进程状态和状态转换: 运行态、就绪态、阻塞态是核心三态,理解它们之间的转换条件(如调度、I/O完成、等待资源等)。
- 进程控制块(PCB): 进程的唯一标识,存储了进程的所有信息,是进程存在的标志。其组成(进程标识符、程序计数器、寄存器、进程状态、内存管理信息、I/O状态信息、记账信息等)和上下文(保存CPU寄存器内容以便切换)是重点。
- 进程队列: 就绪队列、阻塞队列等。
- 进程的类型和特性:
- 并发性,和其他进程一同向前推进
- 动态性,动态产生动态消亡,且生命周期中也处在变化之中
- 独立性,是调度的基本单位
- 异步性,每个进程都以相对独立、不可预知的速度向前推进
- 交互性,可以和其他进程发生直接或间接的相互作用
- 结构性,每一个进程都有一个PCB
- 进程相互联系和相互作用: 合作与竞争。
- 进程的创建、撤销和汇聚: 理解系统调用的过程。
- 进程和程序的联系和差别: 程序是静态的指令集合,进程是动态的执行过程。一个程序可以对应多个进程,一个进程只能对应一个程序。
- 线程和轻进程:
- 线程的引入、概念和结构: 线程是CPU调度和执行的基本单位,是进程中的一个实体。一个进程可以有多个线程共享进程的资源(地址空间、文件句柄等),但每个线程有独立的栈、程序计数器和寄存器。引入线程是为了提高并发性,降低开销。
- 线程控制块(TCB): 存储线程相关信息。
- 实现和应用: 用户级线程和内核级线程的区别。
- 用户级线程:控制块保存在目态空间,由运行系统维护
- 内核级线程:通过系统调用产生,操作系统管理
中断和处理器调度
中断机制以及处理器调度的各种算法。
- 中断和中断系统:
- 中断的概念、装置、处理逻辑: 中断是CPU对系统发生的某个事件的一种响应,中断装置负责检测中断信号。中断处理逻辑是保存现场、分析中断原因、执行中断服务例程、恢复现场。
- 嵌套中断和系统栈: 理解多重中断的发生和处理顺序,系统栈在中断处理中用于保存上下文。
- 进程状态转换的分解图: 通过中断来触发状态转换(如I/O完成中断使阻塞态转为就绪态)。
- 中断处理例程: 响应中断的特定程序。
- 处理器调度:
- 处理器调度的算法、时机和过程:
- 调度算法:
- 先来先服务(FCFS): 简单但可能导致长作业等待。
- 短作业优先(SJF): 最优平均周转时间,但难以实现。
- 优先级调度: 考虑作业的优先级,可能导致饥饿。
- 时间片轮转(RR): 适用于分时系统,公平性好,但时间片过小或过大都会影响效率。
- 多级反馈队列调度: 综合前几种算法的优点。
- 调度时机: 进程创建、终止、阻塞、I/O完成等。
- 调度过程: 保存当前进程上下文,选择新进程,恢复新进程上下文。
- 调度算法:
- 处理器调度的算法、时机和过程:
- 调度级别和多级调度: 高级调度(作业调度)、中级调度(内存调度)、低级调度(进程/CPU调度)。
- 实时调度:
- 最早截止期优先调度(Earliest Deadline First, EDF): 优先调度截止期最早的任务。可抢占式。要求 。
- 单调速率调度(Rate Monotonic Scheduling, RMS): 优先调度周期最短的任务。不可抢占式。要求 。其中 。
- 最小裕度优先调度(Least Slack Time First, LSTF): 优先调度裕度(截止期-剩余执行时间)最小的任务。
互斥、同步和通信
- 并发进程:
- 前驱图: 表示任务之间的依赖关系。
- 并发程序和顺序程序的特性: 并发程序具有不确定性。
- 并发执行的条件: 资源共享、执行次序不确定。
- 和时间有关的错误(竞争条件): 多个进程并发访问和修改共享数据,结果依赖于执行的相对速度。
- 顺序程序的特性:
- 连续性
- 封闭性,一个程序独占全部资源
- 可再现性
- 并发程序的特性:
- 间断性,多个程序是交叉执行的,可能会被中断
- 非封闭性,程序之间会互相影响
- 不可再现性,并发程序的交叉是随机的
- 若失去了非封闭性,则也会失去不可再现性
- 并发执行的条件:
- Bernstein条件
- 记 分别为程序 的读集和写集
- 互斥:
- 共享变量、临界区和互斥:
- 共享变量: 多个进程/线程可以访问的变量。
- 临界区: 访问共享资源的代码段。
- 空闲让进:进展性
- 忙则等待:互斥性
- 有限等待
- 让权等待:避免单核处理器中自旋导致死锁,多核处理器自旋也会导致性能损失
- 互斥: 任何时刻只允许一个进程进入临界区访问共享资源。
- 任何时刻最多只能有一个进程处于同一组共享变量的相同的临界区域
- 任何时刻最多只能有一个进程处于同一组共享变量的不同的临界区域
- 进程互斥原则:
- 互斥性,任意时刻至多只有一个进程在关于同一组共享变量的临界区内
- 进展性,在空闲时可以让想进入临界区的进程进入
- 有限等待性,所有进程需要在有限的等待时间内获得进入该临界区的机会
- 互斥的软件实现:
- Dekker 算法、Peterson 算法: 理论上可行但复杂,不适用于多处理器。
TestAndSet
指令、swap
指令: 硬件支持的原子操作,但可能导致忙等待。
- 共享变量、临界区和互斥:
- 进程同步:
- 同步机制: 协调进程的执行顺序,使它们按特定顺序工作。
- 信号量和 PV 操作:
- 信号量: 一个整型变量,除了初始化外,只能通过P和V操作来访问。
- P 操作(wait): 信号量减1,如果小于0则阻塞。
- V 操作(signal): 信号量加1,如果小于等于0则唤醒一个阻塞进程。
- ,阻塞
- ,唤醒
- 经典同步问题:
- 先动作,
- ,后动作
- 生产者-消费者问题、读者-写者问题、哲学家进餐问题。
- 条件临界区: 对临界区的一种扩展。
- 管程、会合:
- 管程: 一种高级同步机制,将共享数据及对数据的操作封装起来,提供互斥和同步的机制。
- 会合: Ada 语言中的同步机制。
- 事务存储器: 硬件辅助的同步机制。
死锁和饥饿
本章专门讨论了并发进程可能遇到的两个严重问题:死锁和饥饿,并提供了相应的处理策略。
- 死锁的概念和类型:
- 死锁: 多个进程因争夺资源而造成的一种僵局,若无外力作用,它们都将无法向前推进。
- 竞争资源引起死锁: 如共享打印机、共享文件等。
- 进程间通信引起死锁: 循环等待消息。
- 死锁的条件和处理:
- 死锁的四个必要条件(Coffman 条件):
- 资源独占: 资源一次只能被一个进程占用。
- 保持申请: 进程已获得某些资源,又请求新的资源,并对已获得的资源保持不放。
- 不可剥夺: 资源在未被使用完之前,不能被强行剥夺。
- 循环等待: 存在一个进程等待序列 ,使得 等待 占有的资源, 等待 占有的资源,…, 等待 占有的资源。
- 处理死锁的策略:
- 死锁预防: 破坏死锁的四个必要条件之一。
- 死锁避免: 运行时动态检查,确保系统进入安全状态。
- 死锁检测: 检测是否发生死锁。
- 死锁解除: 发现死锁后采取措施解除(如撤销进程、剥夺资源)。
- 死锁的四个必要条件(Coffman 条件):
- 资源分配图及其约简: 用于死锁检测的工具。
- 寻找一个非孤立且没有请求边的进程节点,若没有,算法结束
- 去除它所有的分配边
- 寻找所有可满足请求的进程,将它的请求边改成分配边
- 死锁定理:死锁状态的充分必要条件是资源分配图不可完全约简。
- 死锁的预防:
- 预先分配策略: 一次性申请所有资源(破坏请求并保持)。
- 有序分配策略: 对资源进行编号,按编号顺序申请(破坏循环等待)。
- 死锁的避免:
- 安全状态和安全进程序列: 系统能够找到一个执行序列,使得所有进程都能完成,则系统处于安全状态。
- 银行家算法: Dijkstra 提出的死锁避免算法,通过判断系统是否能进入安全状态来决定是否允许资源分配。
- 分配资源
- 判断是否安全
- 饥饿和饿死: 进程长时间得不到服务,可能是由于优先级调度等原因。
主存储器管理
本章主要讲解了操作系统如何管理主存储器(内存),包括分配、保护和地址映射等。
存储器的功能: 存储分配、共享、保护和扩充、地址映射。
内存资源管理:
- 内存分区: 将内存划分为不同的区域。
- 内存分配: 如何将分区分配给进程。
- 静态等长分区
- 静态和动态
- 等长和异长
- 动态异长分区
- 最先适应算法 (FF)
- 下次适应算法 (NF)
- 最佳适应算法 (BF)
- 最坏适应算法 (WF)
- 静态等长分区
- 碎片和紧凑: 外部碎片(分区之间)和内部碎片(分区内部)。紧凑用于消除外部碎片。
单一连续区的存储管理:
最简单的管理方式,不常用。
- 双对界: 确保进程程序和数据都在界限寄存器范围内。
- 交换和重定位:
- 交换: 进程在内存和外存之间进行整体移动。
- 重定位: 将程序的逻辑地址转换为物理地址。分为静态重定位(装入时完成)和动态重定位(运行时由硬件辅助完成)。
- 覆盖技术: 在内存紧张时,通过程序段的重叠来扩充内存。
页式存储管理:
- 页式存储: 将逻辑地址空间和物理地址空间都划分为固定大小的块(页和页框),以页为单位进行分配。
- 页表: 存储逻辑页号到物理页框号的映射关系。
- 多级页表: 解决页表过大的问题,减少页表占用的内存空间。
- 反置页表: 存储物理页框号到逻辑页号和进程ID的映射,适用于大地址空间。
- 快表(TLB,Translation Lookaside Buffer): 高速缓存,用于存储最近访问的页表项,加速地址转换。
- 有效访问时间=快表命中率×(快表访问时间+内存访问时间)+(1−快表命中率)×(快表访问时间+2×内存访问时间)
段式存储管理:
- 基本原理: 将程序按逻辑单元(段)进行划分,每个段有独立的段号和段长。
- 段表: 存储逻辑段号到物理地址的映射关系。
- 段的共享和保护: 共享代码段、数据段。保护可以通过段的读/写/执行权限实现。
虚拟存储系统
本章在主存储器管理的基础上,引入了虚拟内存的概念,这是现代操作系统的一大创新,它使得程序可以运行在比实际物理内存更大的地址空间上。
虚拟页式存储管理:
基本原理: 将程序地址空间划分为页,只将当前需要的页装入内存,不常用的页留在外存,需要时再调入。实现了离散分配和内存扩充。
内存页框的分配策略: 固定分配、可变分配。
外存块的分配策略: 连续分配、链式分配、索引分配。
页面调入的时机: 预调页(局部性原理)、请求调页(缺页中断)。
写时复制(Copy-on-Write): 多个进程共享同一页,当任一进程尝试写入时,才复制该页。
置换算法:
当发生缺页且内存已满时,需要选择一个页面淘汰。
- 最优置换算法(OPT): 淘汰未来最久不使用的页(理论最优,无法实现)。
- 先进先出置换算法(FIFO): 淘汰最早进入内存的页(可能发生Belady 现象)。
- 最近最少使用置换算法(LRU): 淘汰最长时间未使用的页(需要硬件支持或软件模拟,开销大)。
- 时钟置换算法(Clock/NRU): FIFO的改进,利用访问位。
- 最不常用置换算法(LFU): 淘汰使用次数最少的页。
颠簸(Thrashing): 系统发生“抖动”,大部分时间用于页面置换,CPU利用率急剧下降。
工作集模型: 进程在某段时间内频繁访问的页的集合。
页故障率反馈模型: 根据缺页率调整分配给进程的页框数。
交换: 与覆盖的区别在于交换是进程整体的调入调出。
非均匀存储器访问(NUMA): 现代多处理器系统架构,不同CPU访问不同内存区域的速度不同。
虚拟段式存储管理: 基本原理与页式类似,但分配和管理单位是段。
虚拟段页式存储管理: 结合了段式和页式的优点,先分段再分页,既方便用户编程,又便于内存管理。
文件系统
本章介绍了操作系统如何组织、存储和管理文件,以及如何提供文件访问接口。
- 文件和文件系统:
- 文件: 具有名称的一组相关信息的集合。
- 文件系统: 操作系统中负责管理和组织文件、目录、存储介质的部分。
- 文件组织:
- 逻辑组织: 用户看到的文件结构,如流式文件、记录式文件。
- 物理组织: 文件在存储介质上的存放方式,如连续分配、链式分配、索引分配。
- 文件存储空间管理:
- 内存块表(FCB): 文件控制块,存储文件的属性和位置信息。
- 内存块链: 用于链式分配。
- 位图: 用位表示磁盘块的空闲或占用状态。
- 内存所需的表目:
- 系统打开文件表: 记录所有打开的文件信息。
- 用户打开文件表: 记录特定用户打开的文件信息。
- 表间联系: 通过索引或指针相互关联。
- 文件系统界面: 用户通过系统调用(open, read, write, close等)来访问文件。
设备和 IO
本章讨论了操作系统如何管理各种 I/O 设备,确保它们能够高效、有序地工作。
设备管理的功能和目标: 提高设备利用率,提供方便的用户接口,管理设备分配与回收,实现 I/O 数据传输。
设备的分类:
- IO 设备和存储设备: 按功能。
- 块型设备和字符型设备: 按数据传输单位(块设备传输固定大小块,字符设备传输单个字符)。
- 独占型设备和共享型设备: 按是否允许同时使用(独占型如打印机,共享型如磁盘)。
数据传输方式:
- 程序控制查询: CPU 不断查询设备状态,效率低。
- 中断驱动: 设备完成 I/O 后发起中断, CPU 响应并处理。
- 内存映射: I/O 设备寄存器映射到内存地址空间,CPU 通过访存指令操作设备。
- DMA(直接存储器存取): 设备控制器直接与内存进行数据传输,无需 CPU 干预。
- 通道: 更高级的 DMA ,可以执行简单的 I/O 程序,进一步解放 CPU。
设备调度:
磁盘输入输出参数: 寻道时间、旋转延迟、传输时间。
磁盘引臂调度算法:
优化磁盘 I/O 性能。
- 先来先服务(FCFS): 简单。
- 最短寻道时间优先(SSTF): 优先服务距离当前磁头最近的请求(可能导致饥饿)。
- 扫描算法(SCAN,电梯算法): 磁头向一个方向移动,直到该方向没有请求,再反向移动。
- 循环扫描算法(C-SCAN): 磁头单向移动,到达末端后快速返回起始端继续扫描。
缓冲和缓存:
- 缓冲技术的引入: 缓解CPU与I/O设备速度不匹配的矛盾,减少CPU中断次数,提高CPU与I/O的并行性。
- 私用缓冲和公用缓冲: 进程独占的缓冲和多个进程共享的缓冲。
- 单缓冲、双缓冲、循环缓冲: 不同缓冲实现方式。
- 缓冲池及其管理: 操作系统管理的一组共享缓冲区。
- 缓冲技术的实现: 通过数据拷贝实现。
- 缓存: 一种高速存储器,用于存放经常访问的数据的副本,利用局部性原理。
名词解释
来自 https://www.cnblogs.com/gonghr/p/16549543.html。
- Mutual exclusion(互斥):互斥也叫间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才运行去访问此临界资源,阻止对共享资源同时访问。
- Process(进程):
- 进程是进程实体的运行过程
- 是程序的一次执行过程
- 是具有独立功能的程序在一个数据集合上运行的过程
- 是系统进行资源分配和调度的一个独立单位。
- Thread(线程):线程是”轻量级进程“,是进程中的一个实体,是被系统独立调度和分派的基本单位,是一个基本的 CPU 执行单元,也是程序执行流的最小单元,由线程 ID、程序计数器、寄存器集合和堆栈组成。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源。
- Operating System(操作系统):是一种运行在内核态的软件,是控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集和。操作系统是计算机系统中最基本的系统软件。
- Race Conditions(竞态条件):由于两个或者多个进程竞争使用不能被同时访问的资源,使得这些进程有可能因为时间上推进的先后原因而出现问题,这叫做竞争条件。分为两类,互斥、同步。竞争条件指有两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序。
- Deadlock(死锁):多个进程并发执行,出现进程对资源的竞争,每个进程都持有其他进程等待的资源,导致所有进程等待,形成僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
- System Calls(系统调用):系统调用是指用户在程序中调用操作系统所提供的一些子功能,是操作系统提供给应用程序使用的接口,系统调用可视为特殊的公共子程序。用户程序不能直接执行对系统影响非常大的操作,必须通过系统调用的方式请求操作系统代为执行,以便保证系统的稳定性和安全性,防止用户程序随意更改或访问重要的系统资源,影响其他进程的运行。
- Multiprogramming(多道程序设计):多道程序设计是指在一台处理机上同时并发运行多个程序,即在一台处理机上有多个程序同时进入主存并发运行,宏观上并行,微观上串行交替运行。
- Physical Address(物理地址):物理地址是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。
- Critical Region(临界区):访问临界资源的代码称为临界区。
- Busy Waiting(忙等待):在进程互斥访问时,当一个进程位于其临界区内时,其他试图进入临界区的进程都必须在进入区内连续空循环,占用 CPU。在实现 I/O 时,用户程序发出一个系统调用,内核将其翻译成一个对应设备驱动程序的过程调用。然后设备驱动程序启动 I/O 并在一个连续不断的循环中检查该设备,看该设备是否完成了工作。当 I/O 结束后,设备驱动程序把数据送到指定的地方,并返回。然后操作系统将控制返回给调用者,这种方式称为忙等待。
- Buffer(缓冲器):分为输入缓冲器和输出缓冲器,前者将外设送来的数据暂时存放,以便处理器将它取走;后者的作用是用来暂时存放处理器送往外设的数据。用来解决外设和处理器速度不匹配的问题。
- I-nodes(i 结点):UNIX 系统采用文件名和文件描述信息分开的方法,使文件描述信息单独形成一个称为索引节点的数据结构,简称 i 结点。在文件目录中每个目录项仅由文件名和指向该文件所对应的 i 结点的指针组成。
- Monitors(管程):管程可以看做一个软件模块,它定义了一个数据结构,将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发控制。任一时刻管程中只能有一个活跃进程。
- Virtual Address(虚拟地址):虚拟地址并不真实存在于计算机中。每个进程都分配有自己的虚拟空间,而且只能访问自己被分配使用的空间,进程隔离,更好的保护系统安全运行。操作系统为应用程序提供的一个统一的内存访问接口。所有的应用程序只需要面向虚拟地址进行编写,而不用考虑实际的物理地址的使用情况。当应用程序使用虚拟地址访问内存时,处理器(CPU)会通过 MMU(内存管理单元)将其转化成物理地址,方便编程。
- Interrupt(中断):指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。中断分为外中断和内中断。外中断是指来自 CPU 执行指令外部的事件,通常用于信息输入/输出,比如 I/O 中断,时钟中断;内中断是指来自 CPU 执行指令内部的事件,入程序的非法操作码、地址越界……一旦出现,就应立即处理,不能被屏蔽。
- Semaphore(信号量):信号量(semaphore)是操作系统用来解决并发中的互斥和同步问题的一种方法。是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
- Device Driver(驱动程序):是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。
- Relocation(重定位):重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。
- Atomic Action(原子操作):是指不可被中断的一个或一系列操作,不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束。要么全部成功,要么全部失败。
- Device Independence(设备独立性):设备独立性是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以像使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。
- Avoiding Locks(避免锁):避免锁,指对进程资源申请不加限制,但在分配之前会作安全检查,只有安全才进行分配。
- Read-Copy-Update(RCU):是一种同步机制,它的优点就是可以在更新的过程中,运行多个 reader 进行读操作。支持一个写操作和多个读操作同时进行。对于被 RCU 保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调 (
callback
) 机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。