65 - 进程互斥锁的优化实现

news2025/1/25 4:36:36

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 问题一
    • 1.1 当前实现的深入分析
    • 1.2 解决方案设计
    • 1.3 解决方案实现步骤
    • 1.4 编程实验:EnterCritical()重设计
  • 2. 问题二
    • 2.1 互斥锁的优化设计
    • 2.2 互斥锁的优化实现方案
    • 2.3 编程实验:互斥锁的优化实现
  • 3. 小结

1. 问题一

  • 在当前任务实现下,阻塞的多个任务重新进入执行态,会发生什么?

1.1 当前实现的深入分析

在这里插入图片描述

1.2 解决方案设计

在这里插入图片描述

  • 任务从阻塞中(因获取锁失败而阻塞)恢复执行时
    • 必须再次尝试获取锁 ==>
    • 任务怎么知道锁是否获取成功?
  • 内核需要 返回获取锁的 结果 给任务(成功 or 失败)
    • 成功:任务继续执行,进入临界区
    • 失败:任务 等待机会 再次尝试获取锁

1.3 解决方案实现步骤

  1. 在系统调用EnterCritical()中向内核传入 标记变量wait的地址
  2. 内核根据目标Mutex的状态(空闲or占用)设置标记变量wait的值
  3. 任务从系统调用返回后,判断并标记变量wait的值
    • true:再次尝试获取锁
    • false:无需再次尝试,继续向下执行

1.4 编程实验:EnterCritical()重设计

  • 问题演示:【参看链接】:65 - 进程互斥锁的优化实现 / 00问题演示

在这里插入图片描述

  • 优化:【参看链接】:65 - 进程互斥锁的优化实现 / 01优化

在这里插入图片描述

2. 问题二

  • 如果有任务比较聪明,在进入临界区之前,先主动调用ExitCritical(),会发生什么?
  • 任务不使用临界资源,但是要销毁已经存在的互斥锁,行为合法吗?

在这里插入图片描述
在这里插入图片描述

2.1 互斥锁的优化设计

  • 同一个任务中可多次获取同一个互斥锁
    • 同一个任务中多次调用EnterCritical()不会阻塞
  • 只有获取锁的任务,才能释放锁
    • 强行释放锁(异常行为) 的任务将被内核直接杀死
  • 无法销毁处于占用状态的互斥锁
    • 强行调用DestroyMutex()销毁占用状态的锁,将 无效返回

2.2 互斥锁的优化实现方案

  • 任务通过自身标识对锁进行标记
    mutex->lock = (uint)gCTaskAddr

  • 释放锁时,通过锁标记与任务自身标识判断合法性
    IsEqual(mutex->lock, gCTaskAddr)

  • 只有未标识的锁能被销毁
    IsEqual(mutex->lock, 0) ==> true

2.3 编程实验:互斥锁的优化实现

【参看链接】:65 - 进程互斥锁的优化实现 / 01优化

  • 问题验证:
  1. 同一个任务中可多次获取同一个互斥锁
    • 同一个任务中多次调用EnterCritical()不会阻塞
  2. 无法销毁处于占用状态的互斥锁
    • 强行调用DestroyMutex()销毁占用状态的锁,将无效返回

在这里插入图片描述
在这里插入图片描述

  1. 只有获取锁的任务,才能释放锁
    • 强行释放锁(异常行为)的任务将被内核直接杀死

在这里插入图片描述
在这里插入图片描述

3. 小结

  • 互斥锁是一种特殊的内核变量,用于保护临界资源
  • 多个任务在互斥锁的协调下,能够有序互斥的执行
  • 互斥锁的具体实现需要在内核中完成
  • 互斥锁的使用需要遵循预定的规则

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

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

相关文章

【C语言】每日刷题 —— 牛客

前言 大家好,今天带来一篇新的专栏 c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页:悲伤的猪大…

小白做什么兼职项目赚钱?宝妈拍短视频赚钱的方法

很多宝妈在家带孩子之余想做兼职赚点小钱,依靠互联网无疑是比较方便的途径,在刷单、微商等网上兼职成为过去式以后,很多宝妈选择了短视频创业。 宝妈怎么拍短视频? 宝妈因为要照顾宝宝还要兼顾家务,空闲的时间比较琐碎…

Rust Web入门(七):WebAssembly

本教程笔记来自 杨旭老师的 rust web 全栈教程,链接如下: https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…

5款电商团队必须会用的任务管理工具

随着企业数字化转型,高效率的团队协作和远程协同办公成为越来越多团队的强烈需求,今天说说电商团队,电商运营很大一个特点是多场景、跨部门、高频协作。并且要通过多平台和形式跟新兴媒体进行品宣争夺市场份额。 这种情形对跨部门的团队协作…

java基础学习 day50(内部类)

什么是内部类? 写在一个类里面的类就叫做内部类 什么时候用到内部类? B类表示的事物是A类的一部分,且B单独存在没有意义。 比如:汽车和发动机,ArrayList和迭代器,人和心脏 内部类的访问特点 内部类可以…

STM32U5开发(1)----通过 USART1 发送数据

概述 通过 USART1 发送一些数据。 最近在弄ST和GD的课程,需要样片的可以加群申请:6_15061293。 生成例程 使用STM32CUBEMX生成例程,这里使用NUCLEO-U575ZI开发板。 选择工程的时候,先不必选择加载了TrustZone。 样品申请 h…

STM32程序下载和启动方式

目录1 BOOT引脚配置和下载说明2 关于串口下载方式3 关于一按复位就跑代码4 关于下载调试速度5 关于三种启动方式5.1 FLASH启动5.2 系统存储器器启动5.3 SRAM启动6 关于程序的三种下载方式1 BOOT引脚配置和下载说明 BOOT0BOOT1程序运行ST-Link下载串口下载启动说明xx无0x√√用…

AList搭建网盘挂载硬盘并挂载网络资源(傻瓜式自配置教程)

AList搭建网盘挂载硬盘并挂载网络资源1.安装AList1.1 下载1.2 解压1.3 启动1.4 登录1.5 改密1.6 开机自启2.添加云盘存储2.1 添加阿里云盘2.2 阿里云刷新令牌2.3 查看云盘文件3.映射本地盘3.1 下载RaiDrive3.2 安装3.2 设置4.延伸参考资料: AList: https://alist.n…

Warshall算法

🚀write in front🚀 📜所属专栏:> 算法 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我…

数据中台架构体系理解

目前,大部分企业更倾向于数据集中采集、存储,并应用分层建设。这种方式一方面有利于应用系统的快速部署,另一方面也保证了数据的集中管理与运营,体现数据的资产、资源属性。 数据中台的出现弥补了数据开发和应用开发之间由于开发…

工厂设计模式

介绍 Java工厂设计模式主要分为三种: 简单工厂模式(Simple Factory Pattern):使用一个工厂类来封装对象创建的过程,客户端只需要通过传递不同的参数来获取不同的产品对象,从而避免了客户端直接创建产品对象的操作工厂方法模式(Factory Method Pattern):将工厂类抽象出来,每个…

fastjson 返回 $ref 数据

文章目录问题描述:1、重复引用:2、循环引用:原因分析:1、重复引用:2、循环引用:反序列化:1、开启引用检测:2、关闭引用检测:小结:问题描述: 问题…

小樽C++ 单章⑨ 文件

目录 1.文件类型变量的定义与引用 1.1 文件的读写 1.2 fopen()版 (C专用) 1.3 文件输入输出流 (C专用) 文件有两种保存方式:二进制文件、文本文件。例如存121这个数字。 二进制存储效率高,但是对我们不友好,对每个值都要变成二进制太难啦…

uniapp实现自定义相机

自定义相机起因由于最近用uniapp调用原生相机容易出现闪退问题,找了很多教程又是压缩图片又是优化代码,我表示并没有太大作用!!实现自定义相机使用效果图拓展实现多种自定义相机水印相机身份证相机人像相机起因 由于最近用uniapp调用原生相机容易出现闪退…

MindAR的网页端WebAR图片识别功能的图片目标编译器中文离线版本功能(含源码)

前言 之前制作了基于MindAR实现的网页端WebAR图片识别叠加动作模型追踪功能的demo,使用了在线的图像目标编译器对识别图进行了编译,并实现了自制的WebAR效果,大致效果如下: 但是在线的编译器在操作中也不是很方便,我…

207. 课程表

207. 课程表https://leetcode.cn/problems/course-schedule/ 难度中等1526 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [a…

One-YOLOv5 v1.2.0 Released(支持分类,检测,实例分割)

0x0. 引言0x1. 快速开始0x2. 在COCO上的精度表现 yolov5s-defaultyolov5s-seg 0x3. 在COCO上的单GPU性能表现特性 & bug 修复 特性用户反馈的bug 下个版本的展望附件常用预训练模型下载列表 0x0. 引言 🌟 v1.2.0同步了ultralytics yolov5的上游分支v7.0 &…

Python+ChatGPT制作一个AI实用百宝箱

目录一、注册OpenAI二、搭建网站及其框架三、AI聊天机器人四、AI绘画机器人ChatGPT 最近在互联网掀起了一阵热潮,其高度智能化的功能能够给我们现实生活带来诸多的便利,可以帮助你写文章、写报告、写周报、做表格、做策划甚至还会写代码。只要与文字相关…

The Sandbox 中的独特体验——《奥米加》

在过去几年间,The Sandbox 游戏变得越来越受欢迎。因为我们为玩家提供了在虚拟世界中探索、创造和游戏的自由,没有线性游戏的限制。DeQuest 工作室创作的《奥米加》也正是如此,绝对是一个前所未有的体验! 先了解一下《奥米加》的故…

代码审计之旅之百家CMS

前言 之前审计的CMS大多是利用工具,即Seay昆仑镜联动扫描出漏洞点,而后进行审计。感觉自己的能力仍与零无异,因此本次审计CMS绝大多数使用手动探测,即通过搜索危险函数的方式进行漏洞寻找,以此来提升审计能力&#xf…