操作系统
计算机系统概述
OS特征
-
并发
-
共享
- 互斥共享
- 同时访问
-
虚拟
- 空分复用技术-扩充内存
- 时分复用技术-多个CPU
-
异步
- 各进程向前推进的速度不相等
不同时期发展
-
手工阶段
- 用户独占全机,资源利用率低
-
单道批处理系统
- 各作业一次运行,无需人工
-
多道批处理
- 资源利用率高,不提供人机交互功能
-
分时操作系统
- 采用时间片方式,可以人机交互
-
实时操作系统
- 及时可靠
-
网络操作系统
- 网络中各种资源的共享及各台计算机通信
-
分布式操作系统
- 分布性、并行性
-
个人计算机
操作系统提供接口
-
命令接口
-
联机控制方式
- 类似cmd命令窗口
-
脱机控制方式
- 日常编程
-
-
程序接口
- 比如GUI
CPU状态
-
分类
- 核心态
- 用户态
-
用户态->核心态
- 中断
- 异常
- 访管指令
操作系统内核
-
时钟管理
- 计时
- 进程切换(时间片轮转调度)
-
中断机制
-
原语
- 比如设备驱动控制,CPU切换
-
系统中的数据结构及处理
- 进程管理
- 存储器管理
- 设备管理
系统调用
- 设备管理
- 文件管理
- 进程控制
- 进程通信
- 内存管理
体系结构
这里就类似中央是否集中权利进行管理
集权程度高,就是大内核操作
放权程度高,就是微内核操作
- 大内核体系结构
- 微内核体系结构
进程管理
进程
-
进程
-
概念
- 形象理解为程序的一次实验
-
组成
-
程序段
-
数据段
-
PCB
- 进程描述信息
- 进程控制和管理信息
- 资源分配清单
- 处理机相关信息
-
-
特征
-
动态性
-
并发性
- 多个进程实体同时存在与内存中
-
独立性
- 独立获得资源和独立接受调度的基本单位
-
异步性
- 进程之间相互制约,使得进程具有执行的间断性
-
结构性
-
-
状态
- 运行态
- 就绪态
- 阻塞态(等待态)
-
-
进程控制
- 进程创建
- 进程终止
- 进程的阻塞和唤醒(阻塞为主动行为)
- 进程切换
-
进程的通信
-
共享存储
-
采用同步互斥工具PV
- 基于数据结构的共享
- 基于存储区的共享
-
-
消息传递(借助消息缓冲区)
- 直接通信方式
- 间接通信方式
-
管道通信(半双工)
- 管道是固定大小的缓冲区
- 一边写入,同时一边读没哟问题
-
-
进程运行步骤
-
编译
- 由编译程序将用户源代码编译成若干目标模块
-
链接
-
由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起
形成一个完成的装入模块 -
链接方式
- 静态链接
- 装入时动态链接
- 运行时动态链接
-
-
装入
- 由装入程序将装入模块装入内存中运行
-
线程
-
特点
-
不拥有系统资源,共享线程资源
-
状态
- 就绪
- 阻塞
- 运行
-
处理机的独立调度单位
-
-
实现方式
- 用户级线程
- 内核级线程
-
引入目的
- 增加多道程序并发度
- 提高资源利用率和系统吞吐量
- 增加程序的并发性
调度
-
调度的层次
-
高级调度(作业调度)
- 从外存中调入作业,分配给他们内存,必要资源,建立进程
-
中级调度(内存调度)
- 堵塞态->挂起态 or 挂起态->堵塞态
-
低级调度(进程调度)
- 分配处理机
-
-
调度方式
- 非剥夺式调度
- 剥夺式调度
-
评价指标
- CPU利用率
- 系统吞吐量(单位时间内CPU完成作业的数量)
- 周转时间(从作业提交到完成的时间)
- 响应时间
-
调度算法
-
先来先服务算法FCFS
- 效率低
- 不利于短作业
- 适合CPU繁忙型,不适合I/O繁忙型作业
-
短作业优先算法SJF
- 饥饿发生
- 未考虑作业的紧迫程度
- 平均等待时间短
-
优先级调度算法
-
分类
- 剥夺式优先级调度算法
- 非剥夺式优先级调度算法
-
原则
- 系统进程 > 用户进程
- 交互型进程 > 非交互型进程
- IO型进程 > 计算型进程
-
-
高响应比优先调度算法
-
计算公式
响应比 = (等待时间+要求服务时间)/要求服务时间
-
克服饥饿
-
-
时间片轮转算法(分时系统)
-
时间片的长短确定
- 系统响应时间
- 就绪队列进程数目
- 系统的处理能力
-
-
多级反馈队列调度算法
-
进程同步
-
临界
- 临界资源
- 临界区
-
同步(直接制约关系)
-
信号量实现同步
semaphore S = 0;
P1()
{
一些操作代码…;
x; // 语句x;
V(S)// 唤醒另外P进程
}
P2
{
P(S); // 一直堵塞P2进程,等待唤醒
Y; // 被唤醒,执行正事
}
-
-
互斥(间接制约关系)
-
实现方法
-
软件
-
单标志法
- 违背 空闲让进 原则
-
双标志先检查法
- 违背 忙则等待 原则
-
双标志法后检查
- 产生饥饿状态
-
Peterson’s Algorithm
- flag 解决临界资源的互斥访问
- turn 解决饥饿现象
-
-
硬件
-
中断屏蔽方法
-
方法
关中断;
临界区;
开中断; -
特点
- 限制了CPU交替执行能力
- 用户能力变大,居然能控制中断
-
-
硬件指令方法
-
TestAndSet指令
boolean TestAndSet(boolean *lock)
{
boolean old;
old = *lock;
*lock = true;
return old; // 设置old为true
}
while (TestAndSet(&lock));
{
临界区代码段;//(进入第一件事,设置lock为true),防止他人进入
lock = false;
进程其他代码;
}- 读出制定标志后设该标志位真
- true 表示被占用
- 初值为false,空闲
-
Swap指令
Swap(boolean *a, boolean *b)
{
boolean temp;
temp = *a;
*a = *b;
*b = temp;
}
Main
{
key = true;
while(key!=false)
Swap(&lock, &key);//只要有其他进程
//Lock = true
进程临界区代码段;
lock = false;
进程的其他代码段
}- 交换两个字节内容
- 设置局部变量key
-
-
-
信号量实现互斥
-
整型信号量
-
存在忙等
-
操作
wait(S)
{
while(S<=0);
S–;
}
signal(S)
{
S++;
}
- wait(占有资源)P操作
- signal(释放资源)V操作
-
-
记录型信号量
-
操作
typedef struct
{
int value;
struct process *L;// 构造等待序列
}semaphore;
void wait(semaphore S)
{
S.value --;
if(S.value < 0)
{
add this process to S.l; block(S.L); // 放弃处理机,插入等待序列
}
}
void signal (semaphore S)
{
S.value++;
if(S.value > 0)
{ remove a process P from S.L; // 告诉阻塞进程P,来资源了,可以干活 wakeup(P); }
}
- 资源数目value
- 进程链表L(链接所有等待该资源的进程)
-
-
-
-
进程互斥
-
信号量实现
semaphore S = 1;
P1()
{
…;
P(S); // 准备访问临界资源,加锁
进程P1的临界区;
V(S); // 访问结束,解锁
}
P2()
{
P(S); // 准备访问临界资源,加锁
进程P2的临界区;
V(S); // 访问结束,解锁
}
-
-
-
经典同步问题(统一把P理解为消耗,V理解为释放)
-
生产者-消费者问题
-
分析
a 这里生产者和消费者是互斥访问
但存在相互协作关系,是同步关系
semaphore mutex = 1; // 设置临界区初始互斥量值 = 1
semaphore empty = n; // 设置空的单位数
semaphore full = 0; // 设置满的单元数
producer() //这里把P(empty), P(full) 理解为消耗会更好Instead of waiting
{
while(1)
{
produce an item in nextp; // 先生产一个物品 P(empty); // 消耗一个空闲区 P(mutex);(互斥夹紧) // 进入临界区 add nextp to buffer; // 操作动作 V(mutex);(互斥夹紧) // 离开临界区,释放互斥信号量 V(full); // 生成一个满块
}
}
consumer()
{
while(1)
{
P(full);// 消耗一个满载区 P(mutex);(互斥夹紧) remove an item from buffer; V(mutex);(互斥夹紧) V(empty);// 生成一个空块区 consume the item;
}
}
-
是否可以先进入临界区,然后消耗空闲块or满载块
分析
会造成两个进程堵塞,死锁的情况
-
-
写者读者问题
int count = 0; // 记录当前读者数量
semaphore mutex = 1; //用于保护 更新count变量时 的互斥
semaphore rw = 1; //用于保护 读者 和写者互斥地访问文件
semaphore w = 1; //用于实现“写优先”
writer()
{
while(1)
{
P(w); // 消耗写优先资源
P(rw); // 消耗读写互斥资源
writing;
V(rw); // 释放读写互斥资源
V(w); //释放写优先资源}
}
reader()
{
while(1)
{
P(w); // 消耗写优先资源
P(mutex); //消耗 count变量资源
if(count == 0) // 如果是第一个读操作,封杀写操作
P(rw); // 封杀写操作
count++; // 表明读者个数
V(mutex); //释放 count变量资源
V(w); // 消耗写优先资源
reading;
P(mutex); //消耗 count变量资源
count–;
if(count == 0)
V(rw); // 释放读写互斥资源
V(mutex); //释放写优先资源
}
} -
哲学家进餐问题
-
吸烟者问题
-
管程
-
组成
- 名称
- 局部于管程内部的共享结构数据说明
- 对该数据结构进行操作的一组过程(或函数)
- 共享数据设置初始值
-
条件变量(进程阻塞的原因)
-
操作
- wait (正在调用管程的进程用wait插入等待队列,释放管程)
- signal (唤醒一个因x 条件而阻塞的进程)
-
死锁
-
定义
- 多个进程因竞争资源而造成的一种僵局
-
产生条件
-
互斥条件
- 排他性控制
-
不剥夺条件
- 该资源只能由本进程释放
-
请求并保持条件
- 进程已经保持一个资源,但提出新的资源请求
-
循环等待条件
-
-
处理策略
-
死锁预防
- 闲置资源
-
避免死锁
- 寻找安全序列
- 银行家算法
-
死锁的检测
- 定期检查,剥夺资源
- 资源分配图 + 死锁定理
-
死锁解除办法
- 资源剥夺方法
- 撤销进程法
- 进程回退法
-
内存管理
功能
-
内存空间的分配与回收
-
地址转换
- 逻辑地址到物理地址的转换
-
内存空间的扩充
- 虚拟内存的应用
-
存储保护
- 防止内存地址越界
装入模块放入内存方式
-
绝对装入
- 适合单道程序
-
可重定位装入
- 静态重定位,适合多道程序
-
动态运行时装入
- 动态重定位
内存保护两种方法
- 在CPU中设施一对上下寄存器
- 采用重定位寄存器+界地址寄存器
扩充内存
-
多道程序环境下
-
覆盖
用户空间分 固定区和若干覆盖区
-
交换
- 中级调度技术
-
-
虚拟内存管理
-
局部性原理
- 空间局部性
- 时间局部性
-
特征
- 多次性
- 对换性
- 虚拟性
-
管理内存方式
-
请求分页管理方式
-
新增功能
-
请求调页功能
-
页面置换功能
-
算法
-
最佳置换算法
-
先进先出算法
- 出现Belady异常
-
最近最久未使用算法
-
时钟置换算法
- 淘汰最近未用的
-
改进时钟算法
- 最先淘汰被修改且没访问的
-
-
-
页面分配策略
驻留集:给一个进程分配的物理页框的集合
工作集:某段时间内,进程要访问的页面集合
- 固定分配局部置换
- 可变分配全局置换
- 可变分配局部置换
-
调入页面时机
- 预调页策略
- 请求调页策略
-
-
异常
- 抖动
-
-
请求分段存储方式
-
请求段页式管理方式
-
-
最大
- 不超过计算机的地址位数
-
管理内存方式
-
连续
-
单一连续分配
-
固定分区分配
- 产生内部碎片
- 无外部碎片
-
动态分区分配
-
产生外部碎片
-
分配算法
- 首次适应
- 最佳适应
- 最坏适应
- 邻近适应算法
-
-
-
离散
-
分页存储管理方式
根据运行时作业是否要把全部页面装入内存中才能运行
-
基本分页存储管理方式
-
单级分页
-
类似固定分区技术,产生内部碎片
-
逻辑结构分 页号 + 页内偏移量
计算过程
a 计算页号 和 页内偏移量
-
-
-
-
-
单级分页
- 类似固定分区技术,产生内部碎片 - 逻辑结构分 页号 + 页内偏移量 计算过程 a 计算页号 和 页内偏移量 b 页表项地址 = 页表始址+页号*页表项长度 - 引入快表,加速地址变换 - 二级分页
-
分段存储管理方式
-
基本分段存储管理方式
- 分段管理的地址空间是二维的
-
-
段页式存储管理方式
-
文件管理
文件
-
分类
-
流式文件
- 无结构文件
-
记录式文件
-
一组相似的记录
- 顺序文件
- 索引文件
- 索引顺序文件
- 散列文件
-
-
-
基本操作
-
创建文件
- 分配空间
- 在目录中记录该文件
-
写文件
- 分配指针
-
读文件
-
文件寻址
-
删除文件
-
-
打开文件的关联信息
- 文件指针
- 文件打开技术
- 文件磁盘位置
- 访问权限
目录结构
-
数据结构
- 文件控制块
- 索引节点
-
操作
- 搜索
- 创建文件
- 删除文件
- 显示目录
- 修改目录
-
结构
- 单级目录结构
- 两级目录结构
- 多级目录(树形目录结构)
- 无环图目录结构
文件共享
-
基于索引节点的共享方式(硬链接)
- 链接到多个目录中
-
利用符号链实现文件共享(软链接)
- 只存放路径link
文件保护
-
访问类型
- 读
- 写
- 执行
- 添加
-
访问控制
- 控制用户身份
-
口令密码
文件系统层次结构
- 用户调用接口
- 文件目录系统
- 存取控制验证模块
- 逻辑文件系统与文件信息缓冲区
- 物理文件系统
- 设备管理程序模块
目录实现
- 线性列表
- 哈希表
文件分配方式
- 连续分配
- 链接分配
- 索引分配
文件存储空间管理
-
初始化
- 目录区
- 文件区
-
管理方法
- 空闲表法
- 空闲链表法
- 位示图法
磁盘
-
磁盘地址
- 柱面号 * 盘面号 * 扇区号
-
读写操作时间
- 寻找时间
- 延迟时间
- 传输时间
-
调度算法
- 先来先服务
- 最短寻找时间优先
- 扫描算法/电梯算法
- 循环扫描算法
-
磁盘管理
- 磁盘初始化
- 引导块
- 坏块
IO外设管理
分类
-
块设备
- 比如磁盘
-
字符设备
- 比如打印机等
IO控制方式
-
程序直接控制
- CPU资源浪费
-
中断驱动方式
-
DMA方式
-
通道控制方式
IO子系统层次结构
- 用户层IO软件
- 设备独立性软件
- 设备驱动程序
- 中断处理程序
- 硬件设备
IO管理内容
- 状态跟踪
- 设备存取
- 设备分配
- 设备控制
IO核心子系统
-
服务
- IO调度
- 缓冲与高速缓存
- 设备分配与回收
- 假脱机
- 设备保护与差错处理
-
高速缓存 + 缓冲区
-
高速缓存
-
缓冲区
- 单缓冲
- 双缓冲
- 循环缓冲
- 缓冲池
-
-
设备分配时数据结构
- 设备控制表DCT
- 控制器控制表COCT
- 通道控制表CHCT
- 系统设备表SDT
-
SPOOling技术
-
组成
-
输入井和输出井
- 磁盘中
-
输入缓冲区和输出缓冲区
- 内存中
-
输入进程和输出进程
-
-