Ch3 进程描述与控制
原目录:操作系统
1. 进程
(Process)进程是一组元素的实体:
- 基本元素:程序代码,相关数据集
- 其余元素:存放在进程控制块,结构如下
标识符:进程唯一ID | |
状态:运行/阻塞/挂起… | |
优先级:相对执行优先顺序 | |
程序计数器:程序要执行的下一条指令的地址 | |
内存指针:程序代码和进程相关数据的指针,以及其他进程共享内存的指针 | |
上下文:执行时处理器寄存器中数据 | |
IO状态信息:与IO有关信息 | |
记账信息:处理器时间总和,使用时钟数总和,时间限制,记帐号等 | |
总结: 进程=程序代码+相关数据+进程控制块 | |
2. 进程状态
2.1 两状态模型

2.2 五状态模型
- 无挂起态
阻塞态必须先变为就绪态(👇就绪队列的限制)才能运行 | 转换:
|
- 有挂起态: 可产生"交换":内存中进程移动到磁盘
转换: 除了内存中的就绪和阻塞,还产生了就绪/挂起和阻塞/挂起 |
3. 进程描述
3.1 操作系统控制结构

操作系统维护4种表:
- 内存表:跟踪实存虚存
- IO表:管理系统的IO设备和通道
- 文件表:提供文件相关信息
- 进程表-->进程映像
3.2 进程映像
进程映像=程序+数据+栈+属性(属性即为控制块) 即slp中的栈帧(活动记录)
用户数据 | 用户可修改区域 | ||
用户程序 | 待执行程序 | ||
栈 | 每个进程有一个LIFO栈,保存参数,过程调用地址和系统调用地址 | ||
进程控制块 | 进程表示 | 标识符 | |
处理器状态 | 用户可见寄存器 | ||
控制和状态寄存器:程序计数器、条件码、状态信息 | |||
栈指针 | |||
进程控制信息 | 调度和状态信息、数据结构、进程间通信、进程特权、存储、资源所有权和使用情况 | ||
4. 进程控制
执行模式 | 大多处理器至少支持两种执行模式,某些指令只能在特权模式下执行,且某些区域仅能在特权模式下访问 |
非特权模式 |
|
特权模式 |
|
5. 操作系统运行
两个事实:
- 操作系统同软件一样运行,就是一个程序
- 操作系统也会频繁释放控制权,依赖处理器恢复控制权
操作系统的3种运行模式
无进程内核(a) | 传统,古老 | |
用户进程内运行(b) | 小型PC,工作站中 | |
基于进程的OS(c) | 把OS当作一组系统进程实现 |
Ch4 线程
原目录:操作系统
1. 线程和进程
1.1 线程定义

进程(process)具有两大特点:
- 资源所有权: 进程包含存放进程映像的虚拟地址空间
- 调度/执行: 进程具有执行状态和优先级,是可被系统调度与分派的实体
通常把调度/执行的基本单位称为线程,拥有资源所有权的基本单位称为进程
1.2 多线程
操作系统在单个进程中支持多个并发执行路径的能力叫做多线程(multithreading)

区别并发(concurrency)和并行(parallelism)
- 并发:能够处理多个任务的能力,没有要求同时处理
- 并行:强调能够同时处理多个任务,并行是并发的子集
1.3 线程&进程
进程 | 线程 | |
关联属性 |
|
|
进程管理 |
|
|
2. 线程特点
2.1 线程功能
- 派生(spawn):派生新进程同时派生一个线程,线程可在进程中继续派生线程,新线程放在就绪队列中
- 阻塞/解除阻塞:当前线程发送等待,处理器执行另一个就绪进程,当事件发生,线程重新入队
- 结束:线程完成后,释放其寄存器上下文和栈
2.2 线程优点
- 线程创建更快速
- 终止线程更快速
- 线程切换更快速
- 同进程中线程的通信效率高于独立进程通信效率
2.3 线程分类
| 用户级线程(User-Level Thread, ULT) | 内核级线程(Kernel-Level Thread, KLT) |
管理线程的所有工作都由应用程序完成,内核意识不到线程的存在 | 管理线程的工作由内核完成, |
| ULT对比KLT | |
ULT优点
ULT缺点
| |
Ch5 并发: 互斥与同步
原目录:操作系统
1. 并发原理
关于并发(concurrency)和并行(parallelism),参照Ch4 区别并发和并行

根据上图,并发中最重要的就是控制问题:控制不同进程的共享资源的访问
2. 互斥
(Mutual Exclusion)
假设多进程访问不可共享资源,称其为临界资源(critical resource),使用临界资源的程序段叫做临界区(critical section),为了避免控制问题,一次只能有一个程序处于临界区,互斥实现中会遇到下列问题:
- 死锁:进程循环等待
- 饥饿:进程被无限拒绝

3. 信号量
3.1 基本原理
两个或多个进程合作时使用semaphore强迫一个进程在某个位置停止:
- 发送信号,执行semSignal(s)
- 接收信号:执行semWait(s)
把信号量视为int变量,在其上定义了三个操作:
|
3.2 二元信号量
对信号量规范定义:
- initialize: 二元信号量只可以初始化为0或1
- semWaitB:检查信号量s
- s=0->进程阻塞
- s=1,则s置为0,继续执行
- semSignalB: 检查是否有进程受阻
- 有受阻进程->阻塞恢复
- 无进程受阻->s置为1
3.3 互斥

左侧部分给出了信号量解决互斥的基本方法;右侧为ABC三个进程访问受信号量保护数据的场景
4. 生产者/消费者问题
问题描述 | 生产者/消费者问题是互斥的典型问题:有一个或多个producer将数据放入buffer,有一个consumer从中取数据,每次取一项,在任何时候:
|
解决思路 |
4.1 无限缓冲+二元信号量
- 算法准备
数据结构:给定缓冲区数组
| |
给定以下变量和信号量:
|
- 实现
原始算法 | 分析 | 修正 |
该算法不能保证任何情况下的正确: 正确前提: Producer总能在Consumer之前工作,即消费时,n总为1 错误情况:
| ||
产生错误的直接原因: n变化-->delay的更新失败-->consumer第二次先于producer执行 consumer本身满足n==0,准备在此处阻塞,delay置为0,但被抢占后,n++,delay保持1,使得consumer恢复后delay未能阻塞连续消费的发生 | 算法因为"被producer抢占后n++,导致delay更新错误"而产生,因此使用m局部变量保存consumer中的n,使producer的抢占不会影响delay的更新 | |
4.2 无限缓冲+一般信号量
使用一般信号量时: 交换producer中两语句--无影响:
交换consumer中两语句--产生死锁:
|
4.3 有限缓冲+一般信号量

有限缓冲下管程,消息的解决方案见5.3和6.3
4.4 信号量的实现
关于信号量的实现,必须满足semWait和semSignal操作作为原子原语
- 可以使用Dekker或Peterson算法(参考PDF P166)
- compare&swap指令
- 禁用中断(仅适用于单处理器系统)
5. 管程
(Monitors)
5.1 概述
管程是一种软件模块,由一个或多个过程,一个初始化序列和局部数据组成,有下列特征:
- 任何时候,只能有一个进程在管程中执行,其他调用管程的进程都堵塞
- 管程中的数据变量每次只能被一个进程访问
5.2 同步&互斥
管程通过条件变量实现互斥,下列函数操作条件变量
- cwait(c):进程的执行在条件c上阻塞,管程可被其他进程使用
- csignal(c):恢复等待条件c的进程执行

5.3 有限缓冲+管程

6. 消息传递
6.1 概述
消息传递 | 进程交互需要满足同步和通信.为了实时互斥,进程需要同步,为了合作,需要通信.消息传递可以提供以上功能,且可在分布式系统,共享内存的多处理器系统和单处理器系统实现 | |
基本实现 | 两个重要原语:
|
|
6.2 同步&互斥
send和receive分别可能阻塞/非阻塞
send阻塞/receive阻塞 | 发送进程和接收进程都阻塞,直到完成投递 |
send无阻塞/receive阻塞 | 接收者阻塞,直到接收到消息(最自然的方式) |
send无阻塞/receive无阻塞 | 双方都不等待 |
同步作为互斥的基础,在无阻塞send/阻塞receive下,消息传递可以实现互斥,当box中无消息,receive阻塞

6.3 有限缓冲+消息
两个进程两个信箱:
|
7. 读者/写者问题
读者/写者问题 | 一个共享的数据区,一些进程(reader)只读取数据,一些进程(writer)只写数据,且满足
即读进程不排除其余读进程,写进程排除所有进程 |
对比P/C问题 | 主要在于对共享空间的访问
|
问题分类 | 读者优先:只要有一个读进程执行,就为读进程保留数据区控制权,其余读进程可同时进行,写进程可能饥饿 |
写者优先:当一个写进程要执行,假设此时一个读进程正执行,暂时阻塞写进程,但其余读进程也被阻塞不能再执行,且优先恢复写进程 |
Ch6 并发: 死锁和饥饿
原目录:操作系统
1. 死锁原理
死锁 | 一组相互竞争系统资源或通信的进程发生"永久阻塞" | |
系统资源 | 可重用 reusable | 一次仅供一个进程安全使用且不会因为使用而耗尽,数量有限 死锁情况:两个进程分别占有一个资源,但都请求对方占有的资源,产生死锁 |
可消耗 consumable | 可被生产/消耗的资源,数量通常无限 | |
2. 死锁的条件
死锁的必要条件
额外条件,组成充要条件
| |
| 死锁的处理方法有三种:预防(prevent),避免(avoid),检测(detect),主要针对四种死锁条件处理 | |
3. 死锁预防
死锁预防可从四种死锁条件入手

①互斥 | 操作系统普遍实现,不具备禁止条件 |
②占有且等待 | 一次性请求所需资源,确保后续无等待 |
③不可抢占 | 👹问题:第二种额外抢占需要满足优先级不同,且两种实现都需要系统可以容易保存与恢复进程状态 |
④循环等待 | 若AB死锁,可能是A占有Ri,请求Rj,B占有Rj请求Ri,因此杜绝B的请求就能防止死锁 |
4. 死锁避免

资源向量化 | |
进程启动拒绝 | |
资源分配拒绝 | 参考: 银行家算法例题 |
进程启动拒绝和资源分配拒绝的区别: 进程启动拒绝是基于假设:新旧进程一起以最大请求访问资源,安全但产生不必要的拒绝; | |
5. 死锁检测
死锁检测和死锁预防的区别: |

算法 | 参考: 死锁检测算法 |
银行家算法和死锁检测算法本质相同,只是在系统的使用时间在分配资源前后与否 | |
6. 综合死锁策略

7. 总结

银行家算法例题
原目录:操作系统 / Ch6 并发: 死锁和饥饿

安全状态判断--银行家算法(见PDF p198)
- 仍需要资源
P1 | 0 | 0 | 0 | 0 |
P2 | 0 | 7 | 5 | 0 |
P3 | 6 | 6 | 2 | 2 |
P4 | 2 | 0 | 0 | 2 |
P5 | 0 | 3 | 2 | 0 |
- 安全状态
由银行家算法:
p1执行:(2 1 0 0)+(0 0 1 2)=(2 1 1 2)[加的是当前分配,非仍需要或最大需求]
p4执行:(2 1 1 2)+(2 3 5 4)=(4 4 6 6)
p5执行:(4 4 6 6)+(0 3 3 2)=(4 7 9 8)
p2执行:(4 7 9 8)+(2 0 0 0)=(6 7 9 8)
p3执行:(6 7 9 8)+(0 0 3 4)=(6 7 12 12)
所有进程都能执行结束
- 根据死锁检测算法
Allocation矩阵如下
W = W+(0 0 1 2)=(2 1 1 2)
| 银行家算法和检测算法: 银行家算法和死锁检测是同一种算法,但前者专门指资源分配前通过算法得出的安全状态而决定是否分配资源给某个线程;后者则是判断当前状态下是否有进程无法执行完毕 |
- 由3,不存在
- 假设同意后,使用银行家算法[对请求进程的"当前分配"增加对"可用资源"中扣除]

此时可用资源变为(2 0 0 0)
p1执行:(2 0 0 0)+(0 0 1 2)=(2 0 1 2)[加的是当前分配,非仍需要或最大需求]
p4执行:(2 0 1 2)+(2 3 5 4)=(4 3 6 6)
p5执行:(4 3 6 6)+(0 3 3 2)=(4 6 9 8)
p2,p3无法执行,产生死锁
Ch7 内存管理
原目录:操作系统
1. 内存管理需求
内存管理需要满足以下五种需求:
- 重定位(relocation): 程序换出到磁盘中后下次下次换入时要放入换出前区域很困难,需要重定位到内存的不同区域
- 保护(Protection): 当前进程以外的其他程序不能未经授权地访问(读\写)该进程地内存单元
- 共享(sharing): 保护机制也需要灵活性,以允许多个进程访问内存的同一部分,内存管理系统在不损害基本保护的前提下,允许对内存共享区域进行受控访问
- 逻辑组织(Logical Origanization): 计算机系统中的内存总是被组织成线性(或一维)的地址空间,该地址空间由一系列字节或字组成
- 物理组织(Physical Origanization): 计算机存储器至少有两级:内存和外存.二两级存储间移动信息由系统负责,即为存储管理的本质
2. 内存分区

2.1 固定分区
将内存分成若干边界固定的区域

- 两类固定分区

- 等大分区问题 内部碎片:任何程序,无论大小,都需要单独完整占用一个分区,当装入分区的数据块小于分区大小,限制空间也无法利用造成浪费
- 不等大分区放置算法
多队列法 | 将每个进程放到能容纳它的最小分区, 每个队列负责维护该分区换出的进程,对单个分区,该方法最优,内部碎片少,但整体看,当分区有挂起进程,但此时别的分区本可以容纳,却由于非对应队列而无法执行,增加阻塞 |
单队列法 | 当没有可用分区后,进行交换,优先换出可容纳该进程的最小分区 |

2.2 动态分区

定义 | 分区的长度和数量可变,进程装入内存时,系统分配给它一块与其容量完全相等的内存空间 | |
外部碎片 | 动态分区时,内存中会出现"空洞",无法满足任何进程的空间需求,只能换出其余进程,
|
2.3 伙伴系统
运用二分法的思想,进程请求空间s,开始给进程分配大小为2u内存:
- 如果2u-1<s≤2u,分配整个空间
- 否则分为两部分,如果2u-2<s≤2u-1,分配给两个伙伴中的一个
- 重复,且当遇到空间不足时还可以合并伙伴
3. 重定位

- 重定位的硬件支持

- 相对地址的使用
加载模块被加载到内存时,全部使用相对地址,只有真正执行才使用绝对地址 假设某进程占据了内存中一段完整的相邻分区: 程序装入的实际起点(Base值)为1024,假设x装入后Bounds为2688,此时统一相对化地址:开始执行x的语句 jump 400,400+1024=1424 < 2688,读取400处指令 load 1200,1200+1024=2224 < 2688,加载1200处数据 | |
4. 分页
将内存和进程都分割成同样大小的块,进程中为页(page),内存中为帧(frame),没有外部碎片,唯一的内部碎片为每个进程的最后一页
页表: 内存中的帧无法连续保存同一进程的页,为了标注实际的对应关系,每一个进程维护一个页表
例题:使用16位寻址,页大小1k,已知相对地址1502,和部分页表,求逻辑地址与物理地址 | |
解:1502化为二进制0000,0101,1101,1110,1K=210,16-10=6,则6位用于片选 page:000001,offset:0111011110=478 ⭐则相对地址1502的逻辑地址:对于page1(000001)的偏移量为478(0111011110)二者产生的16位数一样,但含义不一样 page:000001->frame:000110 则物理地址:0001100111011110 | |
逻辑地址 | 物理地址 |
5. 分段
把程序和数据分为几个段(segment),段有最大长度限制,但不要求所有段长度一致

例题:使用16位寻址,段号占4位,已知逻辑地址0001,0010,1111,0000和部分段表,求逻辑地址与物理地址 |
解:片选4位 segment:0001,offset:0010,1111,0000 段表中Length代表该段分区长度,起始地址Base=0010,0000,0010,0000 则offset+Base=0010,0011,0001,0000即物理地址 |
本章动画: http://williamstallings.com/OS-Animation/Animations.html
Ch8 虚拟内存
原目录:操作系统
硬件和控制结构
1. 分页

- 虚拟地址与页表项

1.1 地址转换
注意点:
|
1.2 二级页表
对一个32位机器,当虚拟空间大小4GB,页大小4KB时
- 一般分页

当页大小4k,4G/4k=220,需要220页,即220=2MB个页表项,直接放置在内存占据空间
- 二级分页

👉 在32位机器中,当页大小为4KB,虚拟空间4GB: 232/4k=220,分为220页,当每页都使用一个4B的页表项映射,构成一张二级页表,需要内存空间4*220=4MB | 页目录表(Directory)/一级页表/根页表 页表地址(Table)/二级页表/用户页表 | 👈 把4GB空间分为1024个可被页目录索引的页组(二级页表),每个页组长4MB.包含1024个项,每项对应大小4KB的页. 此时实存中只保存了210个一级页表项 |
4B页表项即32b地址,符合32位机 | ||
222/4k=210,需要210个页目录,则1级是包含1024个项的页目录表/一级页表 |
1.3 倒排页表
(Inverted Page Table)

| 多级页表不足 | 页表大小与虚拟空间大小成正比 |
倒排 | 使用散列函数将n位页号映射到散列表得到m位帧号,表中有指向倒排表的指针,倒排表中有页表项.这种结构下,散列表和倒排表各有一项对应一个实存页:
由于多个虚拟地址可能映射到一个散列表项中,需要使用链接技术管理溢出,因此无论有多少进程,支持多少虚拟页,页表只需要实存中的一个固定部分 (类比数据结构散列表有限,但通过散列函数和二次散列等方式保证了散列值的不同)
|
1.4 转换检测缓冲区(TLB)
快表(TLB: Translation Lookaside Buffer)

虚存访问的普遍问题:会访问两次物理实存:访问页表、访问物理地址
使用TLB旨在解决该问题:
- 给定虚拟地址,处理器先检查TLB
- 若命中,则检索帧号形成物理地址(避免了二次访问)
- 未命中,使用页号检索页表,当存在位
- 已置位,直接从页表项中取出帧号形成物理地址,更新TLB
- 未置位,缺页(page fault)发生,操作系统接管,从外存中取出数据装入页,更新页表

- TLB与cache的关系
TLB实际上是一块特殊的cache,用于保存最近使用过的页表项,从而避免再次进入内存访问
TLB从RAM中取数据--cache映射三种:直接,全关联,组关联(参考:系统级编程 Ch12 Cache深入)
1.5 页尺寸

1.6 分页与缺页率
|
2. 分段

基于分段的虚拟内存中,每个进程有唯一的段表
|
3. 段页式
段页式结构中,每个进程使用一个段表和一些页表. 段表项:包含段长和Base,无需存在位和修改位,留在页级处理
|
操作系统策略
1. 读取策略
策略意义 | 决定某页何时取如内存 |
方式 |
|
2. 放置策略
策略意义 | 决定进程块驻留在实存的什么位置 |
方式 |
|
3. 置换策略⭐
策略意义 | 决定读取新页时应该置换出内存中哪一页 |
方式 |
|
3.1 时钟置换策略
时钟策略给每个页框关联一个"使用位",实现了较小开销下接近LRU的性能
具体实现⭐:
- 当某页第一次被放入内存中,"使用位"置为1,且有一个指针与内存缓冲区关联.
- 外存中数据块要换入时,指针扫描缓冲区,查找使用位=0的页框
- 当遇到使用位=1的页框,置为0
- 当所有页框都为0,换出第一块
- 当所有页框都为1,将每个页框使用位置0后,回到起点块换出
- 当某页框被置换出后,指针指向该位置的下一个页框
例子:
要换入页727,初始指针在页框2 |
4. 驻留集管理
策略意义 | 决定给进程分配多少空间,允许其中多少页驻留在内存中 |
分配方式 |
|
置换范围 |
|
组合方式 |
|
5. 清除策略
策略意义 | 确定何时将已经修改的一页写回辅存 |
方式 |
|
6. 加载控制
策略意义 | 影响系统并发度:驻留在内存中的进程数量 |
影响 |
|
本章动画: http://williamstallings.com/OS-Animation/Animations.html
内存MindMap
原目录:操作系统 / Ch8 虚拟内存
扩展: 存储器内部组织
原目录:操作系统 / Ch8 虚拟内存
1. 芯片
1.1 集成电路

数字逻辑中的内容:利用输入电平的高低表示1与0,经过门电路的处理得到输出
1.2 芯片
一块晶片上有大量芯片,每个芯片上有无数的门电路用于处理数据,位元用于存储数据 |
1.3 位元和DRAM
半导体存储器的基本结构是位元,可被多种技术实现,但都具有以下性质:
位元普遍有三个功能端口:
| |
图示为一个储存1位信息的DRAM结构: 电容具有漏电的自然趋势,因此需要周期性充电保持存储状态--"动态"的来历
|
1.4 芯片逻辑
一块RAM芯片内部位元的组织形式
参考链接: SDRAM基础知识
一般RAM芯片中阵列组织使用W×B表示:有W字长,每个字有B位宽,字的位宽决定半导体存储器一次读/写数据的位数
对于一个16Mb的DRAM,可以有多种内部阵列组织:
当阵列中位宽16bits(极端) | 1M×16b,1M个16位字 |
当阵列中位宽1bit(极端) | 16M×1b,16M个1位字 |
当采用4M×4(常见) | 4M×4b,4M个4位字 |
4M×4时DRAM内部结构如下:

放大存储阵列:
逻辑上: DRAM组织成4个2048×2048的方阵,阵列元素使用行和列控制线连接,行控制线连接行内每个位元的Select端口,列控制线连接Data-In/Sence端口 log2(4M)得到22,需要22根地址线,各取11位控制行与列,最终确定4位位元参与读/写:
|
1.5 模块组织
多块RAM芯片组成一块存储器
对于更大容量的存储器,需要RAM芯片的阵列,此时需要保证位宽的一致,当RAM不满足存储器位宽要求,需要多个RAM组成一个模块达到位宽要求
当使用256K×2组成一个1M×8的存储器时,如图显示了如何使用4个芯片组成一个芯片模块
|
2. 位宽与性能
总线宽度 |
|
CPU位宽 | 32位CPU和64位CPU的两大区别体现在此
|
3. 位宽与存储系统
虚拟内存中的二级页表如下
|
内存习题
原目录:操作系统 / Ch8 虚拟内存
例1:虚拟内存映射
虚拟内存使用2入口TLB,2路组关联cache,一个页表,假设cache块大小8个字,页大小16个字,RAM如如分块,两个块为一个页框
|
解答:

例2:置换策略
Consider the following page reference string: 7,2,3,7,2,5,1,4,6,5,7,1,0,5,4,0,2,3,0,5 Assuming demand paging with 4 frames, please show the frame contents of the pages after each page reference for the following page-replacement algorithms and count the page interrupt times for every replacement algorithm. a) LRU replacement (3分) b) Optimal replacement (3分) c) FIFO replacement (3分) d) Clock replacement (4分) |
LRU |
OPT |
| FIFO |
Clock |
Ch9 单处理器调度
原目录:操作系统
1. 处理器调度类型
1.1 调度的目的
调度是以满足满足系统目标(响应时间,吞吐率,处理器效率)的方式,把进程分配到一个或多个处理器上执行
1.2 调度类型
类型 | 解释 | 理解⭐ |
长程 | 决定加入待执行进程池 | 将批作业/程序加载到系统,最少使用 |
中程 | 决定加入部分或全部位于内存中的进程集合 | 一定涉及到交换(swapping),即挂起态到其他态的转换,稍频繁 |
短程/分派器 | 决定处理器执行哪个可运行进程 | 决定下次执行哪个进程,最频繁,以下事件都属于短程调度:时钟中断、I/O中断、操作系统调用、信号量 |
I/O | 决定可用I/O设备处理哪个挂起的I/O请求 | 与I/O请求有关 |
1.3 调度队列&层次
- 调度队列
本质上,调度属于队列管理,在排队环境中减少延迟优化性

- 调度层次
图示反映了不同进程态转换所属的调度

2. 调度算法
2.1 短程调度规则
根据面向的对象:系统/用户,是否与性能相关,系统的调度规则也不同,它们互相依赖可以根据需求切换
对象 | 性能 | ||
用户 | 相关 | 周转时间 (Turnaround time) | 周转时间=等待时间+执行时间 对批处理作业适用 |
响应时间 | 进程从提交请求到接收响应时间间隔, 对用户需要接收响应的进程更适用 | ||
最后期限 | 在DDL接近时,规则会降低其余目标 | ||
其他 | 可预测性(predictability) | 无论负载大小,用户不希望出现大范围波动 | |
系统 | 相关 | 吞吐量 (Throughput) | 单位时间完成最大进程数 |
处理器利用率 (Processor efficiency) | 处理器忙状态占比 对共享系统重要,但单用户/实时系统不重要 | ||
其他 | 公平性 | 没有额外限定时,每个进程应该平等对待 | |
强制优先级 | 优先执行高优先度的 | ||
平衡资源 | 当资源都忙,优先调用较少使用紧缺资源的进程 | ||
2.2 选择调度策略⭐
场景模型: 调度队列
- 对于cpu进程,执行完成->释放,超时->重新入列
- 对于I/O进程,执行完成->释放,I/O阻塞->进入阻塞队列(阻塞队列中,I/O设备就需要处理,此时为忙碌,一旦完成I/O,相关设备空闲),非阻塞超时->重新入列

FCFS (先来先服务)
决策模式 | 非抢占 | ||
调度时间 | 当前进程完毕,执行下一进程 | ||
进程选择 | 设置就绪队列,当前进程结束后,执行队列中存在最久的进程 | ||
缺点 |
| ||
优点 |
| ||
Round-Robin(RR轮转)
决策模式 | 抢占 | ||
调度时间 | 按基于时钟中断的时间片(time slicing)执行 | ||
进程选择 | 基于FCFS选择下一时间片执行的进程 | ||
缺点 |
| ||
优点 |
| ||
virtual RR(虚拟轮转)
决策模式 | 抢占 | |||
调度时间 | 同上RR | |||
进程选择 | 见👇与RR对比 | |||
对比 | 区别: | |||
SPN(ext)(最短进程优先)
决策模式 | 非抢占 | ||
调度时间 | 当前进程完毕,执行下一进程 | ||
进程选择 | 预期处理时间最短的进程下一个执行 | ||
缺点 |
| ||
优点 |
| ||
SRT(最短剩余时间)
决策模式 | 抢占 | ||
调度时间 | 新进程抵达后决定 | ||
进程选择 | 新进程抵达后选取剩余时间最短者 | ||
缺点 |
| ||
优点 |
| ||
HRRN(Higest Response Ration Next最高响应比优先)
决策模式 | 非抢占 | ||
调度时间 | 当前进程完毕,执行下一进程 | ||
进程选择 | 计算最大响应比的进程作为下一个 | ||
响应比 |
R最小值为1.0,只有第一个进入系统的进程才可能达到 | ||
例题:调度策略
给出以下进程调度,比较不同策略下的调度情况:

此处时间表示某一时刻而非时间段
![]()
FCFS:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RR, q=1:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
规律总结:
|
SPN:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SPN是非抢占式,一定是一个进程完全执行完后再切换
SRT:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SRT=SPN+抢占
HRRN:
| 0 | 1 | 2 | R | 3 | 4 | 5 | 6 | 7 | 8 | R | 9 | 10 | 11 | 12 | R | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
| 7/6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
| 9/4 |
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
| 8/5 |
|
|
|
| 12/5 |
|
|
|
|
|
|
|
E |
|
|
|
|
|
|
|
|
|
| 3/2 |
|
|
|
| 7/2 |
|
|
|
|
|
|
|
Feedback,q=1:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
A | 1 | 2 | 3 | 结束 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
| 1 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | 4 | 4 | 5 | 5 | 5 | 6 | 结束 |
C |
|
|
|
| 1 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 4 | 4 | 结束 |
|
|
|
|
D |
|
|
|
|
|
| 1 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 4 | 4 | 4 | 5 | 结束 |
|
E |
|
|
|
|
|
|
|
| 1 | 2 | 结束 |
|
|
|
|
|
|
|
|
|
技巧:阶梯+再个方格中标注当前优先级,纵向比较,选择数字小的,当数字一样,选择先处于此优先级的进程(先入队)
本章动画: http://williamstallings.com/OS-Animation/Animations.html
Ch11 I/O管理与磁盘调度
原目录:操作系统
1. I/O管理

1.1 I/O设备
人可读 |
|
机器可读 | 磁盘,usb密钥,传感器 |
通信 | 调制解调器 |
1.2 I/O功能组织
程序控制I/O | 处理器代表进程给IO模块发送IO指令,进程进入忙等待直到IO操作完成 |
中断驱动I/O | 处理器代表进程给IO模块发送IO指令:分为两种情况:
|
DMA | 专门的DMA模块控制内存和IO模块间的数据交换.为传输数据,处理器给DMA模块发送请求后执行后续指令,只有整个数据库传输结束后,处理器才被中断 |
小结
| 无中断 | 有中断 |
处理器实现IO和内存间传输 | 程序控制IO | 中断驱动IO |
IO和内存直接传输 |
| DMA |
1.3 I/O发展
总结: 1. 处理器直接控制外设 5. IO配置专门处理器 6. IO的存储器独立 |
1.4 I/O缓冲
IO设备 | 面向块 | 信息保存在固定大小的块中,每次传输一块 | |
面向流 | 设备以字节流输入/输出数据,没有快结构 | ||
单缓冲 | 系统为操作分配一个内存中系统部分的缓冲区 | ||
优点 |
| ||
缺点 |
| ||
面向流 |
| ||
面向块 | 无明显提升 | ||
双缓冲 | 面向流 |
| |
面向块 | 提高复杂性,提升性能 | ||
循环缓冲 | 支持大量IO | ||
| 缓冲作用 | 当进程需求远大于IO模块处理请求时,即使再多的缓冲也会被填满; 但在多道环境中,当有多种IO和进程,缓冲能够提高系统效率,提升单个进程性能 | ||
2. 磁盘调度
2.1 磁盘结构
磁道(track):存储磁头在某一盘片(platter)某个位置上个访问的所有数据
扇区(sector):每个扇区数据量相同,外长内短,故外层数据密度小;sector是一次I/O的最小数据单位
簇(cluster):多个连续的sector组成簇,簇是文件分配的最小单位

2.2 性能参数

一个磁盘的正常访问顺序为
- 寻道:IO磁头定位到包含数据的磁道==>寻道时间
- 旋转:磁头等待含有目标数据的扇区转到下方==>旋转延迟
- 实现读写:IO==>存取时间
寻道时间 | 磁头定位到某磁道 |
旋转延迟 | 抵达磁道后,适当扇区旋转到磁头下 |
传输时间 | 数据传输时间 |
存取时间 | 寻道时间+旋转延迟 |
总平均存取时间 | 寻道时间+旋转延迟+传输时间 T:传输时间,b:字节数, N:一个磁道字节数, r:旋转速度(r/s) |
2.3 顺序组织&随机组织
- 顺序读取:读取连续存放在一起的数据,只有在第一次需要寻道
- 随机读取:读取非连续扇区中的数据,每个扇区都需重新寻道
例题:
一个典型磁盘,平均寻道时间4ms,转速7500rpm,每个磁道500个扇区,每个扇区512字节,假设读取一个包含2500个扇区,大小1.28MB的文件,计算总时间:
| 顺序组织:文件连续存放在相邻磁道与扇区 | |
顺序组织下,只有第一次需要寻道:
合计:16ms | 其余每个磁道:
合计4*12=48ms
|
随机组织:文件随机分布在不同磁道的扇区 | |
随机组织下,每个扇区都需要重新寻道:
因此读取完2500个扇区共需:2500*8.016=20040ms | |
结论:完全随机的存取时性能非常差 | |
2.4 调度策略
2.2的内容说明IO性能主要被寻道时间拖累,因此需要在访问磁道时采取策略
当一个磁盘200磁道,磁盘请求队列中的随机请求被磁盘调度程序依次接收:55-58-39-18-90-160-150-38-184(起始磁道100)
FIFO
按顺序处理IO队列中项目
访问记录
Priority
通常短作业优先级高,长作业优先级低
LIFO
先处理最晚入队的请求
利用局部性原理,先处理最新的请求,可以减少磁臂移动
SSTF(最短服务时间优先)
优先处理移动到指定磁道耗时最少的请求,同样利用局部性原理
SCAN
磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道或没有此方向请求后反向扫描处理请求
- 不如SSTF和LIFO全面的利用局部性原理,它忽视了刚刚扫描的区域
C-SCAN
磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道然后直接返回到起点途中不处理请求,接着重新扫描,即对所有请求的处理只在一个方向
NSCAN,FSCAN
SSTF,SCAN,C-SCAN在进程对某个磁道有较高访问速度时,可能很长时间都不移动(局部性原理),为了避免"黏性",将请求队列分段,每次只完整处理一段
- N步SCAN把请求队列分为N个子队列,当N较大,性能接近SCAN,当N等于1,退化为FIFO
- FSCAN使用两队列,一趟扫描中的新请求放入另一个队列,方便下轮优先处理
本章动画: http://williamstallings.com/OS-Animation/Animations.html
Ch12 文件管理
原目录:操作系统
1. 文件和文件系统

1.1 文件系统架构⭐
- 设备驱动--Device IO layer(外设指磁盘,磁带等辅存设备)
- 基本文件系统--Physical layer
- 基本IO管理程序--Directory management layer
- 逻辑IO--Logical layer
2. 文件组织和访问

文件组织 | 数据结构 | ||
堆 Pile | 优点 | 最简单,按照达到顺序被收集,记录的组成域可以不同,没有规范 | |
缺点 | 堆文件没有结构,访问记录是需要穷举查找 | ||
顺序文件 | 优点 | 最常见,每条记录长度相同,且组成记录的域也是数量相同,长度固定 | |
缺点 | 记录有规范,域的位置大小都已知,只需要保存域的值,访问记录还是需要使用顺序查找 | ||
索引顺序文件 | 优点 | 保持了顺序文件的特点,增加了索引和溢出文件 | |
缺点 | 基于文件的域进行处理,无法使用其他属性查找记录 | ||
索引文件 |
| ||
直接/散列文件 | 允许直接访问磁盘中任何一个地址已知块 | ||
3. 记录组块

.
记录组块 | 如上图所示,记录是访问结构化文件的逻辑单元,而内存中的块是与辅存IO交互的基本单位,因此记录必须组织成块 |
定长 | 记录定长,且若干完整记录在一块,因此块内会产生内部碎片 |
变长跨越式 | 使用变长记录,使得块中无剩余空间,但有些记录会跨块,使用指针连接 |
变长非跨越式 | 使用变长记录,但不允许跨块,因此还会有内部碎片 |
4. 辅存管理

4.1 文件空间分配:
文件空间分配时有三个问题:
- 是否一次分配空间
- 空间分配多少
- 如何追踪分配给文件的分区
对应解决:
| 分配策略 |
|
| 分区大小 |
|
| 如何追踪 | 使用文件分配表FAT来管理 |
4.2 文件分配方式
连续 | 文件创建时分配一组连续的块,采用基于长度可变分区的预分配策略 |
链式 | 基于单个块的动态分配,适合顺序文件,局部性原理不再适用,可周期性合并 |
索引 | 每个文件在FAT中有一级索引,文件每个分区在索引中有一个表项,文件的索引单独保存在一块中 |
4.3 卷
(Volumns)


