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

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

1 死锁

  • 临界资源
    每次只允许一个进程访问的资源,分硬件临界资源、软件临界资源。
  • 临界区
    每个进程中访问临界资源的那段程序叫做临界区。
    进程对临界区的访问必须互斥,每次只允许一个进程进去临界区,其他进程等待。


临界区管理的基本原则(重点)

①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入

②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待

③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区

④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”


1.1 死锁的定义

一组进程中,每个进程都无限等待被该组进程中另一进程所占用的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。

如果发生死锁,会浪费大量系统资源,甚至导致系统崩溃,注意:

  • 参与死锁的所有进程都在等待资源
  • 参与死锁的进程是当前系统中所有进程的子集


1.2 死锁的产生原因

资源数量有限、锁和信号量错误使用。

  • 资源的使用方式
“申请-分配-使用-释放”模式
  • 可重用资源:可被多个进程多次使用,又可分为可抢占资源与不可抢占资源,如处理器、I/O部件、内存、文件、数据库、信号量等可抢占资源。
  • 可消耗资源:只可使用一次、可创建和销毁的资源。如信号、中断、消息等。


1.3 活锁和饥饿

image.png

说明:

如图,这里有两个进程都需要使用资源1和资源2。比如这两个进程都上cpu执行,但是进程A执行到第二句的时候需要使用资源2,而进程B执行到第二句的时候需要资源1,但是此时恰好都不能获得各自的资源,这样就进入忙等待(进入轮询看资源是否可用),这就是活锁,也就是先加锁再轮询,这样导致两个进程既无进展也没有阻塞。这和死锁的概念的区别在于死锁的时候进程不能进入cpu去执行。


饥饿:资源分配策略决定


死锁与“饥饿”

  • 饥饿

进程在竞争资源时,一直得不到其想要的资源,因而得不到服务,此时系统中并没有死锁

image.png

1.4 产生死锁的必要条件

  • 互斥使用(资源独占):一个资源每次只能给一个进程使用
  • 占有且等待(请求和保持,部分分配):进程在申请新的资源的同时保持对原有资源的占有。
  • 不可抢占(不可剥夺):资源申请者不能强行的从资源占有着手中多去资源,资源只能由占有着自愿释放
  • 循环等待


存在一个进程等待队列{P1,P2,......,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路。


2 资源分配图(RAG:Resource Allocation Graph)

用有向图描述系统资源和进程的状态

image.png

2.1 资源分配图画法说明

  • 系统由若干类资源构成,一类资源称为一个资源类;每个资源类中包含若干个同种资源,称为资源实例。
  • 资源类:用方框表示。资源实例:用方框中的黑圆点表示。进程:用圆圈中加进程名表示。


image.png

  • 分配边:资源实例–>进程;申请边:进程–>资源类

2.2 死锁定理

  • 如果资源分配图中没有环路,则系统中没有死锁;如果图中存在还礼则系统中可能存在死锁。
  • 如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件。例如:

image.png

2.3 资源分配图化简

化简步骤:


  • 1、找一个非孤立、且只有分配边的进程结点,去掉分配边,将其变为孤立结点
  • 2、再把相应的资源分配给一个等待该资源的进程,即将该进程的申请边变为分配边。
  • 3、重复上述步骤直到找不到资源分配结点。完成之后如果所有结点都变为孤立结点则表示系统中没有死锁,否则系统存在死锁。


目录
相关文章
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
496 32
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
缓存 运维 前端开发
阿里云操作系统控制台:高效解决性能瓶颈与抖动之进程热点追踪
遇到“进程性能瓶颈导致业务异常”等多项业务痛点时,提供高效解决方案,并展示案例。
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2902 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
454 6
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
222 4
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
200 2

推荐镜像

更多