操作系统
处理器、存储器、文件、设备等系统资源的管理者
一、进程与线程
OS发展历程:
- 1.手工操作:一次装入并运行一个“作业”
- 2.简单批处理:一次装多个”程序“,串行执行
- 3.多道程序批处理:一次装多个程序,并发执行,仅当等待I/O时切换进程
- 4.分时处理:一次装多个程序,并发执行,程序切换条件:执行时间长度or IO等待
进程
1. 五个基本特征
- 动态性 : 因创建而产生,由调度而执行,因得不到资源而暂停执行, 最后因完成或撤销而消亡(进程生命周期)
- 并发性 : 引入进程的目的就是为了使多个程序并发执行,提高资源利用率(主要CPU)
- 独立性 : 进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的基本单位
- 异步性 : 进程以各自独立的、不可预知的速度向前推进
- 结构性 : 进程 = 程序 + 数据 + 进程控制块(PCB)
进程的组成
- 程序与数据:描述进程本身所应完成的功能
- 进程控制块PCB:进程的动态特征,该进程与其他进程和系统资源的关系
描述进程与其他进程、系统资源的关系以及进程在各个不同时期所处的状态的数据结构
内容包括:
- 进程描述信息
- 进程控制和管理信息
- 资源分配清单
- 处理器相关信息
2. 三种基本状态
- 就绪状态 : 进程分配了必要的资源,等待获得CPU执行的状态(进程获得了除了CPU外所需的一切资源)
- 运行状态: 已分配到必要资源和cpu,正在CPU上执行时的状态
- 阻塞状态 : 程序正在等待某一事件而暂停运行,放弃CPU而处于暂停状态。
CPU空闲,但是并未等到所需资源时,该进程也不能运行 - 新建,终止,挂起
- 新建(new) – 建立PCB,但进程相关的其他内容可能未调入主存
- 终止(terminated) – 进程已经终止,但资源等待父进程或系统回收
3. 进程的控制
- 1.
fork
创建进程 父进程通过调用fork函数创建一个新的运行状态的子进程
允许一个进程创建另一个进程。创建者为父进程,被创建者为子进程。子进程可以继承父进程所拥有的资源,当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。
- 并发执行:不能预测父子进程的执行顺序
- 调用一次,返回两次值
- 调用者(父进程): 返回子进程的PID(出错的话返回-1)
- 新建的子进程 : 返回0
- 2.
exit
终止进程- 正常结束返回0,错误时返回非0值
- 只会被调用一次,并且不会再次返回
引起终止的事件有:
- 正常结束
- 异常结束
- 外界干预 : OS 、父进程终止 、父进程请求
- 3.阻塞与唤醒
- 正在执行的进程,由于期待的事情未发生,会使自己由运行态变为阻塞态。(进程自身的一种主动行为)
- 当阻塞等待的条件被满足时,进程会被唤醒从阻塞态进入就绪态。(一般是由另一个和被唤醒进程相关的合作进程实现的)
引起进程阻塞的事件
- ✓ 请求系统服务
- ✓ 等待I/O操作
- ✓ 等待数据到达
- ✓ 无新工作可做:服务进程
- 4.切换
进程切换的过程:- 保存处理机上下文,包括程序计数器和其他寄存器
- 更新PCB信息
- 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列
- 选择另一个进程执行,并更新其PCB
- 更新内存管理的数据结构
- 恢复处理机上下文
处理机从一个进程的运行转到另一个进程上运行,进程的运行环境发生了实质性的变化
-
5. 回收子进程
- 回收原因:进程中止后仍消耗系统资源
- 回收过程:
1. 收到子进程退出状态后,父进程执行回收
2. 内核删除僵尸进程
- 孤儿进程:父进程退出而子进程还在运行
- 僵尸进程:子进程退出而父进程没有调用
wait
或waitpid
获取子进程状态信息,则子进程的进程描述符仍保留
4. 进程图
- 每个节点表示一条语句的执行
- a——>b表示a在b之前发生
- fork后先执行子还是主?(随机)
5. 进程间通信
为保证安全,各进程拥有的内存地址空间相互独立,不能直接访问其他进程的地址空间。
- 1.共享内存系统
共享存储:两个进程对共享空间的访问必须互斥,操作系统提供共享空间与同步互斥工具
基于数据结构 | 基于存储区 | |
---|---|---|
实现 | 规定共享空间存放的数据结构 | 在内存中划出一块共享区,数据形式、存放位置都由进程控制 |
特点 | 低级通信(速度慢、限制多) | 高级通信 |
-
2.管道通信
管道 连接一个读进程,一个写进程int pipe(int fd[2])
:fd[0]为读出,1为写入(没写满不能读,写满后不能再写,读完了才能继续写)- 要实现双方通信需定义两个管道,管道只能采用半双工通信,某一时间段内只能单向传输
-
3.消息传递系统
进程间的数据交换是以格式化的消息(message,在计算机网络中又称报文)为单位。
消息头包括:发送进程ID,接收进程ID,消息类型,消息长度等格式化信息
消息缓冲队列机制(直接) | 信箱通信方式(间接) | |
---|---|---|
描述 | 消息直接挂到接收进程的消息缓冲队列中 | 消息先发到中间实体中,如计网中的电子邮件系统 |
线程
进程内一个相对独立的可调度执行单元
线程是处理机调度的单位
进程是资源分配的单位
1. 并发性 线程更好的支持并发
- 1.进程间并发,需要切换进程的运行环境,系统开销大
- 2.线程间并发,若是同一进程内,不用切换进程环境,开销小
2. 线程属性
- 处理机调度的单位
- 多CPU计算机中,各线程占用不用CPU
- 各线程都有其ID,线程控制块 TCB
- 线程也有就绪、运行、阻塞三种基本状态
- 几乎不拥有系统资源
- 同一进程的不同线程间共享进程资源
- 进程中线程切换,不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
- 切换同进程中的线程,系统开销很小
- 切换进程,系统开销很大
3. 线程的实现方式
用户级线程 | 内核级线程 |
---|
多线程模型
并发线程 : 在时间线上控制流有重叠的线程是并行的,否则为顺序执行
单核处理器通过时间片模拟并行
多核处理器能够实现真正的并行
二、 处理器调度
操作系统按照一定的策略从就绪队列当中选择一个进程,将CPU的使用权交给该进程
1. 相关概念
非抢占式调度 | 抢占式调度 | |
---|---|---|
解释 | (任务完成/阻塞)主动让出CPU, 调度程序将CPU分配给某就绪进程的调度方式 | 操作系统将正在运行的进程强行暂停, 由调度程序将CPU分配给其他就绪进程的调度方式 |
例 | 进程任务完成自动终止推出 因等待某些事件(资源)而让出CPU | 规定的时间片到了 出现了优先级更高的进程 |
评价标准
-
吞吐量: 单位时间完成的任务数量
-
周转时间: 从任务提交到任务结束的时间,即为任务完成时刻减去任务到达就绪队列的时刻。
T 周转时间 = T 完成时刻 – T 到达时刻 T_{周转时间} = T_{完成时刻}– T_{到达时刻} T周转时间=T完成时刻–T到达时刻 -
等待时间:就绪队列中等待的时间总和
-
响应时间:从用户输入到产生反应的时间,即从任务到达就绪队列到首次运行的时间:
T 响应时间 = T 首次运行时刻 – T 到达时刻 T_{响应时间} = T_{首次运行时刻}– T_{到达时刻} T响应时间=T首次运行时刻–T到达时刻
2. 调度算法
- 1.先到先服务FCFS
调度的顺序是任务到达就绪队列的顺序(就绪了就运行)
- 2.最短作业优先调度SJF
最短的作业(CPU区间长度最小)最先调度
- 3.最短剩余作业优先调度SRJF
SJF的可抢占版本。
抢占显然具有优点,但CPU区间必须是已知! 需要预测下一CPU区间的大小
- 4.轮询法调度RR
按时间片来轮转调度
- 时间片太大则响应时间太长
- 时间片太小则吞吐量变小,周转时间变长
- 5.多级反馈队列MLFQ
之前的FCFS 、SJF、RR算法任务的缺陷:都在单个队列中,可能要O(n)搜索
MLFQ按任务优先级分成多个队列,每次从level高的队列选择任务
- 多级队列的缺陷:若任务优先级无法改变,可能存在饥饿进程
解决:根据任务的CPU周期将任务放在不同队列中,运行任务在队列间移动
-
使用太多CPU时间的任务放在低优先级队列
-
优先级队列中过久的任务移到高优先级(防止“老化”)
-
6.彩票算法
三、 并发与同步
1. 信号
内核发出的一个消息,用来通知进程:系统中发生了某种类型的事件。
- 1.每种信号用一个整数ID标识
- 2.内核将ID发往进程或另一个进程发起
- 3.使用信号的目的
- 通知进程某种特殊的事件发生了
- 迫使进程执行信号处理程序
2. 同步
3. 并发
四、 死锁
多个进程(线程)因循环等待资源而造成无法执行的现象
- 造成进程(线程)无法执行
- 造成系统资源浪费
1. 特征分析——四个必要条件
- 1.互斥使用 多个进程因等待资源才造成死锁
- 2.不可抢占
- 3.请求和保持
- 4.循环等待
2. 处理方法
-
1.死锁预防
破除死锁的四个必要条件, 会引入不合理因素
- 破坏互斥使用 : 资源的固有特性,通常无法破除,如打印机
- 破坏不可抢占
- 破除请求和保持 : 在进程执行前,一次性申请所有需要的资源
- 破除循环等待
-
2.死锁避免 :防止系统进入不安全状态
检测每个资源请求,如果会造成死锁就拒绝
银行家算法 : 判定安全状态。系统的所有进程中存在一个可完成的执行序列(安全序列)
可用的资源可以满足某个进程的资源请求,则分配,然后寻找安全序列,找到,分配成功,找不到,已分配资源收回
例:有A,B,C三类资源,当前可利用资源Available(3, 3, 2)表示当前可用的各类资源数量。下表为各进程已分配的各类资源量与最大需求量
进程 Max 资源最大需求 Allocation 当前已分配资源数 P1 7, 5, 3 0, 1, 0 P2 3, 2, 2 2, 0, 0 P3 9, 0, 2 3, 0, 2 P4 2, 2, 2 2, 1, 1 用max-allocation得到need资源743,122,600,011
存在一个安全序列:P2->P4->P3->P1
- 3.死锁检测+恢复
由于银行家算法执行效率低 O ( m ∗ n 2 ) O(m*n^2) O(m∗n2),不好预判是否会发生死锁,于是只要资源够就分配,遇到死锁再撤销。
对策:只要可用资源足够就分配,允许运行时发生死锁。定时检测/当资源利用率较低时检测,检测到死锁再处理(撤销/挂起进程,回收资源)
- 4.死锁忽略
鸵鸟算法