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 自旋锁相关推荐

  1. linux内核自旋锁的代码分析

    前面看操作系统导论这本书,其中锁的历史变化有点感悟,现在追一下linux内核锁的代码. 一.自旋锁 1.锁的结构体 系统自旋锁结构体如下: typedef struct spinlock {union ...

  2. 探秘最新Linux内核中的自旋锁

    一.前言 目前最新内核中的自旋锁已经进化成queued spinlock,因此需要一篇新的自旋锁文档来跟上时代.此外,本文将不再描述基本的API和应用场景,主要的篇幅将集中在具体的自旋锁实现上.顺便说 ...

  3. 并发与竞争(三)自旋锁

    文章目录 自旋锁的概念 什么是自旋锁? 自旋锁的API函数(一) 自旋锁的使用步骤 其他自旋锁API函数(二) 自旋锁的注意事项 内核中自旋锁的实例 自旋锁死锁 写代码 临界区在哪? 最简单的实现逻辑 ...

  4. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  5. 面试题-自旋锁,以及jvm对synchronized的优化

    背景 想要弄清楚这些问题,需要弄清楚其他的很多问题. 比如,对象,而对象本身又可以延伸出很多其他的问题. 我们平时不过只是在使用对象而已,怎么使用?就是new 对象.这只是语法层面的使用,相当于会了一 ...

  6. linux并发控制之自旋锁

    自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式. 通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为"我当前在运行,请等待"或者标记为"我当前不 ...

  7. Java锁的种类以及辨析(二):自旋锁的其他种类

    作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...

  8. jvm第7节-锁(偏向锁,轻量锁,自旋锁)

    为什么80%的码农都做不了架构师?>>>    在介绍锁之前我们先介绍一个线程不安全的例子,一个全局的list,开2个线程往里面插入数据,代码如下: package com.jvm. ...

  9. 嵌入式 自旋锁、互斥锁、读写锁、递归锁

    互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程 ...

  10. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

最新文章

  1. ceph bluestore源码分析:非对齐写逻辑
  2. ndarray维度认识及np.concatenate函数详解
  3. 首款移动社交购物平台“商宝”的产品简介、特点、交易服务以及入驻方式
  4. java 使用正则表达式过滤HTML中标签
  5. 将深度学习技术应用于基于情境感知的情绪识别
  6. win10使用WSL安装CentOS7
  7. python alpha_如何用Python打造一个简易版的Alpha GO?
  8. [html] 举例说明图片懒加载的方案有哪些?
  9. 06_jQuery_内容过滤
  10. 平时喜欢使用的软件总结 欲善其事,必先利其器
  11. dw怎么修改html框架的宽度,Dreamweaver (dw)cs6中div标签宽度和高度设置方法
  12. Windows 64位下安装Redis超详细教程
  13. 服役七年超级计算机,太费电 曾经的最快超级计算机服役5年即退休
  14. 头条搜索“美丽中国”,你为哪处风景胜地打过Call?
  15. pytorch中tensor类型转换
  16. 犀牛3D造型软件Rhino 7 for Mac
  17. JSON Viewer丨Json格式查看器
  18. 什么是BT1120协议
  19. 淘宝客SDK,一键导入淘宝客商城,快速实现流量变现,新增商城返利功能
  20. win7怎样更改计算机密码,win7系统电脑怎么设置开机密码

热门文章

  1. 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。...
  2. Spring MVC 实现文件的上传和下载
  3. 分享几个Python小技巧函数里的4个小花招 1
  4. linux系统--C语言程序开发的基本步骤(包含gcc的基本步骤)
  5. 『TensorFlow』读书笔记_TFRecord学习
  6. Go语言入门之指针的使用
  7. 过来人谈在美国大学里的中国研究生
  8. Java之品优购课程讲义_day09(2)
  9. eclipse(mac)启动配置-设置jdk路径
  10. 软件天才都是训练出来的