<mutex>注释 11:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(上)

(46)问题的起源

在这里插入图片描述

++ 因为上面的内核代码,我们编写多线程代码时,对手里的家伙事不那么自信。但我们知道,多线程在竞争锁时,若得不到锁,会进入睡眠,并会在被唤醒后重新尝试得到锁,一直到得到了锁,线程才会继续执行下面的代码。这种线程的睡眠与唤醒机制。参考 linux 0.11 里的进程睡眠与唤醒机制。给出 linux 0.11 的源代码。

(47) 寻找 linux 0.11 的睡眠与唤醒代码

在这里插入图片描述

++ 如图,在硬盘的读写过程中,对应硬盘块的内存块,是不允许被修改的。会被加锁。或者说,所有等待该内存块的进程,都会失去 CPU,被标记为 TASK_uninterruptable 状态。 进程 PCB 的 地址存储在 buffer_head . b_wait 成员里。 最后由当前操作硬盘的进程依次唤醒所有等待的线程。

(48)下图是睡眠与唤醒的原理

在这里插入图片描述

(49)如下图,系统的内存缓冲区是有限的。可以接受的硬盘读写请求,也是有限的,最多 32 个,这时候,都会导致太多的进程请求去睡眠

在这里插入图片描述

(50)下图里介绍了 linux 0.11 设置的进程的几种状态。区别 task_interruptable 与 task_uninterruptable 。后者不可被随便唤醒,只等待的进程来唤醒。前者可以接受信号的唤醒,比如定时器信号的唤醒。

在这里插入图片描述

(51) 定时睡眠的唤醒的原理支持如下。该睡眠会在进程调度时,触发进程收到一个 定时器信号 : SIGALRM 。该处于 task_interruptable 状态的进程就会 恢复运行。

在这里插入图片描述

(52) 那么,进程会单纯因为时间而睡眠么? 会的,下面的函数,就说明,进程会睡眠的,让出 CPU ,设置 task_struct . alarm 成员:

在这里插入图片描述

++ 以及:

在这里插入图片描述

++ 在定时中断中会维护这个定时器值。(同时下图也说明了,在 int 80H 与定时中断里,进程会响应信号量,这已经相当频繁了。):

在这里插入图片描述

++ 函数 do_timer ( ) 的源码

在这里插入图片描述

++ 结合上图,再修正一下语言,不是在 do_timer()里完成进程的定时器逻辑。而是在 时间中断 _timer_interrrupt 里递增了全局量 jiffres

(53) 上面的分析,已经指出了 sleep() 睡眠,触发的信号量 SIGALRM 。那么进程如何进入 task_interruptable 状态呢?因为没有 sleep() 函数的源代码。但是知道 waitpid () 函数,也会使进程自身睡眠,并也进入 task_interruptable 状态

在这里插入图片描述

++ 以及 wait_pid()。该函数里有对进程状态的设置

在这里插入图片描述

(54) 以上关于定时睡眠的理论分析,基于 linux 0.11 。但也适用于,可以为现代的 C++ STL 库中的条件变量 conditon_variable 提供指导, cv 包含了关于时间的成员函数。举例如下::

在这里插入图片描述

++ 上图引用了模糊的内核函数 ,_Cnd_timedwait (…) ,因为没有其源代码,不清楚锁与定时睡眠引起的线程唤醒与睡眠的关系,才引出了本文的推导与求证,试图自圆其说,更接近一些真相。核心问题就是:线程没育抢到锁的时候,还会醒来么?加了定时睡眠呢?醒来后代码流程还会继续么? unique_lock 在析构时候,如何处理锁呢?

(55)通过以上的分析,得出的结论是** 定时睡眠,使进程进入了可中断睡眠状态。到时后会因为信号 SIGALRM 被唤醒,恢复进程的执行**。而在 linux 里,认为线程是轻量级的进程,这里试图类比线程为进程来理解线程。

(56)对于现代的 c++ STL 库里引起的代码逻辑,只可以用测试,来感觉里面的涉及操作系统的信号的,锁的,条件变量的代码逻辑。 先给出第一版,这是最正确的,最简单的一版,随后再修改和复杂其中的逻辑:

在这里插入图片描述

++ 以及:

在这里插入图片描述

++ 以及:

在这里插入图片描述

++ 以及:

在这里插入图片描述

++ 作为强烈对比:把上面的锁 mutex 换成 timed_mutex 就会得出完全不一样的结果,代码逻辑不变:

在这里插入图片描述

++ 正是为了解释此问题,引出了本篇文章与下一篇文章

(57) 补充 cv 的函数特性

在这里插入图片描述

(58) 这俩图还搬过来:

在这里插入图片描述

++ 以及:

在这里插入图片描述

(59)继续分析为什么定时 mutex 可以准确的依据时间。先给出一个图:

在这里插入图片描述

(60)

谢谢

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

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

相关文章

flask_socketio 以继承 Namespace方式实现一个网页聊天应用

点击进入上一篇,可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装: pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…

LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度

本代码的主要功能是建模 LOS(视距)和 NLOS(非视距)环境下的定位系统,估计目标的动态位置,三维空间 文章目录 运行结果源代码代码介绍 总结 运行结果 10个点的轨迹定位: 50个点的轨迹定位&#…

Centos创建共享文件夹拉取文件

1.打开VMware程序,鼠标右检你的虚拟机,打开设置 2.点击选项——共享文件夹——总是启用 点击添加,设置你想要共享的文件夹在pc上的路径(我这里已经添加过了就不加了) 注意不要中文,建议用share&#xff0c…

C++算法第十一天

本篇文章我们继续学习动态规划 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解析 代码原理 代码编写 第五题 题目链接 题目解析 代…

[x86 ubuntu22.04]投影模式选择“只使用外部”,外部edp屏幕无背光

1 问题描述 CPU:G6900E OS:ubuntu22.04 Kernel:6.8.0-49-generic 系统下有两个一样的 edp 屏幕,投影模式选择“只使用外部”,内部 edp 屏幕灭,外部 edp 屏幕无背光。DP-1 是外部 edp 屏幕,eDP-1…

【ETCD】【实操篇(二)】如何从源码编译并在window上搭建etcd集群?

要在 Windows 上编译 etcd 及 etcdctl 工具,并使用 bat 脚本启动 etcd 集群,首先需要准备好开发环境并确保依赖项正确安装。下面是从 etcd 3.5 源码开始编译和启动 etcd 集群的详细步骤: 目录 1. 安装 Go 环境2. 获取 etcd 源码3. 编译 etcd…

34. Three.js案例-创建球体与模糊阴影

34. Three.js案例-创建球体与模糊阴影 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数对象,包…

从源码分析swift GCD_DispatchGroup

前言: 最近在写需求的时候用到了DispatchGroup,一直没有深入去学习,既然遇到了那么就总结下吧。。。。 基本介绍: 任务组(DispatchGroup) DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…

深度神经网络(DNN)在时序预测中的应用与缺陷

目录 ​编辑 一、DNN在时序预测中的应用 二、DNN的缺陷 三、技术挑战与未来趋势 四、结论 随着大数据时代的到来,深度学习技术在时序预测领域扮演着越来越重要的角色。深度神经网络(DNN)因其强大的非线性拟合能力和自动特征提取能力&…

第十五章、职责链模式

第十五章、职责链模式 职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递&a…

docker容器的安装以及用法

1、了解docker 1.1、docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现…

springboot450房屋租赁管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统房屋租赁管理系统信息管理难度大,容错率低&am…

案例分享|企查查的数据降本增效之路

分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…

5G -- 5G网络架构

5G组网场景 从4G到5G的网络演进: 1、UE -> 4G基站 -> 4G核心网 * 部署初中期,利用存量网络,引入5G基站,4G与5G基站并存 2、UE -> (4G基站、5G基站) -> 4G核心网 * 部署中后期,引入5G核心网&am…

28. 描述符

一、什么是描述符 如果一个类中有如下 3 个方法中的任意一个,那么这个类创建的对象,可以称为 描述符对象。 object.__get__(self, instance, ownerNone) object.__set__(self, instance, value) object.__delete__(self, instance)如果有另外一个类&…

CVE-2024-32709 WordPress —— Recall 插件存在 SQL 注入漏洞

漏洞描述 WordPress 是一款免费开源的内容管理系统,适用于各类网站,包括个人博客、电子商务系统、企业网站。其插件 WP-Recall 的 account 存在 SQL 注入漏洞,攻击者可以通过该漏洞获取数据库敏感信息。 WP-Recall 版本 <= 16.26.5 漏洞复现 搭建环境、安装插件、完成…

Flink CDC实时同步mysql数据

官方参考资料&#xff1a; https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化&#xff08;如插入、更新和删除操作&#xff09;的技术。Flink CDC…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

二、使用langchain搭建RAG:金融问答机器人--数据清洗和切片

选择金融领域的专业文档作为源文件 这里选择 《博金大模型挑战赛-金融千问14b数据集》&#xff0c;这个数据集包含若干公司的年报&#xff0c;我们将利用这个年报搭建金融问答机器人。 具体下载地址 这里 git clone https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_…

maven使用Dependency-Check来扫描安全漏洞

在现代软件开发中&#xff0c;使用开源库和第三方依赖项已成为常态。然而&#xff0c;这些依赖项可能包含已知的安全漏洞&#xff0c;给应用程序带来潜在的风险。为了解决这个问题&#xff0c;OWASP Dependency-Check 应运而生。本文将介绍 OWASP Dependency-Check 的功能、安装…