SylixOS arm64 自旋锁
SylixOS 下自旋锁结构体,使用union , SLD_uiLock 和 SLD_usSvcNow, SLDQ_usTicket共用空间
SLD_uiLock 代表了 是否上锁, SLD_usTicket 是当前自己编号,每次加锁后这个值会加1.依次递增。 SLDQ_usSvcNow 代表了目前正在锁的编号。 加入此时有四个加锁 SCL_usTicket 每次加锁都会递增加1。 SLDQ_usSvcNow只有释放锁的时候都会递增加1.
每次加锁 都会判断是否已经到了自己编号可以往下走的时候,如果不是调用相应函数,或者进入arm 低功耗模式。
ldaxr 是加载命令,根据arm 手册介绍是加载数据到寄存器,并保证是原子操作,同时加入了内存屏障
psld是在加锁时声明的一个内存变量。 将psld->SLD_uiLock 的值加载到 slVal中。也是是把传进来的自旋锁结构体值赋值给临时变量中的SLD_usSvcNow, SLDQ_usTicket。 add命令是相加,将 sldVal 加上 1 << LW_SPINLOCK_TICKET_SHIFT.
#define LW_SPINLOCK_TICKET_SHIFT 16 根据宏定义是左移16位,根据spinlock 结构体 定义,左移16位是给SLDQ_usTicket加1。 stxr命令又将相加后的值写入到可内存中psld中。这里这几句汇编主要是给SLDQ_usTicket 加1.
stxr命令在写入成功后第一个参数会变为0,失败会变为1.
cbnz 主要是判断写入是否成功,如果失败了,整个过程在从头开始。
解锁操作主要是将SLD_usSvcNow 加1,然后调用dsb内存屏障。调用sev命令,唤醒正处于wfe低功耗模式的核。
SylixOS arm64 自旋锁相关推荐
- linux内核自旋锁的代码分析
前面看操作系统导论这本书,其中锁的历史变化有点感悟,现在追一下linux内核锁的代码. 一.自旋锁 1.锁的结构体 系统自旋锁结构体如下: typedef struct spinlock {union ...
- 探秘最新Linux内核中的自旋锁
一.前言 目前最新内核中的自旋锁已经进化成queued spinlock,因此需要一篇新的自旋锁文档来跟上时代.此外,本文将不再描述基本的API和应用场景,主要的篇幅将集中在具体的自旋锁实现上.顺便说 ...
- 并发与竞争(三)自旋锁
文章目录 自旋锁的概念 什么是自旋锁? 自旋锁的API函数(一) 自旋锁的使用步骤 其他自旋锁API函数(二) 自旋锁的注意事项 内核中自旋锁的实例 自旋锁死锁 写代码 临界区在哪? 最简单的实现逻辑 ...
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
- 面试题-自旋锁,以及jvm对synchronized的优化
背景 想要弄清楚这些问题,需要弄清楚其他的很多问题. 比如,对象,而对象本身又可以延伸出很多其他的问题. 我们平时不过只是在使用对象而已,怎么使用?就是new 对象.这只是语法层面的使用,相当于会了一 ...
- linux并发控制之自旋锁
自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式. 通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为"我当前在运行,请等待"或者标记为"我当前不 ...
- Java锁的种类以及辨析(二):自旋锁的其他种类
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
- jvm第7节-锁(偏向锁,轻量锁,自旋锁)
为什么80%的码农都做不了架构师?>>> 在介绍锁之前我们先介绍一个线程不安全的例子,一个全局的list,开2个线程往里面插入数据,代码如下: package com.jvm. ...
- 嵌入式 自旋锁、互斥锁、读写锁、递归锁
互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程 ...
- java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...
最新文章
- ceph bluestore源码分析:非对齐写逻辑
- ndarray维度认识及np.concatenate函数详解
- 首款移动社交购物平台“商宝”的产品简介、特点、交易服务以及入驻方式
- java 使用正则表达式过滤HTML中标签
- 将深度学习技术应用于基于情境感知的情绪识别
- win10使用WSL安装CentOS7
- python alpha_如何用Python打造一个简易版的Alpha GO?
- [html] 举例说明图片懒加载的方案有哪些?
- 06_jQuery_内容过滤
- 平时喜欢使用的软件总结 欲善其事,必先利其器
- dw怎么修改html框架的宽度,Dreamweaver (dw)cs6中div标签宽度和高度设置方法
- Windows 64位下安装Redis超详细教程
- 服役七年超级计算机,太费电 曾经的最快超级计算机服役5年即退休
- 头条搜索“美丽中国”,你为哪处风景胜地打过Call?
- pytorch中tensor类型转换
- 犀牛3D造型软件Rhino 7 for Mac
- JSON Viewer丨Json格式查看器
- 什么是BT1120协议
- 淘宝客SDK,一键导入淘宝客商城,快速实现流量变现,新增商城返利功能
- win7怎样更改计算机密码,win7系统电脑怎么设置开机密码