《操作系统第四版》(刘振鹏 王煜)复习总结

操作系统(一)

操作系统引论
用户接口与作业管理
进程和线程的概念
存储器管理
文件管理
设备管理

一.引论

1.1 操作系统的概念

1.1.1计算机系统

硬件系统+软件系统(程序和文件)
软件分为:系统软件(操作系统)、支撑软件(数据库、编译程序)、应用软件

1.1.2什么是操作系统

用户角度:是一个控制软件,管理应用程序,为应用程序提供服务,杀死应用程序。
资源分配角度:资源管理,管理外设,分配资源。
操作系统位于硬件之上 应用程序之下 操作系统为应用软件提供服务支撑,完成对硬件的控制与分配。
作用:
(1)管理系统中的资源
(2)提供良好的界面

1.1.3操作系统的目标

方便性 有效性 可扩充性 开放性

1.2. 操作系统的形成与发展

1.2.1 形成

  • 1)无操作系统时代:

    人工操作方式
    脱机I/O方式:外围机 磁盘

  • 2)单道批处理操作系统 :

    作业成批处理 每次只处理一项作业

  • 3)多道批处理操作系统 :

    多道性、无序性、调度性(作业提交到完成经历两次调度 高级调度 低级调度)
    **高级调度:作业调度 作业由外存调入内存
    **低级调度:进程调度 内存中的作业分配给处理机

  • 4)分时系统

    • 问题产生:
      满足多用户的需要->一台主机连接多个带显示器和键盘的终端
    • 需解决的问题:
      A及时接收 ->终端配置多路卡;B及时处理->使用户作业进入内存
    • 实现方法:
      A作业直接进入内存;B分时间片占用处理机
    • 具体方法:
      A单道分时系统—利用时间片 内存<–>外存
      B具有前后台的分时系统—内存划分为前台后台
      C多道分时系统内存容纳多道作业 调入调出不费内存
      (现代分时操作系统多用次方案)
  • 5)实时系统
    满足实时控制、实时信息处理
    【批处理、分时、实时 是三种基本的操作系统类型 实际操作系统兼有两者或者此三者的功能】

1.2.2发展

  • 1)微机操作系统

    单用户单任务 MS-DOS
    单用户多任务 Windows Linux
    多用户多任务 UNIX

  • 2)多处理机操作系统

    • 提高计算机系统性能的途径:
      (1)提高元器件的性能(2)改进计算机系统结构
    • 多处理机的类型:
      (1)非对称多处理机 :主从模式 主处理机一个管理操作系统并为从处理机分配任务 ,从处理机多个服从主处理机的任务
      (2)对称多处理机
  • 3)网络操作系统

    计算机技术和通信技术的产物

  • 4)分布式操作系统

    • 集中式 处理和控制在同一处理机上
    • 分布式 系统处理控制功能分散
  • 5)嵌入式操作系统

1.3.研究操作系统的几种观点

软件的观点
计算机资源管理的观点
进程的观点
用户与计算机硬件系统之间接口的观点
虚拟器的观点
服务提供者的观点-----程序执行、I/O操作、文件系统操控、进程通信、差错检测

1.4. 操作系统的功能与特征

1.4.1 功能:

  • 1.处理机管理----对处理机进行分配 并对其运行进行有效控制,处理机的分配和运行以进程为单位:
    (1)进程控制
    (2)进程同步—进程以异步方式运行
    **进程协调的方式:
    进程互斥
    进程同步方式
    (3)进程通信
    直接通信
    间接通信
    (4)调度
  • 2.存储器管理
    (1)内存分配
    静态分配:作业所要求的内存空间是在作业装入的时候决定的,在作业装入后的整个运行期间不能够申请新的空间 不能够改变位置。
    动态分配:作业所要求的内存空间在装入的时候决定但允许增加新的空间,允许移动.
    *内存分配机制:1)内存分配数据结构 2)内存分配功能 3)内存回收功能
    (2)内存保护
    (3)地址映射
    源程序经过编译之后会形成若各个目标程序,这些目标程序再经过链接形成可执行程序。程序的地址都是从“0”开始的,成为“相对地址”或者“逻辑地址”其地址空间称为“地址空间”。内存中的地址空间成为“内存空间”,称“绝对地址”或者“物理地址”
    多道程序中逻辑地址与物理地址不对应因此需要地址映射。在硬件的支持下进行此项工作
    (4)内存扩充
    *内存扩充机制:1)请求调入功能 2)置换功能
  • 3.文件管理
    计算机系统中把程序和数据以文件的形式存储在磁盘或者是磁带上
    文件存储空间管理、目录管理、文件读写管理、目录控制
  • 4.设备管理
    完成用户提出的I/O请求,为用户分配I/O设备,提高处理机和I/O设备的利用率,提高I/O速度,方便用户使用I/O
    缓冲管理、设备回收、设备处理程序、设备独立性和虚拟设备
  • 5.用户接口
    命令接口、程序接口、图形接口

简单说:

  • 操作系统的功能:管理软硬件资源,提供用户接口
  • 处理机管理:进程控制,进程同步,进程通信,调度(作业调度和进程调度)
  • 存储器管理:内存分配,内存保护,地址映射,内存扩充(地址映射:将逻辑地址转换为物理地址。)
  • 设备管理功能:缓冲管理,设备分配,设备处理
  • 文件管理:文件存储空间管理,目录管理,文件读写管理及保护
  • 用户接口:用户接口和程序接口。(系统调用,是用户程序取得操作系统服务的惟一途径)

1.4.2操作系统的特征

并发性
并行性是指在两个或者多个事件在同一时刻发生
并发性是指两个或者多个事件在同一时间间隔发生
共享性
指操作系统中的资源可供内存中的多个并发执行的进程共同使用
互斥共享资源:如打印机、磁带机
同时访问方式:如磁盘、重用代码编写的文件
并发和共享是操作系统最基本的两个特征
虚拟性
物理实体到逻辑对应物的转化。举例:多道程序设计,分时技术,虚拟内存技术
异步性
多道程序中允许多个程序并发执行 作业完成情况与进入内存时间不匹配 但是多次完成的结果一致。

1.5.操作系统的结构设计

  • 演变
    无结构->模块化结构->分层结构->微内核结构
  • 模块法的优缺点:
    优点:提高OS设计的正确性、可理解性和可维护性增强OS的适应性加速OS的开发过程 ;
    问题:接口设计难于满足实际需求
  • 分层结构优缺点:
    优点:易保证系统的正确性易扩充和易维护;
    缺点:系统效率降低
  • 微内核:只包括操作系统最基本的部分。包括:进程(线程管理)、低级存储器管理、中断和陷入处理
    微内核的优缺点:
    优点:提高了系统的可扩展性增强了系统的可靠性提高了系统的可移植性提供了对分布式系统的支持;
    问题:系统运行效率有所降低。

1.6操作系统的硬件环境

(待续)

操作系统(二)

二、用户接口和作业管理

2.1 概述

  • 基本概念:
    1.接口:要让计算机完成任务,就一定要先编写程序,将程序提交给计算机,这实际上就是用户与操作系统的接口。计算机为用户提供的接口是:命令接口、程序接口
    2.作业:用户一次计算过程中或者一次事物处理过程中要求计算机系统所做的全部工作的集合。
    作业的组成:程序、数据和作业控制说明书

2.2 命令接口

  • 命令接口:用户和操作系统通过高级通信来控制程序运行。
    • 脱机命令(批处理作业,由作业控制语言组成)、联机命令也叫交互式命令(用于交互式命令,人机对话)
    • 程序接口:在程序,系统资源以及系统服务之间交互作用。程序接口由系统调用组成。
      3.系统调用:是操作系统提供给编程人员的唯一入口,编程人员在源程序级动态请求和释放系统资源调用系统中已有的系统功能来完成与机器硬件部分相关的工作和控制程序的执行。

2.3 系统调用

  • 系统调用分类:
    文件操作类: 创建、打开、读、写、删除等
    进程控制类:创建、执行、撤销等
    资源申请类:申请或归还内存、请求或释放设备等
    进程通信类:进程间传递消息或信号
    信息维护类:用户与OS间传递信息,如获取时间等
    *系统调用功能:用户程序使用子程序以得到特权指令提供的功能但是并没有使用特权指令。
    *陷入(TRAP)或异常处理机构:在系统中为控制系统调用服务的机构
    *陷入或异常指令(或称访管指令):由于系统调用引起处理机中断的指令
  • 系统调用与一般过程调用的比较:
    系统调用通过非特权指令——访管指令调用
    系统调用与一般的过程调用方式的相同点:
    改变指令流程
    重复执行和公用
    改变指令流程后需要返回原处
    系统调用与一般过程调用的区别:(从5方面考虑)
    (1)系统调用通过软中断进入
    一般的过程调用可直接由调用过程转向被调用过程;系统调用通常都是通过软中断机制转向相应的命令处理程序
    (2)运行在不同的处理器状态
    一般的过程调用,其调用程序和被调用程序都运行在相同的处理器状态 ;系统调用调用程序运行在目态,而被调用程序则运行在管态
    (3)处理器状态的转换不同
    一般的过程调用不涉及系统状态的转换;系统调用需要系统状态转换(通过软中断机制先由用户态转换为核心态)
    (4)返回问题不同
    一般的过程调用在被调用过程执行完后,将返回到调用过程继续执行;系统调用不一定返回原调用过程
    (5)嵌套调用
    像一般过程一样,系统调用也允许嵌套调用,但对嵌套调用的深度都有一定的限制。

2.4 作业管理

  • 研究问题:用户如何向操作系统提交作业,操作系统如何组织作业,调度作业的运行
  • 基本功能:作业调度和作业控制

批处理作业

  • 建立过程:
    1.作业控制块(JCB)建立—作业由输入设备输入时,系统为其建立JCB 并对其进行初始化 作业完成之后系统对其撤销。
    JCB与作业一一对应。所有的JCB构成一个表成为作业表。作业表存放在外存的固定区域,长度固定。
    2.作业输入
  • 作业调度算法
    • 先来先服务算法
      按照作业进入系统的先后次序来挑选作业,先进入系统的作业优先被挑选
    • 最短作业优先算
      总是选取计算时间最短的作业投入运行
      ---- 计算时间靠用户估计
    • 响应比最高者优先算法
      响应比=(等待时间+计算时间)/计算时间,作业调度时总是选取响应比高的作业投入运行
      ----有利于短进程 和等待时间较长的进程 响应比公式中的计算时间仍是用户的估计时间
    • 优先数调度算法
      每次总是选择优先数高的作业
      优先数的确定:一种是用户自己提出;一种是由系统综合考虑有关因素来确定
    • 分类调度算法
      根据系统运行情况和作业属性将作业分类(如计算型、I/O型等),作业调度时轮流从这些不同的作业类中挑选作业
  • 作业调度与处理器调度的关系
    进入计算机系统的作业只有经过 两级调度后才能占用处理器。
    第一级是作业调度,使作业进入内存储器;第二级是处理器调度,使作业进程占用处理器。
    《操作系统第四版》(刘振鹏 王煜)复习总结_第1张图片
  • 作业的状态
    -提交状态 作业还未进入算机系统内之前,用户正在向系统提交作业时所处的状态
    -后备状态 作业的提交完成后,作业便处于后备状态
    -运行状态 作业被选中,分配资源,调入内存,创建进程
    -完成状态 当作业运行结束或异常终止时,作业进入完成状态

操作系统(三)

三、进程与进程管理

3.1 进程引入

  • 前驱图:有向无循环图
  • 程序顺序执行特点:
    • 程序执行的顺序性
    • 程序执行的封闭性----程序一旦开始运行,其执行结果不受外界因素的影响
    • 程序执行结果的确定性
    • 程序结果的可再现性----程序执行时的环境和初始条件相同,当程序多次重复执行时,都将获得相同的结果
  • 多道程序设计:在采用多道程序设计的计算机系统中,允许多个程序同时进入一个计算机系统的内存储器并运行
    • 目的是:提高处理器的效率,从而提高整个系统的效率
    • 必须解决的问题
      • 存储保护与程序浮动
      • 处理器的管理和调度
      • 系统资源的管理和调度
    • 为了使程序在多道程序环境下能够并发执行(走走停停),并对并发执行的程序加以控制和描述,引入进程的概念。
      程序段、数据段及进程控制块三部分构成了一个进程的实体

3.2进程

3.2.1 进程的定义

  • 进程是具有独立功能的可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的独立单位。或者说,“进程”是进程实体的运行过程。

  • 进程的特征

    • 动态性:进程的基本特性。进程是进程实体的执行过程;
    • 并发性:进程的主要特征。多个进程实体同存于内存中,能在一段时间内同时运行;
    • 独立性:进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。
    • 异步性:进程按各自独立的、不可预知的速度向前推进;或者说,进程按异步方式运行。
    • 结构特征:从结构上看,进程实体是由程序段、数据段及进程控制块三部分组成,有人把这三部分统称为进程映像
  • 程序与进程的区别与联系
    区别:

    • 进程是程序的一次执行,是一个动态的概念,程序是完成某个特定功能的指令的有序序列,是一个静态的概念
    • 一个进程可以执行一个或几个程序,同一程序也可能由多个进程同时执行
    • 进程是系统进行资源分配和调度的一个独立单位,程序则不是
    • 程序可以作为一种软件资源长期保存,而进程是程序的一次执行过程,它是临时的,有生命期的
    • 进程是具有结构的:三部分组成
      《操作系统第四版》(刘振鹏 王煜)复习总结_第2张图片
      联系:
      进程是程序的一次运行。

3.2.2 进程的基本状态及其转化

  • 进程的三种基本状态
    • 就绪状态
      当进程已分配到除CPU以外的所有必要的资源后,只要能再获得处理机便可立即执行,这时的状态称为就绪状态。同时处于就绪状态的多个进程排成就绪队列。 (万事俱备,只差CPU)
    • 执行状态
      指进程已获得处理机,其程序正在执行
    • 阻塞状态
      进程因发生某种事件(如I/O请求、申请缓冲空间等)而暂停执行时的状态,有时也称为“等待”状态或“睡眠”状态。通常将处于阻塞状态的进程排成一个队列,即阻塞队列。
      《操作系统第四版》(刘振鹏 王煜)复习总结_第3张图片
  • 进程挂起状态
    • 挂起状态的引入

      • 终端用户的需要:暂时静止下来 既不执行也不接受调度
      • 父进程的需要:父进程常常希望考察和修改子进程,或者想要协调各子进程间的活动
      • 操作系统的需要 :操作系统有时需要挂起某些进程,检查运行中资源的使用情况及进行记账,以便改善系统运行的性能
      • 对换的需要
        为了缓解内存紧张的情况,即将内存中处于阻塞状态的进程换至辅存上,使进程又处于一种有别于阻塞状态的新状态。
      • 负荷调节的需要
        实时系统的负荷较重则可能影响到实时任务的控制,此时系统将不重要的进程挂起,以保证系统正常运行。
    • 进程状态的转换

      • 在引入挂起状态后,又将增加从挂起状态(又称静止状态)到非挂起状态(又称活动状态)的转换
      • 活动就绪→静止就绪 :处于就绪状态的进程被suspend()原语挂起后变为静止就绪状态
      • 活动阻塞→静止阻塞 :阻塞状态的进程被挂起
      • 静止就绪→活动就绪 :处于静止就绪的进程被active()原语激活
      • 静止阻塞→活动阻塞 :静止阻塞的进程被激活
        《操作系统第四版》(刘振鹏 王煜)复习总结_第4张图片

    3.2.3进程控制块PCB

    • 进程控制块的作用
      • 记录进程信息
      • 操作系统是根据进程控制块PCB来对并发执行的进程进行控制和管理的
      • PCB是进程存在的唯一标志
    • 进程控制块中的信息
      • 进程标识符信息
        进程标识符用于唯一地标识一个进程,通常有外部标识符和内部标识符。
        ①外部标识符。由创建者提供,通常由字母、数字所组成,往往是由用户(进程)在访问该进程时使用。
        ②内部标识符。这是为了方便系统使用而设置的。在所有操作系统中都为每一个进程赋予一个惟一的整数作为内部标识符,它通常就是一个进程的序号。
      • 处理机状态信息
        通用寄存器、指令计数器、程序状态字PSW、用户栈指针,用于断点重新继续执行
      • 进程调度信息
        存放了一些与进程调度和进程对换有关的信息:进程状态、进程优先级、进程调度所需的其他信息、事件
      • 进程控制信息
        程序和数据的地址、 进程同步和通信机制、资源清单、链接指针。
    • PCB的组织方式
      • 链接方式
        《操作系统第四版》(刘振鹏 王煜)复习总结_第5张图片
      • 索引方式
        《操作系统第四版》(刘振鹏 王煜)复习总结_第6张图片

3.2.4 进程控制

进程控制的主要任务是创建和撤消进程以及实现进程的状态转换,进程控制一般由操作系统的内核来实现。操作系统内核通常是运行在系统态的。

  • 管态:硬件设备处理机的状态
  • 目态:用户程序占用处理机的状态
  • 操作系统内核
    • 定义:
      将一些与硬件紧密相关的模块诸如中断处理程序、各种常用设备的驱动程序以及运行频率较高的模块都安排在紧靠硬件的软件层次中并使它们常驻内存,以便提高操作系统的运行效率,并对它们加以特殊的保护,把这一部分称为操作系统的内核
    • 功能:
      中断处理、进程管理、资源管理
  • 原语 内核或微核提供核外调用的过程或函数称为原语(primitive)。原子操作:一个操作中的所有动作,要么全做,要么全不做
  • 进程的创建
    • 引起创建进程的典型事件
      • 用户登录
      • 作业调度:作业装入内存,随即创建进程并插入就绪队列
      • 提供服务:如打印进程
      • 应用请求
    • 进程的创建过程
      • 调用进程创建原语create( )创建进程
      • 申请空白PCB :分配唯一的数字标识
      • 为新进程分配资源:程序、数据及用户栈所需的内存空间
      • 初始化进程控制块
      • 将新进程插入就绪队列
  • 进程的终止
    • 引起进程终止的事件
      • 正常结束
      • 异常结束
      • 外界干预
    • 进程的终止过程
      • 根据被终止进程的标识符从PCB集合中检索出该进程的PCB,从中读出该进程的状态
      • 若被终止进程正处于执行状态,应立即终止该进程的执行并设置调度标志为真,当前进程被终止后应重新进行调度。
      • 若该进程还有子孙进程,还应将其所有子孙进程予以终止
      • 将该进程所拥有的全部资源,或者归还其父进程或者归还给系统
      • 释放进程的PCB,删除相应队列中的PCB,归还空表项
  • 进程的阻塞与唤醒
    • 引起进程阻塞和唤醒的事件
      • 请求系统服务
      • 启动某种操作
      • 新数据尚未到达
      • 无新工作可作
    • 进程阻塞过程
      进程通过调用阻塞原语block()把自己阻塞(主动行为)
      • 立即停止当前进程的执行
      • 把进程控制块中的现行状态由“执行”改为“阻塞”,并把它插入到阻塞队列
    • 进程唤醒过程
      调用唤醒原语wakeup( )将等待该事件的进程唤醒
      • 把被阻塞进程从等待该事件的阻塞队列中移出
      • 将其PCB中的现行状态由“阻塞”改为“就绪”
      • 然后再将该进程插入到就绪队列中
        block()和wakeup()原语必须成对出现
  • 进程的挂起与激活
    • 进程的挂起过程
      当出现了引起进程挂起的事件时,系统就利用挂起原语suspend( )将指定进程或处于阻塞状态的进程挂起。
      • 检查被挂起进程的状态,若正处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将其改为静止阻塞
      • 进程保存于外存对换区
      • 如被挂起的进程正在执行,则转调度程序重新调度
    • 进程的激活过程
      • 当发生激活进程的事件时系统将利用激活原语active( )将指定进程激活
      • 将进程从外存调入内存,检查该进程的现行状态:若是静止就绪,便将其改为活动就绪;若为静止阻塞,便将其改为活动阻塞
      • 假如采用的是抢占调度策略 ,检查是否要进行重新调度

3.3 进程调度

3.3.1调度的基本概念

  • 高级、中级和低级调度:
    • 高级调度又称为作业调度 :作业从外存调入内存
    • 低级调度又称为进程调度:分配处理机
    • 在有的系统中,可能增加一中级调度,主要作用是在内存和外存对换区之间进行进程对换,以解决内存紧张问题。
  • 调度方式
    • 非剥夺方式
    • 剥夺方式
      • 剥夺原则:优先权原则、短进程优先原则、时间片原则

3.3.2进程调度算法

  • 先来先服务(FCFS)算法 :把处理机分配给最先进入就绪队列的进程

  • 最短CPU运行期优先调度算法:从就绪队列中选出“下一个CPU执行期”最短的进程,为之分配处理机使之执行

  • 最高响应比优先调度算法 :响应比=(等待时间+要求的服务时间)/要求的服务时间 ,每次选取响应比最高的进程调度

  • 优先级调度算法 :将CPU分配给就绪队列中优先级最高的进程

  • 时间片轮转调度算法
    《操作系统第四版》(刘振鹏 王煜)复习总结_第7张图片

  • 前后台调度算法:该方法用在批处理和分时相结合的系统中。将分时用户作业放在前台,把批处理作业放在后台。系统对前台作业按照时间片轮转法进行调度,仅当前台无作业时,才把处理机分配给后台作业的进程。后台进程通常按先来先服务方式运行

  • 多级反馈队列轮转算法

  • **进程调度的过程:

    • 进程调度所依赖的数据结构通常是调度队列,由于调度的原因不同,在单处理器系统中设置了多种等待队列
    • 只有就绪队列中的进程能够获得处理器而最终运行,其他队列中的进程从队列中出来后,必须进入就绪队列才能分配处理器
    • 队列数据结构的建立结构与调度算法密切相关
    • 进程调度算法只是决定哪一个进程将获得处理机,而将处理机分配给该进程的具体操作是由分派程序完成的

3.4 线程

  • 线程的引入

    • 在操作系统中引入进程的目的是为了使多个程序并发执行以改善资源利用率及提高系统的吞吐量;
    • 在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性。
  • 线程与进程的比较
    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light-Weight Process)或进程元;而把传统的进程称为重型进程(Heavy-Weight Process)。

    • 调度
      在引入线程的操作系统中,线程是调度和分派的基本单位;在同一进程中,线程的切换不会引起进程切换;在由一个进程中的线程切换到另一进程中的线程时,将会引起进程切换
    • 并发性
      在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量
    • 拥有资源
      不论是传统的操作系统,还是设有线程的操作系统,进程都是拥有资源的一个独立单位,它可以拥有自己的资源。一般地说,线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问其隶属进程的资源
    • 系统开销
      创建、撤销以至于切换进程时付出的系统开销显著大于创建、撤销、切换线程时的系统开销
  • 线程的实现机制

    • 用户级线程
      仅存在于用户级中,对于这种线程的创建、撤销和切换,都不利用系统调用来实现,因而这种线程与内核无关。相应地,内核也并不知道有用户级线程的存在
    • 内核支持线程
      依赖于内核,它们的创建、撤销和切换都由内核实现。在内核中保留了一张线程控制块,内核根据该控制块而感知该线程的存在并对线程进行控制。
  • 用户级线程和内核支持线程的比较

    • 线程的调度与切换速度
      用户级线程的调度切换速度高于内核支持线程的速度
    • 系统调用
      用户级线程的系统调用将看作整个进程的行为,该进程将被阻塞;内核支持线程的系统调用看作该线程的行为,仅仅阻塞该线程
    • 线程执行时间
      对于只设置了用户级线程的系统,调度是以进程为单位进行的 ;设置的内核支持线程的系统,其调度是以线程为单位进行的。

操作系统(四)

四、进程同步与通信

4.1 进程间的相互作用

4.1.1进程间的联系

  • 进程间的联系
    • 资源共享关系
    • 相互合作关系
  • 临界资源
    • 一种供多个进程互斥访问的资源 同一时刻只允许一个进程访问的资源叫临界资源
  • 临界区 每个进程中访问临界资源的那段代码称为临界区(critical section)
  • 同步机制应遵循的准则
    • 空闲让进
    • 忙则等待
    • 有限等待
    • 让权等待
  • 解决进程互斥问题:

    4.1.2 软件方法:

    完全使用软件的方法 解决此问题有一定难度并且有很大的局限性。

    4.1.3 硬件方法:

    • 利用Test-and-Set指令实现互斥
    • 利用Swap指令实现进程互斥

    4.1.4 信号量机制

    • 对信号量的操作:信号量机制是一种非常有效的进程同步工具

      • 1.记录型信号量机制
        • 记录型数据结构描述

        •    typedef struct {
                int value;  //代表资源数
           	 list of process *L;  //进程链表L,用于链接所有等待该信号量代表资源的进程
            }  semaphore;
          

          在这里插入图片描述

        • 对信号量的操作:
          信号量除初始化外,仅能通过两个标准的原子操作wait(s)和signal(s)来访问。这两个操作很长时间以来被称为P、V操作。

        • 信号量的物理含义:

          • S.value>0时 S.value表示可使用的资源数或表示可使用资源的进程数;
          • S.value=0时 S.value表示无资源可供使用或表示不允许进程得到该资源;
          • S.value<0时 S.value表示等待使用资源的进程个数或表示等待该资源的进程个数。
        • wait原语:申请一个资源,得到就继续,得不到就阻塞

            void  wait (static  semaphore  s)
            {
             s.value - -;
             if (s.value<0)   block(s.L);
            } 
          
        • singal原语: 释放一个资源,有进程等待则唤醒一个

           void signal ( static  semaphore  s)
           	{
               s.value++;
              if (s.value <= 0)  wackup(s.L);
             } 
          
        • 利用信号量实现进程互斥的过程描述
          为使多个进程互斥地访问某个临界资源,只需为该资源设置一个信号量,并设其初始值为1。此信号量可称为“互斥信号量”。
          《操作系统第四版》(刘振鹏 王煜)复习总结_第8张图片
          进程1,进程2 同时执行,并不存在顺序关系。

    • 2.信号量集机制

      • AND型信号量集机制
        .引入:
        假定现有两个进程P和Q,它们都要求同时访问共享数据A和B。共享数据都应作为临界资源,为此,可为这两个数据分别设置用于互斥的信号量Amutex和Bmutex,并令它们的初值为1(表示可以被访问)。这时容易产生死锁的情况。
        对若干个临界资源的分配采取原子操作方式,要么全部分配到进程,要么一个也不分配,这称为AND同步,可以通过信号量集机制实现(Swait,Ssignal)
        • Swait操作:

             Swait(S1, S2, … , Sn)
             {  
                 if (S1≥1&&…&&Sn≥1)
             	for (i=1;  i<=n;  i++)     Si -- ;
             	 else  {
             		阻塞该进程,并将其插入到 等待资源Si的阻塞队列中;
             		 将程序计数器PC重新指向Swait 操作的第一条语句。
             			     }
               }
          
        • Ssignal操作:

          Ssignal (S1, S2, … , Sn)
          {
               for (i=1; i<=n; i++)
                {
                      Si++;
                      将所有等待Si资源的进程唤醒;
                 }
          }
          
      • 一般“信号量集”机制
        一次分配多个某种资源,且当该资源数量少于一定值时,不予分配。因此,在每次分配之前都必须测试该资源的数量是否大于测试值t
        • Swait操作

           Swait(S1,t1,d1, S2,t2,d2, … , Sn,tn,dn)
           {
              if (S1>=t1 && … && Sn>=tn)
                     for (i=1;i<=n;i++)         Si=Si-di; 
              else   {
                   阻塞该进程,并将其插入到等待资源Si的阻塞队列中;
                   将程序计数器PC重新指向Swait 操作的第一条语句。
                       }
          } 
          
        • Ssignal操作

             Ssignal(S1,t1,d1, S2,t2,d2, … , Sn,tn,dn)
             {     for (i=1;i<=n;i++)
                  {      Si=Si+di;
                   唤醒所有等待资源 Si的进程;
                   }
               }
          

4.1.5 经典进程同步问题

  • 用信号量实现互斥:

《操作系统第四版》(刘振鹏 王煜)复习总结_第9张图片
黄色部分是循环使用互斥临界区的使用,标准写法:
1.进入区 申请资源
2. 临界区 使用临界区
3.退出区 释放资源
4.剩余区 退出临界区
注意:
- 实现互斥必须使 P操作-wait (mutex),V操作-signal(mutex) 成对出现
- mutex的变化:
- 初始状态:mutex:=1 表示没有并发进程使用临界区
- 一个进程申请成功 执行wait操作:mutex := 0
- 另一个进程也在申请 mutex:=-1; 则申请失败 而且此进程要进入阻塞队列
- 释放资源 mutex :=0 释放资源 并且从阻塞队列里找到想要使用资源的进程

  • 生产者-消费者问题–

    • 有一群生产者进程在生产产品,并将此产品提供给消费者进程去消费

    • 利用记录型信号量解决生产者-消费者问题 —整型数和链表
      《操作系统第四版》(刘振鹏 王煜)复习总结_第10张图片
      初始的时候:full=0,empty=n

      semaphore mutex=1, empty=n, full=0;
      item buffer[n];
      int in=out=0;
      void producer(){
         while (1) {  
        …
        produce an item in nextp; //生产一个产品
        ...
        wait(empty); //判断空缓冲区的个数 申请一个空缓冲区 empty-1
        wait(mutex); //护持信号量 判断缓冲池是否可用
        buffer[in]=nextp;//临界区 将下一个产品放入下标为in的数组
        in=(in+1) % n;//临界区 
         signal(mutex);//释放缓冲池
         signal(full);//将full+1
       }
      }
      void consumer() //消费者 保证安全取出数据
      {
       while (1)  {
          ...wait(full);//申请一个full 缓冲区 
        wait(mutex); //申请缓冲池 判断有没有生产者在用
        nextc=buffer[out]; //取出 下标为OUT的 作为下一个消费品
        out=(out+1)%n;  //下标+1
        signal(mutex);  //退出区
        signal(empty); //释放一个空缓冲区
        ...
        consume the item in nextc;  //消费
         …}
       }
      main()
         { 
           cobegin  {
                producer();
                consumer(); 
                 }
         }
      
    • 利用AND信号量解决生产者-消费者问题

         semaphore  mutex1=1,     
         mutex2=1, empty=n,full=0;
        item buffer[n];
        int in=out=0;
        void producer()
        { 
        	while (1)
            {    …
            produce an item in nextp;
               ...
            Swait(empty, mutex1);
            buffer[in]=nextp;
            in=(in+1) mod n;
            Ssignal(mutex1, full);
          }
        }
        void consumer()
        {  
          while (1)
          {   ...
            Swait(full, mutex2);
            nextc=buffer[out];
            out=(out+1) mod n;
            Ssignal(mutex2, empty);
            ...
            consume the item in nextc;
            …
           }
         }
        main()
        { 
          cobegin  {
               producer();
               consumer(); 
                }
        }
      
  • 哲学家进餐问题

    • 有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们共用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有五个碗和五支筷子。平时,哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐毕,放下筷子继续思考。

    • 利用记录型信号量解决哲学家进餐问题
      《操作系统第四版》(刘振鹏 王煜)复习总结_第11张图片

      	   semaphore chopstick[5]={1,1,1,1,1};/筷子
      	       void process(int i)
      	       {
      	          while (1)   {
      	              wait(chopstick[i]); //拿起左边的筷子 
      	              wait(chopstick[(i+1) mod 5]);//拿起右边的筷子 这里左右不分 临近的加一就可以了
      	              ...
      	              eat;//吃饭
      	              ...
      	              signal(chopstick[i]);
      	              signal(chopstick[(i+1) mod 5]); //释放筷子
      	              ...
      	              think;
      	           }
      	        }
      

      《操作系统第四版》(刘振鹏 王煜)复习总结_第12张图片

      • 几种解决办法:
        ①至多只允许四个哲学家同时请求进餐,以保证至少有一个哲学家能够真正进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。
        ②仅当哲学家的左、右两支筷子均可用时才允许他拿起筷子进餐。
        ③规定奇数号哲学家先拿他左边的筷子,然后再去拿他右边的筷子;而偶数号哲学家则相反。

      • 利用AND信号量机制解决哲学家进餐问题
        AND型信号量:宁可锦上添花,绝不雪中送炭**

          semaphore chopstick[5]={1,1,1,1,1};
          void process(int i)
          { while (1)
            { Swait(chopstick[(i+1) mod 5], chopstick[i]); //swit同时可以 奇数和偶数都满足才可以 采用原子操作
                  ...
                  eat;
              Ssignal(chopstick[(i+1) mod 5], chopstick[i]);
                  ...
                 think; }
          }
          main()
          {cobegin { process(0);
                     process(1);
                     process(2);
                     process(3);
                     process(4); }
          }
        
  • 读者写者问题

    • 所谓读者-写者问题(The Reader-Writer Problem)是只保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题

    • 利用记录型信号量解决第一类读者-写着问题
      《操作系统第四版》(刘振鹏 王煜)复习总结_第13张图片

      • 这里变量作为临界资源

        semaphore rmutex=mutex=1;
        int readcount=0;
        void reader(int i)
        {
        while (1)
          {  ...
            wait(rmutex);
            if (readcount==0)  wait(wmutex);//==0表示无reader进程在读 reader进程才需要执行PC操作等待信号量 若P操作成功 reader便去读
            readcount++;//readercount就是一个数
            signal(rmutex);//读完之后释放
            perform read operation;  ……
            wait(rmutex);
            readcount--;
            if(readcount==0)signal(wmutex);//当没有reader时可以执行writer操作
            signal(rmutex); 
            ...  
          }
        } 
        void writer(int j)
        {
        while (1)
          {   ...
             wait(wmutex);
             perform write operation;
             signal(wmutex);
              ...
            }
          } 
         main()
         {
         	cobegin {
             reader(1);
                …
             reader(n);
             writer(1);
                ...
             writer(m);}
             }  
        

4.1.6 管程机制

  • 管程的定义
    一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据.

  • 管程的组成

    • 局部于管程的共享变量说明
    • 对该数据结构进行操作的一组过程
    • 对局部于管程的数据设置初值的语句

4.2 进程通信

  • 基本概念
    • 进程通信是指进程之间的信息交换
    • 进程的互斥和同步可归结为低级通信
    • 高级通信是指用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式
      (通信量大,对用户透明)

4.2.1 进程通信的类型(高级通信机制)

  • 共享存储器系统
    • 基于共享数据结构的通信方式 (小,低级通信)
    • 基于共享存储区的通信方式 (大,高级通信)
  • 消息传递系统
    • 进程间的数据交换以消息为单位 (也叫报文
    • 4.2.2 直接通信方式

      • 直接通信方式是指发送进程利用操作系统所提供的发送命令直接把消息发送给目标进程。系统提供下述两条通信原语:

        send(receiver,message); //receiver 表示的是进程标识符
        receive(sender,message);

      • 利用直接进程通信原语来解决生产者-消费者问题

          void producer()
        {     while (1)
              {    … 
                    produce an item in nextp;
                    …
                    send(consumer, nextp);  //发送
                }
         } 
         void consumer()
         {  while (1)
             {   …
                 receive(producer, nextc); //接收
                  …
                  consume the item in nextc;
              }
          }
         
          main()
          {cobegin {
             producer();
             consumer();
               }
           }
        
      过程对用户透明了 由操作系统完成了
    • 间接通信方式 (信箱通信方式)
      • 所谓间接通信方式,是指进程之间的通信需要通过作为某种共享数据结构的实体,该实体用来暂存发送进程发送给目标进程的消息;接收进程则从该实体中取出对方发送给自己的消息。通常把这种中间实体称为信箱
  • 管道通信
    • 所谓管道是指用于连接一个读进程和一个写进程以实现它们之间通信的共享文件(实质就是文件 文件系统放在外存上),又称为pipe文件
    • 为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:互斥、同步、双方是否存在

4.2.3 消息缓冲队列通信机制

  • 在这种通信机制中,发送进程利用send原语将消息直接发送给接收进程;接收进程则利用receive原语接收消息.
  • 消息缓冲队列通信机制中的数据结构
    • 消息缓冲区

         struct  message_buffer{
                sender;     // 发送者进程标识符
                size;          // 消息长度
                text;          // 消息正文
                 next;        // 指向下一个消息缓冲区的指针
               }; 
      
    • PCB中有关通信的数据项 在PCB中应增加的数据项可描述为

         struct  processcontrol_block{
               …
               mq;         // 消息队列队首指针
               mutex;             // 消息队列互斥信号量
               sm;         // 消息队列资源信号量
               …
           }; 
      

4.3 死锁

  • 所谓死锁是指在多道程序系统中,一组进程中的每一个进程均无限期地等待被该组中的另一个进程占有且永远不会释放的资源;这种现象称系统处于死锁状态,简称死锁。处于死锁状态的进程称为死锁进程.
  • 产生死锁的原因(有2个)
    • 由竞争资源引起死锁
      多个进程,共享资源,资源不足,竞争资源
      -竞争可剥夺性资源 :例如:CPU
      -竞争非剥夺性资源 :例如打印机,磁带机
      -竞争临时性资源
    • 进程推进顺序不当引起死锁
  • 产生死锁的四个必要条件:
    • 互斥调件
    • 请求和保持条件
    • 不剥夺条件
    • 环路等待条件
  • 解决死锁的基本方法 (四个)
    • 预防死锁
      通过设置某些限制条件,以破坏产生死锁的四个必要条件中的一个或几个,来防止发生死锁。

      • 摒弃“请求和保持”条件 :系统要求所有进程一次性地申请其所需的全部资源
      • 摒弃“不剥夺”条件:一个已保持了某些资源的进程,若新的资源要求不能立即得到满足,它必须释放已保持的所有资源
      • 摒弃“环路等待”条件 将所有的资源按类型进行线性排队,并赋予不同的序号,所有进程对资源的请求,必须严格按资源序号递增的次序提出
    • 避免死锁
      在资源的动态分配过程中,使用某种方法去防止系统进入不安全状态,从而避免了死锁的发生。
      安全与不安全状态
      安全状态:系统能按某种进程顺序 来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。
      银行家算法!!!重要!!!

      • 基本思想

        • 银行的总资产是一定的,已经发放的贷款、客户还需要的贷款也是已知的;
        • 为保障银行不破产,每当一个客户申请贷款时,都进行检查,看看如果贷给他的话后面的业务能否顺利进行下去;
        • 如果能,就贷给他;否则,让他等着。
      • 银行家算法中的数据结构(假设有n个进程、m类资源)

        • 可利用资源向量Available
        • 最大需求矩阵Max
        • 分配矩阵Allocation
        • 需求矩阵Need
      • 银行家算法
        (1) 设Requesti是进程Pi的请求向量。如果Requesti[j]=k,表示进程Pi需要k个Rj类型的资源,要求:Requesti≤Needi &&Requesti≤Available
        (2)系统试探把要求的资源分配给进程Pi并修改下面数据结构中的数值:

                  Available=Available–Requesti;
                  Allocationi=Allocationi+Requesti;
                  Needi=Needi–Requesti;
        

        (3)系统执行安全性算法若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待,即:

          Available=Available+Requesti;
          Allocationi=Allocationi-Requesti;
          Needi=Needi+Requesti;
        
      • 安全性算法
        ① 设置并初始化两个向量:Work和Finish
        工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目;标志向量Finish,它表示系统是否有足够的资源分配给进程使之运行完成。

        初始化:Work = Available; Finish = 0;

        ② 从进程集合中找到一个能满足下述条件的进程

         Finish[i]==0 && Needi≤Work 
        

        如找到,则执行步骤③,否则执行步骤④。
        ③ 当进程Pi获得资源后,顺利执行,直至完成并释放出分配给它的资源,故应执行:

        Work=Work+Allocationi;
        Finish[i]=1;
        go to step 2;

        ④ 如果所有进程的Finish[i]==1,则表示系统处于安全状态,否则系统处于不安全状态。
        《操作系统第四版》(刘振鹏 王煜)复习总结_第14张图片

    • 检测死锁

检测死锁方法允许系统运行过程中发生死锁。但通过系统所设置的检测机构,可以及时检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中消除所发生的死锁

  • 解除死锁
    • 剥夺资源
    • 撤销进程

操作系统(五)

五、

5.1

操作系统(六)

操作系统

操作系统

操作系统

操作系统

你可能感兴趣的:(计算机基础必备)