操作系统 (2)进程

操作系统的进程管理与进程通信功能。

进程管理

  • 进程:程序的一次动态执行过程,是程序处在一个执行环境中在一个数据集上的执行过程,系统资源分配和调度的可并发执行单位

    • 进程映像:

      • PCB(基本块+扩充块)
      • 共享正文段:程序+不可修改的常数
      • 数据区:执行时需要的数据,外部变量+静态变量
      • 工作区:传递参数、返回地址、保护现场;核心栈+用户栈
    • 执行,就绪,阻塞
      image-20201104193930903

  • 队列的形式管理PCB,分为执行队列、就绪队列、多个阻塞队列

  • 调度

    • 高级调度:输入池哪个作业调入主系统,形成一个或一组就绪的进程
    • 中级调度:交换区的就绪进程进入内存
    • 低级调度(进程调度):内存的就绪进程占用CPU
    • 进程调度策略:
      • 先来先服务调度
      • 时间片轮转:每次选择队首的就绪进程,运行一段“时间片”的固定时间间隔
      • 优先级调度
      • 多级反馈队列调度:不同队列优先级不同,优先级高的队列分配到短时间片。未完成则降低优先级排到下一级别队尾,高优先级队列进程可抢占处理机
    • UNIX调度:
      • 计算动态优先数,小的优先级高
      • 核心态进程优先数对调度不起作用,只有在进入睡眠状态时才根据等待事件分配优先数
      • 切换时机:
        • 主动:
          • 完成任务
          • 等待资源
          • 因其他进程同步/互斥
        • 被动:中断或陷入处理的末尾
          • 被唤醒的睡眠进程有更高优先级
          • 系统调用返回用户态时,进程的优先级下降
          • 时钟中断程序对优先级过小的进程重新计算优先数
      • 切换操作:保存现场,选择优先级最高进程,恢复现场
    • 中级调度:
      • 换入:
        • 依据就绪进程在外存驻留时间从长到短换入内存,直到内存无任何空闲区
      • 换出:
        • 部分映像已经换出的进程从内存完全换出
        • 睡眠进程换出
        • 内存驻留时间最长的进程换出
      • 换入为主动,换出为被动
  • 睡眠与唤醒

    • 系统调用sleep()进入睡眠状态,根据睡眠原因划分队列
    • 根据睡眠原因得到阻塞对列,全部唤醒,排入就绪队列,竞争处理机
  • 进程终止:系统调用exit(),关闭所有文件,释放空间,只保留基本的PCB

  • 创建与映像改换:

    • 创建:fork()
      image-20201104195624947
    • 映像改换:父子进程的映像基本一致,但父进程执行过的内容对子进程没有意义。系统调用exec()
  • 线程:CPU的最小调度单位

    • 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据
    • 多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈
    • 各个线程切换开销小
    • 内核级线程:
      • 线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程
      • 在全系统内进行资源的竞争
      • 每一个内核支持线程设置了一个线程控制块(TCB)
      • 切换线程时需要进入核心态
    • 用户级线程:
      • 仅存在于用户空间
      • 内核并不能看到用户线程
      • 用户线程只能在进程内进行资源竞争

进程通信

  • 临界资源:一段时间内只允许一个进程访问的资源;对应的访问程序段为临界段

    • 锁的关闭包括测试和关闭两个步骤——中断可能导致临界资源的控制失败
    • 安全控制方法:
      • 交换指令:设置测试单元并赋值为1,将测试单元和锁变量交换——先将锁关闭——然后查看锁变量
      • 禁止中断
      • 测试时禁止中断,设置锁之后开启中断
  • 信号量

    • semWait:减小信号量的值,如果结果为负数,则执行此操作的进程阻塞

    • semSignal:增大信号量的值,如果结果大于等于0,则对应的阻塞进程解除阻塞

    • 互斥:
      image-20201104201140985

    • 同步:

      • 单方同步
        image-20201104201251640
      • 两个进程同步(以计算并存储、取出并打印为例)
        image-20201104201359772
      • 生产者与消费者问题
      • 读者与写者问题
  • 数据通信

    • 消息通信
      • 向系统申请一个缓冲区
      • 填写消息正文与控制信息
      • 通过消息通信机构送到接收进程的消息队列
      • 接收进程从消息队列中移出消息
    • 共享存储区
      • 将内存的一个区域连入多个进程的虚拟地址空间
      • 核心按进程提供的关键字查照共享存储区段表,有则返回,无则建立一个共享段并在段表中填入共享段的信息
    • 管道通信
      • 先进先出组织数据传输
      • 以流的形式将数据写入管道,以相同的顺序读出管道中的信息
  • 软中断

    • 信号
      • 由事件引起,可在进程之间传送,通知进程发生了异常事件,需要执行相应动作
      • 信号无优先级,中断有优先级;中断处理程序在核心态运行,信号处理程序可在用户态运行;中断响应及时,信号响应需要进程在执行中的几个时机询问
      • 信号存入PCB的相应字段
      • 只有当进程从核心态返回到用户态(系统调用、中断返回时、陷入返回时)才检查相应字段是否被设置
    • 子进程继承父进程所有信号处理方式;信号处理程序入口在一个PCB扩充块的数组中
      • 设置新的处理方式 :系统调用signal()
      • 进程之间传递信号:系统调用kill()
  • 死锁

    • 产生原因
      • 互斥执行:其他申请资源的进程被阻塞
      • 保持并等待:进程等待分配资源时,保持占有已分配的资源
      • 不可剥夺:不能强迫移除进程占有的资源
      • 循环等待:存在一个闭合的进程资源链
    • 预防
      • 进程一次性申请需要的所有资源
      • 进程不能进一步获得资源时,必须释放原有的占用资源
      • 资源有序使用,进程只能申请资源顺序表中排在已分配到资源后面的资源类型
    • 银行家算法
      • 系统保证申请者在有限时间中能获得所需的全部资源;保证至少有一个进程能得到所需的全部资源时,才进行资源分配
      • 安全状态:
        image-20201104203024272
      • 不安全状态:
        image-20201104203014873
    • 撤销死锁
      • 强迫撤销所有死锁进程
      • 回退到一些过去的“检查点”
      • 逐个撤销死锁进程,直到死锁不存在
      • 逐个剥夺进程占用的资源,直到死锁不存在