• 计算机系统(22)----- 管程、死锁


    一、管程

    1.1 定义

    管程是一种特殊的软件模块;

    1.2 组成

    1. 局部于管程的共享数据结构的说明;
    2. 对该数据结构进行操作的一组过程(相当于函数);
    3. 对局部于管程的共享数据设置初始值的语句;
    4. 管程有一个名字;

    1.3 基本特征

    1. 局部于管程的数据只能被局部于管程的过程所访问;
    2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
    3. 每次仅允许一个进程在管程内执行某个内部过程;

    1.4 实现进程互斥和同步

    1. 需要在管程中定义共享数据;
    2. 需要在管程中定义用于访问这些共享数据的 " 入口 " ---- 其实就是一些函数;
    3. 只有通过这些特定的 " 入口 " 才能访问共享数据
    4. 管程中有很多 " 入口 " ,但是每次只能开放其中一个 " 入口 " ,并且只能让一个进程或线程进入
    5. 可在管程中设置条件变量等待 / 唤醒操作以解决同步问题;

    二、死锁

    2.1 定义

    各进程互相等待对方手里的资源,导致各进程都堵塞,无法向前推进的现象;

    2.2 死锁和饥饿、死循环的区别

    死锁:

    • 一定是 " 循环等待其他进程手里的资源 " 导致的;
    • 如果有死锁现象,那至少有两个进程同时发生死锁;
    • 死锁一定处于阻塞态;

    饥饿:

    • 由于长期得不到资源,某进程无法向前推进;
    • 可能只有一个进程发生饥饿;
    • 发生饥饿的进程可能是阻塞态也可能是就绪态,即得不到需要的 I / O 设备或长期得不到处理机;

    死循环:

    • 某个进程执行过程中一直跳不出某一个循环的现象;
    • 可能只有一个程序发生死循环;
    • 可能是程序 bug 导致,可能是程序员故意设计;

    2.3 产生死锁的必要条件

    • 互斥条件:

    只有对必须互斥使用的资源的争抢才会导致死锁;

    • 不剥夺条件:

    进程所获得的资源在未使用完之前不能由其他进程取走,只能主动释放;

    • 请求和保持条件:

    进程至少保持了至少一个资源,并又提出了新的资源请求,而所需的资源又被其他进程所占有,这个时候请求进程被堵塞,但是又对已有资源保持不放;

    • 循环等待条件:

    存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求;

    注:发生死锁时一定有循环等待,但是循环等待时不一定是死锁;

    2.4 什么时候会发生死锁

    1. 对系统资源的竞争:各进程对不可剥夺的资源的竞争可能引起死锁;
    2. 进程推进顺序非法:请求和释放资源的顺序不当也同样会导致死锁;
    3. 信号量使用不当也会造成死锁;

    总结:

    对不可剥夺的资源的不合理分配,可能导致死锁;

  • 相关阅读:
    太神了!开源大佬的SpringBoot+微服务架构笔记,一般人真肝不出来
    【100个 Unity实用技能】| Unity 查询游戏对象位置是否在NavMeshAhent烘焙上的网格上
    UE5 GAS 学习笔记 10.3 LyraStarter案例解析(下)
    基于springboot的医院挂号管理系统
    研究发现GPT-4o等较新的多模态AI模型的安全机制有不足之处
    (附源码)php丽江旅游服务网站系统 毕业设计 010149
    信创需求激增,国产服务器操作系统赋能数字化转型
    《Vue.js 3移动应用开发实战》简介
    在YesDev研发协同工具,项目协作 All In One
    跨平台应用开发进阶(二十七)安卓应用加固签名后应用无法打开
  • 原文地址:https://blog.csdn.net/jc15274630894/article/details/126137856