1205复习
3.6 进程有哪些调度算法
-
为什么要进程调度?
-
CPU个数有限,为了有效的 分配和管理 CPU资源
- 来优化性能、提高效率、确保公平、满足用户和应用程序的需求
-
抢占:强制剥夺CPU,只有在新来进程时才会发生,已经在就绪队列中的不会抢占
非抢占:进程主动释放CPU后下一个进程才能使用CPU
-
进程调度:确定 某一时刻 CPU运行哪个进程
-
常见的进程调度算法有:
-
先来先服务
-
短作业优先
-
最短剩余时间优先
-
时间片轮转
-
优先级调度
-
高响应比优先
-
FCFS先来先服务算法(First Come Frist Serve)
-
算法思想:从公平角度(类似排队)
-
算法规则:按进程==到达==的 先后顺序 进行服务
-
是否可抢占:==非抢占式==算法
-
优缺点:
-
优点:公平、算法实现简单
-
缺点:排在长作业后的短作业 需要等待很长时间(带权周转时间大)
-
利于==长作业==,不利于==短作业==
-
因为短作业要 等前面的长作业执行完 才能执行
-
而长作业执行时间长,导致短作业等待时间过长
-
-
不利于==I/O密集型进程==
-
这种进程 每次I/O操作后 又得重新排队
- 当得到CPU资源后,如果IO事件没有发生,会主动释放CPU,重新排队
-
-
-
是否会导致饥饿?
-
不会
- 因为已经排好顺序了,等待前面进程结束后一定会得到CPU资源
-
饥饿:通俗理解就是进程长时间得不到资源,如果永远得不到就叫饿死
SJF短作业优先(Shortest Job First)
-
算法思想: 追求:
-
最小平均等待时间
-
最小平均周转时间
-
最小平均带权周转时间
-
-
算法规则:==要求服务时间最短==的进程优先
-
是否可抢占:==非抢占式==
-
优缺点:
-
优点:
-
“最小化”平均等待时间
-
“最小化”平均周转时间
-
-
缺点:
-
不公平
-
对长作业不利
-
可能产生饥饿
-
长作业可能会饿死
- 处于 一直等待短作业执行完毕 的状态
- 如果一直有短作业到来,长作业永远得不到调度
-
-
-
-
是否会导致饥饿:可能产生饥饿
- 如果一直有短作业进来,长作业长时间得不到服务
SRTN最短剩余时间优先算法(Shortest Remaining Time Next)
是抢占版的短作业优先
-
算法思想: 追求:
- 最小平均等待时间
- 最小平均周转时间
-
算法规则:==剩余时间==最短的优先
-
是否可抢占:可抢占式
-
优缺点:
-
优点:
-
“最小化”平均等待时间
-
“最小化”平均周转时间
-
高效利用CPU
- 倾向于优先执行剩余时间短的作业,更好的利用CPU
-
-
缺点:
- 预测性差
-
-
是否会产生饥饿:可能产生饥饿
- 如果一直有短作业进来,长作业还是会长时间得不到服务
-
当一个进程被放入就绪队列时,调度器会计算该进程的预计执行时间,并将其插入到就绪队列中
- 然后从就绪队列中选一个剩余执行时间最短的进程来执行
- 如果新进程的剩余执行时间比当前进程更短,则当前进程被抢占,然后把这个进程插入到就绪队列的合适位置
-
每当有进程加入 就绪队列改变时,需要调度
- 如果,新到达的进程 剩余时间 比当前运行的进程剩余时间 更短,新进程就==抢占==处理机,当前进程回到==就绪队列==
HRRN高响应比优先(Highest Response Ratio Next)
-
算法思想:==综合==考虑 进程的 ==等待时间==和==要求服务时间==
-
算法规则:
- 每次调度时,先计算各进程的响应比
- 响应比=(等待时间+要求服务时间)/要求服务时间
- 然后选响应比最高的进程为其服务
- 每次调度时,先计算各进程的响应比
-
是否可抢占:非抢占式算法
- 因此 只有当前运行的进程 主动放弃处理机时,才需要调度,才需要计算响应比
-
优缺点
-
优点:
- 综合考虑了 ==等待时间==和==运行时间==(要求服务时间)
- 等待时间相同时,要求服务时间短的优先(SJF的优点)
- 要求服务时间相同时,等待时间长的优先(FCFS的优点)
- 对长作业来说,等待时间越久,响应比越大,从而避免长作业饥饿问题
-
缺点:
- 响应比计算开销
- 每次调度时都需要计算各进程的响应比,会增加系统的计算开销
- 不适用于实时系统
- HRRN要根据==等待时间==和==服务时间==来确定优先级
- 而实时系统的任务 必须在规定时间内完成,并且按预期时间 响应外部事件
- 响应比计算开销
-
-
是否会导致饥饿:
- 不会
优先级调度算法(Priority Scheduling)
-
算法思想:只考虑任务的紧急程度
-
算法规则:选择优先级最高的进程为其服务
-
是否可抢占:两个都有
-
非抢占式:进程 主动放弃处理机时 进行调度
-
抢占式:不止进程主动放弃处理机时进行调度,还要在来新进程时进行调度,检查是否会发生抢占
-
-
优缺点:
-
优点:
- 用优先级区分==紧急程度==、==重要程度==,适用于==实时操作系统==
- 可灵活的调整对各进程的==偏好程度==
-
缺点:如果一直有高优先级进程来,可能会导致饥饿
-
-
是否会导致饥饿:会
-
就绪队列未必只有一个,可以按照不同优先级来组织
-
另外,也可以把优先级高的进程排在更靠近队头的位置
-
根据优先级是否可以动态改变,可以将优先级分为:
- 静态优先级:创建进程时确定,之后一直不变
- 动态优先级:创建进程时有一个==初始值==,之后根据情况动态调整优先级
-
优先级设定:
-
系统进程 优先级 高于 用户进程
-
前台进程 优先级 高于 后台进程
-
操作系统更偏好 I/O密集型进程
- I/O设备和CPU可以并行工作(I/O进行操作时,CPU去处理别的工作)
- 如果优先让I/O密集型任务先工作,更有可能让I/O设备尽早投入工作,提高资源利用率和系统吞吐量
- I/O密集型对应计算密集型
- I/O设备和CPU可以并行工作(I/O进行操作时,CPU去处理别的工作)
-
采用动态优先级,什么时候应该调整?
(可以从追求公平、提升资源利用率等角度考虑)
- 如果某进程在就绪队列中等待了很长时间,可以适当提升优先级
- 如果某进程占用处理机运行了很长时间,可以适当的降低优先级
- 如果某进程频繁的进行I/O操作,可以适当的提高优先级
-
RR时间片轮转(Round-Robin)
- 算法思想:
- 公平、轮流的为各进程服务,让每个进程在一定时间间隔内都可以得到响应
- 算法规则:
- 按进程到达就绪队列的顺序,所有进程各执行一个时间片
- 如果进程在一个时间片内没执行完,则==剥夺处理机==,将进程放到就绪队列末尾重新排队
- 是否抢占:抢占式算法
- 不是==主动释放==处理机而是到时间后==被剥夺==处理机,所以是==抢占式==
- 优缺点:
- 优点:
- 公平
- 响应快
- 适用于==分时操作系统==
- 缺点:
- ==高频率==的进程切换,有一定的==开销==
- 不区分任务的==紧急程度==
- 优点:
- 是否会导致饥饿:不会
-
短作业效应:
-
对短作业,时间片轮转可以提供快速响应
-
对长作业,会花费更多时间在上下文切换上
-
3.7 进程间通信有哪些方式
管道
有两种管道:都是服务于本机的进程
-
匿名管道:
-
单向的
-
基于字节流的(源源不断的)
-
有亲缘关系的进程
-
-
命名管道:
- 双向的
- 基于消息的
- 可以实现本机==任意两个==进程通信
信号
-
程序崩溃时(访问越界等),操作系统会通过信号掐死这个进程
-
通知某个进程 某个事件发生了,不会携带大量消息
消息队列
- 保存在==内核==中的==消息链表==
共享内存
- 机制:拿出一块==虚拟地址空间==,==映射==到==相同的物理内存==中
- 最==高效==的进程间通信方式
信号量
- 本质是一个==整数计数器==
- 用来控制 多个进程 对共享资源的 访问
- 常作为一种==锁==机制,防止某进程正在访问共享资源时,其他进程也访问该资源
- 因此,主要作为==进程间==以及==同一进程的不同线程之间==的同步手段
- 信号量==表示资源的数量==,控制信号量的方式有两种原子操作:
- P操作:信号量减一
- 减一后如果信号量<0,说明资源已被占用,进程需要阻塞等待
- 减一后如果信号量>=0,说明还有资源可用,进程可以继续执行
- V操作:信号量加一
- 加一后如果信号量<=0,说明有阻塞中的进程,就将该进程唤醒
- 加一后如果信号量>0,说明没有阻塞中的进程
- P操作:信号量减一
- P操作用在进入共享内存之前,V操作用在离开共享内存之后,这两个操作必须成对出现
Socket
- 可用于==不同主机==之间的进程通信
不同通信方式的优缺点
-
管道:
-
优点:基于字节流,简单
-
缺点:效率低,容量有限
-
-
消息队列:
- 优点:基于消息
- 缺点:消息大小固定
-
共享内存:
- 优点:
- 很容易控制容量
- 速度快
- 缺点:
- 需要注意==不同进程间==的==同步==
- 优点:
-
信号量:
-
Socket:
- 有本地套接字,也可以在不同机器的进程间通信
3.8 进程和线程的联系和区别
-
重点,常识性知识,必会
-
区别:
-
调度:线程作为处理器调度和分配的基本单位,而进程是作为拥有资源的基本单位
-
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行
-
拥有资源:进程是拥有资源的一个独立单位,有自己独立的地址空间;线程不拥有系统资源,但可以访问隶属于进程的资源,共享进程的地址空间.
-
系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
-
线程是指进程内的一个执行单元,也是进程内的可调度实体。一个程序至少有一个进程,一个进程至少有一个线程,一个线程只属于一个进程.
-
线程在执行过程中,需要协作同步。不同进程的线程间要利用==消息通信==的办法实现同步。
-
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间, 一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
-
栈不会共享
- 内核栈
-
线程因为共享需要同步
3.9 线程上下文切换了解吗
- 线程不属于同一进程,进行上下文切换时与进程相似
- 线程属于同一进程,在进行上下文切换时的开销远小于进程
3.10 线程间如何同步
-
锁:
区分是否忙等待:是否占用CPU
-
忙等待锁:自旋锁
-
无忙等待锁:互斥锁
-
-
信号量
3.12 什么是死锁
-
必会,四个必要条件
-
多个进程或线程,因为争夺资源而相互等待,永远无法推进下去
3.13 死锁产生有哪些条件
-
互斥
-
持有和等待
-
不可剥夺
-
环路等待
3.14 如何避免死锁
-
消除其中之一就不会死锁
-
消除互斥:
-
消除持有和等待:要么全部持有,要么释放所有资源
-
消除不可剥夺:
-
消除环路等待:给资源按顺序编号,然后按顺序逐个获取
-
怎么解决死锁:(解决的是已经发生,避免是没有发生)
-
解决方法:
-
杀死部分或全部线程
-
回滚
-
-
3.15 活锁和饥饿锁了解吗
-
饥饿锁:资源饥饿,某个线程一直等不到它需要的资源,从而无法推进下去
-
活锁:一起释放资源,线程也不能向下推进,但是活锁有可能自己解决
- 活锁危害更大,释放资源占用CPU