重学操作系统原理系列 - 进程管理(三)

简介: 重学操作系统原理系列 - 进程管理(三)

三、死锁预防

3.1 解决死锁的方法

  • 不考虑此问题(鸵鸟算法)
  • 不让死锁发生
  • 死锁预防。这是一种静态策略:即设计合理的资源分配算法,不让死锁发生
  • 死锁避免。这是一种动态策略:以不让死锁发生为目标,跟踪并评估资源分配过程,根据评估结构决策是否分配
  • 让死锁发生
死锁检测和解除

3.2 死锁预防(Deadlock Prevention)(重点)

  • 定义:在设计系统时,通过确定资源分配算法,排除发生死锁的可能性
  • 具体做法:防止产生死锁的四个必要条件中任何一个条件的发生

3.2.1 破坏“互斥使用/资源独占”条件

  • 资源转换技术:把独占资源变为共享资源
  • SPooling技术的引入,解决不允许任何进程直接占有打印机的问题。设计一个“守护进程/线程”负责管理打印机,进程需要打印时, 将请求发给该daemon,由它完成打印任务。

3.2.2 破坏“占有且等待”条件

  • 实现方案1:要求每个进程在运行前必须一次性申请它所有求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配。当然,这种方案的资源利用率较低,容易出现“饥饿”现象。
  • 实现方案2:在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请。

3.2.3 破坏“不可抢占”条件

  • 实现方案
当一个进程申请的资源被其他进程占用时,可以通过操作系统抢占这一资源(两个进程优先级不同)

局限性:

该方法实现起来比较复杂,要付出很大的代价。

  • 反复地申请和释放资源
  • 进程的执行被无限地推迟


只适用于状态易于保存和恢复的对主存资源和处理器资源的分配适用于资源。如cpu和内存等。


3.2.4 破坏“循环等待”条件

  • 通过定义资源类型的线性顺序实现
  • 实施方案:资源有序分配法
  • 把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配。我们一般根据资源使用的频繁性来进行编号。例如解决哲学家就餐问题。
  • 为什么资源有序分配法不会产生死锁?
    起始就是进程申请的资源编号必须是递增的,比如进程P1申请了资源1、3、9,而进程P2需要资源1、2、5,那么进程P2在申请时必须按照1、2、5的顺序来申请,这样就破坏了环路条件,因为在申请到资源1之前,后面的资源是申请不到的。


存在下述严重问题:

限制了新类型设备的增加。

造成对资源的浪费。

必然会限制用户简单、自主地编程。


四、死锁避免

定义:在系统运行过程中,对进程发出的每一个系统能满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统发生死锁或可能发生死锁(不是安全状态),则不予分配,否则(安全状态)予以分配。


安全状态:如果系统中存在一个所有进程构成的安全序列P1,P2,......,Pn,则称系统处于安全状态。安全状态表示系统一定没有发生死锁。


安全序列

一个进程序列{P1,P2,......,Pn}是安全的,如果对于每个进程Pi(1<= i <= n):它以后还需要的资源数量不超过系统当前剩余资源量与所有进程Pj(j < i)当前占有资源量只和。


不安全状态:系统中不存在一个安全序列。一定会导致死锁。五、死锁避免算法:银行家算法这是Dijkstra在1965年提出的,是仿照银行发放贷款时采取的控制方式而设计的一种死锁避免算法。


应用条件

1、在固定数量的进程中共享数量固定的资源。

2、每个进程预先指定完成工作所需的最大资源数量。

3、进程不能申请比系统中可用资源总数还多的资源。

4、进程等待资源的时间是有限的。

5、如果系统满足了进程对资源的最大需求,那么,进程应该在有限的时间内使用资源,然后归还给系统。


image.png

  • 当进程Pi提出资源申请时,系统执行下列步骤:

(1)若Request[i] <= Need[i],转(2);否则,报错返回。

(2)若Request[i] <= Available,转(3);否则,报错返回。

(3)假设系统分配了资源,则有:

Available = Available - Request[i];
Allocation[i] = Allocation[i] + Request[i];
Need[i] = Need[i] = Request[i]
`</pre>
若系统新状态是安全的,则分配完成;若系统新状态是不安全的,则恢复原来状态,进程等待。
为了进行安全性检查,定义了数据结构:
安全性检查的步骤:
(1)`Work = Available; Finish = false;`
(2)寻找满足条件的`i`:
如果不存在,则转(4)
(3)

`Work = Work + Allocationi ;

转(2)

(4)若对所有i,Finish[i] == true,则系统处于安全状态,否则,系统处于不安全状态。

目录
相关文章
|
2天前
|
算法 调度 UED
深入理解操作系统内存管理:原理与实践
【4月更文挑战第23天】 在现代计算机系统中,操作系统的内存管理是保证系统高效、稳定运行的关键组成部分。本文旨在深入探讨操作系统中内存管理的理论基础、关键技术以及实际操作过程,通过对内存分配策略、虚拟内存技术、分页与分段机制等核心概念的详细解析,为读者提供一个清晰、全面的内存管理视角。此外,文章还将通过案例分析,展示内存管理在解决实际问题中的应用,以期加深读者对操作系统内存管理复杂性的认识和理解。
|
1月前
|
消息中间件 存储 算法
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
82 0
|
1月前
|
存储 消息中间件 算法
《操作系统》——进程与线程
《操作系统》——进程与线程
|
1月前
|
缓存 Linux Shell
Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)
Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)
52 1
|
2月前
|
Java
操作系统基础:进程同步【下】
操作系统基础:进程同步【下】
|
27天前
|
资源调度 监控 算法
深入理解操作系统:进程管理与调度策略
本文旨在探讨操作系统中进程管理的核心概念及其实现机制,特别是进程调度策略对系统性能的影响。通过分析不同类型操作系统的进程调度算法,我们能够了解这些策略如何平衡响应时间、吞吐量和公平性等关键指标。文章首先介绍进程的基本概念和状态转换,随后深入讨论各种调度策略,如先来先服务(FCFS)、短作业优先(SJF)、轮转(RR)以及多级反馈队列(MLQ)。最后,文章将评估现代操作系统在面对多核处理器和虚拟化技术时,进程调度策略的创新趋势。
|
1月前
|
安全 算法 网络安全
深入理解操作系统之进程调度策略网络安全与信息安全:防御前线的关键技术与策略
【2月更文挑战第29天】在多任务操作系统中,进程调度策略是核心机制之一,它决定了CPU资源的分配。本文将探讨三种经典的进程调度算法:先来先服务(FCFS)、短作业优先(SJF)和轮转调度(RR)。通过比较它们的优缺点,我们可以理解不同场景下的性能考量,以及如何根据实际需求选择合适的调度策略。 【2月更文挑战第29天】在数字化时代,网络安全和信息安全已成为维护信息完整性、确保数据隐私以及保障网络服务连续性的重要组成部分。本文将深入探讨网络安全漏洞的概念、加密技术的应用以及提升个人和企业安全意识的重要性。通过分析当前网络威胁的类型和特点,文章旨在为读者提供一系列针对网络攻击的预防措施和应对策略,
|
17天前
|
存储 算法
深入理解操作系统内存管理:原理与实践
【4月更文挑战第8天】 在现代计算机系统中,操作系统扮演着关键角色,特别是在内存资源的管理上。本文将深入探讨操作系统中的内存管理机制,包括虚拟内存、物理内存的分配与回收,以及页面置换算法等关键技术。通过分析不同内存管理策略的优势与局限性,本文旨在为读者提供一套系统的内存管理知识框架,帮助理解操作系统如何高效、安全地管理有限的内存资源以满足多任务处理的需求。
|
18天前
|
算法 Linux 调度
深入理解操作系统的进程调度策略
【4月更文挑战第8天】本文深入剖析了操作系统中的关键组成部分——进程调度策略。首先,我们定义了进程调度并解释了其在资源分配和系统性能中的作用。接着,探讨了几种经典的调度算法,包括先来先服务(FCFS)、短作业优先(SJF)以及多级反馈队列(MLQ)。通过比较这些算法的优缺点,本文揭示了它们在现实世界操作系统中的应用与局限性。最后,文章指出了未来进程调度策略可能的发展方向,特别是针对多核处理器和云计算环境的适应性。
|
18天前
|
算法 调度 UED
深入理解操作系统中的进程调度策略
【4月更文挑战第7天】 在多任务操作系统中,进程调度策略是决定系统性能和响应速度的关键因素之一。本文将探讨现代操作系统中常用的进程调度算法,包括先来先服务、短作业优先、轮转调度以及多级反馈队列等。通过比较各自的优势与局限性,我们旨在为读者提供一个全面的视角,以理解如何根据不同场景选择合适的调度策略,从而优化系统资源分配和提升用户体验。