操作系统note

操作系统

操作系统概述

什么是操作系统?

【操作系统简称OS,是管理计算机硬件与软件资源的计算机程序】

  • 计算机系统的构成
    • 用户
    • 应用程序
    • 操作系统
    • 硬件(裸机)
  • 操作系统是一种【系统软件】
    • 与硬件交互
    • 对资源共享进行调度管理
    • 解决并发操作处理中存在的协调问题
    • 数据结构复杂,外部接口多样化,便于用户反复使用
  • 操作系统做了什么?
    • 管理与配置内存
    • 决定系统资源供需的优先次序
    • 控制输入设备与输出设备
    • 操作网络与管理文件系统等基本事务
    • 提供一个让用户与操作系统交互的操作界面

操作系统目标和功能

目标

  • 有效性【管理系统资源】
    • 提高系统资源利用率
    • 提高系统吞吐量
  • 方便性【方便用户使用】
  • 可扩充性【作为扩充机器】
  • 开放性【作为扩充机器】
    • 兼容各个国家的软件

功能

  • 作为计算机资源的管理者
处理机管理1. 进程控制 2. 进程同步 3.进程通信 4.调度
存储器管理1. 内存分配 2.内存保护 3.地址映射 4.内存扩充
I/O设备管理1.缓冲管理 2.设备分配 3.设备处理
文件管理1.文件存储空间的管理 2.目录管理 3.文件的读/写管理和保护
  • 作为用户与计算机硬件系统之间的接口

    • 程序接口
    • 命令接口
    • GUI
  • 实现了对计算机资源的抽象

    • 将具体的计算机硬件资源抽象成软件资源,方便用户使用
    • 开放了简单的访问方式,隐藏了实现细节

操作系统特征

四个特征:并发,共享,虚拟,异步

并发是虚拟,共享,异步的前提,共享也是并发的前提

  • 并发
    • 同一个事件间隔内执行和调度多个程序的能力
    • 宏观上,处理机同时执行多道程序
    • 微观上,处理机在多道程序间高速切换(分时交替执行)
    • 关注单个处理机同一时间段内处理任务数量的能力
    • 相似概念【并行】–同一时刻,同一个时间点
  • 共享
    • 供多个并发执行的程序共同使用资源
    • 同时访问方式:同一时段允许多个程序同时访问共享资源
    • 互斥共享方式:也叫做独占式,允许多个程序在同一个共享资源上互不干扰的工作
    • 共享打印机、音频设备【一般都是独占式】
  • 虚拟
    • 使用某种技术把一个物理实体变成多个逻辑上的对应物
    • 时分复用技术
      • 虚拟处理机技术:“四核八线程”
      • 虚拟设备技术:虚拟打印机
    • 空分复用技术
      • 虚拟磁盘技术:将一块硬盘虚拟出若干个卷
      • 虚拟存储器技术
  • 异步
    • 多道程序环境下,允许多个程序并发执行
    • 单处理机下,多个程序分时交替执行
    • 【程序执行的不可预知性】
      • 获得运行的时机
      • 为什么暂停
      • 每个程序需要多少时间
      • 不同程序的性能,比如计算多少,IO多少
    • 宏观上“一气呵成”,微观上“走走停停”

操作系统运行机制⭐

基本概念:

内核程序<--->应用程序
核心态<--->用户态			【核心态别名:管态、内核态、系统态、特权态】
特权指令<--->非特权指令
目态--->管态只有一种方式:中断(访管指令(陷入指令)或系统调用)

内核态用户态

  • 时钟管理

    • 计时:提供系统时间
    • 时钟中断:比如进程切换
  • 中断机制

    • 提高多道程序环境下CPU利用率

    • 外中断:中断信号来源于 外部设备

    • 内中断:中断信号来源于 当前指令

      • 陷阱/陷入: 由应用程序主动引发【系统调用】–用户态–>内核态
      • 故障:由错误条件引发
      • 终止:由致命错误引发
    • 处理过程:

    中断处理

  • 原语–运行在内核空间,操作系统底层运行机制

    • 由若干条指令组成【是一个程序段】
    • 用来完成某个特定功能
    • 执行过程不会中断【具有原子性】
  • 系统数据结构

    • 进程管理:作业控制块、进程控制块
    • 存储器管理:存储器分配与回收
    • 设备管理:缓冲区、设备控制块
  • 系统调用【运行在核心态】

    • 由操作系统实现,给应用程序调用

    • 是一套接口的集合

    • 应用程序访问内核服务的方式

    • 通过陷入指令(也叫房管指令)【用户空间】实现,管理区域是虚线以下

系统调用

面试题:什么是零拷贝?

拷贝过程中会出现内核空间和用户空间会反复进行切换,造成损耗。零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。

操作系统体系结构

传统操作系统【大内核】

  • 第一代:无结构OS
    • 一系列过程的集合,过程间可以相互调用
    • 结构复杂混乱,难以调试、阅读和维护
  • 第二代:模块化OS
    • 基于分解和模块化原则
    • 按照功能划分模块,规定模块间接口
    • 模块独立性标准:高聚合、低耦合
    • 优点
      • 提高OS设计的正确性、可理解性和可维护性
      • 增强OS 的适应性
      • 加速开发过程
    • 缺点
      • 模块接口设计难以扩展后续需求
      • 模块设计没有统一决策标准,导致模块接口设计不可靠
  • 第三代:分层式OS
    • 有序分层法,自顶向下依次依赖
    • 设计时自底向上,每一步简历在可靠的基础上
    • 优点缺点
      • 容易保证系统正确性
      • 容易扩充和维护
      • 自上而下的层次通信,导致系统效率降低
  • 第四代:微内核
    • 足够小的内核,只实现OS 的核心功能,不是完整的os

    • 微内核

    • 采用机制与策略分类原理

    • 使用面向对象技术

    • 优点:

      • 提高OS可扩展性,可靠性,可移植性
      • 支持分布式系统
      • 融入面向对象技术
    • 缺点

      • 相较于早期OS,降低了一定的效率

进程管理⭐

1、什么是进程?

概念

进程是一个具有一定独立功能的程序关于某个集合的一次运行活动,是系统进行『资源分配和调度』的一个独立单位。

几个要点:

  • 进程是程序一次执行
  • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  • 进程是程序在一个数据集合上运行过程
  • 进程是系统进行资源分配和调度的一个独立单位

进程实体(映像)的结构

  • 控制块(PCB)–操作系统唯一标识

    • 进程描述信息(PID、UID)
    • 进程控制和管理信息(进程当前状态、进程优先级)
    • 资源分配清单(程序段指针、数据段指针、键盘、鼠标)
    • 处理机相关信息(寄存器)
  • 数据段

  • 程序段

    进程结构

特征
  • 动态性:由创建而生,由撤销而亡
  • 并发性:多个进程同时运行
  • 独立性:独立资源分配
  • 异步性:相互独立,互不干扰
进程的组织

进程的组成说的是一个进程内部由哪些部分构成,而进程的组织讨论的是多个进程之间的组织方式。

  • 链接方式

    • 按照进程状态将PCB分为多个队列
    • 操作系统持有指向各个队列的指针
      进程组织_链接方式
  • 索引方式

    • 根据进程状态的不同,简历几张索引表

    • 操作系统持有指向各个索引表的指针

进程组织_索引方式

进程与线程

线程 ?

  • 进程的轻形实体,是一系列活动按事先设定好的顺序一次执行的过程,是一些列指令的集合
  • 是一条执行路径,不能单独存在,必须包含在进程中
  • 线程时OS调度的最小单位
  • 引入线程是为了提高OS 的并发性

线程属性:

  • 轻型实体
  • 独立调度和分派的基本单位
  • 可并发执行
  • 共享进程资源

进程线程比较

  • 调度
  • 拥有资源
    • 线程不拥有资源(寄存器、io设备)
    • 同一进程中,所有线程共享进程资源,共享同一块内存空间
  • 并发性
    • 操作系统引入进程提高并发性
    • 引入线程进一步提高并发性
  • 系统开销
    • 进程开销大
    • 线程开销相对而言小,每一个线程保存少量寄存器内容
  • 地址空间和其他资源
  • 通信

线程实现方式

  • 用户级线程(ULT):cpu只有进程级别,看不到进程内部的线程,线程不支持并行。线程切换本质上是进程的切换。

  • 内核级线程(KLT):cpu级别的线程,支持并行。线程调度开销大,因为用户线程会切换到内核线程,内核线程再切换到另一个线程。
    线程实现方式

  • 组合方式:内核空间和用户空间时多对多的关系,用户空间的线程更多些。

2、进程是怎么运行的?

进程状态
  • 创建状态:进程刚刚创建好,还没到达就绪状态

  • 就绪状态:进程随时可以运行,获得了除了处理器之外的一切资源,等待处理器分配时间片就可以运行

  • 运行状态:在运行,单核CPU一次只能运行一个进程

  • 阻塞状态:进程正在等待某一个事件而暂停运行【等待io或者什么资源】,这时候即使处理器空闲它也不会 运行

  • 结束状态:进程从系统中消失。可能是正常结束或者中断退出。

进程状态转换

进程控制—原语

进程控制是对进程实现有效的管理,包括创建新的进程,撤销已有进程、挂起、阻塞和唤醒、进程切换等多种操作。OS通过原语实现进程控制。

原语的概念:由若干条指令组成,完成特定的功能,是一种原子操作。本质就是一个可以完成特定功能的程序,封装了很多指令。操作系统中的指令能封装成原语就封装成原语,可以提高操作效率。

特点:

  • 原子操作,要么都做,要么都不做,所以执行过程不会中断。原子虽然是不可中断的,但是它不是只有一个操作。
  • 在管态/内核态下执行,常驻内存
  • 是内核三大支持功能之一(中断处理/时钟管理/原语操作)

进程控制相关的原语:

  • 创建原语create

  • 阻塞原语 block

  • 唤醒原语wakeup

  • 撤销原语destory

进程

挂起与激活

为了系统和用户观察和分析进程

  • 挂起原语 suspend

    • 静止就绪:放外存,不调度(挂起不属于进程状态的原因,它已经被放进了外存中)
    • 静止阻塞:等待事件
  • 激活原语 active

    • 活动就绪:等待调度
    • 活动阻塞:等待唤醒
  • 注意: 执行状态不能直接挂起

挂起和激活

进程调度

进程的调度也叫做处理机调度,根据一定的算法和原则将处理机资源进行重新分配的过程。

前提: 作业/进程数远远大于处理机数量

目的: 提高资源(cpu)利用率,减少处理机空闲时间

调度程序: 一方面要满足特定系统用户的需求(快速响应),另一方面要考虑系统整体效率(系统平均周转时间)和调度算法本身的开销。

处理机调度层次

  • 高级调度/作业调度

    • 把后备作业调入内存

    • 只调入一次,调出一次

      作业调度

  • 中级调度/内存调度(挂起的过程)

    • 将进程调至外存,条件合适再调入内存
    • 在内外存对换区进行进程对换
  • 低级调度/进程调度(重点)

    • 从就绪队列选取进程分配给处理机
    • 最基本的调度,频率非常高(相当于一个时间片完成)

处理机调度方式

  • 抢占式/剥夺式调度
    • 立即暂停当前进程
    • 分配处理机给另一个进程
    • 原则:优先权/短进程优先/时间片原则
  • 非剥夺/非抢占式调度
    • 若有进程请求执行
    • 等待直到当前进程完成或阻塞
    • 缺点:适用于批处理请求,不适用分时/实时系统

处理机调度时机(了解)

  • 进程运行完毕
  • 进程时间片用完
  • 进程要求I/O操作
  • 执行某种原语操作
  • 高优先级进程申请运行(抢占式调度)

处理机调度过程

  • 保存镜像:记录进程现场信息
  • 调度算法:确定分配处理机的原则
  • 进程切换:分配处理机给其他进程
  • 处理机回收:从进程收回处理机

进程调度算法指标:

  • cpu利用率–忙碌时间/总时间 越高越好
  • 系统吞吐量 单位时间完成作业数 越高越好
  • 周转时间 完成-提交 越低越好
  • 等待时间越低越好
  • 响应时间越低越好

进程切换过程

  1. 检查是否允许上下文切换,有可能某进程处于原语操作中,不允许切换
  2. 保存当前进程上下文,包括程序计数器和寄存器
  3. 更新PCB信息—操作进程就是操作PCB
  4. 把此进程的PCB移入队列,比如就绪 队列,或因某种事件的阻塞队列
  5. 选择另一个(就绪状态)进程执行,并更新其PCB
  6. 更新内存管理的数据结构
  7. 恢复所选进程的上下文,将CPU执行权交给所选进程

调度算法

  • 先来先服务(FCFS)

    • 调度作业/就绪队列始中最先入队者,等待操作完成或者阻塞
    • 算法原则:按照作业/进程到达顺序进行服务
    • 调度方式:非抢占式
    • 使用场景:作业/进程调度
    • 优缺点:
      • 有利于cpu繁忙型作业 ,充分利用cpu资源
      • 不利于I/O繁忙型作业,操作耗时,其他饥饿
  • 短作业优先(SJF)

    • 算法内容:所需执行最短的服务先执行
    • 算法原则:追求最少平均(带权)周转时间
    • 调度方式:SJF/SPF非抢占式
    • 使用场景:作业/进程调度
    • 优缺点
      • 平均等待/周转时间最少
      • 长作业周转时间会增加或饥饿
      • 估计时间不准确,不能保证紧迫任务及时处理
    • SRTN抢占式:最短剩余时间优先(时间片到了之后会有剩余时间,选择时选择最短剩余时间去执行)
  • 高响应比优先调度(HRRN)

    • 算法内容:结合先来先服务和短作业优先原则,综合考虑等待时间和服务时间计算响应比,高的优先调度
    • 算法原则:综合考虑作业/进程的等待时间和服务时间
    • 调度方式:非抢占式
    • 适用场景:作业/进程调度
    • 响应比计算:
      • 相应比=(等待时间+服务时间)/服务时间
      • 只有当前进程放弃执行权,重新计算所有进程响应比
      • 长作业等待越久响应比越高,更容易获得处理机
  • 优先级调度(PSA)

    • 算法内容:又叫优先权调度,按照作业/进程的优先级(紧迫程度)进行调度
    • 原则:优先级最高的作业/进程最先调度
    • 调度方式:抢占/非抢占式(不能获得及时执行)
    • 使用场景:作业/进程调度
    • 优先级设置原则:
      • 静态/动态优先级
      • 系统>用户;交互型>非交互型;I/O型>计算型
      • 低优先级进程可能会产生饥饿
  • 时间片轮转调度(RR)

    • 内容:按照进程到达就绪队列的顺序,轮流分配一个时间片执行,时间用完直接剥夺
    • 原则:公平轮流给每个进程都服务,进程在一定时间内都能得到响应
    • 调度方式:抢占式,由时钟中断确定时间到
    • 使用场景:进程调度(作业调度是一次性的,加载就是作业)
    • 优缺点
      • 公平,响应快,适用于分时系统
      • 时间片决定因素:系统响应时间、就绪队列进程数量、系统处理能力
      • 时间片太大,相当于FCFS;太小。处理机切换频繁,开销增大
  • 多级反馈队列调度(MFQ)

    • 内容:设置多个按优先级排序的就绪队列,优先级从高到低,时间片从小到大,新进程采用队列降级法,前面队列不空,不执行后续队列进程。进程来了先进入优先级高的队列,执行一次后进入优先级第二的队列。。。

    • 原则:集合前几种算法优点

    • 调度方式:抢占式

    • 使用场景:进程调度

    • 优点:

      • 对各种类型的进程相对公平,快速响应
      • 终端型作业用户:短作业优先
      • 批处理作业用户:周转时间短
      • 长批处理作业用户:在前几个队列部分执行

      多级反馈

3、进程之间是怎么协作的?

进程通信

进程间通信:详解

七种方式:

  • 1)管道【匿名管道】

    • 一个循环队列, 只能一端读取一端写入。
    • 只能用于具有亲缘关系的进程之间。
    • 缓冲区有限【管道只存在于内存中,在管道创建时,为缓冲区分配一个页面大小】
    • 传输的是无格式字节流,要求进程事前约定好数据传输格式,比如多少字节做一个消息之类的。
  • 2)有名管道【FIFO】

    • 为了解决匿名管道只能在具有亲缘关系的进程之间使用。
    • 提供了一个路径与之关联,以有名管道的文件形式存储于文件系统中,这样即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径就可以通过有名管道之间通信。
    • 有名管道的名字存在于文件系统中,内容放在内存中。

【管道总结】

  • 管道是一种类型特殊的文件,在满足先进先出的条件下可以进行读写,但是不能进行定位读写

  • 匿名管道是单向的,只能在有亲缘关系的进程之间通信,有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。

  • 【无名管道阻塞问题】无名管道无需显示打开,创建时直接返回文件描述符,在读写时需要确定对方的存在,否则将退出。如果当前进程向无名管道的一端写数据,必须确定另一端有某一进程。如果写入无名管道的数据超过其最大值,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果管道发现另一端断开,将自动退出。

  • 【有名管道阻塞问题】有名管道在打开时要确认对方是否存在,否则将阻塞。即以读的方式打开某个管道,在此之前必须一个进程以写方式打开管道,否则阻塞。此外可以使用读写模式打开有名管道,即当前进程读,当前进程写,不会阻塞。

  • 3) 信号

    • 进程之前相互通信的一种机制,可以在任何时候发给某一进程,而无需知道该进程的状态。
    • 如果该进程当前并未处于执行状态,则该信号会由内核保存,直到该进程恢复执行并传递给它为止。
    • 【信号来源】
      • 信号是软件层次上对中断机制的一种模拟,是一种异步通信方式,信号可以在用户空间进程和内核之间直接交互,内核可以利用信号来通知用户空间的进程发生了哪些系统事件,信号事件两个来源
        • 硬件来源:用户按键输入ctrl+c 退出,硬件异常如无效的存储访问等
        • 软件终止:终止进程信号,其他进程调用kill函数、软件异常产生信号
  • 4)消息队列

    • 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示
    • 与管道不同的是消息队列存放在内核中,只有在内核重启(操作系统重启)或者显示的删除一个消息队列时,该消息队列才会被真正的删除
    • 消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到来。
    • 特点:
      • 消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识
      • 消息队列允许一个或多个进程向它写入与读取消息
      • 管道和消息队列都是先进先出的原则
      • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的方式读取,可以按消息类型读取,更有优势
      • 消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及受缓冲区内存大小限制。
      • 目前主要两种类型的消息队列:POSIX消息队列以及System V消息队列,系统V消息队列目前被大量使用。系统V消息队列是随内核持续的,只有在内核重启或者人工删除时,消息队列才会被删除
  • 5)共享内存

    • 多个进程可以直接读取同一块内存空间,时最快的可用IPC形式。是针对其他通信机制运行效率低而设计的。
    • 为了多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率
    • 由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥
  • 6)信号量

    • 信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步
    • 为了获得共享资源,进程需要进行下列操作
      • 创建一个信号量:要求调用者指定初始值,对于二值信号量来说,通常是1或者0
      • 等待一个信号量:这个操作会测试这个信号量的值,如果小于0,就阻塞。称为P操作
      • 挂出一个信号量:操作将信号量的值+1,称为V操作
    • 信号量在内核中实现。
  • 7)套接字

    • 套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。

进程同步

协调进程间的相互制约关系,使他们按照预期的方式(一定规则)执行的过程

前提

  • 进程是并发执行的,进程间存在着相互制约关系
  • 并发的进程对系统共享资源进行竞争
  • 进程通信,过程中相互发送的信号称为消息或者事件

两种制约形式

  • 间接(互斥):进程排他性访问共享资源
  • 直接(同步):进程间的合作,比如管道通信

互斥的访问临界资源

访问过程

  1. 进入区:尝试进入临界区,成功则加锁
  2. 临界区:访问共享资源
  3. 退出区:解锁,唤醒其他阻塞进程
  4. 剩余区:其他代码

访问规则:

  • 空闲让进:临界区空闲,允许一个进程进入
  • 忙则等待:临界区有进程,其他进程等待
  • 有限等待:处于等待的进程,等待时间有限
  • 让权等待:等待时应让出cpu执行权,防止“忙等待”

互斥的软件实现

  • 单标志法: 每个进程有个标志,标志值与自己访问资源的预期值相同则进行访,必须要求两个线程循环访问,也就是说一个进程的访问权限必须由另一个进程赋予。违背“空闲让进”原则。java中的condition使用了这种思想。
  • 双标志先检查:设置一个flag[]数组,判断别的进程有没有在访问进程,如果有则等待,没有则访问资源,并把自己的标志设置为true,表示自己在访问资源。缺点:会导致两个进程同时进来,违反”忙则等待“原则
  • 双标志后先查:检查前先把自己的flag置为true,可能会出现两个进程都在等待状态,互相等待一直自旋(死循环)。违背“空闲让进”,“有限等待”
  • 皮特森算法:“孔融让梨”,如果双方都抢着进入临界区,那么就先让对方执行。违背“让权等待”

硬件实现

  • 中断屏蔽:关中断/开中断
    • 禁止一切中断:cpu执行完临界区之前不会切换
    • 关中断可能会被滥用
    • 关中断时间长影响效率
    • 不适用于多处理机,无法防止其他处理机调度其他进程访问临界区
    • 只适用于内核进程(该指令运行于内核态)
  • TS指令–测试并赋值
    • 读出标志并设置为true,返回旧值,原子操作
    • 也被称作为TLS指令(test and set lock)
    • 违背“让权等待”
  • SWAP指令
    • 交换两个变量的值,原子操作
    • 违背“让等待”

信号量?

  • PV操作:等待唤醒
  • 整型信号量:违背”让权等待“,会发生忙等
  • 记录型信号量:进程进入阻塞状态,遵守”让权等待“
  • 它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

管程Monitor–相当于锁

”管理进程":用于实现进程同步的工具。由代表共享资源的数据结构一组过程(进行PV操作的函数)组成的管理程序(封装)。

组成:

  • 名称
  • 局部于管程内部的共享数据结构
  • 对该数据结构操作的一组过程(函数)
  • 管程内共享数据结构的初始化语句

特征:

  • 是一个模块化的基本程序单位,可以单独编译
  • 是一种抽象数据类型(类),包含数据(变量)和操作(函数)
  • 信息掩蔽,共享数据只能被管程内的过程访问

条件变量/条件对象:

  • 进入管程的进程可能由于条件不满足而阻塞
  • 此时进程应释放管程以便其他进程调用管程
  • 进程被阻塞的条件(原因)有多个,移入不同条件队列
  • 进程被移入条件队列后,释放管程

4、如何处理死锁问题?

死锁定义: 多个进程由于竞争资源而造成的阻塞现象,若没有外力作用,这些进程将无法继续推进

产生死锁的原因:

  • 系统资源的竞争
  • 进程推进顺序不合理

死锁产生的必要条件:

  • 互斥:共享资源排他性访问
  • 不剥夺(非抢占):访问时共享资源不会被剥夺
  • 请求并保持(占有):保持当前资源时请求另一个资源
  • 循环等待:存在共享资源的循环等待链

死锁预防

  • 破坏互斥条件:
    • 将只能互斥访问的资源改为同时享用访问(放入队列,排队取)
    • 将独占锁改为共享锁
    • 不是所有资源都能改成可共享的
  • 破坏不剥夺条件
    • 请求新资源无法满足时必须释放已有资源
    • 由OS协助强制剥夺某进程持有的资源
    • 实现复杂,代价高
    • 此操作过多导致原进程任务无法推进
  • 破坏请求并保持条件
    • 进程开始运行时一次性申请到所有的所需资源(静态分配)
      • 资源浪费
      • 进程饥饿
    • 阶段性请求和释放资源
  • 破坏循环等待条件
    • 对所有资源现行排序,按序号请求资源
      • 请求时先低再高
      • 释放时先高再低
    • 对资源的编号相对稳定,限制了新设备增加
    • 进程使用资源的顺序可能与系统编号顺序不同
    • 限制了用户编程

死锁避免:安全性算法

它的角度是允许系统中同时存在四个必要条件 ,只要掌握并发进程中与每个进程有关的资源动态申请情况,做出 明智和合理的选择 ,仍然可以避免死锁,因为四大条件仅仅是产生死锁的必要条件。

  • 系统安全状态
    • 安全状态一定不会出现死锁
    • 不安全状态可能出现死锁
  • 银行家算法
    • 预判进程请求会不会导致系统不安全状态
    • 如果会,则拒绝请求,不会则应答

死锁检测

  • 需要一种数据结构,保持有关资源的请求和分配信息

    • 资源分配图
      • 两种资源
      • 两种节点
  • 提供一种算法,利用这些信息检测是否形成了死锁

    • 死锁定理
      • 当且仅当此状态下的资源分配图时不可完全简化的
      • 简化过程类似于“拓扑排序”算法
  • 步骤:

    1. 如果进程-资源分配图中无环路,则此时系统没有发生死锁
    2. 如果进程-资源分配图中有环路,且每个资源类仅有一个资源,则系统中已经发生了死锁。
    3. 如果进程-资源分配图中有环路,且涉及到的资源类有多个资源,此时系统未必会发生死锁。如果能在进程-资源分配图中找出一个 既不阻塞又非独立的进程 ,该进程能够在有限的时间内归还占有的资源,也就是把边给消除掉了,重复此过程,直到能在有限的时间内 消除所有的边 ,则不会发生死锁,否则会发生死锁。(消除边的过程类似于 拓扑排序)

死锁的解除

  • 资源剥夺
    • 挂起死锁进程
    • 剥夺其资源
    • 将资源分配给其他(死锁)进程
  • 撤销进程
  • 进程回退
    • 回退到足以避免死锁的地步
    • 需要记录进程历史信息,设置还原点

其他内容

僵尸进程

子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。

僵尸进程解决方案

内存管理⭐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值