操作系统 第三章

重难点:
  进程、进程控制、进程同步、进程通信

系统的工作流程

  • 处理器执行程序的方式称为系统工作方式(工作流程),基本工作流程有顺序执行和并发执行
      

  • 顺序执行的工作方式及特征

    • 顺序执行指:
      • 处理器在开始执行一道程序后,只有在这道程序运行结束(程序指令运行完成,或程序运行过程出现错误而无法继续运行),才能开始执行下一道程序。
      • 这种工作流程的外在表现就是单任务。DOS 操作系统采用该方式
      • 特征:封闭性(运行中程序不受其他程序的影响),可再现性(初始条件相同,不同时间多次运行,得到的结果相同)
        因此,在顺序执行的工作方式下,处理器不需要额外控制就可以保证程序正确的执行
          
  • 并发执行的工作方式

    • 并发执行是指:
      • 在多道程序设计环境下,处理器在开始执行一道程序的第 1 条指令后,在这道程序完成之前,处理器可以开始执行下一道程序,同样地,更多其他的程序也可以开始运行。即处理器在执行一道程序的两条指令之间,可以执行其他程序的指令。
    • 这种工作流程的外在表现就是多任务。
    • 特征:并发执行可以发挥硬件的并行(本课程并行指处理器与设备或设备与设备之间的并行工作)能力,为任务协作提供可能,但并发执行具有复杂性:
      • 随机性/不确定的:哪一道程序先运行,运行的时间都是随机的,任意的。为操作系统管理提供可能。
        Tip:并发执行方式包含了顺序执行方式
      • 不可再现性:程序丢失了可再现性
      • 相互制约:例如一道程序使用一些资源时,会影响其他程序对同样资源的使用;进程死锁

      

    • 并发执行的理解
      • 宏观:多道程序 “同时” 在运行,表现为多任务。 因为一道程序开始后,在它完成前,它是处于运行之中,这时另外的程序也可以开始运行,也在运行中,所以多道程序同时都在运行中
      • 微观:多道程序又是轮流交替地在处理器上执行。 由于只有一个处理器(本课程均只考虑单处理器),而一个处理器任何时刻至多只能执行一条指令,这条指令只能属于一道程序,所以在微观上任何时刻至多只有一道程序真正在运行中。
          

进程概述

  • 定义
    • 一道程序在一个数据集上的一次执行过程,称为一个进程(Process)
        
  • 主要特征
    • 动态性:每个进程都有生命期,即从创建、运行到消亡的过程。进程与程序的根本区别在于进程是动态的,而进程是静态的
    • 并发性:多个进程可以并发执行
    • 独立性:具体表现在进程是操作系统分配资源的基本单位,一个进程的程序和数据只能由该进程本身访问(即进程的地址空间是私有的)。进程的独立性要求并发进程间,在同一个处理器上运行时,各自都能正确地完成程序所规定的功能
    • 结构性:各个进程有相同的属性,操作系统定义一个相对固定的格式(就是一个数据结构),用来表示一个进程,它就是进程控制块 PCB
    • 异步性:进程的创建无需同步(不需要等进程结束再创建新进程),要求操作系统能在一个进程完成之前,随时创建一个或多个新的进程
        
  • 动态性的进一步讨论
    • 进程的基本状态
      • 一个进程在它生命期内的任一时刻,一定处在某一个状态且只能在一个状态上
      • 运行/执行(Running):处理器当前执行的指令正是该进程对应的程序代码;即进程正在占用 CPU,或 CPU 分配给进程
      • 就绪(Ready):当前不在运行状态,但只要把 CPU 分配给该进程,它就可以立即运行。该状态下的进程已经得到除处理器外的所有资源,只缺 CPU 了
      • 阻塞/等待(Blocked):当前不在运行状态,即使把 CPU 分配给该进程,它也不能立即运行。为什么有这样的进程呢?见书 P43
    • 进程的状态转换
      Tip:通常,新创建的进程为就绪态;每个进程在生命期内,不一定三个状态都经历

  

  • 进程与程序的联系与区别
    • 联系
      • 进程是程序的运行过程,因此进程包含了程序
      • 进程的运行就是对应程序的运行
      • 程序规定了进程要完成的功能
    • 区别
      根本区别:进程动态,程序静态
        

进程管理

  • 进程管理
    • 引入进程后,对处理器的管理转变为对进程的管理,操作系统设计了一个数据结构——进程控制块 PCB,用来描述、管理和控制进程。
    • 创建一个进程就是为其建立一个 PCB,进程状态的改变就是通过修改 PCB 中对应的状态值实现
        
  • PCB 的组成:不同操作系统差异较大
    • 基础信息描述部分:描述进程本身的信息
      • 进程名
      • 进程标识符:由操作系统自动生成,在开机-关机时间段内唯一
      • 用户标识
      • 进程状态
    • 管理信息部分
    • 控制信息部分
        
  • PCB 队列
    • 就绪队列:把就绪状态的进程的 PCB 链接起来组成的队列
    • 等待队列:把阻塞 状态的进程的 PCB 链接起来组成的队列
    • 两种队列都可以有多个。一个进程对应一个 PCB,多个进程通过 PCB 队列的组织,就可以让操作系统进行有效管理了
        

进程管理的主要功能

  • 控制、同步、通信、调度、死锁
  • 进程控制
    • 定义:对进程生命期及其状态转换的实现
    • 通过一组原语来实现状态转换
      • 原子性:
        • 动作不会被分割或中断
        • 动作要么全部执行,要么一个都不执行
      • 原子操作:几个动作的执行满足原子性的操作
      • 原语:一个特殊的程序段,该段程序的所有指令,要么全部执行,要么一个都不执行,处理器一旦开始了第一条指令的执行,就必须把原语部分的全部代码执行完,期间不能转去执行其他程序的代码,即任何两条相邻指令的执行不可被分割或中断。若执行原语中某一条指令时出错了,那么该原语已经执行的指令要回复到执行前的状态
          
    • 进程的创建
      • 通过创建原语实现,主要操作:建立一个 PCB -> 生成 pid -> 初始化 PCB 各项内容 -> 加入合适的就绪队列

      • 创建时机:操作系统启动过程中,由初始化程序自动创建一些系统进程;作业调度程序;用户提交请求命令;系统调用
          

    • 进程的撤销
      • 意味着进程生命期的结束,通过撤销原语实现,主要操作:回收进程所占用的资源和 PCB
      • 时机:进程执行完成、执行过程出错(或者叫异常结束)、子进程对应的父进程异常结束、人为终止
          
    • 进程的阻塞
      • 通过阻塞原语实现,主要操作:修改 PCB 中的进程状态【为阻塞状态】 -> 现场保护【将处理器现场的内容保存在 PCB 中】 -> 将进程加入合适的等待队列
      • 时机:运行状态的进程要进入阻塞状态时
      • 意义:减少 CPU 等待时间
      • 操作系统不能把阻塞状态的进程直接转化为运行状态,若此时处理器不可分配,进程将再次转化为阻塞状态(原语恢复),进入等待队列,再不断尝试。会极大地影响系统开销
          
    • 进程的唤醒
      • 通过唤醒原语实现,主要操作:从等待队列中移出进程 -> 修改PCB的进程状态为就绪状态 -> 进程加入合适的就绪队列
      • 时机:阻塞状态的进程要进入就绪状态时
      • 意义:减少 CPU 等待时间
          
  • 进程同步
    • 解决程序的并发执行中的不可再现问题
    • 无关的进程间在并发执行后,不会破坏程序的可再现性,只有相关的进程间会
    • 相关的并发进程分为两种相互制约关系
      • 间接制约关系:一个进程通过共享的资源,暂时限制其他进程的运行。由资源共享引起
      • 直接制约关系:一个进程的执行状况直接决定另一个或几个进程可否执行。由任务协作引起,即任务的完成要按一定的执行顺序
    • 间接制约与互斥关系
      • 资源的使用步骤:申请、使用、归还
      • 临界资源与间接制约:一次只能让一个进程使用的资源就是临界资源,这里的一次是指从申请到归还算一次。比如:打印机、堆栈。所以,间接制约关系就是一组并发进程在共享某种临界资源时存在的一种制约关系
      • 临界区与互斥关系:临界区是指进程对应的程序中访问临界资源的一段代码,至多只有一个进程在临界区内执行
      • 两个或两个以上的一组并发进程,称它们具有互斥关系,是指这组进程至少共享一类临界资源,当一个进程在临界资源对应的临界区内执行时,其他要求进入相关临界区执行的进程必须等待
    • 直接制约与同步关系
      • 依赖关系

        • 单向依赖关系:处理器在执行进程 A 的某些指令前,必须先执行进程 B 的某些指令,否则就不能执行,称为进程 A 依赖于进程 B
            
          图中进程 A 的 L1 指令依赖于进程 B 的 L2 指令

          

        • 相互依赖关系:进程 A 依赖于进程 B,同时进程 B 也依赖于进程 A
          图中进程 A 的 L1 指令依赖于进程 B 的 L4 指令,进程 B 的 L3 指令依赖于进程 A 的 L2 指令
        
      • 同步关系
        • 在一组并发进程中,如果每个进程至少与同组中另一个进程存在单向或相互依赖关系,称这组进程具有同步关系,简称同步进程
    • 进程同步机制
      • 控制并发进程的互斥、同步关系,保证它们能够正确执行的方法;(互斥是一种特殊的同步)

      • 常用的进程同步机制:加锁机制、标志位机制、信号量机制和管程机制

      • 互斥关系

        • 操作系统对进程互斥关系的实现转换为对临界区执行的控制。
        • 临界区管理准则:
          • 空闲让进:临界区内无进程执行,则允许进入临界区执行
          • 忙则等待:临界区内有进程执行,则等待
          • 有限等待:要求经过有限时间的等待后,有机会进入临界区执行,不能无限期等待
          • 让权等待:进程离开临界区时,要把处理器让给下一个进程
      • 信号量机制与互斥关系

        • 信号量可以认为是资源计数器,通过 p 操作来使用资源,进行 p 操作后信号量减一, v 操作则相反,加一。p 操作和 v 操作都是原语
        • 互斥关系中,信号量值为 1
        • P、V 操作代码
            p(s){
                s -= 1;
                if(s < 0)   // 信号量不够用
                    block(s);   // 将当前调用 p 操作的进程设置为阻塞状态
            }
        
            v(s){
                s += 1;
                if(s <= 0)  // 还有进程需要执行
                    wakeup(s);  // 从等待队列中唤醒一个进程
            }
        
            // 实现互斥的模型
            ...
            p(s);
            临界区;
            v(s);
            ...
        
      • 信号量机制实现同步关系

        • 单向依赖关系也叫简单同步关系
        • 先执行的可以看成是资源的提供者,后执行的看成是资源的消耗者,所以先执行的用 v 操作,后执行的用 p 操作,信号量的值为 0,因为一开始没有资源,只有先执行的进程执行完才有
        • 相互依赖关系也叫一般同步关系
        • 一个依赖关系定义一个信号量,这里有 2 个依赖关系,所以要定义 2 个信号量,s1 = 1,s2 = 0(假定进程 A 的第一次执行不受限制,否则会死锁 )
      • 生产者/消费者问题

              // empty 初始值为资源个数,表示有 k 个空位;mutex 用来实现缓冲区互斥;full 初始值为 0 ,表示当前可用资源数,表示有 full 个产品可用
              mutex = 1, empty = k, full = 0;
              producer(){
                  生产一个物品;
                  p(empty);       // 如果有空位,就继续进行,没有就阻塞等待
                  p(mutex);
                  物品存入缓冲区;
                  v(mutex);
                  v(full);        // 存入缓冲区后,可用产品数加一
              }
      
              consumer(s){
                  p(full);        // 如果有可用产品,就继续进行,没有就阻塞等待
                  p(mutex);
                  物品取出缓冲区;
                  v(mutex);
                  v(empty);       // 取走后空位加一
                  消费;           // 消费者自己对物品的处理
              }
      

  

  • 进程通信
    • 两个或多个进程之间交换数据的过程
    • 进程通信类型:
      • 低级通信:操作系统内核程序之间的通信,交换的数据量小
      • 高级通信:没有特别说明,进程通信是指高级通信,即应用程序之间的数据交换,交换的数据量可以很大
    • 为什么需要进程通信
      • 任务协作
      • 进程的独立性:一个进程不能访问另一个进程的代码和数据,以保证不会互相干扰,但因此造成进程之间无法直接交换数据
    • 进程通信方式:即进程通信的具体实现方法
      • 共享存储区通信
      • 消息缓冲通信
      • 信箱通信
      • 管道通信
          
  • 线程
    • 把进程细化成若干个可以独立运行的实体,每一个实体称为一个线程(Thread)
    • “进程就是线程组成的”这个观点不对,因为有的进程不能完全细化,总有一些模块无法独立于其他模块而运行
    • 引入线程的目的
      • 引入线程可以减小系统的基本工作单位粒度
      • 实现进程内部的并发执行,提高并行程度
      • 减少处理器切换带来的开销:一个线程阻塞后,处理器可以执行同一个进程的另一个线程,这个线程与原来的线程共享同一个进程的资源,因此只用保护原线程的少数现场信息,而不是进程的现场信息,减少处理器切换带来的系统开销
      • 简化进程通信方式
    • 线程与进程的关系
      • 同一进程的线程之间共享的该进程地址空间
      • 与进程一样,线程具有动态性和并发性
      • 线程是处理器分配调度的基本单位,进程是其他资源(除处理器之外)分配的基本单位
      • 进程之间在处理器切换时现场的保护/恢复的开销比较大,同一进程的线程之间在处理器切换时现场的保护/恢复的开销比较小
    • 线程的类型
      • 管理、控制线程的模块叫线程包
      • 用户线程:由运行在用户空间的线程包管理、控制的线程
      • 系统线程:由运行在系统空间的线程包管理、控制的线程
posted @ 2020-12-10 00:54  物转星移几度秋  阅读(62)  评论(0)    收藏  举报