linux锁学习记录

APUE学习记录(零)——Ubuntu14.04环境搭建 最近在学习 APUE,所以顺便将每日所学记录下来,一方面对所学知识进行梳理,另一方面也为了以后再看时方便。   这篇博文不涉及书上的知识,只是在虚拟机里安装了Ubuntu14.04,先做一些目前需要的环境配置,以后有新的需求再添加进来,故命名为APUE学习记录(零)。 阅读详情

临界区和竞争条件:

       所谓的临界区,就是访问和操作共享数据的额代码段,多个执行线程并发访问同一个资源通常是不安全的。为了避免在临界区中并发的执行,必须保证这些代码原子的执行。如果两个执行线程有可能处于同一临界区中同事执行,那么这就是程序的bug,如果情况真的发生,就称之为竞争条件。这种情况出现的机会往往非常小。

       这样,避免并发和防止竞争条件成为同步。

       锁是采用原子操作实现的,而原子操作不存在竞争,

造成并发执行的原因

       用户空间之所以需要同步,是因为用户程序会被调度程序抢占和重新调度。由于用户进程可能在任何时刻被抢占,而调度程序完全可能选择另一个高优先级的进程到处理器上执行,所以就会使得一个程序正在处于临界区时,被非自愿的抢占了。如果重新调度的进程随后也进入同一个临界区,前后两个进程相互之间就会产生竞争。另外,因为信号处理是异步发生的,所以,即使是单线程的多个进程共享文件,或者在一个程序内部处理信号,也有可能产生竞争条件。

       内核中有类似可能造成并发执行的原因。

       中断——几乎可以在任何时刻异步,打断当前正在执行的代码。

       软中断和tasklet——内核能在任何时刻唤醒或者重新调度软中断和tasklet。打断当前正在执行的代码

       内核抢占——内核具有抢占性。

       睡眠以及与用户空间同步。

       对称多处理——两个或多个处理器其可以同时执行代码

因此存在如下的bug:

       如果在一段内核代码操作某一资源的时候系统产生了一个中断,而且该中断的处理程序还要访问这一资源,这就是一个bug.

       如果一段内核代码在访问一个共享资源期间可以被抢占,这也是一个bug.

       如果内核代码在临界区里睡眠,那简直就是故障欢迎竞争条件的

实际上,真正有挑战性的地方在于辨认出真正需要共享的数据和相应的临界区,记住,在开始设计代码的时候就要考虑加入锁。

       在编写代码的开始阶段就要设计恰当的锁。

重要的是了解需要保护写什么。

       对于大对数的内核数据来说都是需要加锁的。如果有其他执行线程可以访问这些数据,那么这些数据就要加上某种形式的锁。切记,是要给数据枷锁而不是要给代码加锁。

       在编写内核代码的同时,需要考虑如下的问题:

       这个数据是不是全局的,除了当前进线程以外,其他线程能不能访问他。

       这个数据会不会在进程上下文和中断上下文中共享。

       进程在访问数据时可不可能被抢占,被调度的程序会不会访问同一数据

       当前进程是不是会睡眠在某些资源上,如果会的话,此时的数据处于何种状态

       如何防止数据失控

       如果函数在另一个处理器上被调度还会怎么样

       如何确保代码远离并发的威胁?

死锁

       死锁的产生需要一定的条件,要有一个或多个执行的线程和一个或多个资源。每个线程都在等待其中的一个资源,但是所有的资源都已将被占用。线程之间相互等待。但他们永远不会释放已经占有的资源。

可以用一些简单的规则来帮助避免死锁

       使用嵌套的锁时必须保证以相同的顺序获取锁,这样可以阻止致命拥抱类型的锁。

       防止发生饥饿。

       不要重复请求同一个锁

       设计应力求简单。

在代码中使用锁的地方,对锁的获取顺序加上顺序是个良好的习惯。

争用和扩展性:

       锁的争用会降低系统的性能,高度争用的锁会成为系统的瓶颈。

       扩展性是对系统可扩展程度的一个量度。

 

       在设计之初加锁方案应该力求简单,仅当需要时再进一步细化方案

精髓在于力求简单。

       记录就到这里

 

       爱你YZ

Linux ——IPC 锁 最好的参考资料:1.师从互联网。2.UNP v2 Posix IPC的相关章节7、8、9。3.Linux man 命令。4.APUE 相关章节11、14。第一条:概述                   这里介绍的是Posix.1线程标准的:互斥锁、条件变量、读写锁。他们主要用来同步一个进程内各个线程的,如果把它们放在一个共享内存空间中,Posix允许他们用于进程间同步。如果想了解他们的实现,在libc源码的nptl文件下,你可以找到他们。                    我同样也会介绍Posix.1 阅读详情

相关推荐

Linux进程同步之记录锁(fcntl)

记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作。尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记录上锁往往更容易使用,且效率更高。 记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区。对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同

anonymalias的专栏 8979

Linux学习——锁

Liinux锁的学习。

qq_41934502的博客 1727

linux下实现高性能读写锁(read/write lock)

在linux下按照windows的slim read/write lock算法实现的读写锁源码。

Linux 常见的锁

我们在开发中使用的几种常见的锁主要有互斥锁、自旋锁、读写锁、乐观锁和悲观锁这五种。

weixin_58004346的博客 1989

Carsim2019与Simulink (Matlab2018b)联合仿真成功(超详细)

Carsim与Simulink联合仿真成功

强强的博客 3万+

英飞凌TC3xx的GTM模块到底有多强?从PWM生成到电机驱动,一篇讲透车载定时器核心

本文深入解析英飞凌TC3xx系列中的GTM模块在汽车电子领域的强大功能,从PWM生成到电机驱动的全链路设计。通过模块化架构和硬件级解决方案,GTM显著提升系统精度和响应速度,适用于电机控制、电源管理等复杂场景。文章结合实战经验,详细拆解GTM的技术实现和性能优势。

weixin_27741699的博客 202

[Linux]互斥锁(什么是锁,为什么需要锁,怎么使用锁(接口),什么是死锁,怎么避免死,锁演示代码)

什么是锁?锁是一种同步机制,用于控制多个线程对共享资源的访问。通过锁,可以确保一次只有一个线程能够访问特定的代码段或数据,从而防止数据竞争和不一致。锁的主要目的是确保数据的一致性和线程安全性。为什么需要锁?需要锁的主要原因在于确保多线程或多用户环境中共享资源访问的原子性和数据一致性。在多线程应用中,若多个线程同时访问并修改同一资源,可能导致数据冲突、不一致甚至损坏。

2202_75305885的博客 2467

新手必看:用Simulink搭建飞跨电容三电平逆变器的完整流程(附SPWM配置技巧)

本文详细介绍了使用Simulink搭建飞跨电容三电平逆变器(FCNPC)的完整流程,特别聚焦于SPWM调制策略的配置技巧。通过模块拆解、参数设置和波形优化的三步法,配合实操截图和典型参数表,帮助新手快速掌握多电平逆变器的建模与仿真技能,适用于电力电子学习和项目开发。

weixin_30664051的博客 284

详解Linux中的锁

spin_lock_irq()/spin_unlock_irq()会禁止/使能中断,另一套函数是spin_lock_irqsave()/spin_unlock_irqrestore(),spin_lock_irqsave()会先保存当前中断状态(使能还是禁止),再禁止中断;这些函数改名为spin_lock_softirq也许更恰当,请记住:spin_lock_bh会禁止Softirq,而不仅仅是禁止“中断下半部”(timer、tasklet里等都是Softirq,中断下半部只是Softirq的一种)。

m0_73726682的博客 1284

如何利用ADS中的耦合线设计带通滤波器并转换为HFSS模型

耦合线带通滤波器是一种常用的微带滤波器形式,由多个长度为四分之一波长的耦合线节组成,在所需频点形成谐振,构成滤波器的频率响应特性。首先我们先来了解一下耦合线带通滤波器的电路结构,见下图:包括两对耦合线,中间为公共连接点,其中两对耦合线的偶奇模阻抗为(Z1e,Z1o)和(Z2e,Z2o,端口输入阻抗为Z0)。2.指定一个初始奇偶模值,ADS优化出一个合适的结果,通过奇偶模值利用linecalc工具计算出微带耦合线尺寸。假设中心频率为2GHz,则对应频点的电长度为。5.运行结果,两个软件仿真结果基本一致。

auqihc的博客 2227

CODESYS做Modbus TCP主站踩坑记:从IP配置到数据映射的完整避坑指南

本文详细记录了在CODESYS中配置Modbus TCP主站的全过程,从IP配置到数据映射的常见问题及解决方案。重点解析了网络适配器选择、Slave ID误解、地址偏移陷阱等关键问题,并提供了实用的调试技巧和性能优化建议,帮助工业通信开发者高效避坑。

weixin_30642561的博客 624

linux用户空间下的锁介绍

与互斥锁不同,读写锁允许多个线程同时读取共享资源(只要它们是读操作),但只允许一个线程写入共享资源,一旦有一个线程试图执行写操作,其他所有线程都将被阻塞,直到写操作完成。Linux用户空间的屏障(Barrier)是一种同步机制,用于协调多个线程或多进程应用在执行过程中的同步点,同步一组线程,确保它们在达到某个点之前都不会继续执行。总之,Linux用户空间的自旋锁是一种用于保护临界区的同步机制,通过忙等待方式尝试获取锁,适用于对临界区的竞争非常短暂的情况。此外,CAS操作需要小心处理循环,以防止无限自旋。

szqy00的博客 1130

单电源运放偏置电压设计:如何避免信号失真

本文详细解析了单电源运放偏置电压设计的关键技术,以LM358为例,探讨如何通过1/2 VCC偏置避免信号失真。文章从基本原理出发,揭示了双端偏置的黄金法则,并提供了常见设计陷阱的解决方案和进阶调试技巧,帮助工程师实现高保真信号放大。

weixin_29266647的博客 292

学习记录--开篇

就以这篇作为这期学习记录的开篇吧,今天晚上7:00到家,大概7:20开始看视频,还是看的黑马的视频,可能是由于挺长时间没有学习了吧,感觉都没有什么状态。 印象最深的有如下几点: Linux里的top是监视CPU运行的命令; htop是他的友好显示版本,可以显示当前进程。 GIL锁:全局解释器锁 可以保证同一时刻只有一个线程可以执行代码。 然后还看了import的几种方式。 封装、继承和多态的深层次...

cuizhihong的博客 237

【YOLOv11多模态融合改进】| CVPR2025 LCA轻量交叉注意力 双向模态交叉引导 + 双支路噪点抑制,兼顾纹理与热目标特征融合

可见光模态富含纹理、色彩、边缘细节,但夜间/低照度场景信噪比极低,暗区噪声泛滥;红外模态依靠热辐射凸显弱小目标、暗区物体轮廓,但缺失真实色彩与精细纹理。简单拼接/逐加融合仅做浅层特征叠加,无法建立可见光纹理、红外热特征的双向引导关联,两类模态互补信息无法精准互通;普通自注意力仅单模态内部建模,跨模态交互匮乏,红外热目标易被可见光暗噪声淹没,可见光有效纹理易被红外灰度信息覆盖;

Limiiiing的博客 115

基于Java+SpringBoot+微信小程序实现奶茶点单系统

再不用担心逢年过节的第一杯奶茶有没有人送了,制作一个奶茶点单系统自己当店主,开怀畅饮,一劳永逸。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

旧手机安装Linux系统记录

旧手机安装linux deploy记录。 并安装java 使用ngrok配置内网穿透

weixin_43892276的博客 9323

IDEA的使用指南

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

【SOC】【Linux】基于全志F133+Linux内核的嵌入式Linux开发的学习过程记录

本文介绍了Linux内核开发的基础知识和实践方法,主要包括模块开发、常用数据结构(IDR、链表、红黑树、bitmap、kfifo)以及并发控制机制(互斥锁、自旋锁、信号量、顺序锁、原子操作)。文章详细讲解了线程操作、工作队列、tasklet和等待队列的实现,并提供了完整的代码示例。作者建议学习Linux驱动开发需要C语言和单片机基础,通过B站视频快速入门,强调要掌握独立分析Linux源码和驱动开发的能力。

qq_73648789的博客 883

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锁—记录上锁

记录锁的功能是:当一个进程正在读或者修改文件的某一个部分时,它可以阻止其他进程修改同一文件区。记录锁其实是 字节范围锁,因为它锁定的只是文件中的一个区域,也可能是整个文件。 1.基础介绍 SVR3通过fcntl函数增加了记录锁功能。fcntl函数的原型已经在以前给出,这边再重复一次。 #include<fcntl.h> int fcntl(int filedes, int cmd, .../* struct flock *flockptr */); 对于记录锁,cmd是F_GETLK、F_

chengcheng1024的博客 341

Statistics and Machine Learning Toolbox

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

danlock锁_Linux下的进程同步机制 – 记录锁

子进程不继承父进程的记录锁.当可能出现几个进程争用(读、写)同一个Critical Section的时候,加锁是常用的做法。Linux加锁的方法,除了经典的IPC(Semophore)之外,记录锁(Record Locking)提供了更简单的方法。其实记录锁的名字叫文件锁会比较贴切一点,因为其加锁和解锁都是通过对文件的操作完成的。文件锁的粒度大可到整个文件,小可到一个字节,长度可变,但都可以说是对...

weixin_39827306的博客 271

Linux锁的介绍与使用

Linux内核提供了很多类型的锁,它们大体上可以分为两类:(1)自旋锁(spinning lock)(2)睡眠锁(sleeping lock)

hao_994的博客 1129

Linux中的两种文件锁—协同锁与强制锁

文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。 在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之间的不同之处。 我们将采取以下的例子来解释为什么需要使用文件锁。 1、  进程“A”打开和读取一个文件,此文件包含账户相关的一些信息。 2、  进程“B”也打开了这个文件,并读取了文件中的信息

Michael Xiao的程序人生 1997

linux open锁文件,linux 文件锁的实现及其应用

文件锁1.fcntl()函数说明前面讲述的5个基本函数实现了文件的打开、读/写等基本操作,本节将讨论在文件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况。这时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制...

weixin_35486751的博客 552

Linux记录锁

记录锁的功能是:当一个进程正在读或者修改文件的某一个部分时,它可以阻止其他进程修改同一文件区。记录锁其实是 字节范围锁,因为它锁定的只是文件中的一个区域,也可能是整个文件。1.fcntl记录锁SVR3通过fcntl函数增加了记录锁功能。fcntl函数的原型已经在以前给出,这边再重复一次。#include<fcntl.h> int fcntl(int filedes, int cmd, .../

wonder 1万+

Linux系统编程—记录锁

1. 简介 使用 fcntl() 能够在一个文件的任意一个部分上放置一把锁,这个文件部分既可以是一个字节范围,也可以是整个文件。 2. API #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 使用 fcntl() 操作记录锁时,cmd 可以取值如下: F_SETLK:设置锁,可以是加锁或解锁,取决于 arg 参数;如果无法立马加锁,则 fcntl() 会立马返回

gaoZhuanMing的博客 1321

linux、windows中哪些锁是递归锁,哪些不是

同一线程多次获得锁时,不会造成阻塞。在释放锁的过程中,线程需要相应次数地释放锁,只有当计数器降为零时,其他线程才有机会获得锁。递归锁和非递归锁的主要区别在于同一个线程是否可以多次获取同一个锁而不产生死锁。递归锁允许同一个线程多次获取同一个锁,只有在多次解锁之后才能真正释放锁;在Linux中,pthread_mutex_t锁默认是非递归锁,但可以通过设置PTHREAD_MUTEX_RECURSIVE属性将其变为递归锁。递归锁是一种特殊的线程同步机制,它允许同一线程在持有锁的情况下多次获得同一把锁。

slty_123的博客 1925
上一篇: 工作队列
下一篇: make menuconfig时出现 #include CURSES_LOC错误
maclinuxye
博客等级 码龄11年 10粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值