IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 十天玩转操作系统之最最最最最重点之死锁,一篇文章就搞定!! -> 正文阅读

[系统运维]十天玩转操作系统之最最最最最重点之死锁,一篇文章就搞定!!

操作系统——进程与线程(四)


???????操作系统(OS)这门学科在计算机领域有着很重要的作用,作为计算机硬件和软件的临界者,对计算机发展有着很重要的意义,随着时代的不断发展,越来越多的操作系统进入大众视野,无论是大家耳熟能详的Windows、MAC,抑或是程序员口中经常念叨的Linux。除了电脑操作系统,手机中的鸿蒙、苹果、安卓也是大家关注的热点,因此要想在计算机领域有所造诣,操作系统是必须要了解掌握的一门学科,因此在这里借助平台,跟大家分享一下我学习操作系统的经验和笔记,用十天的时间来和大家梳理和整理这门学科,让我们一起探索其中的奥秘,享受知识带给我们的快乐吧!!!

管程

结合上篇文章,可以了解到信号量机制存在的问题:编程程序困难、易出错

管程特点:管程封装了同步操作,对进程隐蔽了同步细节,简化了同步功能的调用界面。用户编写并发程序如同编写顺序(串行)程序。

管程是一种特殊软件模块:
1、有局部于管程的共享数据结构
2、对该数据结构操作的一组过程
3、对局部于管程的共享数据设置初始值的语句

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

管程的属性:
1、共享性:管程可被系统范围内的进程互斥访问,属于共享资源
2、安全性:管程的局部变量只能由管程的过程访问,不允许进程或其它管程直接访问,管程也不能访问非局部于它的变量。
3、互斥性:多个进程对管程的访问是互斥的。任一时刻,管程中只能有一个活跃进程。
4、封装性:管程内的数据结构是私有的,只能在管程内使用,管程内的过程也只能使用管程内的数据结构。进程通过调用管程的过程使用临界资源。管程在Java中已实现。

伪代码实现:

monitor ProducerConsumer
    condition full,empty;    //条件变量用来实现同步(排队)
    int count=0;                //缓冲区中的产品数
    void insert(Item item){   //把产品item放入缓冲区
        if(count==N)
            wait(full);
        count++;
        insert_item(item);
        if(count==1)
            signal(empty);
    }
    Item remove(){            //从缓冲区中取出一个产品
        if(count==0wait(empty);
        count--;
        if(count==N-1)
            signal(full);
        return remove_item();
    }
end monitor

//生产者进程
Producer(){
    while(1){
        item = 生产一个产品;
        ProdecerConsumer.insert(item);
    }
}

//消费者进程
consumer(){
    while(1){
        item = ProdecerConsumer.remove();
        消费产品item;
    }
}

管程引进类似于JAVA编程中封装的思想,实现进程同步互斥的高度解耦,也便于程序员调用功能函数和编写代码,从而进一步提高编程效率。于此同时关于进程与线程中很重要的一个环节,也是程序员编程中不可缺少和回避的一个环节——死锁问题,解决死锁和避免死锁是编程中老生常谈的问题,也是代码工作者需要认真思考的地方,因此我们要了解死锁产生的每一个环节,明白发生的原因及条件,从而牢牢掌握!


死锁

在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致进程阻塞。

产生死锁必须同时满足四个条件:

  • 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
  • 不剥夺条件:进程之间不能抢夺资源,只能主动释放
  • 请求和保持条件:进程已经操持了至少一个资源,但是又提出了新资源的性需求
  • 循环等待条件:存在一种进程资源的循环等待链

发生死锁一定存在循环等待,但是发生循环等待未必死锁

发生死锁的情况:
1、对系统资源的竞争
2、对程序推进顺序非法
3、当信号量的使用不当也会造成死锁

处理死锁情况
1、预防死锁:破坏四个条件中的一个或多个
2、避免死锁
3、死锁的监测和解除

(1)预防死锁
SPOOLing技术:将互斥资源改造为允许共享使用的资源 —— 限制互斥条件
缺点:有的互斥条件无法改变

操作系统通过调度强行剥夺进程资源 —— 限制不剥夺条件
缺点:
??????????复杂
??????????造成前一段工作失效
??????????增加系统开销,降低吞吐量
??????????造成进程饥饿

静态分配方法:一次申请提供所有需要资源,直至该进程结束
缺点:
??????????资源利用率低
??????????导致饥饿

顺序资源分配法:给出系统中资源编号,规定每个进程必须按编号递增的顺序请求资源
缺点:
??????????不方便提那家新设备
??????????导致资源浪费
??????????用户编程麻烦

(2)避免死锁(银行家算法)
安全序列:系统按照该序列分配资源,每个进程都能顺利完成,系统辨识安全状态,安全序列可能有多个。

银行家算法核心思想:系统提出资源申请是,预判资源分配实收会使操作系统进入不安全状态,若是,暂时不答应此次请求

假设系统中有n个进程,m种资源
利用n*m的矩阵表示所有进程对各种自愿的最大需求数(二维数组)
请添加图片描述
如果Request<=Need,申请合理
如果Request<=Available,申请合理,否则表示尚无足够资源,Pi必须等待
系统试探着把资源分配给进程Pi,进行计算预判是否会造成不安全状态
Available = Available - Request
Allocation = Allocation + Request
Need = Need - Request
操作系统执行安全性算法,若安全直接分配,否则恢复相应数据,进程阻塞等待

(3)死锁的检测和解除
【1】死锁检测方法

  • 用某种数据结构来保存资源的请求和分配信息
  • 提供一种算法,利用数据结监测系统

请添加图片描述(一条边代表分配了一个资源或发出一个资源请求,若一个图可以可完全简化,则此时没有发生死锁(相当于找到一个安全序列),若最后还有连接的边则表示为处于死锁的进程)

【2】死锁解除算法

  • 资源剥夺法:挂起某些死锁进程,并抢占它的资源
  • 撤销进程法:枪支撤销部分、甚至全部死锁进程(代价太大)
  • 进程回退法:让一个或多个进程回退奥足以避免死锁的地步(操作系统负载大)

【3】如何“动手”?

  • 进程优先级
  • 已执行多长时间
  • 还需多久时间
  • 进程已经占用多少资源
  • 进程是交互式的还是批处理式的

??????第五天的学习到这里就结束了,不知道小伙伴们收获如何呢?欢迎评论区交流学习,也恳请各位批评指正!!

??????操作系统其实就是计算机中的一个大管家,这个大管家有着很多很厉害的角色(就像谍战片里面的大府中的老管家一样),因此学习操作系统这门课,就像是在欣赏一部谍战片,要想理解角色内涵,你就必须站在其角度去思考,思考其可能会遇到的危险以及应对策略(bug与bug的修复),这样你才能在凶险的代码江湖生存下来,成为一代英雄,留下你的印记,期待与各位在江湖的相遇,也希望大家能给作品一个三连!!


本文参考教材:王道考研——操作系统(配套PDF文件,点赞留言后私信我发你)
教材配套讲解视频:b站链接


  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:35:59  更:2021-08-09 10:37:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 3:38:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计