1
0
mirror of https://github.com/OmegaZhou/408-notes.git synced 2026-10-31 20:36:06 +08:00

finish os

This commit is contained in:
Zhou
2020-08-02 19:55:24 +08:00
parent 7efc4f9c18
commit 52915aed9a
12 changed files with 1960 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

@@ -0,0 +1,357 @@
# 内存管理
## 功能
* 内存空间的分配与回收
* 地址转换
* 内存空间的扩充
* 存储保护
## 程序装入与链接
### 源代码运行步骤
1. 编译
2. 链接
3. 装入
### 链接方式
* 静态链接
* 装入时动态链接
* 运行时动态链接
### 装入方式
* 绝对装入:装入给定内存地址
* 可重定位装入(静态重定位):对地址重定位后装入
* 动态运行时装入(动态重定位):可在运行时重新进行重定位,需要重定位寄存器支持
## 逻辑地址与物理地址
* 逻辑地址/相对地址,程序只需要知道逻辑地址
* 物理地址,装入程序时,将逻辑地址映射为物理地址,称为地址重定位
## 内存保护
* 设置上下限寄存器,通过判断地址是否越界进行保护
* 采用**重定位寄存器(基址寄存器)**和**界地址寄存器(限长寄存器)**,重定位寄存器储存最小物理地址,界地址寄存器储存逻辑地址最大值
## 覆盖和交换
### 覆盖
* 将程序空间分为固定区和覆盖区,经常活跃的部分放在固定区,其余部分按调用关系分段(保证每一个覆盖区调用的覆盖段不会同时出现
* 程序运行时,将要访问的段放在覆盖段,需要调用其他段时,从外存将其调入覆盖
### 交换
* 把程序从内存移至辅存,称为换出
* 把程序由辅存中移入至内存,称为换入
* 注意点
* 交换需要备份存储,一般使用快速磁盘
* 进程使用实际应比交换时间(主要由转移时间影响)长,转移时间与交换的内存空间成正比
* 换出进程时,进程应处于空闲状态
* 交换空间应为独立于文件系统的磁盘空间的一整块
* 交换在内存吃紧时使用,在系统负荷降低时暂停
* 普通的交换使用不多,但交换的变体仍然在许多操作系统起作用
### 区别
* 交换发生在不同进程(或不同作业)间
* 覆盖则用于同一个程序或进程
## 连续分配管理方式
### 单一连续分配
* 将内存分为系统区和用户区
* 内存中只有一道程序,无需内存保护
* 优点
* 简单
* 无外部碎片
* 可采用覆盖
* 缺点
* 由内部碎片,存储器利用率低
* 只能用于单用户、单任务的操作系统
### 固定分区分配
* 最简单的多道程序管理方式
* 将内存分为若干个固定大小的分区,每个分区只装入一个作业
* 分类
* 分区大小相等,用于管理多个相同对象,不灵活
* 分区大小不等,分为较多小分区,适量中等分区和少量大分区
* 优点
* 无外部碎片
* 缺点
* 程序可能放不进分区中,只能采用覆盖
* 主存利用率低,有内部碎片
### 动态分区分配(可变分区分配)
* 需要多少内存就分配多少
* 从空闲分区中划分内存块给进程
* 算法
* 首次适应算法(First Fit):顺序查找分区,
* 最佳适应算法(Best Fit):查找第一个能满足要求的最小分区
* 最坏适应算法(Worst Fit):查找最大的分区
* 临近适应算法(Next Fit):又称循环首次适应算法,从上次查找结束的地方继续顺序查找
* 首次适应算法一般表现最好
* 优点
* 无内部碎片
* 分区可变
* 缺点
* 有外部碎片
* 改进
* 紧凑技术:移动进程使空闲分区彼此相邻
## 非连续分配管理方式
### 基本分页存储管理方式
* 页是物理划分
* 将内存分为大小相同的若干个小块,作为内存分配的基本单位
* 概念
* 页:进程中的内存块
* 页框/页帧:内存中的块
* 地址结构:前半部分为页号P,后半部分为地址偏移量W
* 页表:将页与物理内存进行映射
* 页表项:页表的组成单位
* 页表寄存器:包含页表起始地址和长度
* 快表(相联存储器TLB):
* 快表属于cache的一种
* 查询步骤
1. 硬件解析出页号后,先与快表比对
2. 若找到页表项,直接访问主存读取数据
3. 若没找到,查询主存中的页表,并放入快表中,再访问主存读取数据
* 多级页表
* 段共享和保护
* 共享:实现困难
* 保护:
* 越界保护
* 访问权限控制
* 页是一维的
* 优点
* 内存利用率高
* 实现离散分配
* 便于存储访问控制
* 无外部碎片
* 缺点
* 需要硬件支持
* 内存访问效率下降
* 共享困难
* 内部碎片
### 基本分段式存储管理方式
* 段是逻辑划分
* 将内存空间分为若干个段
* 地址=段号+段内偏移
* 段表:每个段表项包含段号,段长和段起始地址
* 段共享和保护
* 共享:段表项指向同一副本
* 保护:共享段不能修改
* 段是二维的
* 优点
* 便于程序模块化处理和处理变换的数据结构
* 便于动态链接和共享
* 无内部碎片
* 缺点
* 需要硬件支持
* 需要采用拼接减少外部碎片
* 分段最大尺寸受可用空间限制
* 外部碎片
### 段页式管理方式
* 也是二维的
* 地址=段号+页号+页内偏移量
* 段表只有一个,页表可以有多个
* 优点
* 结合段式和页式的优点
* 缺点
* 内部碎片多余页式存储
* 无外部碎片
## 虚拟内存基本概念
### 传统存储管理特征
* 一次性:作业必须一次性加载入内存
* 缺点
* 作业很大时无法运行
* 大量作业运行时,内存容量不足,只能运行部分程序,效率下降
* 驻留性:运行中的进程始终驻留在内存
### 局部性原理
* 时间局部性:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)
* 空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
### 虚拟内存特征
* 多次性:作业无需一次性载入内存
* 对换性:作业无需一直驻留内存
* 虚拟性:用户看到的内存容量大于实际容量
### 实现方式
* 请求分页存储管理
* 请求分段存储管理
* 请求段页式存储管理
### 硬件支持
* 一定容量的内存和外存
* 页表机制(段表机制)
* 中断结构
* 地址变换结构
### 请求分页存储管理
#### 新增页表结构
* 状态位:该页是否调入内存
* 访问字段:该页在一定时间内被访问的次数或至今有多久未被访问
* 修改位:调入后是否被修改过
* 外存地址
#### 缺页中断
* 指令执行期间发生,属于内部中断
* 一条指令执行期间,可能会发生多次缺页中断
#### 地址变换结构
![img](img/内存/地址变换.jpg)
#### 页面置换算法
##### 最佳(OPT)置换算法
* 选择淘汰未来最长时间内不在访问的页面
* 无法实现
##### 先进先出(FIFO)页面置换算法
* 按顺序淘汰页面
* Belady异常
* 只有FIFO会出现
* 物理块数增加缺页率反而增加
* 堆栈类算法不会出现
* FIFO是队列算法
##### 最近最久未使用(LRU)置换算法
* 选择淘汰过去最久未被访问的页面
* 性能较好
##### 时钟(CLOCK)置换算法
* 步骤
1. 增加一个使用位,每次页面被访问时,使用位置1
2. 替换页面时,从上次淘汰页面的下一个位置开始遍历
3. 若使用位为1,则置0,继续移动
4. 直到查找找使用位为0的页面替换
5. 若遍历一遍没有找到,则遍历第二遍
* 改进
* 增加一个修改位,在选取页面时,按如下优先级选取,优先级最高的先替换
| 优先级 | 访问位 | 修改位 |
| ------ | ------ | ------ |
| 4 | 0 | 0 |
| 3 | 0 | 1 |
| 2 | 1 | 0 |
| 1 | 1 | 1 |
* 遍历重置状态时,只重置访问位
* 具体实现
* 第一次查找(访问位=0,修改位=0),此时不修改访问位
* 第二次查找(访问位=0,修改位=1),此时重置访问位
* 查找两轮后,访问位必然全部为0,若还未找到,则再遍历一轮
##### 最不常用(LFU)置换算法
* 增加一个计数器,每次访问时,计数器加1
* 缺页时,淘汰计数器值最小的页面,计数器清零
##### 页面缓存(PBA)置换算法
* 使用两个缓存链表
* 空闲页面链表
* 修改页面链表
* 使用FIFO算法选择置换页,若修改过,放入修改链表尾部,若未修改,放入空闲链表尾部
* 缺页时,若页面存在于空闲链表或修改链表中,直接将其调入
* 若新页面不在链表中,则将空闲链表头部装入
* 修改链表达到一定数目后,将其写入磁盘,并放入空闲链表尾部
#### 页面分配策略
* 影响因素
* 分配给一个进程越少页面,同时驻留在内存的进程就越多,提高系统效率
* 分配给进程页面过少,页错误率较高
* 分配页数过多,由于局部性原理,降低页错误率的效果很小
* 分配策略
* 固定分配局部变换
* 每个进程分配固定的内存块
* 发生缺页时从该进程内的页面选一块调出
* 缺点
* 难以估计物理块数目
* 可变分配全局变换
* 发生缺页时,从全局空闲内存块选一个调入
* 可从其他进程调出物理块
* 缺点
* 若盲目增加物理块,并发能力将降低
* 可变分配局部变换
* 发生缺页时,只从该进程本身调出物理块
* 缺页率高时,增加物理块数目
* 缺页率低时,减少物理块数目
* 缺点
* 实现复杂
* 调入策略
* 请求调页策略:只有使用到该页时才调入
* 预调页策略:掉页时把预计之后也会用到的页面一同调入
#### 何处调页
* 请求分页系统将外存分为两部分
* 对换区:采用连续分配,速度快
* 文件区:采用离散分配,速度慢
* 三种情况
* 对换区足够:全部从对换区调页,在进程运行前,把有关文件全部复制到对换区
* 对换区不足:不被修改的文件从文件区调入,被修改的文件在对换区调入调出
* Unix方式:之前未运行过的页面从文件区调入,之后在对换区调入调出,若请求的共享页面已经位于内存,直接从对换区调入
#### 抖动
* 刚换出的页面马上要调入内存,这种频繁的页面调度称为抖动
#### 工作集
* 工作集指某段时间内进程要访问的页面集合
* 设工作集窗口大小为x,则在t时刻的工作集为,进程在t上课前访问的x个页面去重后的集合
* 进程分配的物理块大小应大于等于工作集大小,以避免抖动
### 地址翻译过程
1. 查找快表,若不命中,查找页表并将页表项载入快表,再访问快表
2. 获取内存地址后访问cache,若cache不命中,访问主存
3. 若页面不在主存中,访问外存
## 其他零散知识
* 处理完缺页中断后,还需访问快表来访问页表项

View File

@@ -0,0 +1,338 @@
# 文件系统
## 文件结构
* 自底向上
1. 数据项:文件的基本逻辑单元,不可再分的原子数据
2. 记录:一组相关的数据项集合,代表一个对象的某方面属性
3. 文件
* 记录式文件(结构文件):由记录构成
* 无结构文件(流式文件):可视为字节流
## 文件属性
* 名称:给用户看的名称
* 标识符:系统内部使用,用于标识文件
* 类型
* 位置
* 大小
* 保护
* 时间、日期和用户标识
## 文件分类
* 按用途
* 系统文件
* 库文件
* 用户文件
* 按保护级别
* 只读文件
* 读写文件
* 执行文件
* 不保护文件
## 文件基本操作
* 创建文件
* 写文件
* 读文件
* 文件重定位:设置当前文件位置
* 删除文件
* 截断文件:仅清除文件内容
* 设置文件读写位置
## 文件打开和删除
### 打开文件
* 将文件读入内存,返回文件索引
* 关联信息
* 文件指针
* 文件打开计数
* 文件磁盘位置
* 访问权限
### 删除文件
* 删除文件索引
* 若文件修改,写回磁盘
* 销毁文件控制块
## 文件的逻辑结构
* 无结构文件
* 有结构文件
* 顺序文件:记录使用顺序存储或链式存储,批量读写时效率最高
* 索引文件:建立索引表(包含长度(记录不定长),指针和索引号)
* 索引顺序文件:将索引项分成若干组,组与组之间保持偏序关系,先查找组,再在组内查找记录
* 直接文件或散列文件:直接通过散列函数得到物理地址
## 目录结构
### 文件控制块(FCB)
* 基本信息
* 文件名
* 文件的物理位置
* 文件的逻辑结构
* 文件的物理结构
* etc
* 存储控制信息
* 访问权限
* etc
* 使用信息
* 创建时间
* 修改时间
* etc
### 索引节点(i node)
* 具有FCB功能,在Unix系统中使用
* 文件名与索引节点**指针**组成一个目录项
* 索引节点内容
* 文件主标识符
* 文件类型
* 文件存取权限
* 文件物理地址
* 文件长度
* 文件链接计数
* 文件存取时间
* 文件复制到内存时,向索引节点增加如下信息
* 索引节点编号
* 状态:是否上锁或修改
* 访问计数
* 逻辑设备号:文件所属文件系统的逻辑设备号
* 链接指针
### 目录结构
#### 目录操作
* 搜索
* 创建文件
* 删除文件
* 显示目录
* 修改目录
#### 分类
* 单级目录结构
* 两级目录结构
* 主目录
* 用户文件目录
* 多级目录结构(树形目录结构)
* 无环图目录结构
* 方便实现文件的共享
* 但提高了系统管理的复杂度
### 文件共享
#### 基于索引节点的共享(硬连接)
* 通过目录项所指向同一索引节点实现
* 增加链接计数,从而保证所有指向该索引节点的目录项都删除了,才删除该文件
#### 利用符号链实现文件共享(软链接/符号链接)
* 使用软链接创建的新文件内容是链接文件的路径名
* 软链接根据链接文件存储的路径名查找实际文件
* 若删除并创建同名文件,会使软链接指向错误文件
* 源文件删除时,软链接文件失效
* 提高启动磁盘的频率
## 文件保护
* 访问类型
* 读
* 写
* 执行
* 添加(append):新信息可添加至文件末尾
* 删除
* 列表清单:列出文件名和文件属性
* 访问控制
* 拥有者
* 组
* 其他
* 其他访问控制方法
* 口令:输入正确口令后,系统运行访问文件
* 缺点:不安全
* 密码:文件访问时使用密码进行解密
* 缺点:效率低
## 文件系统实现
### 层次结构
1. 用户调用接口
2. 文件目录系统
3. 存取控制验证模块
4. 逻辑文件系统和文件信息缓冲区
5. 物理文件系统
6. 辅助分配模块
7. 设备管理程序模块
### 目录实现
* 线性列表
* 费时
* 实现简单
* 哈希表
* I/O开销大
### 文件实现
#### 文件分配方式
* 连续分配
* 链接分配
* 隐式链接分配:每个盘块尾部有下一个盘块的指针
* 缺点:不稳定,一个指针丢失或损坏就会导致文件损坏
* 显式链接分配:将所有盘块指针提取出来构成一个FAT(文件分配表),一个文件仅存在一个,每个表项存放其下一个盘块地址
* 索引分配:每个文件都有一个索引表,第i项即为第i个块的地址
* 实现方式
* 链接方案:将多个索引块直接链接起来
* 多层索引:第一层索引块指向第二层索引块,以此类推
* 混合索引:采用多种索引方式混合,如:使用直接地址+一级索引+etc
| | 访问第n个盘块 | 优点 | 缺点 |
| -------- | --------------- | ------------------------------------------------ | ------------------------------------------------------------ |
| 连续分配 | 1次 | 顺序存取快,可进行随机访问 | 需要连续存储空间,有碎片,不利于动态扩充 |
| 链接分配 | n次(隐式链接) | 可解决外存碎片问题,提高空间利用率,动态增长方便 | 只能按照文件指针链顺序访问,查找效率低 |
| 索引分配 | m级索引需m+1次 | 可以随机访问,文件易于增删 | 索引表增加存储空间开销,索引表的查找策略对文件系统效率影响大 |
### 文件存储空间管理
#### 空闲表法
* 设置一个空闲块表,每个表项有起始空闲号和空闲盘块数
* 分配与回收方式与内存的连续动态分区分配类似
#### 空闲链表法
* 将空闲盘块构成一个链表
* 下一个盘块指针信息存放在空闲盘块上
#### 位示图法
* 使用二进制的一位代表该编号的盘块的使用情况
#### 成组链接法
* Unix使用该方法
* 将每一个盘块都分为若干块,第一块存放指向下一组盘块的盘块号,其余每一块存放一个空闲盘块指针
* root盘块称为超级块
* 分配空闲块
* 若该组还有其他空闲盘块,则直接分配
* 若该组只剩下自身空闲,先将该块内容读入超级块内(使超级块能访问下一组盘块),之后将该块分配
* 回收空闲盘块
* 若第一组盘块数未满,则直接添加
* 若第一组盘块数已满,则将第一组盘块的信息从超级快写入新的空闲盘块中,将该空闲盘块信息存入超级块,成为新的第一组盘块
![img](img/内存/成组链接法.jpg)
## 磁盘管理
### 磁盘结构
* 扇区
* 磁道(由扇区组成),在磁盘上为同心圆
* 柱面,所有个盘面上同一位置的磁道构成一个柱面,为圆柱
* 一个磁盘有若干个柱面
* 磁头,用于读取数据
![img](img/文件系统/磁道2.gif)
![img](img/文件系统/磁道.gif)
### 磁盘分类
* 固定头磁盘:每个磁道一个磁头,磁头相对于盘面的径向方向固定
* 活动头磁盘:磁头可来回伸缩定位磁道
* 固定盘磁盘:磁盘在磁盘驱动器内永久固定
* 可换盘磁盘:磁盘可移动更换
### 磁盘地址
* 地址=柱面号+盘面号+扇区号
### 磁盘读取时间
* $$
寻找时间T_s=m*n+s\\其中m为跨过一道磁盘的时间,n为跨过的磁道数,s为磁臂启动时间
$$
* $$
延迟时间T_r=\frac{1}{2r}\\
其中r为磁盘旋转速度,T_r代表磁头定位到一个磁道某一扇区所需的平均时间
$$
* $$
传输时间T_t=\frac{b}{rN}\\
其中r为转速,N为一个磁道的字节数,b为要读取的字节数\\公式由来:磁盘旋转一周可读取整个磁道的所有数据
$$
* $$
总平均存取时间T=T_s+T_r+T_t
$$
### 磁盘调度算法
#### 先来先服务(FCFS)算法
* 具有公平性
#### 最短寻找时间优先(SSTF)
* 先寻找当前距离磁头最短距离的磁道
* 不保证平均寻找时间最小
* 会出现饥饿现象
#### 扫描(SCAN)算法/电梯调度算法
* 规定移动方向来回扫描
* 扫描过程中按SSTF方式寻道
#### 循环扫描(C-SCAN)算法
* 只往一个方向扫描,到终点后先回到起点再进行下一轮扫描
| | | |
| ------ | ---------------------------- | ------------------------------------------ |
| FCFS | 公平,简单 | 平均寻道距离大,只适用于I/O次数较少的场合 |
| SSTF | 性能比FCFS好 | 不能保证平均寻道时间最短,可能出现饥饿现象 |
| SCAN | 寻道性能较好,可避免饥饿 | 不利于远离磁头一端的访问请求 |
| C-SCAN | 消除了对两端磁道请求的不公平 | |
### 磁盘管理
* 磁盘初始化
* 新磁盘需要进行**低级格式化**(物理分区)后才能存取数据
* 低级格式化为每个扇区构造了特别的数据结构,每个数据结构由头、数据区域和尾部组成,头部尾部包含了供磁盘控制器使用的信息
* 操作系统还需要将自己的数据结构记录在磁盘上
* 将磁盘分为一个或多个柱面组成的分区
* 对物理分区进行逻辑格式化(创建文件系统),操作系统将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空闲和已经分配的空间以及一个初始为空的目录
* 引导块
* 计算机启动时需要一个初始化程序(自举程序),初始化各类设备以及启动操作系统
* 该程序找到磁盘上的操作系统,装入内存,并转到初始地址,从而开始操作系统的运行
* ROM内存放自举装入程序,然后把完整的自举程序保存在磁盘的启动块,启动块位于磁盘的固定分区,拥有启动分区的磁盘称为**启动磁盘**或**系统磁盘**
* 坏扇区
* 处理方式
* 简单磁盘:手工处理,在逻辑格式化时在FAT注明该扇区损坏,不在使用
* 复杂磁盘:磁盘控制器维护一个磁盘坏链表,整个过程动态更新,低级格式化时将一些块保留备用,对操作系统透明,在逻辑上替代坏块,称为扇区备用
## 其他零散知识
* IDE:电子集成驱动器,一种磁盘驱动器接口类型
* SCSI:小型计算机系统接口,一种通用外设接口

336
操作系统/绪论.md Normal file
View File

@@ -0,0 +1,336 @@
# 绪论
## 操作系统基本概念
### 模型
* 冯诺依曼模型
![img](img/绪论/冯诺依曼模型.jpg)
### 层级结构
![img](img/绪论/计算机层级结构.jpg)
### 概念
#### 用户观点
* 根据用户所使用计算机的不同设计不同的操作系统
#### 系统观点(资源管理)
* 操作系统是计算机系统的资源管理程序
* 资源类别
* 硬件资源
* 软件资源
* 按作用划分资源类型
* 处理器(处理器管理)
* 存储器(存储器管理)
* 外设(设备管理)
* 信息(程序,数据)(信息管理,即文件系统)‘
#### 进程观点
* 操作系统由若干个可以独立运行的程序(进程)和一个对这些程序进行协调的核心组成
* 进程分类
* 用户进程
* 系统进程
#### 虚拟机观点(机器扩充)
* 操作系统将裸机扩充为一个功能更强大,使用更方便的虚拟计算机
* 按照系统结构,可将操作系统划分若干层, 通过逐层功能扩充,完成最终的操作系统虚拟机
### 特征
#### 并发性
* 多个事件在同一时间间隔内发生
* 与并行性不同
#### 共享性
* 多个程序/用户共享硬件和软件资源
* 共享方式
* 互斥共享:不可同时访问资源
* 同时访问
#### 虚拟性
* 将一个物理实体变为若干个逻辑上存在的对应物
* 例
* 多道程序设计(一个物理CPU虚拟成多台逻辑CPU)
* 虚拟内存
* 虚拟设备(独占设备变为共享设备)
#### 异步性
* 系统每道程序何时运行,执行顺序,所需时间都是未知的
**并发性**和**共享性**是操作系统最基本的特征
### 操作系统功能和服务
#### 处理器管理
* 进程控制(进程的创建,撤销及状态转换)
* 进程同步(对并发执行的进程进行协调)
* 进程通信
* 进程调度
#### 存储器管理
* 内存分配
* 内存保护
* 内存扩充
#### 设备管理
* 设备分配
* 设备传输控制
* 设备独立性(用户程序中设备与实际物理设备无关)
#### 文件管理
* 文件存储空间管理
* 目录管理
* 文件操作管理
* 文件保护
#### 用户接口
* 命令接口
* 连接命令接口(交互式命令接口):用于分时或实时系统(例:Linux shell)
* 脱机命令接口(批处理命令接口):用户在作业运行时不得干预
* 程序接口(系统调用)
* 图形接口(GUI)
## 操作系统的形成与发展
### 无操作系统阶段
* 使用人工操作计算机
* 步骤
1. 程序纸带装入输入机
2. 启动输入机送人程序和数据到计算机
3. 使用控制台开关启动程序
4. 程序运行完毕后,用户取走纸带和结果
* 缺点
* 手工操作的慢速与CPU的高速的矛盾
* 设备的低速与CPU高速的矛盾
* 用户独占全机,资源利用率低
* 改进:脱机输入输出技术
* 预先将程序和数据从低速设备载入高速输入带中
* CPU需要程序和数据时,直接从输入待高速载入内存
* 输出时同理
### 单道批处理系统
#### 特点
* 自动性
* 顺序性
* 单道性
### 多道批处理系统
#### 特点
* 多道
* 宏观上并行
* 微观上串行
### 操作系统的形成
* 为解决以下问题
* 如何分配处理器
* 如何分配内存
* 如何分配设备
* 如何保证程序和数据的安全性与一致性
* 如何组织不同类型的作业
* 计算型
* I/O型
* 重要而紧急作业
* 要求系统及时响应的作业
## 操作系统的分类
### 批处理操作系统
* 单道批处理操作系统
* 多道批处理操作系统
* 用户脱机使用计算机
* 成批处理
* 多道程序运行
### 分时操作系统
#### 实现方式
* 简单分时操作系统
* 具有“前台”和“后台”的操作系统
* 多道分时操作系统
### 特征
* 多路性
* 交互性
* 独占性
* 及时性
### 实时操作系统
* 对响应时间要求比分时操作系统更高
* 分类
* 实时控制系统:控制生产
* 实时信息处理系统:如购票系统
### 通用操作系统
* 具有批处理操作系统,分时操作系统,实时操作系统至少二者的功能
### 嵌入式操作系统
* 运行于嵌入式主机
### 集群系统
* 将多个独立系统耦合起来,共同完成一个任务
### 网络操作系统
* 特点
* 通过网络互联
* 每个计算机有自己的操作系统
* 通过通信设施实现互联
* 通过通信设施完成信息交换,资源共享,互操作和协作处理
### 分布式操作系统
* 特点
* 统一性:它是统一的操作系统
* 共享性:所有资源共享
* 透明性:看上去像一个计算机
* 自治性:每个主机地位平等
## 操作系统运行环境
### CPU运行状态
* 核心态(管态,系统态)
* 用户态(目态)
### 特权指令
* 只能由操作系统在核心态使用的指令
* 例
* I/Ozhil
* 设置中断屏蔽字
* 清内存指令
* 存储保护指令
* 设置时钟指令
### 内核指令主要内容
* 时钟管理
* 中断机制
* 原语
* 处于操作系统最底层
* 具有原子性
* 运行时间短,调用频繁
* 系统控制的数据结构及处理
### 中断与异常
* 中断(外中断):系统正常功能的一部分
* 异常(内中断):由错误引起的
* 中断处理步骤
1. 关中断
2. 保存断点
3. 引出中断服务程序
4. 保存现场和屏蔽字
5. 开中断(允许更高级中断)
6. 执行中断服务程序
7. 关中断
8. 恢复现场和屏蔽字
9. 开中断
* 1~3步为**中断隐指令**
### 系统调用
* 操作系统提供的子功能
* 类型
* 设备管理
* 文件管理
* 进程控制
* 进程通信
* 内存管理
* 过程
1. 程序执行系统调用
2. 调用trap(陷入)指令进入内核态
3. 系统在内核态执行相应功能
4. 将结果返回并返回用户态
## 操作系统体系结构
### 模块组合结构
#### 优点
* 结构紧密
* 接口简单直接
* 效率高
#### 缺点
* 耦合度高
* 可扩展性差
* 可适应性差
#### 适合对象
* 系统小,模块少,使用环境比较稳定的系统
### 层次结构
#### 优点
* 组织和依赖清晰
* 有利修改和扩充
#### 缺点
* 层次划分不好做
### 微内核结构
#### 优点
* 可靠性好
* 灵活性高
* 便于维护
#### 缺点
* 效率低
#### 适合对象
* 分布式系统
## 其他零散知识
* 用户通过访管指令产生访管中断,进入内核态
* 分层操作系统层次
1. 裸机
2. CPU调度
3. 内存管理
4. 设备管理
5. 文件管理
6. 作业管理
7. 命令管理
8. 用户

View File

@@ -0,0 +1,310 @@
# 设备管理
## 设备的分类
### 按设备的使用特性
* 存储设备
* 磁盘
* 磁带
* 人机交互设备(输入输出设备)
* 输入设备
* 键盘
* 输出设备
* 显示器
* 打印机
* 网络通信设备
* 网络接口
* 调制解调器
### 按信息交换单位分类
* 字符设备
* 键盘
* 打印机
* 显示器
* 块设备
* 磁盘
### 按传输速率分类
* 低速设备
* 键盘
* 鼠标
* 中速设备
* 打印机
* 高速设备
* 磁带机
* 磁盘
### 按设备共享属性
* 独占设备
* 打印机
* 共享设备
* 磁盘
* 虚拟设备
## 设备管理的功能
* 设备分配
* 设备处理
* 缓冲管理
* 设备独立性
## I/O控制方式
### 程序直接控制方式
* 程序需要输入/输出数据时,处理器不断轮询检查状态寄存器的值,当状态寄存器就绪时取出/存入相应数据
* 然后重复上述循环,直至所有数据都输入/输出完成
* 优点
* 简单
* 缺点
* CPU利用率非常低,绝大部分时间在测试设备状态
### 中断控制方式
* 输入/输出数据时,CPU向设备控制器发出一个启动指令
* 设备完成相应功能后,发出中断信号,CPU收到中断信号后,再转向中断处理程序,继续处理后续步骤
* 优点
* 设备和CPU可以并行运行,提高了CPU的利用率
* 缺点
* 每输入/输出一个数据,就要发出一个中断请求,耗费CPU时间
### DMA方式(直接存储器存取)
* 特点
* 基本单位是数据块
* 数据直接从设备送入内存或从内存直接送入设备
* 仅在传输一个或多个数据块的开始和结束时,才需要CPU干预(发出中断请求),传送是在CPU控制器的控制下完成的
* 需要输入/输出数据时,CPU将数据内存起始地址和字节数发给DMA控制器的内存地址寄存器和传送字节计数器中
* DMA使用周期挪用的方式传送数据
* 设备访存时,CPU不访存,设备于CPU不冲突
* 设备访存时,CPU正在访存,设备等待CPU访存结束后访存
* 设备和CPU同时访存时,设备访存优先级高于CPU,先窃取一二个存取周期,之后CPU再访存
* DMA控制器的寄存器
* 命令/状态寄存器(CR):接收CPU发来的命令或有关控制信息
* 内存地址寄存器(MAR):待发送/待接收数据的内存起始地址
* 数据寄存器(DR):暂存待发送/接收的数据
* 数据计数器(DC):本次要传输的字节数
* 优点
* 设备和CPU可以并行,数据交换速度加快,且不需要CPU干预
* 缺点
* 数据传输方向,数据内存起始地址和数据长度都由CPU控制,每个设备都需要一个DMA控制器,设备增加时,DMA控制器的使用不经济
### 通道控制方式
* I/O通道是一个专门负责输入输出的处理机
* 通道处理机执行指令单一,与CPU共享内存
* CPU要进行数据传输时,给通道处理器发出一条I/O指令,并给出通道程序首地址和访问的设备,通道处理机便可自行完成该I/O任务,在数据传输完成后在发送中断请求
* 与DMA的区别
* 通道方式中,每次传输的数据块大小,数据内存地址都是由通道自行决定
* 每个DMA控制器对应一个设备,每个通道处理器可以对应多个设备
* 类型
* 字节多路通道
* 适合低速、中速设备
* 以字节交叉的方式轮流向多个设备服务
* 数组选择通道
* 适合高速设备
* 同一时间内只能执行一个通道程序,被一个设备独占
* 利用率低
* 数组多路通道
* 结合字节多路通道和数组选择通道的优点
* 以数组方式传输数据
## I/O软件结构层次
1. 用户层I/O软件
* 实现与用户交互的接口
* 大部分在操作系统内部
* 少部分为用户层(包括库函数、运行于内核之外的程序),必须通过调用系统调用获取相应服务
2. 设备独立性软件
* 实现用户程序和设备驱动器的统一接口、设备命令、设备保护和设备分配与释放等
* 使用逻辑设备名来使用某设备
* 系统实际执行时,将其映射为物理设备
* 逻辑设备名优点
* 增加设备分配灵活性
* 易于实现I/O设备重定向
* 功能
* 执行所有设备的公用操作
* 向用户层提供统一接口
3. 设备驱动程序
* 与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备故障的驱动程序
* 每类设备设置一个设备驱动程序
4. 中断处理程序
* 唤醒被阻塞的驱动程序进程
* 保护被中断进程的CPU环境
* 进行中断处理
* 恢复现场
5. 硬件设备
* 电子部件(设备控制器/适配器)
* 功能
* 接收和识别CPU或通道发来的命令
* 实现数据交换
* 发现和记录设备自身信息
* 设备地址识别
* 组成
* 设备控制器与CPU的接口(数据线,地址线(与数据寄存器,控制/状态寄存器相连),控制线)
* 设备控制器与设备的接口(每个接口都要数据,控制和状态三种类型的信号)
* I/O控制逻辑
* 机械部件(硬件本身)
## I/O核心子系统
### 服务
* I/O调度
* 缓冲与高速缓存
* 设备分配与回收
* 假脱机
* 设备保护和差错处理
### I/O调度
* 通过调度I/O请求顺序改善效率
* 磁盘调度就属于I/O调度的一种
### 缓冲与高速缓存
#### 磁盘高速缓存
* 逻辑上属于磁盘,物理上属于内存
* 实现方式
* 专门开辟一个内存空间作为磁盘高速缓存
* 把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘I/O共享
#### 缓冲区
* 目的
* 缓和CPU与I/O设备速度不匹配的矛盾
* 减少CPU中断频率
* 解决基本数据单元大小不匹配
* 提高CPU与设备之间的并行性
* 实现
* 采用硬件缓冲器(成本太高,只在少数关键部位使用)
* 采用缓冲区(位于内存)
* 特点
* 不能同时输入和输出,必须串行操作
* 分类
* 单缓冲:相对于处理器和设备是串行的
1. 先将数据装入缓冲区
2. 再取走数据
* 双缓冲:由两个缓冲区组成
1. 填完第一个缓冲区后,填写第二个缓冲区
2. 在填写第二个缓冲区时,可以从第一个缓冲区提取数据
* 循环缓冲:增加多个缓冲区形成循环链表,其余步骤与双缓冲一致,双缓冲可视为缓冲区链表长度为2的循环缓冲
* 缓冲池
* 三个队列
* 空缓冲队列
* 装满输入数据的缓冲队列(输入队列)
* 装满输出数据的缓冲队列(输出队列)
* 工作缓冲区
* 收容输入数据的工作缓冲区
* 提取输入数据的工作缓冲区
* 收容输出数据的工作缓冲区
* 提取输出队列的工作缓冲区
* 流程
1. 需要输入/输出数据时,从空缓冲队列取下一个作为收容输入/输出数据的工作缓冲区
2. 装满后放入输入/输出队列末尾
3. 将输入/输出队列头部缓冲区作为提取输入/输出数据的工作缓冲区
4. 处理器/设备从提取输入/输出数据的工作缓冲区中获取输入/输出的数据
5. 提取输入/输出数据的工作缓冲区空了以后,将其放入空缓冲队列
### 设备分配与回收
#### 使用方式
* 独占式使用设备
* 分时式共享使用设备
* 以SPOOLing方式使用外部设备
#### 设备分配的数据结构
* 设备控制表(DCT):一个DCT代表一个设备,存放设备的各种属性
* 控制器控制表(COCT):用于解析命令,一个DCT具有一个指向COCT的表项
* 通道控制表(CHCT):反应通道状态,一个COCT对应一个CHCT,一个CHCT对应多个设备
* 系统设备表(SDT):一个系统只有一个,存放系统中所有设备的情况
#### 设备分配策略
##### 原则
* 充分发挥设备的使用效率
* 避免死锁
* 使用户程序和具体设备隔离开
##### 分配方式
* 静态分配:一次性将作业需要的所有设备分配出去,不会死锁,但效率低
* 动态分配:进程运行时提出请求获取设备,效率高,肯会死锁
##### 分配算法
* 先请求先分配
* 优先级高者优先
#### 设备分配安全性
* 安全分配方式:进程发出I/O请求后阻塞,完成后才唤醒,此时不请求和保持任何资源
* 优点
* 设备分配安全
* 缺点
* 同一进程下,CPU和设备是串行工作的
* 不安全分配方式:发出I/O请求时继续运行,需要时继续发出新I/O请求,直至请求设备被占用时堵塞
* 优点
* 一个进程可同时操作多个设备
* 缺点
* 可能产生死锁
#### 设备独立性
* 在系统中设置一个逻辑设备表(LUT),将逻辑设备名银蛇为物理设备名
* LUT组成
* 逻辑设备名
* 物理设备名
* 设备驱动程序入口地址
* 建立方式
* 一个系统只有一张,不允许逻辑设备名重名,适合单用户系统
* 每个用户设置一张LUT,用户登录时,建立进程,将LUT放入该进程PCB中
#### SPOOLing技术(假脱机技术)
* 将独占设备改造为共享设备
* 输入井和输出井
* 在磁盘中开辟的两个区域,模拟脱机输入/输出时的磁盘
* 输入/输出缓冲区
* 在内存中开辟的两个区域,暂存输入/输出的数据
* 输入流程
* 数据先从缓冲区输入输入井
* 再从输入井读入内存
* 输出流程
* 数据先从缓冲区输入输出井
* 再从输出井输出到设备
* 作用
* 作为中转站,在设备繁忙时作为虚拟设备暂存数据,避免进程运行停滞
## 其他零散知识
* 缓存(cache)与缓冲(buffer)的区别
1. **Buffer**(缓冲区)是系统两端处理**速度平衡**(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到**流量整形**的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。
2. **Cache**(缓存)则是系统两端处理**速度不匹配**时的一种**折衷策略**。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。
3. 假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。
4. TLB(Translation Lookaside Buffer,翻译后备缓冲器)名字起错了,其实它是一个cache.
* 脱机输入/输出
* 利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上,或者相反

View File

@@ -0,0 +1,619 @@
# 进程管理
## 进程概念
* 进程是资源分配的最小单位
* 独立运行的基本单位
* 与程序的区别
| 进程 | 程序 |
| ---------------------------------------- | -------------------------------- |
| 动态 | 静态 |
| 暂时 | 永久 |
| 组成不同,包括程序段,数据段和进程控制段 | |
| 通过调用关系,一个进程可执行多个程序 | 通过多次执行,程序可产生多个进程 |
| 进程可创建其他进程 | 程序不可创建其他程序 |
| 具有并行特性 | 没有并行特性 |
* 与作业的区别
* 作业是计算机完成某个任务所做工作的集合
* 一个作业的完成经过如下过程
1. 作业提交
2. 作业收容
3. 作业执行
4. 作业完成
* 进程是已提交作业的执行过程
* 用户提交作业后,系统将它放入外存的等待队列
* 进程只要被创建,总有部分内容留在内存
* 一个作业至少由一个进程组成
* 一个进程不能构成多个作业
* 作业主要用于批处理系统,分时系统很少见(Unix无作业概念)
* 进程存在于基本上所有的多道程序系统中
## 进程特征
* 动态性
* 并发性
* 独立性
* 异步性
* 结构性(使用PCB描述)
* 程序段
* 数据段
* 进程控制块
## 进程状态
* new(创建态)
* waiting(阻塞态)
* running(运行态)
* ready(就绪态)
* terminated(结束态)
![](./img/进程/process_state.png)
## 进程控制
### 进程的创建
* 举例
* 终端用户登录系统
* 作业调度
* 系统提供服务
* 用户程序的应用请求
* 过程
1. 为新进程分配一个进程标识号,申请一个空白的PCB,PCB申请失败,则创建失败
2. 为进程分配资源,分配内存(资源不足,进入阻塞态)
3. 初始化PCB
4. 若进程就绪序列能接纳新进程,则将新进程插入就绪队列,等待调度
### 进程的终止
* 引起终止的事件
* 正常结束
* 异常结束
* 越界
* 保护错
* 非法指令
* I/O故障
* etc
* 外界干预
* 操作系统干预
* 父进程请求
* 父进程终止
* 过程(撤销原语)
1. 根据标识符找到PCB,读出进程状态
2. 若进程处于执行态,终止该进程执行,分配处理器资源给其他进程
3. 若该进程还有子孙进程,终止其所有子孙进程
4. 释放该进程全部资源,归还父进程或操作系统
5. 从队列中删除PCB
### 进程的阻塞和唤醒
* 阻塞原语
1. 找到标识号对应PCB
2. 若该进程处在运行态,保护现场,将其状态转为阻塞态,终止运行
3. 将PCB插入相应事件的等待队列,分配处理器资源给其他进程
* 唤醒原语
1. 从该事件等待对列中找到相应PCB
2. 从等待队列移除,设置为就绪态
3. 插入就绪队列,等待调度
### 进程切换
* 过程
1. 保存处理机上下文(程序计数器和其他寄存器)
2. 更新PCB信息
3. 将进程移入相应队列
4. 选择另一个进程,更新其PCB
5. 恢复内存管理的数据结构
6. 恢复处理机上下文
## 进程结构
* 程序段
* 数据段
* 进程控制段(PCB)
* 进程标识符(PID)
* 进程当前状态
* 进程队列指针
* 程序和数据地址
* 进程优先级
* CPU现场保护区
* 通信信息
* 家族联系(父子进程标识等)
* 占有资源清单
## 线程
### 引入目的
* 提高系统并发性
### 线程的定义
* 线程是进程的一个执行单元
* 线程是进程的一个可调度实体
* 线程是程序(或进程)中相对独立的一个控制流序列
* 线程本身不能单独运行
* 除**程序计数器**,**一组寄存器**,**栈**以外,线程不拥有自己的资源
* 线程与同一进程内其他线程共享全部资源
### 线程实现
* 内核级线程
* 由操作系统完成创建和撤销工作
* 内核线程堵塞时,不会影响其他线程
* 处理器以线程作为时间片分配的基本对象
* 用户级线程
* 进程利用线程库提供的创建,同步,调度和管理线程的函数来控制线程
* 由应用进程完成用户级线程的维护
* 调度再进程内部优化,通常采用非抢占式和更简单的规则,无需用户态/核心态切换,速度快
* 一个线程堵塞时,整个进程堵塞
* 处理器时间片以进程为基本对象
* 混合型线程
* 内核支持多线程创建,撤销和调度
* 系统同样运行用户应用程序可自行创建,调度和管理用户级的线程
### 多线程模型
* 基于混合型的线程实现
* 多对一
* 多个用户级线程映射到一个内核级线程
* 线程在用户空间管理,效率较高
* 一个线程堵塞,整个进程堵塞
* 无法利用多处理器并行运行
* 一对一
* 一个线程堵塞不影响其他线程运行
* 并发性高
* 在多处理器计算机上实现多进程并行
* 创建一个用户级线程时就要创建一个内核级线程,开销大
* 多对多模型
* 内核级线程数<=用户级线程数
* 打破前两种模型对用户进程的限制
* 用户级线程可并行执行,数量也不受限
* 一个用户级线程堵塞时,可执行其他线程
## 进程通信
### 共享存储器系统
* 在存储器中划分一个共享存储区
* 多个进程通过对共享存储区的存储进行通信
* 分类
* 低级方式:基于数据结构的共享
* 高级方式:基于存储区的共享
* 通信步骤
1. 通信前,进程申请一个共享存储区,并指名关键字
2. 系统返回该存储区的描述符
3. 申请者将共享存储区附接到进程上,即可如访问普通存储器一样读写共享存储区
### 消息传递系统
* 系统提供一组通信原语实现通信,隐藏细节,简化了通信程序
* 分类
* 直接通信方式(缺点:消息传递与进程名绑定,改动比较麻烦):
1. 发送进程将消息发送至接收进程
2. 将其挂在接收进程的消息缓存队列
3. 接收进程从消息缓冲队列获取信息
* 间接通信方式(例:电子邮件系统):
1. 发送进程将消息发送至中间实体(信箱)
2. 接收进程从信箱中取得信息
### 管道通信系统
* 管道是连接读写进程的**共享文件**
* 写进程以字符流形式将数据送入管道
* 读进程从管道中接收数据
## 处理器调度
### 三级调度
#### 高级调度/作业调度/宏观调度/长程调度
* 调度单位为**作业**
* 功能:从外存中调入一个或多个作业执行
* 一般几分钟一次
* 调度算法
* 先来先服务(最简单)
* 短作业优先(较常用)
* etc
#### 中级调度/交换调度/中程调度
* 调度单位为**进程**
* 功能:
* 将外存交换区的符合条件的挂起进程调入内存,改为就绪态
* 将阻塞状态的进程交换到外存交换区
* 主要涉及外存和内存间的调度
#### 低级调度/进程调度/微观调度/短程调度
* 调度单位为**进程**
* 功能: 从就绪队列选取一个进程,并分配处理器资源
* 运行频率高,几十毫秒一次
### 调度的基本原则
* CPU利用率
* 系统吞吐量:单位时间系统完成的作用数目
* 响应时间
* 周转时间
* $作业i的周转时间T_i=作业i的完成时间-作业i的提交时间$
* $n个作业的平均周转时间=\frac{\sum_{1}^{n}{T_i}}{n}$
* $作业i的带权周转时间W_i=\frac{T_i}{作业i的运行时间}$
* $n个作业的平均带权周转时间=\frac{\sum_{1}^{n}{W_i}}{n}$
### 进程调度
#### 进程调度的功能
* 记录系统所有进程的有关情况和状态特征
* 选择获得处理器的进程
* 处理器分配
#### 引起进程调度的原因
* 当前运行进程结束
* 当前运行进程堵塞
* 执行完系统调用等系统程序后返回用户进程(系统进程执行完毕)
* 抢占式调度中,更高优先级的进程要求使用处理器
* 分时系统中,进程的时间片用完
#### 不能执行进程调度的情况
* 中断处理过程中
* 操作系统内核临界区中
* 完全屏蔽中断的原子操作过程中
#### 进程调度方式
* 抢占方式/可剥夺方式
* 非抢占式方式/不可剥夺方式
### 常见调度算法
#### 先来先服务调度算法(FCFS)
* 用于**作业调度**,**进程调度**
#### 短作业优先调度算法(SJF)
* 用于**作业调度**,**进程调度**
* 所有作业同时到达时,SJF平均周转时间最短
* 长作业容易发生饥饿现象
#### 优先级调度算法
* 用于**作业调度**,**进程调度**
* 优先级确定方式
* 按进程类型确定:系统进程高于用户进程
* 按作业资源要求确定:申请资源越少,优先级越高
* 按用户类型和要求确定
* 动态优先级
* 进程优先级随占有CPU时间上升而下降
* 进程优先级随占有等待时间上升而上升
* 分类
* 抢占式
* 非抢占式
* 优先级相同时,一般使用FCFS算法
#### 时间片轮转调度算法
* 用于**进程调度**
* 时间片太大:退化为FCFS
* 时间片太小:进程切换开销过大
* 时间片确定因素
* 系统响应时间:满足分时系统对响应时间的要求
* 就绪队列的进程数目:进程数与时间片大小成反比
* 系统处理能力:速度越快,时间片越小
#### 高响应比优先调度算法
* 用于**作业调度**
* $响应比=\frac{作业等待时间+估计运行时间}{估计运行时间}$
* 同时考虑了长短作业
* 计算响应比增加了开销
#### 多级队列调度算法
* 用于**进程调度**
* 将就绪队列划分成多个独立队列
* 每个独立队列采用一种调度算法
#### 多级反馈队列调度算法
* 用于**进程调度**
* 时间片轮转算法与优先级调度算法的综合和发展
* 设置多个就绪队列,各个就绪队列优先级逐级降低
* 优先级越高的队列时间片越短
* 新进程进入系统时,放入第一级队列
* 进程时间片执行完毕后,移入下一级队列的末尾
* 对于第i级队列来说,前i-1给队列均为空时,才会调度第i级队列内的进程
* 当处理器处理第i级队列的进程时,若新进程进入高优先级队列中,将该进程重新放入第i级队列末尾,执行新进程
* 优点
* 终端型作业用户:短作业优先
* 短批处理用户:周转时间较短
* 长批处理用户:不会饥饿
## 进程同步
### 临界资源
#### 访问过程
1. 进入区:检查可否进入临界区的部分
2. 临界区
3. 退出区:清除访问临界区的部分
4. 剩余区
### 同步
* 直接制约关系
* 多个进程的执行需要依赖其他进程
### 互斥
* 间接制约关系
* 多个进程不能同时访问某个临界资源
* 同步准则(避免同时访问临界资源)
* 空闲让进
* 忙则等待
* 有限等待:等待时间不能是无限的
* 让权等待:等待时转让CPU资源
### 实现互斥的基本方法
#### 软件实现
##### 算法1:单标志法
```c++
void P0(){
while(turn!=0);
//访问临界资源
turn=1;
//剩余部分
}
void P1(){
while(turn!=1);
//访问临界资源
turn=0;
//剩余部分
}
```
* 缺陷:
* 两进程只能交替访问临界区
##### 算法2:双标志法
```c++
void Pi(){
while(flag[j]);
flag[i]=true;
//访问临界资源
flag[i]=false;
//剩余部分
}
void Pj(){
while(flag[i]);
flag[j]=true;
//访问临界资源
flag[j]=false;
//剩余部分
}
```
* 优点
* 可交替进入
* 缺陷
* 可能同时进入临界区
##### 算法3 双标志法后检查
```c++
void Pi(){
flag[i]=true;
while(flag[j]);
//访问临界资源
flag[i]=false;
//剩余部分
}
void Pj(){
flag[j]=true;
while(flag[i]);
//访问临界资源
flag[j]=false;
//剩余部分
}
```
* 缺陷
* 可能都无法进入临界区
##### 算法4 Peterson‘s Algorithm
```c++
void Pi(){
turn=j;
flag[i]=true;
while(flag[j]&&turn==j);
//访问临界资源
flag[i]=false;
//剩余部分
}
void Pj(){
turn=i;
flag[j]=true;
while(flag[i]&&turn==i);
//访问临界资源
flag[j]=false;
//剩余部分
}
```
#### 硬件实现
##### 中断屏蔽法
```c++
// 关中断
// 临界区
// 开中断
```
##### 硬件指令法
```c++
bool TestAndSet(bool * lock){
bool old=*lock;
*lock=true;
return old;
}
// 临界区访问方式
// 共享变量lock
while(TestAndSet(&lock));
// 访问临界区
lock=false;
// 其他部分
void Swap(bool* a,bool *b){
bool tmp=*a;
*a=*b;
*b=*a;
}
// 临界区访问方式
// 共享变量lock
bool key=true;
while(key!=false){
Swap(&key,&lock);
}
// 访问临界区
lock=false;
// 其他部分
```
### 信号量
#### 整数型信号量
* 使用一个整数作为信号量
* wait时,始终忙等
#### 记录型信号量
* 使用一个整数和所有等待该资源的进程链表作为信号量
* wait时,让权给下一个进程
### 管程
#### 定义
* 使用共享数据结构表示共享资源,并对该共享数据结构实施操作的一组过程所组成的资源管理程序称为**管程**
#### 组成
* 管程的名称
* 管程内部的共享结构数据说明
* 对数据结构操作的一组过程
* 对共享数据初始化语句
#### 特点
* 将申请和释放资源的操作封装起来,只能通过管程访问共享资源
* 每次仅允许一个进程进入管程,多个进程同时调用某一方法时排队等待
#### 条件变量
* wait:阻塞某一进程
* signal:唤醒一个进程
* 条件变量只能实现进程的阻塞和唤醒功能,没有维护一个值
### 经典同步问题
* 生产者消费者
* 读者写者
* 读优先
* 写优先
* 读写公平
* 哲学家就餐
* 吸烟者问题
## 死锁
### 必要条件
* 互斥条件
* 不剥夺条件
* 请求并保持:进程至少保持一个资源,在请求其他资源时不释放已保持的资源
* 循环等待
### 处理策略
* 死锁预防:破坏死锁产生的必要条件
* 死锁避免:分配资源时,防止资源进入不安全状态
* 死锁检测:不对资源分配限制,定期检测死锁是否发生,并解除死锁
### 策略对比
| | 资源分配策略 | 实现方式 | 优点 | 缺点 |
| -------- | ---------------------- | --------------------------------------------------------- | -------------------------------------------- | ------------------------------------------ |
| 死锁预防 | 保守<br />宁可资源闲置 | 1. 一次请求所有资源<br />2. 资源剥夺<br />3. 资源按序分配 | 适用于突发式处理的进程<br />不必进行剥夺 | 效率低<br />初始化时间长 |
| 死锁避免 | 折中 | 寻找各种可能的安全顺序 | 不必进行剥夺 | 必须知道将来的需求<br />进程不能长时间阻塞 |
| 死锁检测 | 宽松只要允许就分配资源 | 定期检测死锁是否发生 | 不延长初始化时间<br />允许对死锁进行现场处理 | 通过剥夺解决死锁,造成损失 |
### 死锁预防
* 破坏互斥条件:不符合实际
* 破坏不剥夺条件:进程申请新资源失败时,必须释放已保持的资源
* 缺点:实现复杂,开销大,降低吞吐量
* 破坏请求并保持条件:一次性分配所有资源
* 缺点:资源严重浪费
* 破坏循环等待条件:按资源编号升序申请
* 缺点:限制新设备增加,容易使资源浪费,对编程造成麻烦
### 死锁避免
* 使用安全性算法判断是否是安全状态
* 申请资源时,先预分配资源,然后检测是否安全
* 若仍处于安全状态,才分配资源
* Request矩阵代表最大请求资源数
### 死锁检测与解除
#### 死锁检测
* 使用类似于安全性算法的方式检测是否发生死锁
* 此时Request矩阵代表当前个进程申请的资源
* 死锁避免的安全性算法条件要强于死锁检测的算法
#### 死锁解除
* 剥夺资源:从其他进程中抢夺足够的资源
* 撤销进程:撤销一些进程从而释放资源
* 进程回退:使若干个进程还原至可避免死锁的地步
## 其他零散知识
* 只有死锁预防对资源申请顺序有要求