前言:此篇博文不是科普性的知识解读文章,不适合新手入门学习。作用在于自己梳理知识脉络,方便回忆和补充知识点,后期会不断更新补充。
目录
2.3.3 调度算法:(这里需要做题加强理解,而不是死记硬背)
3.1 进程通信:进程之间的信息交换(共享存储、消息传递、管道通信)
3.2 进程同步:进程间相互制约的关系(互斥、同步),使得按照预期的方式执行(软件、硬件实现方式)
3.2.2 实现临界区互斥:硬件实现方法(关中断/开中断、Test-And-Set、Swap指令)
4.3 死锁产生的必要条件:互斥、不剥夺不可抢占、请求并保持、循环等待
4.5 死锁避免:系统安全状态、银行家算法(做点题去理解,别死记硬背)
1 什么是进程?线程与进程的概念
1.1 解释进程
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行所发生的活动
- 进程是程序在一个数据集合上运行的过程
- 进程是系统进行资源分配和调度的一个独立单位
1.2 进程的结构
- 控制块PCB
- 数据段
- 程序段
1.3 什么是线程?
- Thread,进程的轻型实体,也叫“轻量级进程”,是一系列活动按事先设定好的顺序依次执行的过程,是一系列指令的集合
- 是一条执行路径,不能单独存在,必须包含在进程中(故进程与线程是包含关系,举例:360杀毒软件是一个进程,但是它可以同时杀毒、清理垃圾、查杀木马,这些都是线程)
- 线程是OS中运算调度的最小单位(对比:进程Process是OS资源分配和调度的单位)
1.3.1 为什么引入线程?
- 提高OS的并发性
1.3.2 线程的属性
- 轻型实体
- 独立调度和分派的基本单位
- 可并发执行
- 共享进程资源
1.3.3 进程与线程的区别
- 调度:
- 线程调度开销远低于进程
- 同一进程内的线程之间的切换不会引起进程切换
- 拥有资源:
- 线程不拥有资源,进程才拥有。
- 但线程可访问隶属进程的资源,要知道若线程也拥有系统资源,则调度开销会很大
- 并发性:进程能并发,线程也能并发,提高OS利用率和吞吐量
- 系统开销:
- 线程只需保存少量寄存器等必需资源
- 地址空间和其他资源
- 独立的地址空间和资源
- 通信
1.3.4 线程的实现方式
- 用户级线程(ULT)
- 内核级线程(KLT)
几句话总结区别:
①操作环境不同,意味着是否可以跨平台、切换模式开销等
②能否运用多处理机的优势,用户态不行,内核态可以
2. 进程是怎么运行的?
2.1 进程的状态
- 就绪
- 执行
- 阻塞:block
- 创建:create
- 终止:destory
2.2 进程控制
即OS对进程实现有效的管理,包括创建新进程、撤销已有进程、挂起、阻塞和唤醒、进程切换等。OS通过原语(Primitive)操作实现进程控制。
- 原语:由若干指令组成,完成特定的功能,是一种原子操作
- 原语特点:
- 原子操作,过程不会被中断
- 在管态/系统态/内核态执行,常驻内存
- 是内核三大支撑功能(中断处理、时钟管理、原语操作)之一
挂起和激活:为了系统和用户观察和分析进程
- 挂起:suspend,放外存,不调度
- 激活:active,等待调度
2.3 进程调度
根据一定算法和原则将处理及资源进行重新分配的过程
- 前提:作业/进程数远远大于处理机数
- 目的:提高资源利用率,减少处理机器空闲时间
- 调度程序:满足特定用户需求(快速响应),考虑整体系统效率(系统平均周转时间),算法本身开销
2.3.1 处理机调度:调度的层次
- 高级调度/作业调度
- 把后备作业调入内存
- 中级调度/内存调度
- 把进程调至外存,合适时再调入内存
- 在内外存兑换区进行进程对换
- 低级调度/进程调度
- 从就绪队列选取进程分配给处理机
- 最基本的调度,频率非常高(一个时间片)
2.3.2 调度算法指标
- CPU利用率
- 系统吞吐量
- 周转时间:作业完成时间-提交时间
- 带权周转时间:周转时间/实际运行时间
- 等待时间:作业等待处理机调度的时间
- 要关注平均值,考虑所有进程
- 响应时间:提交请求到首次响应间隔
2.3.3 调度算法:(这里需要做题加强理解,而不是死记硬背)
多级反馈队列调度:
①设置多个按优先级排序的就绪队列
②优先级从高到低,时间片从小到大
③新进程采用队列降级法:进入第一级队列,按FCFS分时间片,若没有执行完,移动到第二级、第三级
④前面队列不为空,不执行后续队列进程
3. 进程之间如何协作?
3.1 进程通信:进程之间的信息交换(共享存储、消息传递、管道通信)
各进程内存空间独立,不能随意互相访问
消息传递与共享存储区别在于原语:
管道: 用于连接读/写进程的共享文件,pipe文件,本质是内存中固定大小的缓冲区
半双工通信:同一时段只能单向通信,双工通信需要两个管道,以先进先出方式组织数据传输,通过系统调用read()/write()函数进行读写操作
3.2 进程同步:进程间相互制约的关系(互斥、同步),使得按照预期的方式执行(软件、硬件实现方式)
互斥的访问临界资源:核心——锁🔒
- 进入区:尝试进入临界区,成功则加锁
- 临界区:访问共享资源
- 退出区:解锁,唤醒其他阻塞进程
- 剩余区:其他代码
3.2.1 实现临界区互斥:软件实现方法(皮特森算法)
①单标志法:违背”空闲让进“,而且只能存在于两个进程交替执行的情况中
②双标志法先检查:违背”忙则等待”,
③双标志法后检查:违背“空闲让进”、“有限等待”
④ 皮特森算法:违背“让全等待”、会发生“忙等”
3.2.2 实现临界区互斥:硬件实现方法(关中断/开中断、Test-And-Set、Swap指令)
3.2.3 信号量机制:整形信号量
P(wait原语,进程等待) & V(signal原语,唤醒等待进程)操作
整形信号量:
3.2.4 信号量机制:记录型信号量
3.2.5 管程(Monitor,监视器):
“管理进程”,即用于实现进程同步的工具。是由代表共享资源的数据结构和一组过程(进行PV操作的函数)组成的管理程序(封装)
4 如何处理死锁?
4.1 死锁的概念
多个进程由于竞争资源而造成的阻塞现象,若无外力作用,这些进程将无法继续推进。
4.2 死锁产生的原因:资源竞争、进程推进顺序非法
4.3 死锁产生的必要条件:互斥、不剥夺不可抢占、请求并保持、循环等待
请求并保持:保持当前资源是请求另一个资源(一个进程需要多个资源)
4.4 死锁的预防:破坏以上4个必要条件
- 将只能互斥访问的资源改为同时共享访问
- 请求新资源但得不到满足,必须释放已经保持的资源,但会增大开销,造成之前工作的失效
- 不再提出其他资源请求
- 对所有资源排序,按序号请求资源
4.5 死锁避免:系统安全状态、银行家算法(做点题去理解,别死记硬背)
4.6 死锁的检测与解除
- 死锁检测:
- 需要一种数据结构,保存相关资源的请求和分配信息
- 一种算法,利用这些信息检测是否形成死锁
资源分配图:
死锁定理:当且仅当此状态下的资源分配图是不可完全简化的,其过程类似于“拓扑排序”算法。(注意数据结构考察)
- 死锁解除:资源剥夺、撤销进程、进程回退