L16171819 【哈工大_操作系统】进程同步与信号量信号量临界区保护信号量的代码实现死锁处理

L2.9 进程同步与信号量

让进程走走停停,实现进程同步。

1.、信号量的定义

在这里插入图片描述

  1. 生产者Producer需要判断是否还有空闲缓冲区生产资源,所以定义一个标志empty,初始值为最大可用资源数,在开头维护;同时,在消费者Consumer中释放了一个资源后,需要释放一个empty,在结尾维护。
  2. 消费者Consumer需要判断是否有资源需要去执行,所以定义一个标志full,初始值为0,在开头维护;同时,在生产者Producer产生新的资源需要增加full,在结尾维护。
  3. 共享缓冲区定义在文件中,所以要考虑文件读写的互斥,定义了一个锁mutex,初始值为1。任何一个使用时,调用P(),mutex–,则mutex=0。当另外一个调用P()时,mutex=-1,此时小于零,将等待。

L2.10 信号量临界区保护

用临界保护信号量,用信号量实现同步

1、竞争条件:和调度有关的共享数据语义错误
若empty修改到一半,跳转到其他进程运行,将导致少减一个。

2、临界区

临界区:一次只允许一个进程进入的一段代码。

  • 互斥进入
  • 有空让进
  • 有限等待

3、两个进程的临界区策略
在这里插入图片描述

4、临界区保护:面包店算法(软件方法)

  • 每次进来取个号,取号值为当前最大号再+1
  • while中判断如果别人想进 且 别人的号比我的小,则我等着
  • choossing 用来保证:有人在选号时,我就等着,等选完好再进行判断
    在这里插入图片描述

5、临界区保护:硬件方法

  1. 关中断:两个进程不能同时进入临界区 -> 阻止调度 -> 关中断(cli)。

    • 缺点:在多CPU下失效,关中断只能控制一个CPU,另一个CPU不管用
  2. 硬件原子指令法

修改empty需要 mutex 保护,但其实mutex也是一个变量,将导致修改mutex也需要保护,修改mutex的保护也需要保护,没完没了。进而引出了一种硬件原子指令法使得mutex锁时不能被打断,即硬件实现保护

  • 如果变量已经被锁上(x=1),返回的就是true,就会陷入无限循环等待;
  • 如果没有被锁上(x=0),此时会将x锁上(x=1),并且返回false,此时就可以进入临界区,执行完毕再解锁(x=0)。
    在这里插入图片描述

L2.11 信号量的代码实现

  • 定义了一个信号量结构体,包含信号量名称、值、等待唤醒进程队列

  • sem_open根据信号名打开信号量,若没有则创建

  • sem_wait中通过开关中断实现保护临界区,信号量值小于零阻塞
    在这里插入图片描述

  • 开关中断来实现信号量的保护

  • 根据信号量来判断是否睡眠等待

  • 磁盘读完后,睡眠的进程将由中断唤醒
    在这里插入图片描述

  • 隐蔽的队列:tmp作为局部变量,存放在当前进程内核栈中。所以当前进程能找到tmp,建立了索引;而tmp指向下一个进程的PCB;下个进程PCB找到下个进程的内核栈,内核栈找到tmp;tmp再指向下下个进程的PCB…构成了一个队列。

  • sleep_on 把自己放到队列中,变成阻塞态,然后schedule切出去
    在这里插入图片描述

  • 变成阻塞态的睡眠队列,在磁盘中断中被唤醒

  • whilesleep_on实现将队列中所有进程进行唤醒
    在这里插入图片描述


L2.12 死锁处理

1、死锁四个必要条件

  • 互斥使用
  • 不可抢占
  • 请求和保持
  • 循环等待

2、死锁处理方法
在这里插入图片描述

分析死锁

  • 死锁的产生:如果将生产者和消费者的各自的一二行代码交换一下顺序。对于生产者,当empty=0时,mutex执行后锁住,执行empty时阻塞,等待消费者执行V(empty);对于消费者,此时mutex=0,还要等待生产者执行V(mutex),互相需要对方资源,造成死锁。
  • 而相对于原本正确的实现:对于生产者,当empty=0时,P(empty)就阻塞了,等待消费者;消费者可以正常执行,因为mutex没有被锁住。
  1. 死锁预防:破坏出现的条件
  • 一次性申请所有需要的资源
  • 资源申请必须按序申请
  1. 死锁避免:检查每个请求资源
  • 银行家算法:判断此次请求是否引起死锁
  1. 死锁检测+恢复:让一些进程回滚,让出资源
  • 定时监测或发现CPU资源利用率低时检测,检测到时通过银行家算法看需要回滚多少
  1. 死锁忽略:直接忽略
  • 重启

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560196.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3-GPIO八大输出模式 推挽输出 与 开漏输出

推挽输出 与 开漏输出 GPIO有八大输出模式 下图为每个GPIO口的基本结构: 通过这张图来学习 最右侧是I/O引脚,是从STM32引脚到GPIO口的导线,与其他芯片进行连接的线。 芯片内部电路所能承受的电压有限,当未知的静电进入GPIO口&a…

selenium:Select类操作复选框和下拉框(7)

复选框/下拉框操作的Select类 主要使用selinium中的类Select来模拟选择网页上的下拉框或者复选框中的内容,使用前先导入 from selenium.webdriver.support.ui import Select 主要方法如下: 函数 功能 select_by_value 根据复选框/下拉框的值选择 se…

视觉检测系统实时识别工地安全帽佩戴情况

在建筑工地上,工人佩戴安全帽是确保施工安全的基本措施。然而,工人有时因疏忽或其他原因未能及时佩戴安全帽,这可能导致严重的安全隐患。传统的人工监督往往无法实现对工地的全覆盖或全天候监控,效率低下,容易出现漏检…

【GESP】C++一级练习BCQM3034,还是浮点数计算,国庆七天乐

一道又回到简单浮点数计算水平的题,巩固基本语法练习。 题解详见:https://www.coderli.com/gesp-1-bcqm3034/ 【GESP】C一级练习BCQM3034,还是浮点数计算,国庆七天乐 | OneCoder一道又回到简单浮点数计算水平的题,巩固…

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合,以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…

IDM6.42下载器!下载速度就像坐上了火箭,嗖嗖的快到飞起!

亲爱的朋友们,今天我要给大家安利一款下载神器——Internet Download Manager 6.42(简称IDM)!这款软件简直就是下载界的“速度与激情”,用了它之后,你会发现下载速度就像坐上了火箭,嗖嗖的快到飞…

货车一键启动正确方法,新手司机可以看看,汽车,驾驶技巧

货车无钥匙进入一键启动手机联控等配置高到满足您对货车的所有期待 ,由于霸气的外观和较高的配置,深受国内货车用户关注。 ‌货车一键启动手机控车是一种通过智能手机应用程序(APP)控制汽车启动和多种车辆功能的智能化系统。‌ 这…

手机怎么玩七龙珠电光炸裂0?GameViewer远程助你手机畅玩七龙珠

《七龙珠 电光炸裂!ZERO》将于2024年10月11日上线!你不仅可以在电脑上玩七龙珠电光炸裂0,而且手机也能免费玩这个电脑游戏,使用网易GameViewer远程就能让你随时随地玩七龙珠电光炸裂0。你还能享受4K蓝光144帧的高画质,…

攻防世界(CTF)~Reverse-easyRE1

题目介绍 下载附件后一个32位一个64位 64位的放到ExeinfoPE查看一下有无壳子(无壳) 放IDA看一下伪代码,习惯性看一下main函数,直接发现了flag flag{db2f62a36a018bce28e46d976e3f9864}

手动降级wsl中的numpy

下载完pytorch之后想验证一下cuda好不好使&#xff0c;在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低&#xff0c;numpy太高&#xff0c;所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…

一文读懂Spring Security的工作原理和应用(面试经)

导览 前言Spring Security必学必看1. 简介2. 架构2.1 认证2.2 授权 3. 对策 结语精彩回顾 前言 博主精心准备的一文读懂Spring系列文章&#xff0c;旨在通过简洁精炼的语言&#xff0c;展现Spring内部精妙的设计思想。我们知道Spring是一个web容器&#xff0c;不知道的同学&am…

无人机之穿越机飞行注意事项

一、选择合适的场地 1、寻找空旷、无障碍物的区域&#xff0c;如大型公园的空旷草坪、专门的无人飞行场地等。这样可以减少碰撞的风险&#xff0c;确保飞行安全。 2、避免在人群密集的地方飞行&#xff0c;防止对他人造成伤害。例如&#xff0c;不要在商场、学校、体育场等人…

【Linux第一弹】- 基本指令

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

在双十一必买的好物有哪些?盘点五大必买好物清单!

随着2024年双十一购物狂欢节的临近&#xff0c;消费者们正热切期待着这一年度盛事的到来。作为一年中最具影响力的购物节日之一&#xff0c;双十一不仅为消费者带来了前所未有的优惠力度&#xff0c;更是各大品牌展示新品、推广好物的绝佳时机&#xff0c;在众多商品中&#xf…

在spring生命周期中对bean方法进行增强

概述 开发中有时候需要对某个bean进行整体的加强&#xff0c;但是当前代码中有很多地方使用这个bean的不同方法&#xff1b;又不想同时修改这些地方留下修改记录 所以我的想法是在spring初始化bean过程中用自己的增强bean进行增强&#xff0c;不侵入业务代码&#xff1b; 整体…

基于SpringBoot+Vue+Uniapp微信小程序的电子竞技信息交流平台设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…

模版进阶 非类型模版参数

一.模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使用。 #i…

机器学习项目——运用机器学习洞察青年消费趋势

1. 项目背景 在21世纪的第三个十年&#xff0c;全球经济和技术的飞速发展正深刻影响着各个领域&#xff0c;尤其是青年消费市场。随着数字化进程的加速&#xff0c;尤其是移动互联网的广泛普及&#xff0c;青年的消费行为和生活方式发生了前所未有的转变。 然而&#xff0c;面对…

VMware vCenter Server 8.0U3c 发布下载,修复 U3b 更新停止响应的问题

VMware vCenter Server 8.0U3c 发布下载 - 集中式管理 vSphere 环境 Server Management Software | vCenter 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-8-u3/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMw…

如何在全平台启用 IPv6 网络?(路由器、Windows、Linux、Docker)

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 如今 IPv6 网络越来越普及&#xff0c;也是时候开启 IPv6 网络了&#xff0c;特别是对于 NAS 玩家&#xff0c;开启 IPv6 后&#xff0c;NAS 可以获取到公网 IPv6 用于外网访问&#xff0c;通过 ZeroTier …