OS多核多线程锁记录笔记
自旋锁作用
自旋锁的是为了保护两个核上的公共资源,也就是全局变量,只有在一方也就是一个核抢到了自选锁,才能对公共资源进行操作修改,当然还有其他形似的锁如互斥锁,这里不比较两者的区别,以前没有深入的去了解自旋锁的底层实现,只是简单调用。
自旋锁原理
自旋锁的底层实现原理其实是用到了各个架构比较交换的汇编指令,英飞凌的TriCore架构为
CMPSWAP.W,ARM架构虽然没有比较交换指令,但是通过关闭preempt_disable禁止抢占来实现原子操作。
数据总线
数据总线的一些基本概念这里就不提出来再讲了。有一个细节是在总线上同一时刻只能有一个主设备控制总线传输操作。而对于多核来说也是如此,他们需要互相争抢总线的使用权,而这一现象又能帮助我们实现一些原子操作。
总线操作
使用总线对数据进行操作的时候并不是全部都能一次完成的,有时候可能需要多个操作才能实现我们编程中看似简单的操作,而在找个时候就不一定能满足我们的原子性了。
TriCore架构自旋锁实现
boolean IfxCpu_acquireMutex(IfxCpu_mutexLock *lock)
{boolean retVal;volatile uint32 spinLockVal;retVal = FALSE;spinLockVal = 1UL;spinLockVal =(uint32)__cmpAndSwap(((unsigned int *)lock), spinLockVal, 0);/* Check if the SpinLock WAS set before the attempt to acquire spinlock */if (spinLockVal == 0){retVal = TRUE;}return retVal;
}/** \brief This function is a implementation of a binary semaphore using compare and swap instruction* \param address address of resource.* \param value This variable is updated with status of address* \param condition if the value of address matches with the value of condition, then swap of value & address occurs.**/
IFX_INLINE unsigned int Ifx__cmpAndSwap (unsigned int volatile *address,unsigned int value, unsigned int condition)
{unsigned long long reg64= value | (unsigned long long) condition << 32;__asm__ __volatile__ ("cmpswap.w [%[addr]]0, %A[reg]": [reg] "+d" (reg64): [addr] "a" (address): "memory");return reg64;
}
这段代码的逻辑及其简单,就是去查找我们lock变量的值是否为0,如果为0便把它赋值为1,并且返回成功抢到锁的信息。而有一个操作是值得关注的。__cmpAndSwap() 这一操作为什么能保证原子性并且能做到对变量进行加锁的呢?这里使用了汇编语言对芯片进行操作,而cmpswap.w操作正是我们在数据手册中找到的新指令。而正如注释说这一个指令能比较两个地址中的值是否相同,并完成交换。
cmpswap.w等效如下代码:
tmp = *x; //#tmp address的值
if(*x == z) // # z为condition
{*x = y; //#*address = values;
}
else
{*x = tmp;
}
return tmp
PowerPC架构自旋锁实现
static inline uint32 aSpinlock_Hal_Swap(uint32 Addr, register uint32 Value)
{uint32 result;register uint32 temp1,temp2;__asm__ __volatile__(/* prepare the decoration for the SWAP instruction */"mr %[temp11], %[Value]" "\n" /* load value in r6 */"e_lis %[temp22], 0x5000" "\n" /* r5 = 0x50000000 */"se_or %[temp11], %[temp22]" "\n" /* Value = Value | r5 *//* lwdcbx -> Load Word Decorated with Cache Bypass */"lwdcbx %[result], %[temp11], %[Addr]" "\n" /* SWAP Addr with r3 */: [result] "=r" (result): [Addr] "b" (Addr), [temp11]"r" (temp1), [temp22]"r" (temp2) , [Value]"r" (Value): "cc");return result;
}
参考文档:
Aurix/Tricore实验分享之103: 硬件mutex指令|英飞凌开发者技术社区
TriCore架构多核多线程锁探究(TC264双核互斥锁)-CSDN博客
https://www.cnblogs.com/DoOrDie/p/9265754.html
相关文章:
OS多核多线程锁记录笔记
自旋锁作用 自旋锁的是为了保护两个核上的公共资源,也就是全局变量,只有在一方也就是一个核抢到了自选锁,才能对公共资源进行操作修改,当然还有其他形似的锁如互斥锁,这里不比较两者的区别,以前没有深入的去…...
nginx做TCP代理
要实现TCP代理,可以使用Nginx的stream模块。stream模块允许Nginx作为一个转发代理来处理TCP流量,包括TCP代理、负载均衡和SSL终止等功能。 以下是配置Nginx实现TCP代理的基本步骤: 在Nginx配置文件中添加stream块,并在该块中配置…...
python 异常处理 try
异常 我们常见的代码错误后 会出现此类异常 SyntaxError:语法错误 AttributeError:属性错误 IndexError:索引错误 TypeError:类型错误 NameError:变量名不存在错误 KeyError:映射中不存在的关键字…...
月入10万+管道收益,揭秘旅游卡运营的5个阶段!
网上的项目众多,只要用心,便能发现不少商机。在互联网上运营,关键在于理解项目的底层逻辑。今天,我们来揭秘旅游卡项目,如何做到月入10万。 1、先赚成本 开始项目时,首要任务是回本。不要急于求成&#x…...
android_binder源码分析之_binder驱动使用服务
一,binder驱动源码分析,使用服务过程 uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name) {uint32_t handle;unsigned iodata[512/4];struct binder_io msg, reply;bio_init(&msg, iodata, sizeof(iodata), 4);b…...
【波点音乐看广告】
import uiautomator2 as u2 import time from datetime import datetime import xml.etree.ElementTree as ET import re import os 连接设备 d u2.connect() os.system(‘adb shell chmod 775 /data/local/tmp/atx-agent’) os.system(‘adb shell /data/local/tmp/atx-age…...
[SWPUCTF 2021 新生赛]pop
常见的魔术方法 魔术方法__construct() 类的构造函数,在对象实例化时调用 __destruct() 类的析构函数,在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用,比如一个对象被调用时,里面没有程序想调用的属性 …...
【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目
环境 docker_host192.168.0.1jenkins_host192.168.0.2 jenkins_host构建完成后把jar发布到docker_host,再通过dockerfile自动构建镜像,运行镜像 1 Jenkins安装 AWS EC2安装Jenkins:AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装…...
【C++】——入门基础知识超详解
目录 编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式: 注意事项 3. C输入&输出 示例 1:基本输入输出 示例 2:读取多个值 示例 3:处理字符串输入 示例 4:读…...
ChatGPT技术演进简介
chatGPT(chat generative pre-train transformer, 可以对话的预训练trasformer模型),讨论点: 1、chatGPT为什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o区别和特性,在不同应用场景中如何选对模型 3、未…...
C语言 | Leetcode C语言题解之第114题二叉树展开为链表
题目: 题解: void flatten(struct TreeNode* root) {struct TreeNode* curr root;while (curr ! NULL) {if (curr->left ! NULL) {struct TreeNode* next curr->left;struct TreeNode* predecessor next;while (predecessor->right ! NULL)…...
Vue 子组件向父组件传值
1、使用自定义事件 ($emit) 这是Vue中最常用的子组件向父组件传递数据的方式。子组件通过触发一个自定义事件,并附加数据作为参数,父组件则监听这个事件并处理传递过来的数据。 子组件 (发送数据): <template><button click"…...
【前端笔记】Vue项目报错Error: Cannot find module ‘webpack/lib/RuleSet‘
网上搜了下发现原因不止一种,这里仅记录本人遇到的原因和解决办法,仅供参考 原因:因为某种原因导致本地package.json中vue/cli与全局vue/cli版本不同导致冲突。再次提示,这是本人遇到的,可能和大家有所不同,…...
edge浏览器的网页复制
一些网页往往禁止复制粘贴,本文方法如下: 网址最前面加上 read: (此方法适用于Microsoft Edge 浏览器)在此网站网址前加上read:进入阅读器模式即可...
视频播放器-Kodi
一、前言 Kodi 是一款开源免费的多媒体播放软件。Kodi 是由非营利性技术联盟 Kodi 基金会开发的免费开源媒体播放器应用程序。 Kodi是一款免费和开源(遵循GPL协议)的多媒体播放器和娱乐中心软件,由XBMC基金会开发。Kodi的主要功能是管理和播…...
Helm安装kafka3.7.0无持久化(KRaft 模式集群)
文章目录 2.1 Chart包方式安装kafka集群 5.开始安装2.2 命令行方式安装kafka集群 搭建 Kafka-UI三、kafka集群测试3.1 方式一3.2 方式二 四、kafka集群扩容4.1 方式一4.2 方式二 五、kafka集群删除 参考文档 [Helm实践---安装kafka集群 - 知乎 (zhihu.com)](https://zhuanlan.…...
【机器学习】期望最大化(EM)算法
文章目录 一、极大似然估计1.1 基本原理1.2 举例说明 二、Jensen不等式三、EM算法3.1 隐变量 与 观测变量3.2 为什么要用EM3.3 引入Jensen不等式3.4 EM算法步骤3.5 EM算法总结 参考资料 EM是一种解决 存在隐含变量优化问题 的有效方法。EM的意思是“期望最大化(Exp…...
【Python】机器学习中的过采样和欠采样:处理不平衡数据集的关键技术
原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…...
重新思考:Netflix 的边缘负载均衡
声明 本文是对Netflix 博客的翻译 前言 在先前关于Zuul 2开源的文章中,我们简要概述了近期在负载均衡方面的一些工作。在这篇文章中,我们将更详细地介绍这项工作的原因、方法和结果。 因此,我们开始从Zuul和其他团队那里学习&#…...
元组的创建和删除
目录 使用赋值运算符直接创建元组 创建空元组 创建数值元组 删除元组 自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 元组(tuple)是Python中另一个重要的序列结构&#…...
嵌入式开发中volatile关键字的原理与应用
1. 理解volatile关键字的核心作用在嵌入式C语言开发中,volatile关键字是解决编译器优化导致意外行为的关键工具。当编译器对代码进行优化时,它会假设变量的值只在显式赋值时改变。然而在嵌入式系统中,许多变量的值可能被硬件、中断或其他线程…...
办公场景横向测评:GPT-5.5、DeepSeek、Gemini 处理公文优劣对比
进入 2026 年,AI 办公已经从“帮我写一段话”逐渐变成了“帮我完成一整套文档流程”。尤其是在公文、通知、会议纪要、方案初稿、汇报材料等场景里,大模型能不能理解语境、控制语气、保持格式,直接影响实际使用体验。目前常见的办公 AI 模型中…...
【SpringBoot+Elasticsearch 内容搜索系统实战】:架构设计与全流程实现
🔥你好我是fengxin_rou这是我的个人主页fengxin_rou的主页 ❄️欢迎查看我的专栏我的专栏 《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》 目录…...
量子机器学习在网络安全领域的算法演进与实践挑战
1. 量子机器学习:当算力革命遇见智能算法如果你关注过近几年的科技新闻,一定对“量子计算”这个词不陌生。它常常与“颠覆”、“革命”这样的词汇一同出现,听起来既神秘又遥远。但作为一名长期混迹在网络安全和算法优化一线的从业者ÿ…...
【车辆路径规划】基于RRT算法的车辆导航工具箱实现附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 dz…...
【无功优化】基于改进教与学算法的配电网无功优化【IEEE33节点】附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 dz…...
用过才敢说!2026年最值得信赖的专业AI论文网站
2026年AI论文写作工具已从“内容生成”进化为“学术全流程智能助手”,核心差异体现在文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规五大维度。本次测评覆盖6款主流工具,涵盖中文/英文、全流程/专项、免费/付费场景,让你快速锁定最…...
有哪些免费好用的在线论文排版工具值得推荐?
毕业季最让人头疼的,从来都不是论文内容创作,而是繁琐的格式排版 —— 标题层级错乱、目录更新失效、参考文献格式不规范、页眉页脚混乱…… 手动调整动辄耗费数小时,还容易反复返工。其实,多款免费好用的在线论文排版工具已能完美…...
终极指南:5分钟快速上手Eclipse Ditto数字孪生平台
终极指南:5分钟快速上手Eclipse Ditto数字孪生平台 【免费下载链接】ditto Eclipse Ditto™: Digital Twin framework of Eclipse IoT - main repository 项目地址: https://gitcode.com/gh_mirrors/ditto6/ditto 想要在物联网项目中轻松管理成千上万的设备吗…...
5分钟掌握SRWE:Windows窗口分辨率自由调整的终极指南
5分钟掌握SRWE:Windows窗口分辨率自由调整的终极指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾经遇到过这样的烦恼?游戏截图不够清晰,设计软件窗口无法适配特定…...
