3473 字
17 分钟
操作系统基础1205

1205复习#

思维导图

3.6 进程有哪些调度算法#

  • 为什么要进程调度?

    • CPU个数有限,为了有效的 分配和管理 CPU资源

      • 来优化性能、提高效率、确保公平、满足用户和应用程序的需求

抢占:强制剥夺CPU,只有在新来进程时才会发生,已经在就绪队列中的不会抢占

非抢占:进程主动释放CPU后下一个进程才能使用CPU

  • 进程调度:确定 某一时刻 CPU运行哪个进程

  • 常见的进程调度算法有:

    • 先来先服务

    • 短作业优先

    • 最短剩余时间优先

    • 时间片轮转

    • 优先级调度

    • 高响应比优先

FCFS先来先服务算法(First Come Frist Serve)#

  1. 算法思想:从公平角度(类似排队)

  2. 算法规则:按进程==到达==的 先后顺序 进行服务

  3. 是否可抢占:==非抢占式==算法

  4. 优缺点:

    • 优点:公平、算法实现简单

    • 缺点:排在长作业后的短作业 需要等待很长时间(带权周转时间大)

    • 利于==长作业==,不利于==短作业==

      • 因为短作业要 等前面的长作业执行完 才能执行

      • 而长作业执行时间长,导致短作业等待时间过长

    • 不利于==I/O密集型进程==

      • 这种进程 每次I/O操作后 又得重新排队

        • 当得到CPU资源后,如果IO事件没有发生,会主动释放CPU,重新排队
  5. 是否会导致饥饿?

    • 不会

      • 因为已经排好顺序了,等待前面进程结束后一定会得到CPU资源

饥饿:通俗理解就是进程长时间得不到资源,如果永远得不到就叫饿死

SJF短作业优先(Shortest Job First)#

  1. 算法思想: 追求:

    • 最小平均等待时间

    • 最小平均周转时间

    • 最小平均带权周转时间

  2. 算法规则:==要求服务时间最短==的进程优先

  3. 是否可抢占:==非抢占式==

  4. 优缺点:

    • 优点:

      • “最小化”平均等待时间

      • “最小化”平均周转时间

    • 缺点:

      • 不公平

      • 对长作业不利

      • 可能产生饥饿

        • 长作业可能会饿死

          • 处于 一直等待短作业执行完毕 的状态
          • 如果一直有短作业到来,长作业永远得不到调度
  5. 是否会导致饥饿:可能产生饥饿

    • 如果一直有短作业进来,长作业长时间得不到服务

SRTN最短剩余时间优先算法(Shortest Remaining Time Next)#

是抢占版的短作业优先

  1. 算法思想: 追求:

    • 最小平均等待时间
    • 最小平均周转时间
  2. 算法规则:==剩余时间==最短的优先

  3. 是否可抢占:可抢占式

  4. 优缺点:

    • 优点:

      • “最小化”平均等待时间

      • “最小化”平均周转时间

      • 高效利用CPU

        • 倾向于优先执行剩余时间短的作业,更好的利用CPU
    • 缺点:

      • 预测性差
  5. 是否会产生饥饿:可能产生饥饿

    • 如果一直有短作业进来,长作业还是会长时间得不到服务
  • 当一个进程被放入就绪队列时,调度器会计算该进程的预计执行时间,并将其插入到就绪队列中

    • 然后从就绪队列中选一个剩余执行时间最短的进程来执行
    • 如果新进程的剩余执行时间比当前进程更短,则当前进程被抢占,然后把这个进程插入到就绪队列的合适位置
  • 每当有进程加入 就绪队列改变时,需要调度

    • 如果,新到达的进程 剩余时间 比当前运行的进程剩余时间 更短,新进程就==抢占==处理机,当前进程回到==就绪队列==

HRRN高响应比优先(Highest Response Ratio Next)#

  1. 算法思想:==综合==考虑 进程的 ==等待时间==和==要求服务时间==

  2. 算法规则:

    • 每次调度时,先计算各进程的响应比
      • 响应比=(等待时间+要求服务时间)/要求服务时间
    • 然后选响应比最高的进程为其服务
  3. 是否可抢占:非抢占式算法

    • 因此 只有当前运行的进程 主动放弃处理机时,才需要调度,才需要计算响应比
  4. 优缺点

    • 优点:

      • 综合考虑了 ==等待时间==和==运行时间==(要求服务时间)
      • 等待时间相同时,要求服务时间短的优先(SJF的优点)
      • 要求服务时间相同时,等待时间长的优先(FCFS的优点)
      • 对长作业来说,等待时间越久,响应比越大,从而避免长作业饥饿问题
    • 缺点:

      • 响应比计算开销
        • 每次调度时都需要计算各进程的响应比,会增加系统的计算开销
        • 不适用于实时系统
          • HRRN要根据==等待时间==和==服务时间==来确定优先级
          • 而实时系统的任务 必须在规定时间内完成,并且按预期时间 响应外部事件
  5. 是否会导致饥饿:

    • 不会

优先级调度算法(Priority Scheduling)#

  1. 算法思想:只考虑任务的紧急程度

  2. 算法规则:选择优先级最高的进程为其服务

  3. 是否可抢占:两个都有

    • 非抢占式:进程 主动放弃处理机时 进行调度

    • 抢占式:不止进程主动放弃处理机时进行调度,还要在来新进程时进行调度,检查是否会发生抢占

  4. 优缺点:

    • 优点:

      • 用优先级区分==紧急程度==、==重要程度==,适用于==实时操作系统==
      • 可灵活的调整对各进程的==偏好程度==
    • 缺点:如果一直有高优先级进程来,可能会导致饥饿

  5. 是否会导致饥饿:会

  • 就绪队列未必只有一个,可以按照不同优先级来组织

  • 另外,也可以把优先级高的进程排在更靠近队头的位置

  • 根据优先级是否可以动态改变,可以将优先级分为:

    • 静态优先级:创建进程时确定,之后一直不变
    • 动态优先级:创建进程时有一个==初始值==,之后根据情况动态调整优先级
  • 优先级设定:

    • 系统进程 优先级 高于 用户进程

    • 前台进程 优先级 高于 后台进程

    • 操作系统更偏好 I/O密集型进程

      • I/O设备和CPU可以并行工作(I/O进行操作时,CPU去处理别的工作)
        • 如果优先让I/O密集型任务先工作,更有可能让I/O设备尽早投入工作,提高资源利用率和系统吞吐量
        • I/O密集型对应计算密集型
    • 采用动态优先级,什么时候应该调整?

      (可以从追求公平、提升资源利用率等角度考虑)

      • 如果某进程在就绪队列中等待了很长时间,可以适当提升优先级
      • 如果某进程占用处理机运行了很长时间,可以适当的降低优先级
      • 如果某进程频繁的进行I/O操作,可以适当的提高优先级

RR时间片轮转(Round-Robin)#

  1. 算法思想:
    • 公平、轮流的为各进程服务,让每个进程在一定时间间隔内都可以得到响应
  2. 算法规则:
    • 按进程到达就绪队列的顺序,所有进程各执行一个时间片
    • 如果进程在一个时间片内没执行完,则==剥夺处理机==,将进程放到就绪队列末尾重新排队
  3. 是否抢占:抢占式算法
    • 不是==主动释放==处理机而是到时间后==被剥夺==处理机,所以是==抢占式==
  4. 优缺点:
    • 优点:
      • 公平
      • 响应快
      • 适用于==分时操作系统==
    • 缺点:
      • ==高频率==的进程切换,有一定的==开销==
      • 不区分任务的==紧急程度==
  5. 是否会导致饥饿:不会
  • 短作业效应:

    • 对短作业,时间片轮转可以提供快速响应

    • 对长作业,会花费更多时间在上下文切换上

3.7 进程间通信有哪些方式#

管道#

有两种管道:都是服务于本机的进程

  • 匿名管道:

    • 单向的

    • 基于字节流的(源源不断的)

    • 有亲缘关系的进程

  • 命名管道:

    • 双向的
    • 基于消息的
    • 可以实现本机==任意两个==进程通信

信号#

  • 程序崩溃时(访问越界等),操作系统会通过信号掐死这个进程

  • 通知某个进程 某个事件发生了,不会携带大量消息

消息队列#

  • 保存在==内核==中的==消息链表==

共享内存#

  • 机制:拿出一块==虚拟地址空间==,==映射==到==相同的物理内存==中
  • 最==高效==的进程间通信方式

信号量#

  • 本质是一个==整数计数器==
  • 用来控制 多个进程 对共享资源的 访问
  • 常作为一种==锁==机制,防止某进程正在访问共享资源时,其他进程也访问该资源
  • 因此,主要作为==进程间==以及==同一进程的不同线程之间==的同步手段
  • 信号量==表示资源的数量==,控制信号量的方式有两种原子操作:
    • P操作:信号量减一
      • 减一后如果信号量<0,说明资源已被占用,进程需要阻塞等待
      • 减一后如果信号量>=0,说明还有资源可用,进程可以继续执行
    • V操作:信号量加一
      • 加一后如果信号量<=0,说明有阻塞中的进程,就将该进程唤醒
      • 加一后如果信号量>0,说明没有阻塞中的进程
  • P操作用在进入共享内存之前,V操作用在离开共享内存之后,这两个操作必须成对出现

Socket#

  • 可用于==不同主机==之间的进程通信

不同通信方式的优缺点#

  • 管道:

    • 优点:基于字节流,简单

    • 缺点:效率低,容量有限

  • 消息队列:

    • 优点:基于消息
    • 缺点:消息大小固定
  • 共享内存:

    • 优点:
      • 很容易控制容量
      • 速度快
    • 缺点:
      • 需要注意==不同进程间==的==同步==
  • 信号量:

  • Socket:

    • 有本地套接字,也可以在不同机器的进程间通信

3.8 进程和线程的联系和区别#

  • 重点,常识性知识,必会

  • 区别:

  1. 调度:线程作为处理器调度和分配的基本单位,而进程是作为拥有资源的基本单位

  2. 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行

  3. 拥有资源:进程是拥有资源的一个独立单位,有自己独立的地址空间;线程不拥有系统资源,但可以访问隶属于进程的资源,共享进程的地址空间.

  4. 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

  5. 线程是指进程内的一个执行单元,也是进程内的可调度实体。一个程序至少有一个进程,一个进程至少有一个线程,一个线程只属于一个进程.

  6. 线程在执行过程中,需要协作同步。不同进程的线程间要利用==消息通信==的办法实现同步。

  7. 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间, 一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

  • 栈不会共享

    • 内核栈
  • 线程因为共享需要同步

3.9 线程上下文切换了解吗#

  • 线程不属于同一进程,进行上下文切换时与进程相似
  • 线程属于同一进程,在进行上下文切换时的开销远小于进程

3.10 线程间如何同步#

  • 锁:

    区分是否忙等待:是否占用CPU

    • 忙等待锁:自旋锁

    • 无忙等待锁:互斥锁

  • 信号量

3.12 什么是死锁#

  • 必会,四个必要条件

  • 多个进程或线程,因为争夺资源而相互等待,永远无法推进下去

3.13 死锁产生有哪些条件#

  • 互斥

  • 持有和等待

  • 不可剥夺

  • 环路等待

3.14 如何避免死锁#

  • 消除其中之一就不会死锁

  • 消除互斥:

  • 消除持有和等待:要么全部持有,要么释放所有资源

  • 消除不可剥夺:

  • 消除环路等待:给资源按顺序编号,然后按顺序逐个获取

  • 怎么解决死锁:(解决的是已经发生,避免是没有发生)

    • 解决方法:

      • 杀死部分或全部线程

      • 回滚

3.15 活锁和饥饿锁了解吗#

  • 饥饿锁:资源饥饿,某个线程一直等不到它需要的资源,从而无法推进下去

  • 活锁:一起释放资源,线程也不能向下推进,但是活锁有可能自己解决

    • 活锁危害更大,释放资源占用CPU
操作系统基础1205
https://fuwari.cbba.top/posts/操作系统基础1205/
作者
Chen_Feng
发布于
2023-12-05
许可协议
CC BY-NC-SA 4.0