linux并发控制之顺序锁

MTK Meta ISP 工具使用技巧与参数读取路径全解析 在联发科(MediaTek, MTK)平台上进行相机图像调试时,Meta ISP 工具是连接 PC 与设备进行参数调整、寄存器读取和图像输出的重要工具。本文以实战角度出发,系统梳理 Meta ISP 的使用流程、关键模块功能、典型调试技巧与参数读取路径,结合最新版平台(如MTK Genio/Dimensity 系列)架构,帮助工程师掌握联发科图像调优的核心流程。 阅读详情
http://blog.youkuaiyun.com/williamwang2013/article/details/8523710
顺序锁是对读写锁的一种优化。
    1.读执行单元绝对不会被写执行单元阻塞。即读执行单元可以在写执行单元对被顺序锁保护的共享资源进行写操作的同时仍然可以继续读,而不必等待写执行单元完成之后再去读,同样,写执行单元也不必等待所有的读执行单元读完之后才去进行写操作
    2.写执行单元与写执行单元之间仍然是互斥的。
    3.如果读执行单元在读操作期间,写执行单元已经发生了写操作,那么,读执行单元必须重新去读数据,以便确保读到的数据是完整的。
    4.要求共享资源中不能含有指针。

注意:
    1.顺序锁:允许读和写操作之间的并发,也允许读与读操作之间的并发,但写与写操作之间只能是互斥的、串行的。
    2.读写自旋锁:只允许读操作与读操作之间的并发,而读与写操作,写与写操作之间只能是互斥的、串行的。
    3.自旋锁:不允许任何操作之间并发。

理解:
定义于#include<linux/seqlock.h>

首先看它的结构体,这个很重要
typedef struct {
unsigned sequence;
spinlock_t lock;
} seqlock_t;

1.若读操作期间发生了写操作,则要重读,怎样实现重读呢?
do{
    seqnum = read_seqbegin(&seqlock_r);    //读开始
    ……
}while(read_seqretry(&seqlock_r,seqnum));    //读操作期间是否发生写
其中:
int read_seqretry(const seqlock_t* sl, unsigned start);
read_seqretry_irqrestore(lock, iv, flags);

static __always_inline unsigned read_seqbegin(const seqlock_t *sl)
{
unsigned ret = sl->sequence;
smp_rmb();
return ret;
}
static __always_inline int read_seqretry(const seqlock_t *sl, unsigned iv)
{
smp_rmb();
return (iv & 1) | (sl->sequence ^ iv);
}
从上面的代码可以看出,重读的关键就是对sequence变量的操作。

2.为什么可以允许同时读写,而写操作之间仍然互斥?
static inline void write_seqlock(seqlock_t *sl)
{
spin_lock(&sl->lock);
++sl->sequence;
smp_wmb();
}
static inline void write_sequnlock(seqlock_t *sl)
{
smp_wmb();
sl->sequence++;
spin_unlock(&sl->lock);
}
写操作其实就是利用自旋锁是对sequence变量的保护,进程在申请写锁的时候,只是简单的将sequence变量的值增1
对于写操作,首先将sequence变量的值保存下来(这时候已在do-while循环中),然后在read_seqretry函数中作判断,检测当前的读锁变量是否发生变化,若发生变化,则调用写锁函数,sequence变量的值增1,重新读;若不发生变化,则表示申请读锁成功

操作:
seqlock_init(x);       //动态初始化
DEFINE_SEQLOCK(x);     //静态初始化

void write_seqlock(seqlock_t* sl);        //写加锁
int write_tryseqlock(seqlock_t* sl);      //尝试写加锁
write_seqlock_irqsave(lock, flags);       //local_irq_save() + write_seqlock()
write_seqlock_irq(lock);                  //local_irq_disable() + write_seqlock()
write_seqlock_bh(lock);                  //local_bh_disable() + write_seqlock()

void write_sequnlock(seqlock_t* sl);         //写解锁
write_sequnlock_irqrestore(lock, flags);     //write_sequnlock() + local_irq_restore()
write_sequnlock_irq(lock);                   //write_sequnlock() + local_irq_enable()
write_sequnlock_bh(lock);                    //write_sequnlock() + local_bh_enable()

A.读操作:
unsigned int read_seqbegin(const seqlock_t* sl);
read_seqbegin_irqsave(lock, flags);          //local_irq_save() + read_seqbegin()
读执行单元在访问共享资源时要调用顺序锁的读函数,返回顺序锁s1的顺序号;该函数没有任何获得锁和释放锁的开销,只是简单地返回顺序锁当前的序号;
B.重读操作:
int read_seqretry(const seqlock_t* sl, unsigned start);
read_seqretry_irqrestore(lock, iv, flags);
在顺序锁的一次读操作结束之后,调用顺序锁的重读函数,用于检查是否有写执行单元对共享资源进行过写操作;如果有,则需要重新读取共享资源;iv为顺序锁的顺序号;

用例:

write_seqlock(&lock);
...... //写操作代码
write_sequnlock(&lock);

unsigned int seq_num = 0;
do
{
  seq_num = read_seqbegin(&seqlock);
  //读操作代码
  ......
} while(read_seqretry(&seqlock, seq_num));


注:如果写执行单元在操作被顺序锁保护的共享资源时已经保持了互斥锁保护对共享资源的写操作,即:写执行单元与写执行单元之间已经是互斥的,但是读执行单元仍然可以与写执行单元同时访问,那么这种情况下仅需要使用顺序计数(struct seqcount)即可,而不必使用spinlock。
使用顺序计数必须非常小心,只有确定在访问共享资源时已经保持了互斥锁才可以使用;即:只有写操作与写操作之间已经是互斥的、串行的时,才可以使用顺序计数。
从 Non-Unicode 到 Unicode:ABAP 程序切换的坑、原理与工程化落地指南 摘要 老SAP系统中ABAP程序员常假设1字符=1字节,导致大量代码依赖单字节处理逻辑。Unicode系统的引入彻底改变了字符长度、偏移量等底层认知,强制要求程序遵循Unicode规则。关键问题包括:字符/字节语义混淆、结构体访问风险、以及ABAP语言版本的门槛限制。迁移时需要重点关注字符串处理、二进制协议解析等场景,利用UCCHECK、RSUNISCAN_FINAL等工具扫描风险,并通过持续集成机制确保代码质量。建议在Non-Unicode阶段就启用unicode_check参数模拟严格模式,分批次修复问 阅读详情

相关推荐

车规级非易失存储选型指南:从AEC-Q100到ISO 26262的可靠性设计

非易失存储器是电子系统中负责长期保存关键数据与代码的核心组件,其可靠性直接决定了系统的长期稳定运行能力。在汽车电子领域,这一要求被提升到了极致,必须满足严苛的车规级标准。从原理上看,存储器的数据保持能力、擦写寿命等关键参数在高温、振动等恶劣环境下会急剧衰减,因此需要专门的设计与验证。其技术价值在于保障车辆全生命周期的功能安全与数据完整性,避免因存储失效导致的安全隐患或频繁维护。应用场景涵盖从发动机控制单元、自动驾驶域控制器到智能座舱的各类电子控制单元。本文聚焦于车规级非易失存储的选型,深入解析AEC-Q10

weixin_30938149的博客 458

顺序锁(seqlock)

顺序锁的引入 前面学习了spin_lock可以知道,spin_lock对于临界区是不做区分的。而读写锁是对临界区做读写区分,并且度进程进入临界区的几率比较大,因为写进程进入时需要等待读进程退出临界区。而有没有一种方法,可以保护写进程的优先权,使得写进程可以更快的获得锁? 答案是有的,就是顺序锁。 顺序锁的原理 顺序锁的设计思想是:对某一个共享数据读取的时候不加锁,写的时候加锁。同时为

半月旋空 6162

海思Hi3516CV610开发实战:在Ubuntu 22.04上从零构建嵌入式Linux开发环境

本文详细介绍了在Ubuntu 22.04上为海思Hi3516CV610开发板搭建嵌入式Linux开发环境的完整流程。从虚拟机配置、系统安装到基础环境设置,提供了实用技巧和常见问题解决方案,帮助开发者高效构建适用于智能视觉处理的开发环境。

weixin_29197699的博客 510

Linux并发控制——顺序锁(seqlock)

顺序锁seqlock

Fybon的专栏 1407

react +ant desiagn pro实现按钮操作权限控制

在ant desiagn pro中提供了一个access用于对权限进行控制,需引入useAccess和Access

Sylvasylva的博客 2211

YOLOv8 眼底病变检测(眼底照片)详细说明

本文介绍了基于YOLOv8的眼底病变自动检测系统。该系统可识别糖尿病视网膜病变、青光眼等5类常见眼底病变,包括微动脉瘤、出血点等特征。核心技术包含图像预处理、模型训练、病变检测与量化分析三个模块,采用1024×1024高分辨率输入,针对医学图像特点优化数据增强策略。系统支持批量处理、可视化标注和临床报告生成,提供病变数量、面积密度和严重程度评分等量化指标。特别强调医学合规性要求,需专业医生参与数据标注和模型验证,符合医疗器械认证标准。该系统可作为眼科医生的辅助诊断工具,提高眼底病变筛查效率。

u010117029的博客 133

linux 内核同步互斥技术之顺序锁

linux 内核同步互斥技术之顺序锁

一叶知秋的博客 382

互联网的发展简史—web

互联网是我现在生活所离不开的一个东西,但是你知道互联网的前世今生吗?本文将讲解互联网的发展史,以及很火的元宇宙概念。

yj11290301的博客 3562

顺序锁的原理和使用注意事项

顺序锁的原理和使用注意事项,nmi的handler里的顺序锁的使用,double check无锁思路,和rcu锁和读写锁的适用场景及比较

zhaoxin1989的博客 4611

AI自动化时代:一人公司的崛起与商业机会

AI技术正在重塑商业格局,催生"一人公司"创业新模式。这种轻资产、高效率的商业模式通过AI自动化运营,让个人创业者能以极低成本挑战传统企业。核心机会包括:1)AI自主公司替代人力密集型业务;2)为企业提供AI转型解决方案;3)利用AI工具实现个人创业。创业者需快速验证创意,聚焦人机协作,把握当前AI发展窗口期。未来,AI赋能的"一人公司"将成为商业新常态,带来更高的专业化和灵活性。抓住AI红利,学会人机协作,是个人创业成功的关键。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 520

Java:PriorityQueue详解——从零基础到应用

看了网上的详解,我反是一篇没看懂,都是什么垃圾玩意也发出来,无语,我自己根据这两天的学习总结出来了下面这些干货,我就是这么学会的,大家要是零基础看肯定木问题。

流楚丶格念的博客 6142

死锁终结者:顺序锁和轮询锁!,资深java面试题及答案

作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf。

m0_57472099的博客 1057

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2584

Linux设备驱动中的并发控制之七(顺序锁)

7.5.3 顺序锁顺序锁(seqlock)是对读写锁的一种优化,若使用顺序锁,读执行单元不会被写执行单元阻塞,读执行单元在写执行单元对被顺序锁保护的共享资源进行写操作时仍然可以继续读,而不必等待写执行单元完成写操作,写执行单元也不需要等待所有读执行单元完成读操作才去进行写操作。但是,写执行单元与写执行单元之间仍然是互斥的,即如果有写执行单元在进行写操作,其他写执行单元必须自旋在那里,直到写执行单元...

xiezhi123456的博客 327

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

linux内核工程师 7.7节 linux并发控制之顺序锁

顺序锁是对读写锁的一种优化。     1.读执行单元绝对不会被写执行单元阻塞。即读执行单元可以在写执行单元对被顺序锁保护的共享资源进行写操作的同时仍然可以继续读,而不必等待写执行单元完成之后再去读,同样,写执行单元也不必等待所有的读执行单元读完之后才去进行写操作     2.写执行单元与写执行单元之间仍然是互斥的。     3.如果读执行单元在读操作期间,写执行单元已经发生了写操作,那么,读...

zjy900507的博客 201

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux 内核 seqlock

Linux并发控制——顺序锁(seqlock) 定义在头文件linux/seqlock.h中; 顺序锁(seqlock)是对读写锁的一种优化,提高了读锁和写锁的独立性。写锁不会被读锁阻塞,读锁也不会被写锁阻塞。写锁会被写锁阻塞。 若使用顺序锁,读执行单元绝对不会被写执行单元所阻塞,也就是说,临界区可以在写临界区对被顺序锁保护的共享资源进行写操作的同时仍然可以继续读,而不必等待写执行单元完成之后...

zzt4326的博客 307

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

顺序锁

顺序锁与读写自旋锁非常类似,只是赋予了写者较高的优先级:即使在读者正在读的时候也允许写者继续运行。这样的好处是写者不用等待(除非另一个写者正在写),缺点是有些时候读者不得不反复多次读相同的数据直到它获得有效的副本。 每个顺序锁就是包括两个字段的seqlock_t结构:一个类型为spinlock_t的lock字段和一个整型类型的sequence字段,第二个字段是一个顺序计数器。每个读者都必...

weixin_30670925的博客 126

Linux内核的并发控制

    现代Linux系统中存在大量的并发来源,导致可能的竞态,竞态通常作为对资源的共享访问结果而产生。访问管理的常见技术称为“锁定”或者“互斥”——确保一次只有一个执行单元可操作共享资源。在Linux内核中,主要的竞态发生在如下几种情况:对称多处理器(SMP)的多个CPU;单CPU内进程与抢占它的进程;中断(硬中断、软中断、Tasklet、底半部)与进程之间。     另外有两种可能的原因...

雷连杰的技术博客 386

Linux其他类型锁

一、读写自旋锁 现在有个学生信息表,此表存放着学生的年龄、家庭住址、班级等信息,此表可以随时被修改和读取。此表肯定是数据,那么必须要对其进行保护,如果现在使用自旋锁对其进行保护。每次只能一个读操作或者写操作,但是,实际上此表是可以并发读取的。只需要保证在修改此表的时候没人读取,或者在其他人读取此表的时候没有人修改此表就行了。也就是此表的读和写不能同时进行,但是可以多人并发的读取此表。像这样,当某个数据结构符合读/写或生产者/消费者模型的时候就可以使用读写自旋锁。读写自旋锁为读和写操作提供了不同的锁,一次只能

留小乙的博客 1082

Linux内核开发之并发控制(三)

算了,既然给你那么多秘籍了,也不在乎这剩下的两三招: 出招表五:顺序锁(seqlock) 使用顺序锁,读执行单元绝不会被写执行单元阻塞,同时写执行单元也不需要等待所有读执行单元完成读操作后才进行写操作。但是写执行单元之间仍然是互斥的。如果读执行单元在读操作期间,写执行单元已经发生了操作,那么,读执行单元必须重新读取数据,以便确保得到的数据是完整的。 致命弱点:顺序锁有一个限制,就

Aniu127的专栏 481

linux设备驱动中的并发控制

在Linux内核中,主要的静态发生于以下几种情况:   1、对称多处理器(SMP)的多个CPU:   多个CPU共同使用系统总线,可访问共同点的外设和存储器。   2、单CPU内核进程与抢占它的进程:   一个进程的执行可被另一高优先级进程打断。   3、中断(硬中断、软中断、Tasklet,底半部)与进程之间:   中断可以打断正在执行的进程,若访问该进程正在

lc_mazha的专栏 529

面试官让你讲讲Linux内核的竞争与并发,你该如何回答?

工科生一枚,热衷于底层技术开发,有强烈的好奇心,感兴趣内容包括单片机,嵌入式Linux,Uboot等,欢迎学习交流! 爱好跑步,打篮球,睡觉。 欢迎加我QQ1500836631(备注优快云),一起学习交流问题,分享各种学习资料,电子书籍,学习视频等。 文章目录内核中的并发和竞争简介原子操作原子操作简介整型原子操作函数位原子操作函数原子操作例程自旋锁自旋锁简介自旋锁操作函数自旋锁例程读写自旋锁读写锁例程顺序锁顺序锁操作函数自旋锁使用注意事项信号量信号量简介信号量操作函数信号量例程互斥体互斥体简介互斥体操.

嵌入式与Linux那些事的博客 8342
上一篇: 自旋锁和互斥锁的区别
下一篇: windows10下配置adb.exe全目录可用的方法
class_brick
博客等级 码龄12年 223粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值