操作系统02-进程管理

操作系统

第二章:进程管理

进程与线程

  • 进程的基本概念

    • 功能: 为了描述并发执行程序的动态特性,引进的新的概念

    • 程序的顺序执行及其特征

      • 单批道处理系统的执行方式,按照前趋图的顺序执行
      • 顺序性、封闭性、可再现性
    • 程序的并发执行及其特征

      • 指若干个程序同时在系统中运行,在执行时间上是重叠的

      • 重叠是指运行程序的长度有重叠

      • 特征

        • 间断性

        • 失去封闭性:共享性

        • 不可再现性

    • 进程的特征与状态

      • 特征

        • 结构性:进程实体由程序段、数据段及进程控制块组成,又称为进程映像

        • 动态性

          • 数据
          • 代码
          • 控制信息
        • 并发性

          • 多个进程实体同存于内存中中
        • 独立性

          • 地址空间相互独立
        • 异步性

          • 互相制约
      • 进程实体

        • 程序段+数据段+PCB
        • 线程是操作系统进行运行调度的最小单位
        • 包含在进程之中,是进程中实际运行工作的单位
        • 一个进程可以并发多个线程,每个线程执行不同的任务

  • 状态

    - 基本状态
      
      - 就绪:进程已获得除处理机以外的所有资源,一旦分配了处理机就可以立即执行,此时进程所处的状态为就绪状态
      
      - 执行:进程在处理机上运行
      
      - 阻塞:等待资源
      
    - 图解
    - 挂起
      
    	- 优先级的引入
      
    		- 把进程从内存转到外存
      
    	- 优点
      
    		- 提高处理机的效率
    		- 为运行的进程提供足够的内存
    		- 用于调试
      
    	- 请求种类
      
    		- 终端用户的请求
    		- 父进程请求
    		- 负荷调剂的需要
    		- 操作系统的需要
      
    	- 种类
      
    		- 就绪挂起
    		- 阻塞挂起
    		- 运行到就绪挂起
      
    			- 抢占式
    - 激活
      
    	- 进程从外存转到内存
    	- 种类
      
    		- 就绪激活
    		- 阻塞激活
    - 收容
      
    	- 收容一个新进程
      
    		- 进入就绪状态/就绪挂起
    - 图解
    

    • 进程控制块

      • 用于描述和管理进程的数据结构,是进程实体的一部分,进程和PCB是一一对应的,可以参照UNIX中的进程控制块

      • 进程标识信息

          	- 进程标识符、进程名、用户标识符、父进程标识符和子进程标识符
        
      • 处理机状态信息

          	- 用来保存现场
        
          		- 通用寄存器、指令计数器、程序状态字(含执行结果状态、中断屏蔽码)、栈指针(每个进程都有与之相关的栈,保存过程和系统调用的地址和参数)
        
      • 进程调度和状态信息

          	- 进程状态、进程优先级、进程调度的其他信息、等待事件(进程处于等待状态的原因)
        
      • 进程控制信息

          	- 程序和数据地址、进程同步及通讯机制、资源清单、链接指针(处于同一状态的进程组成一个队列),链接指针指向队首
        
      • 组织方式

          	- 链接方式
        
          		- 将处于同一状态的所有进程控制块链接在一起,这样的数据结构称为进程队列
        
        		- 索引方式
        
          		- 系统根据进程状态建立几张索引表,登记具有相应状态的PCB地址
        
  • 线程

    • 引入目的

      • 减少程序并发执行所付出的时空开销,使操作系统具有更好的并发性
      • 提高资源的利用率 和系统吞吐量 增加并发程度
    • 线程的基本概念

      • 是进程内的一个执行单元

      • 资源分配的实体还是进程

      • 线程是调度和分派的基本单位

      • 将进程的两个属性分开

      • 属性

        • 轻型实体

        • 独立调度和分派的基本单位

        • 可并发执行

        • 共享进程资源

        • 状态

          • 执行
          • 阻塞
          • 就绪
      • 线程控制块

        • 寄存器
        • 堆栈
        • 线程运行状态
        • 优先级
        • 线程专有存储器
        • 信号屏蔽
    • 线程和进程关系

      • 一个线程必须有一个父进程
      • 一个进程可以有多个线程
    • 线程间的同步与通信

      • 互斥锁
      • 条件变量
      • 信号量机制
    • 线程的实现方式

      • 内核支持线程

      • 用户级线程

      • 两者结合的办法

      • 用户级线程和内核支持线程比较

        • 线程的调度和切换速度
        • 系统调用
        • 线程执行时间
        • 适应性
    • 线程的实现

      • 内核支持线程

      • 用户级线程

        • 运行在中间系统之上

          • 运行时系统
          • 内核控制线程
  • 可以和内核支持线程相互关联

6WIbzs

  • 进程通信

    • 进程通信的类型

      • 共享存储器系统

        • 共享数据结构

        • 共享存储区

          • 建立
          • 附接
          • 断接
      • 管道通信系统

        • 互斥
        • 同步
        • 确定对方是否存在
      • 消息传递系统

        • 直接通信方式
        • 间接通信方式
      • 客户机-服务器系统

        • 套接字

          • 基于文件型
          • 基于网络型
        • 远程过程调用

        • 远程方法调用

    • 消息传递通信的实现方式

      • 直接消息传递系统

        • 发送原语

        • 接受原语

        • 过程

          • 在自己的工作区设置一个发送区
          • 适用发送原语发送给接收进程,将其挂在接收进程的消息队列上
          • 调用接收原语从自己的消息队列中摘下第一个消息,将内容复制到自己的消息接收区
        • 消息缓冲区

        • 增加的数据结构

        • 对称寻址方式

      • 信箱通信

        • 私用邮箱

          • 用户进程创建、其余进程只可发送
        • 公用邮箱

          • 操作系统创建
        • 共享邮箱

          • 用户创建,可共享
        • 非对称寻址方式

        • 结构

          • 信箱头
          • 信箱体
        • 信箱原语

          • 创建和撤销
          • 消息的发送和接收
      • 管道通信

        • 以管道方式
  • 进程控制

    • 前置概念

      • 原语

        • 原子操作,有若干条机器指令构成,用以完成特定的功能,是不可分割的
    • 进程的创建

      • 引起事件

        • 用户登录、
          作业调度、
          OS服务、
          应用需求
      • 创建原语

        • 创建一个空闲PCB结构
        • 为新进程分配资源
        • 初始化新的PCB结构
        • 将PCB结构插入相应的队列
      • 进程图

        • 描述进程家族关系的一棵有向树
    • 进程的终止

      • 引起事件

        • 中断-正常结束
        • 异常结束
        • 外界干预:父进程可以请求终止子进程
      • 终止原语

        • 根据进程标识符,找到相应的PCB,读取状态
        • 如果正处于进行状态,则停止进程的执行
        • 如果有子进程,终止子进程
        • 归还资源到父进程或者系统
        • 撤销PCB
    • 进程的阻塞与唤醒

      • 引起事件

        • 造成阻塞

          • 请求系统服务(如请求分配资源但没有资源分配)
          • 启动某种操作(进程必须在某种操作执行之后才能继续执行)
          • 新数据未到达
          • 无新工作可做
        • 在满足条件之后就会唤醒

      • 阻塞原语

        • 根据当前执行进程的标识符找到PCB
        • 停止执行进程,改状态为阻塞
        • 保存进程的现场到PCB结构
        • 将该进程PCB插入等待队列
        • 转进程调度程序
        • block 原语
      • 唤醒原语

        • 从等待队列中取出相应进程
        • 改程序状态为就绪,将进程插入就绪队列
        • 转进程调度或返回
        • wakeup原语
    • 进程的挂起与激活

      • 挂起引起事件

        • 用户进程请求将自己挂起
        • 父进程请求将自己的某个子进程挂起
      • 挂起原语

        • 根据被挂起进程的标识符,找到PCB

        • 取PCB的状态

          • 运行状态
          • 就绪状态
          • 等待状态
        • suspend 原语

      • 激活原语

        • 系统将外存上被挂起的进程换入内存
        • 将进程状态由挂起改为激活后的状态
        • 有需要转进程调度
        • active原语

处理机调度

  • 处理机调度的层次

    • 高级调度

      • 决定后备队列中调入主存的作业
      • 多少作业:取决于多道程序度
      • 接纳哪些作业:取决于调度算法
    • 中级调度

      • 闪存中把暂时不运行的换出外存

      • 决定那些进程被允许参与竞争CPU

      • 处于挂起状态

      • 引入原因

        • 换出

          • 紧缩:是空闲区间和占用区间分开到两端
          • 内存空间紧张
          • 就绪队列进程太多
          • 等待I/O可能要一段时间
          • 便于紧缩
        • 换入

          • 内存中有足够的空间
          • 外存中进程的优先级高于内存中进程
    • 低级调度

      • 进程调度

        • 方式

          • 抢占式

            • 原则

              • 优先权
              • 短作业优先
              • 时间片
          • 非抢占式

            • 简单、系统开销小、无法处理紧急情况
      • 就绪队列中分配处理机

    • 作业状态

      • 提交状态

        • 用户作业由输入设备向系统外存输入时作业所处的状态
      • 后备状态

      • 执行状态

      • 完成状态

    • 只有低级调度是必须的

  • 调度队列模型和调度准则

    • 调度队列模型

      • 一级
      • 二级
      • 三级
    • 选择调度方式和调度算法的若干准则

      • 面向系统的准则

        • 系统吞吐量
        • CPU利用率
        • 各类资源的平衡利用
      • 面向用户的准则

        • 周转时间短

          • 等待时间和运行时间之和
          • 带权周转时间:和实际时间的比值
        • 相应时间快

        • 截止时间的保证

      • 算法的性能准则

        • 易于实现
        • 执行开销比
        • 稳定性
  • 调度算法

    • 先来先服务和短作业(进程)优先调度算法

      • 短作业优先是当前时刻的短时间
      • 多个作业同时到达时,短作业优先调度算法的平均周转时间最小
    • 最短剩余时间优先调度算法

      • 即当一个新进程进入就绪队列时,若其需要的运行时间比当前运行进程的剩余时间短,则它将抢占CPU

      • 缺点

        • 对长作业不利 并且长作业容易出现饥饿现象
        • 未考虑紧迫程度
        • 只是根据用户的估计运行时间 容易造假
    • 高优先权优先调度算法

      • 抢占式

      • 非抢占式

      • 优先权

        • 静态优先权 开销小但是不准确
        • 动态优先权
    • 最高相应比优先调度算法

      • 响应比 = (等待时间+要求服务时间 )/ 要求服务时间
    • 基于时间片的轮转调度算法

      • 最开始的在队首,执行完时间片到队尾

      • 时间片过大 太大退化为先来先服务,会让队尾的进程等待过久

      • 时间片过小 进程切换过于频繁,系统的开销过大

      • 多级反馈队列调度算法

        • 设置多个队列
        • 优先级越高,执行时间越短
        • 在第一个队列执行完以后再执行第二个队列
        • 执行过的进程放到最后一个队列的末尾
  • 实时调度

    • 实现实时调度的基本条件

      • 提供必要的信息
      • 系统处理能力强
      • 采用抢占式调度机制
      • 具有快速切换机制
    • 实时调度算法的分类

      • 非抢占式调度算法

        • 非抢占式轮状调度算法
        • 非抢占式优先调度算法
      • 抢占式调度算法

        • 基于时钟中断的抢占式优先权调度算法
        • 立即抢占的优先权调度算法
    • 常用的几种实时调度算法

      • 最早截止时间优先

      • 最低松弛度优先

        • 松弛度
        • 抢占式的

进程同步

  • 进程同步的基本概念

    • 进程制约关系

      • 相互协作关系
      • 资源共享关系
    • 临界资源与互斥

      • 临界资源

        • 一段时间内仅允许一个进程使用的资源
      • 互斥

      • 临界区

        • 访问临界资源的那段代码称为临界区

          • entry section 进入区
          • critical section 临界区
          • exit section 退出区
      • 同类临界区

        • 所有与同一临界资源相关联的临界区
    • 互斥与同步

      • 互斥

        • 解决进程间竞争关系的手段
      • 同步

        • 解决进程间协作关系的手段
    • 同步原则

      • 空闲让进:资源无占用,允许使用
      • 忙则等待:资源有占用,请求进程等待
      • 有限等待:保证有限等待时间能够使用资源
      • 让权等待:等待时,进程需要让出CPU
    • 临界区互斥

      • 基本方法

        • 软件方法

          • 单标志法

            • 违背 空闲让进
          • 双标志先检查法

            • 违背 忙则等待
          • 双标志法后检查

            • 会导致 饥饿
          • 皮特森算法

            • 单标志法和双标志后检查法的结合
        • 硬件方法

          • 中断屏蔽法

            • 进区关中断
            • 出区开中断
          • 硬件指令法

            • 设置立原子操作指令

              • 测试与设置指令TS test and set
              • swap 指令
        • 信号量

          • 一种有效的进程同步机制

          • 整型信号量

            • Wait(S) P操作 信号量减一(仅仅对信号量大于0有效 小于0的时候不做操作)

            • signal(S) V操作 信号量加一

            • 缺点

              • 在信号量小于等于0的时候会不停的测试
              • 没有做到“让权等待的原则”
          • 记录型信号量

            • 增加记录资源数目的整型变量value值
            • 增加一个进程链表指针L 链接所有等待进程
            • signal和wait原语操作
            • 记录型数据结构包含value值和链表L
          • AND型信号量集

            • 全部分配或全不分配
            • 适合同时需要多种资源,且每种占用一个时的情况
          • 信号量集

            • 和AND型信号量集一样

            • 加判断条件后全分配或全不分配

            • 适合于同时需要多种资源,且每种占用的数目不同,且可分配的资源还存在临界值

            • 特殊应用

              • Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源数少于d时,不予分配。
              • Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
              • Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。
  • 经典进程的同步问题

    • 生产者--消费者问题

      • 用记录型信号量解决

        • 用empty和full分别表示空缓冲区的数量和满缓冲区的数量

          • empty初值为n
          • full初值为0
        • 临界资源mutex 初值为1

        • 过程

          • 生产一个产品:

            • 看到先要求一个空缓冲区然后要求临界资源
            • 生产完成以后,释放临界资源,生成一个满缓冲区
          • 取出产品:

            • 需要一个满缓冲区和临界资源
            • 取出后,释放临界资源并生成一个空缓冲区
      • 用AND信号量解决

        • 可以将2步wait和signal合成一个,可以避免出现wait顺序颠倒的情况
    • 哲学家进餐问题

      • 算法描述

      • 存在问题

        • 当五个哲学家同时感觉饥饿,并同时拿起自己左边的筷子,则会出现死锁
      • 尝试解决

        • 至多允许四个哲学家同时进餐 还是有可能存在死锁的问题
        • 同时使用左右筷子 采用AND信号量解决问题
        • 奇数号哲学家先拿左边筷子再拿右边筷子,偶数号哲学家相反
    • 读者--写者问题

      • 共享整型变量 readcount 记录当前正在读数据的读者数量

        • 初值为0
      • wmutex 用于写者与写者、写者与读者之间的互斥

        • 初值为1
      • rmutex 用于读者互斥地访问共享变量readcount

        • 初值为1
      • 算法描述

        • 读者描述
        • 写者描述
      • 使用信号量集解决

        • 至多允许RN个读者同时读
        • 引入信号量L 初值为RN
        • 信号量mx 初值为1
  • 信号量的应用

    • 实现互斥

      • wait(mutex)
      • 临界区
      • signal(mutex)
    • 实现前趋关系

      • S1
      • signal(S)
      • wait(S)
      • S2
  • 管程机制

    • 管程

      • 管程名字
      • 局部于管程的共享数据结构(变量)
      • 对共享数据结构进行的一组操作(函数)
      • 对局部于管程的数据设置初始值的语句
    • 基本特性

      • 共享变量仅能由管程内定义函数访问
      • 一个进程只有通过调用管程内函数才能访问共享变量
      • 管程互斥进入
      • 由编译程序在编译时自动添加上
    • 入口等待队列

    • 紧急等待队列

      • x.wait
      • x.signal
    • 条件变量

      • 说明

        • 同步原语

          • x.wait
          • x.signal
        • condition x

      • 作用

    • 生产者、消费者

进程死锁

  • 死锁

    • 多个进程因竞争系统资源而造成的一种僵局,如果没有外力作用,这些进程永远不能向前推进

      • 死锁: 缺资源不缺CPU
      • 饥 饿 : 缺资源 不缺CPU

  • 产生死锁的原因

    • 竞争资源

      • 可剥夺资源与不可剥夺
      • 永久性和临时性
      • 不可剥夺、永久性和临时性资源可造成死锁
    • 进程推进顺序不当

    • 产生死锁的必要条件

      • 互斥条件
      • 请求和保持条件
      • 不可剥夺条件
      • 环路等待条件
  • 处理死锁的基本方法

    • 预防死锁

      • 预防死锁的方法

        • 破坏 互斥条件

          • 是设备本身固有的属性
          • 不可修改
        • 破坏“不可剥夺”

          • 已有该资源的进程要求释放资源
          • 只可用于状态可以保存和恢复的资源
        • 破坏 请求和保持条件

          • 静态资源分配法
          • 一次分配所用的全部资源
          • 资源利用率低,进程延迟
        • 破坏“环路等待”

          • 有序资源分配

            • 进程申请一个资源的时候,必须释放其占有序号大于该资源的其他资源
          • 资源利用率提高(还是存在浪费)

          • 限制了用户编程

          • 限制了设备的增加

    • 避免死锁

      • 系统安全状态

        • 只要系统始终都处于安全状态便可避免死锁的发生
      • 利用银行家算法避免死锁

          1. 通过对资源分配进行分析
          1. 如果有任何一个进程的资源需求满足现有资源储备量,则可分配,并释放占用的资源 重复1
        • 如果所有进程可全部被释放,则处于安全状态
    • 检测死锁和解除

      • 死锁的检测

        • 资源分配图

          • 用圆圈代表进程
          • 方框表示一类资源
          • 方框中一个点代表一类资源的一个实例
          • 从进程到资源表示进程请求一个该类资源
          • 从资源指向进程表示有一个资源分配给该进程
        • 检测

          • 不可完全简化即死锁
          • 完全简化即形成孤立结点
          • 可以获取到想要的资源则移除请求边和分配边
      • 死锁的解除

        • 资源剥夺法
        • 撤销进程法

原文地址:https://www.cnblogs.com/hiszm/p/13435826.html