RISCV——Spinlock锁的理解
目录
1. 原子操作
2. 锁是干嘛的
3. 锁的实现
1. 原子操作
gcc从4.1.2开始提供了__sync_*系列的build-in函数,用于提供加减和逻辑运算的原子操作,主要接口的其声明如下:
- type __sync_fetch_and_add (type *ptr, type value, ...): 将value加到ptr上,结果更新到ptr,并返回操作之前*ptr的值
- type __sync_fetch_and_sub (type *ptr, type value, ...):从ptr减去value,结果更新到ptr,并返回操作之前*ptr的值
- type __sync_fetch_and_or (type *ptr, type value, ...): 将ptr与value相或,结果更新到ptr, 并返回操作之前*ptr的值
- type __sync_fetch_and_and (type *ptr, type value, ...): 将ptr与value相与,结果更新到ptr,并返回操作之前ptr的值
- +type __sync_fetch_and_xor (type *ptr, type value, ...):将ptr与value异或,结果更新到ptr,并返回操作之前ptr的值
- type __sync_fetch_and_nand (type *ptr, type value, ...): 将ptr取反后,与value相与,结果更新到ptr,并返回操作之前ptr的值
- +type __sync_add_and_fetch (type *ptr, type value, ...):将value加到ptr上,结果更新到ptr,并返回操作之后新ptr的值
- type __sync_sub_and_fetch (type *ptr, type value, ...):从ptr减去value,结果更新到ptr,并返回操作之后新*ptr的值
- type __sync_or_and_fetch (type *ptr, type value, ...):将ptr与value相或, 结果更新到ptr,并返回操作之后新*ptr的值
- type __sync_and_and_fetch (type *ptr, type value, ...):将ptr与value相与,结果更新到ptr,并返回操作之后新*ptr的值
- type __sync_xor_and_fetch (type *ptr, type value, ...):将ptr与value异或,结果更新到ptr,并返回操作之后新ptr的值
- +type __sync_nand_and_fetch (type *ptr, type value, ...):将ptr取反后,与value相与,结果更新到ptr,并返回操作之后新ptr的值
- bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...):比较*ptr与oldval的值,如果两者相等,则将newval更新到*ptr并返回true
- type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...):比较ptr与oldval的值,如果两者相等,则将newval更新到ptr并返回操作之前*ptr的值
- __sync_synchronize (...):发出完整内存栅栏
- +type __sync_lock_test_and_set (type *ptr, type value, ...): 将value写入ptr,对ptr加锁,并返回操作之前*ptr的值。即,try spinlock语义
- void __sync_lock_release (type *ptr, ...):将0写入到ptr,并对ptr解锁。即,unlock spinlock语义
2. 锁是干嘛的
锁解决的问题:为了并行中的正确性(共享数据一致性)
多核处理器,多个CPU如果同时访问一些共享资源,可能会导致数据不一致,即共享数据用锁设置成多CPU分时访问。
锁带来的问题:并行变串行,效率降低
3. 锁的实现
上锁:
__sync_lock_test_and_set
通过原子操作赋值,也就是锁只能一方获取。
解锁:
__sync_lock_release
通过原子操作清0。
锁的操作均是原子操作,但是实现锁的功能,还需要内存屏蔽功能,保证临界区的执行可靠性。某些平台的部分代码:
#define SPINLOCK_INIT \{ \0 \}#define CORELOCK_INIT \{ \.lock = SPINLOCK_INIT, \.count = 0, \.core = -1 \}/* Defination of memory barrier macro */
#define mb() \{ \asm volatile("fence" :: \: "memory"); \}#define atomic_set(ptr, val) (*(volatile typeof(*(ptr)) *)(ptr) = val)
#define atomic_read(ptr) (*(volatile typeof(*(ptr)) *)(ptr))
#define atomic_get(ptr) (*(volatile typeof(*(ptr)) *)(ptr))#ifndef __riscv_atomic
#error "atomic extension is required."
#endif
#define atomic_add(ptr, inc) __sync_fetch_and_add(ptr, inc)
#define atomic_sub(ptr, inc) __sync_fetch_and_sub(ptr, inc)
#define atomic_sub_return(ptr, inc) __sync_sub_and_fetch (ptr, inc)
#define atomic_or(ptr, inc) __sync_fetch_and_or(ptr, inc)
#define atomic_swap(ptr, swp) __sync_lock_test_and_set(ptr, swp)
#define atomic_cas(ptr, cmp, swp) __sync_val_compare_and_swap(ptr, cmp, swp)typedef struct _spinlock
{int lock;
} spinlock_t;typedef struct _semaphore
{spinlock_t lock;int count;int waiting;
} semaphore_t;typedef struct _corelock
{spinlock_t lock;int count;int core;
} corelock_t;static inline int spinlock_trylock(spinlock_t *lock)
{int res = atomic_swap(&lock->lock, -1);/* Use memory barrier to keep coherency */mb();return res;
}static inline void spinlock_lock(spinlock_t *lock)
{while(spinlock_trylock(lock));
}static inline void spinlock_unlock(spinlock_t *lock)
{/* Use memory barrier to keep coherency */mb();atomic_set(&lock->lock, 0);asm volatile("nop");
}
相关文章:

RISCV——Spinlock锁的理解
目录 1. 原子操作 2. 锁是干嘛的 3. 锁的实现 1. 原子操作 gcc从4.1.2开始提供了__sync_*系列的build-in函数,用于提供加减和逻辑运算的原子操作,主要接口的其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...): 将valu…...

阿里云幻兽帕鲁Windows 服务器怎么下载存档?
阿里云幻兽帕鲁Windows 服务器怎么下载存档?通过远程连接window服务器桌面的方式。 远程连接到阿里云的 Windows 服务器后,可以将压缩后的存档文件,拖动到 workbench\Download 目录后,就会触发浏览器的文件下载,然后将…...

ArcGIS API for JavaScript 4.X 本地部署(js,字体)
0 目录(4.19) /4.19/ 1 修改文件 1.1 init.js 编辑器打开/4.19/init.js搜索文本[HOSTNAME_AND_PATH_TO_JSAPI],然后将其连同前面的https://替换为http://ip地址/4.19,可以是localhost,只能本机引用 替换后ÿ…...

202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈
202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈 《猫的自信:治愈系生活哲学绘本》作者林行瑞,治愈系小漫画绘本,10分钟可以读完的一本书,线条明媚,自…...

数据结构链表力扣例题AC(2)——代码以及思路记录
206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 AC方法1 struct ListNode* reverseList(struct ListNode* head) {if(head NULL)return NULL;struct ListNode* n1, *n2, *n3;n1 NULL;n2 head;n3 head->next;while…...

C++面试宝典第30题:分发饼干
题目 假设你是一位非常棒的家长,想要给你的孩子们分发一些小饼干。但是,每个孩子最多只能给一块饼干。对每一个孩子i,都有一个胃口值gi,这是能让孩子们满足胃口的饼干的最小尺寸。对每一块饼干j,都有一个尺寸sj。如果sj >= gi,我们就可以将这个饼干j分配给孩子i,这个…...

文件包含+文件上传漏洞(图片马绕过)
目录 一.文件包含二.文件上传三.图片马四.题目 一.文件包含 将已有的代码以文件形式包含到某个指定的代码中,从而使用其中的代码或者数据,一般是为了方便直接调用所需文件,文件包含的存在使得开发变得更加灵活和方便(若对用户输入…...

华为配置旁挂二层组网隧道转发示例
配置旁挂二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络,以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时,不影响用户的业务使用。 组网需求 AC组…...

Postgresql源码(123)事务提交时三段资源释放分析ResourceOwnerRelease
0 总结 三段释放原因:因为如果先释放锁,没有释放一些共享资源(比如pin住的buffer),别人拿到锁后发现我们仍然持有一些资源,就会有问题。所以三阶段释放主要是以锁为分界线,先释放锁保护的资源&…...

电脑文件误删除如何恢复?2024最新三种恢复方法
我们在使用电脑的过程中,随着时间的不断推移,渐渐的我们会发现C盘内存空间不足了。这是因为我们很多文件都默认存储在C盘,所以导致C盘空间不足,电脑运行越来越慢。那么电脑哪些文件可以删除,电脑删除的东西怎么恢复&am…...

Netty应用——Google Protobuf强化篇(二十)
Protobuf发送一种实例 客户端可以发送一个 Student PoJo 对象到服务器 (通过 Protobuf 编码)服务端能接收 Student PoJo 对象,并显示信息(通过 Protobuf 解码) Student.proto syntax "proto3"; //版本 option java_outer_classname "StudentPOJO&…...

SpringAMQP开启“可靠性”机制
前言 上一篇介绍了如何在 《SpringBoot 中集成和使用消息队列》,看过这一篇就基本上可以在SpringBoot中使用消息队列了,但是消息队列他归根结底是一个客户端服务器模式的中间件,面对复杂的网络环境和分布式使用环境,难免会出现各…...

戴尔Dell R740服务器开机冒烟亮黄灯故障维修
今天分享的是一台过保修期的DELL PowerEdge R740服务器开机冒烟的维修案例。先上图: 接到用户报修后工程师立即响应,由于用户也是刚开工第一天服务器开机就出现了这种祥龙吐雾的祥兆,导致工厂业务流程无法正常使用,这台机器在东莞…...

【阅读笔记】空域保边降噪《Side Window Filtering》
1、保边滤波背景 保边滤波器的代表包括双边滤波、引导滤波,但是这类滤波器有一个问题,它们均将待处理的像素点放在了方形滤波窗口的中心。但如果待处理的像素位于图像纹理或者边缘,方形滤波核卷积的处理结果会导致这个边缘变模糊。 基于这个…...

vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style
当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现 1. 使用的插件 : sheet.js-xlsx 文档地址:https://docs.sheetjs.com/ 中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md xlsx-style&#…...

npm install一直卡在 sill idealTree buildDeps
当npm install命令在安装过程中卡在sill idealTree buildDeps阶段时,可能的原因包括网络延迟、镜像源问题或缓存问题。以下是一些可能的解决方法: 检查镜像源: 打开命令提示符(cmd)窗口。 输入命令npm config get…...

spring boot rabbitmq常用配置
直接上代码 package com.example.demo;import org.aopalliance.aop.Advice; import org.springframework.amqp.rabbit.annotation.RabbitListenerConfigurer; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframewo…...

MySQL学习记录——십삼 视图及用户、权限管理
文章目录 1、视图2、用户管理3、权限管理 1、视图 视图把查询出来的结果以表结构的形式存储起来,视图和基表有关系,两者的数据变化都会互相影响。 在查询时,假如要经常查询一条记录,select …,那么为了方便ÿ…...

PyCharm 自动添加文件头注释
PyCharm 自动添加文件头注释 1. File and Code Templates2. Python FileReferences 1. File and Code Templates File -> Settings -> Editor -> File and Code Templates -> Python Script Reformat according to style & Enable Live Templates Created by…...

用HTML Canvas和JavaScript创建美丽的花朵动画效果
目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>炫酷花朵</title><style>* {margin: 0;padding: 0;overflow: hidden;bac…...

java----js常用的api
java----js常用的api 时间函数获取当前时间: DateUtil.today()时间偏移字符换时间格式化 map.computeIfAbsent添加list 时间函数 获取当前时间: DateUtil.today() String todayDateUtil.today()String today “2024-02-01”; 时间偏移 往前退役30天 DateUtil.offsetDay(D…...

unity 使用VS Code 开发,VS Code配置注意事项
vscode 对应的插件(unity开发) 插件:.Net Install Tool,c#,c# Dev Kit,IntelliCode For C# Dev Kit,Unity,Unity Code Snippets 本人现在是用了这些插件 unity需要安装Visual Studio Editor 1、.Net Install Tool 设置 需要在设置里面配置…...

领域驱动设计(Domain Driven Design)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、场景和要求二、领域模型关键词1.领域2.子域3.通用语言4.限界上下文5.领域模型6.实体和值对象7.聚合根8.领域服务9.领域事件 总结 前言 Domain Driven Desi…...

CF778A String Game 题解
文章目录 CF778A String Game 题解题面翻译Input DataOutput DataInput Sample 1Output Sample 1题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示算法:二分代码: CF778A String Game 题解 link 题面翻译 …...

【工具插件类教学】Unity运行时监控变量,属性,事件等的值和调用Runtime Monitoring
目录 一、介绍 二、安装方式 三、入门 1.实例化和静态成员...

实际生产中的一次非典型的基于jmeter的接口自动化实践
实际工作中遇到过一次自动化巡检的需求,作为测试人员没法从源代码入手,加之数据库也不熟悉,故采取接口自动化的方式来实现巡检,算是一种歪门邪道吧,应该不是接口自动化的常规使用方式。jmeter在这里的作用实际上也只是…...

新能源汽车软件开发设计规范
新能源汽车 软件开发设计规范 版本: 1.0 编 制: 校 对: 审 核: 会 签: …...

Linux:grep进阶(11)
Linux:shell脚本:基础使用(4)《正则表达式-grep工具》_shell grep 全角字符串-CSDN博客https://blog.csdn.net/w14768855/article/details/132338954?ops_request_misc%257B%2522request%255Fid%2522%253A%252217083360171680022…...

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)
文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本: 项版本babe…...

8.2 新特性 - 透明的读写分离
文章目录 前言1. 安装部署1.1 下载安装包1.2 MySQL Shell1.3 配置 MySQL 实例1.4 启动 ReplicaSet1.5 启动 8.2 Router 2. 测试路由总结 前言 MySQL 8.0 官方推出过一个高可用方案 ReplicaSet 主要由 Router、MySQL Shell、MySQL Server 三个组件组成。 MySQL Shell 负责管理…...