21 内核开发-临界区及临界区代码段判断

内核开发-临界区判断

目录

内核开发-临界区判断

1.定义

2.临界区实现机制

3.使用互斥锁实现临界区的示例

4.怎么识别是临界区代码

5.总结



1.定义


临界区是计算机系统中的一段代码,在任何时刻只能被一个线程执行。临界区的目的是防止多个线程同时访问共享资源,从而避免数据损坏或其他问题。

定义临界区的两个条件:

  • 互斥:在任何时刻,只能有一个线程执行临界区中的代码。
  • 有限等待:一个线程不能无限期地等待进入临界区。如果临界区被其他线程占用,等待的线程必须在有限的时间内获得访问权。


临界区代码指的是一段代码路径,代码或者系统中必须同时满足以下两个条件才能称得上是临界区代码

  • 条件一:代码路径可能是并发的,也就是说,存在它可以并行运行的可能性。并且
  • 条件二:它处理(读取和/或写入)可写的共享数据(也称为共享状态)。

只有能识别出哪些地方是临界区代码,才能思考去加锁,从而避免并发导致问题,教科书通常只教会我们如何去实现临界区,而忽略了教会我们则怎么去识别临界区代码,
事后,我们发现很多时候是没有识别到临界区而导致问题。


2.临界区实现机制


临界区可以通过各种机制来实现,包括:

  • 互斥锁:互斥锁是一种数据结构,它允许一个线程一次获取对临界区的独占访问权。其他线程在等待互斥锁释放时被阻塞。
  • 信号量:信号量是一种数据结构,它允许线程跟踪可用资源的数量。当一个线程进入临界区时,它会减少信号量的计数。当一个线程离开临界区时,它会增加信号量的计数。其他线程在信号量的计数为零时被阻塞。
  • 硬件锁:硬件锁是一种特殊的硬件机制,它允许一个线程一次获取对临界区的独占访问权。其他线程在等待硬件锁释放时被阻塞。
3.使用互斥锁实现临界区的示例
// 定义互斥锁
std::mutex m;

// 定义临界区
void critical_section() {
  // 获取互斥锁
  m.lock();

  // 执行临界区代码

  // 释放互斥锁
  m.unlock();
}

在这个示例中,critical_section 函数是一个临界区。当一个线程调用这个函数时,它会获取互斥锁,然后执行临界区代码。其他线程在等待互斥锁释放时被阻塞。


4.怎么识别是临界区代码


如何识别代码可能存在并发访问问题,那就是依据定义条件一,条件二来分析。这里我们通过分析三个小demo 代码来判断是否存在临界区代码,来加深理解。分析如下(1) (2) (3)代码段中,代码行 t1-t2 之间是否是临界区代码。

(1)代码段

(2)代码段

(3)代码段

对比两个条件,(1)代码段没有共享的数据读写,所以没有临界区代码,(2)存在并发访问,并且有共享数据读写,所以存在临界区代码 (3)代码段虽然存在共享的读写数据,但是由于内核加载和卸载不存在并发访问情况(内核模块的启动和清理 "方法"(函数)只能执行一次),所以不存在临界区代码。

5.总结


临界区的目的是防止多个线程同时访问共享数据,从而避免数据损坏或其他问题。例如,如果两个线程同时尝试更新同一个变量,可能会导致不可预测的结果。

为了解决这个问题,必须使用某种同步机制来确保在任何时刻只有一个线程可以执行临界区代码。这可以通过互斥锁、信号量或其他机制来实现。

通过本文三个例子的分析,我们应该很容易识别哪些代码是临界区代码。


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Make3D数据集相关介绍

一、参考资料 Make3d数据集使用方法 二、相关介绍 1. 简介 Make3D 数据集的每帧图像的深度值均由激光雷达进行采集,相较于 Kinect 相机采集的深度信息,该测距仪可以得到室外图像更加精确的深度信息,而且测距范围更大,与普通的…

【stm32笔记】DSP库调用

参考:DSP库调用 , __CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT1U, ARM_MATH_CM4把需要的库复制出来单独用,方便移植

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数…

什么是X电容和Y电容?

先补充个知识: 一、什么是差模信号和共模信号 差模信号:大小相等,方向相反的交流信号;双端输入时,两个信号的相位相差180度 共模信号:大小相等。方向相同。双端输入时,两个信号相同。 二、安规…

小程序如何重启

用户在使用小程序的过程中,有时候会碰到一些问题。比如小程序数据不加载、卡顿、崩溃或者出现其他异常情况。这时候,最简单的办法就是重启小程序。但是很多客户不知道如何重启小程序,下面就具体介绍小程序重新启动的几种方法。 1. 强制关闭&…

CWDM、DWDM、MWDM、LWDM:快速了解光波复用技术

在现代光纤通信领域,波分复用(WDM)技术作为一项先进的创新脱颖而出。它通过将多个不同波长和速率的光信号汇聚到一根光纤中来有效地传输数据。本文将深入探讨几种关键的 WDM 技术(CWDM、DWDM、MWDM 和 LWDM)&#xff0…

流量分析。

流量分析 在Wireshak抓包可以看到正常的执行流程如下: ● Client向Server发起Load data local infile请求 ● Server返回需要读取的文件路径 ● Client读取文件内容并发送给Server ● PS:在本机上启动服务端与客户端,启动wireshark 抓包&…

根据相同的key 取出数组中最后一个值

数组中有很多对象 , 需根据当前页面的值current 和 数组中的key对比 拿到返回值 数据结构如下 之前写法 const clickedItem routeList.find(item > item.key current) // current是当前页 用reduce遍历数组返回最后一个值 const clickedItem routeList.reduce((lastIte…

41.乐理基础-拍号-小节、小节线、终止线

小节线:下图红框中的竖线就是小节线 小节、终止线:最后的终止线就是文字意思表示乐谱结束了,后面没有了 下图中 0.5表示0.5拍(八分音符)、1表示1拍(四分音符)、0.25表示0.25拍(十六分…

学习Rust的第29天: cat in Rust

今天即将是这个系列的最后一次内容,我们正在catRust 中从 GNU 核心实用程序进行重建。cat用于将文件内容打印到STDOUT.听起来很容易构建,所以让我们开始吧。 GitHub 存储库:GitHub - shafinmurani/gnu-core-utils-rust 伪代码 function read(…

Transformer详解:从放弃到入门(一)

Transformer由论文《Attention is All You Need》提出,是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,在自然语言处理领域获得了巨大的成功,在这个…

免费开源线上线下交友社交圈子系统 小程序+APP+H5 可支持二开!

为什么要玩社交软件:互联网社交软件的独特优势 首先,社交软件为我们提供了一个便捷的沟通方式。在传统的交往方式中,人们需要面对面交流,这种方式在时间和空间上都受到限制。而社交软件打破了这些限制,无论我们身处何地…

如何复制本地docker镜像到其他主机

(1)打包镜像 比如我要复制的镜像是grafana的镜像 docker images 这里我把打包的镜像放在了根~目录下,如截图所示: docker save grafana/grafana:latest -o ~/grafana.jar (2)移动镜像 scp命令拷贝镜像到目标…

linux学习:线程池

目录 原理 初始线程池 运行中的线程池 相关结构体 api 线程池初始化 投送任务 增加活跃线程 删除活跃线程 销毁线程池 例子 thread_pool.h thread_pool.c test.c 测试程序 原理 一个进程中的线程就好比是一家公司里的员工,员工的数目应该根据公司的…

AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件,文件名很多都是一大串字母和数字,不打开看看,根本不知道里面是什么内容。 我想能不能做个工具,把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。 我们有些朋友可能不会…

刷代码随想录有感(57):二叉搜索树中的众数

题干&#xff1a; 代码&#xff1a; class Solution { public:unordered_map<int,int>map;void traversal(TreeNode* root){if(root NULL)return;traversal(root->left);map[root->val];traversal(root->right);}bool static cmp(const pair<int,int>&a…

[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

查看保护 查看ida 大致就是只能创建0x60大小的堆块&#xff0c;并且uaf只能利用一次 完整exp&#xff1a; from pwn import* #context(log_leveldebug) pprocess(./ezheap2.31)def alloc(content):p.sendlineafter(b4.exit,b1)p.send(content) def free(index):p.sendlineaft…

C++:运算符重载(=/==)

赋值运算符&#xff08;&#xff09;重载 在C中&#xff0c;赋值运算符可以被重载&#xff0c;允许用户定义类对象的赋值行为。通过重载赋值运算符&#xff0c;可以自定义对象的赋值操作&#xff0c;以便适应特定的需求和语义。当我们定义一个自定义的类时&#xff0c;比如一个…

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

商城数据库88张表结构完整示意图41~50(十二)

四十一&#xff1a; 四十二&#xff1a; 四十三&#xff1a; 四十四&#xff1a; 四十五&#xff1a; 四十六&#xff1a; 四十七&#xff1a; 四十八&#xff1a; 四十九&#xff1a; 五十&#xff1a;
最新文章