linux 自旋锁和信号量

Linux内核锁机制——信号量、互斥锁、自旋锁、原子操作详解 阅读目录 一、信号量(struct semaphore): 二、互斥锁:(mutex_lock) 三、自旋锁(spin_lock): 四、原子操作: 4.1、Linux原子概念: 4.2、Linux内核两组原子操作接口 参考资料 90分钟搞懂线程锁、进程锁以及分布式锁 还有人弄不懂线程锁、进程锁和分布式锁? 聊点通俗的自旋锁,互斥锁,原子操作,CAS 正文 linux内核中有多种内核锁,内核锁的作用是: 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数 阅读详情

    自旋锁最多只能被一个可执行线程持有(读写自旋锁除外)。自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去(一直占用CPU),在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。

信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(因为中断的上下文不允许休眠)(_trylock的变种能够在中断上下文使用);而自旋锁适合于保持时间非常短的情况,因为一个被争用的自旋锁使得请求它的线程在等待重新可用时自旋,特别浪费处理时间,这是自旋锁的要害之处,所以自旋锁不应该被长时间持有。在实际应用中自旋锁代码只有几行,而持有自旋锁的时间也一般不会超过两次上下方切换,因线程一旦要进行切换,就至少花费切出切入两次,自旋锁的占用时间如果远远长于两次上下文切换,我们就可以让线程睡眠,这就失去了设计自旋锁的意义。

如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。

自旋锁保持期间是抢占失效的(内核不允许被抢占),而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。

(问题:在单CPU可抢占内核中,如果一个进程请求自旋锁,那么他一直占用CPU循环等待自旋锁可用,那么原来占用自旋锁的进程得不到使用CPU的机会,怎么释放它自己占用的自旋锁呢?

回答:这种情况应该是在实际中不会发生的。因为考虑最开始的情况,一个进程需要自旋锁,而且这个时候自旋锁没有被占用,所以他加锁,进入临界区。因为这个时候内核已经被自旋锁设置成了非抢占式,所以正在运行的进程不会被调用处CPU,因此也不会再有其他的进程来请求这个已经被占用的自旋锁,当临界区代码处理完成后,释放了自旋锁,此时内核又被自旋锁设置成了可抢占模式,这个时候其他的进程可以被调度,因此可以再请求自旋锁等操作。因此问题中的情况应该在实际中不会发生。

注意,如果在一个已经对某个自旋锁加锁的进程的临界区中又申请对这个自旋锁加锁,则会导致进程自旋在那里,引起死机。)

一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。

无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁(读写锁除外)。自旋锁的实现和体系结构密切相关,代码一般通过汇编实现,定义在文件,实际用到的接口定义在文件夹中。

因为自旋锁在同一时刻至多被一个执行线程持有,所以一个时刻只能有一个线程位于临界区,这就为多处理器提供了防止并发访问所需的保护机制,但是在单处理器上,编译的时候不会加入自旋锁。它仅仅被当作一个设置内核抢占机制是否被启用的开关(gx自己的理解:在单内核可抢占式内核中,对自旋锁加锁导致禁止抢占,对自旋锁解锁导致恢复抢占模式。)。注意,Linux内核实现的自旋锁是不可递归的,这一点不同于自旋锁 在其他操作系统中的实现,如果你想得到一个你正持有的锁,你必须自旋,等待你自己释放这个锁,但是你处于自旋忙等待中,所以永远没有机会释放锁,于是你就被自己锁死了,一定要注意!

自旋锁可以用在中断处理程序中,但是在使用时一定要在获取锁之前,首先禁止本地中断(当前处理器上的中断),否则中断处理程序就可能打断正持有锁的内核代码,有可能会试图争用这个已经被持有的自旋锁。这样一来,中断处理程序就会自旋,等待该锁重新可用,但是锁的持有者在这个中断处理程序执行完毕之前不可能运行,这就会造成双重请求死锁。

自旋锁与下半部:由于下半部(中断程序下半部)可以抢占进程上下文中的代码,所以当下半部和进程上下文共享数据时,必须对进程上下文中的共享数据进行保护,所以需要加锁的同时还要禁止下半部执行。同样,由于中断处理程序可以抢占下半部,所以如果中断处理程序和下半部共享数据,那么就必须在获取恰当的锁的同时还要禁止中断。对于软中断,无论是否同种类型,如果数据被软中断共享,那么它必须得到锁的保护,因为同种类型的两个软中断也可以同进运行在一个系统的多个处理器上。但是,同一个处理器上的一个软中断绝 不会抢占另一个软中断(gx:因为在中断处理代码运行上下文中禁止响应同类型的中断?),因此,根本不需要禁止下半部。

自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁),它能够在中断上下文中使用。

Lnux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:

如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。

--------自旋锁对信号量------------------------------------------------------

需求                                 建议的加锁方法

低开销加锁                         优先使用自旋锁

短期锁定                           优先使用自旋锁

长期加锁                           优先使用信号量

中断上下文中加锁                 使用自旋锁

持有锁是需要睡眠、调度         使用信号量

 

原子操作、信号量、读写信号量和自旋锁:

http://kom118.blog.163.com/blog/static/476673182010312113630768/

 

自旋锁和信号量:

http://canlynet.blog.163.com/blog/static/2550136520091025069172/

自旋锁:一种当获取不到锁时,采用循环“测试并设置”的方式等待获取锁的一种互斥锁。

获取方法:采用test-and-set原子操作测试并设置某个内存变量。——实现互斥的方法。

不被打断:通过禁止抢占实现。

使用场合:可在进程上下文和中断上下文使用。

特点:

1、这种锁在获取不到时系统开销大,所以获取锁和释放锁的区间代码执行时间应该尽可能短。

2、在单CPU内核可抢占系统中,自旋锁持有期间内核抢占被禁止。但在单CPU内核不支持抢占的系统,自旋锁退化为空操作。——也就是说,如果持有锁的区间代码执行时间过长,会出现其它操作的不响应(假死机)现象。

3、因为抢占被禁止,自旋锁可保证临界区不受“别的CPU和本CPU内”的抢占进程进程打扰。(但是可响应中断,如果连中断都不响应,需要特定的加锁函数)

4、可能受到中断和底半部(BH)的影响,为此,与开、关中断配合,为此有:

spin_lock_irq(),spin_unlock_irq()

spin_lock_irqsave(),spin_unlock_irqstore()

spin_lock_bh(),spin_unlock_bh()


具体含义请参考教材或网络搜索。

自旋锁的扩展:1、读写自旋锁;2、顺序锁;3、读-拷贝-更新(RCU)

 ******************************************************************

信号量:一种当获取不到锁时,采用睡眠以等待唤醒的方式的一种同步机制。

不被打断:通过何种方式实现没找到参考,但可推断为同自旋锁。

获取方法:同自旋锁。

适用场合:由于会导致睡眠,只能在进程上下文中使用。但是int down_trylock(struct semphore *sem)可以。

特点:

获取不到锁时,进入睡眠状态,系统开销为上下文切换的时间Tsw。

自旋锁和信号量的对比:

1、当锁不能获取时,信号量开销为Tsw(上下文切换时间),自旋锁开销为等待获取时间Tcs,这两个时间对比权衡使用哪种机制。

2、信号量可用于保护包含可能引起阻塞的代码(即保护的代码中有可引起睡眠的函数如 copy_to_user(),copy_from_user()),自旋锁不能。自旋锁如果也使用这样的代码,当睡眠时另一个程进也要获取这把锁时,会进入循环,而睡眠时间一般相对较长,系统资源开销大的时间过长时,资源耗尽的情况会发生,直到这个睡眠的进程被唤醒,代码执行完毕,资源才得以释放。至于自旋锁区间睡眠引起死锁的情况我实在想不出来。但教材中都这么说。

3、中断上下文中只能使用自旋锁,不可使用信号量。因为中断上下文中是不能被调度的,但睡眠后会发生上下文切换,需要调度,在中断上下文中睡眠只能永久睡眠——死机!

 

 

如果一个函数需要一个锁,并且接着调用另外一个函数也试图请求这个锁,那么会导致代码死锁。

获得多个锁可能是危险的,然而,如果你有2个锁,称为lock1和lock2,代码需要同时获取,你有一个潜在的死锁。这个问题的解决方法常常是简单的:当多个锁必须获得时,它们应当一直以同样的顺序获得,只要遵照这个惯例,像上面描述的简单的死锁能够避免。

如果你怀疑锁竞争在损坏性能,你可能发现lockmeter工具有用,这个补丁装备内核来测量在锁等待花费的时间,通过看这个报告你能够很快知道是否锁竞争真的是问题。

对于2.6.10,有一个通用的环形缓存实现在内核中可用,如何使用它的信息看<linux/kfifo.h>。

 

加锁方式的几种选择:

1、             有时候一个共享资源是一个简单的整数值,对于这样的情况,内核提供了一个原子整数称为atomic_t,定义在<asm/atomic.h>中,atomic_t的操作非常快,因为他们在认识可能时编译成一条机器指令。有一系列函数支持atomic_t操作。

Atomic_t数据项必须通过这些函数存取,如果你传递一个原子项给一个期望一个整数参数的函数,你会得到一个编译错误。

2、             内核提供了一套函数来原子的修改或测试单个位,因为整个操作在单步内发生,没有中断能干扰。参见<asm/bitops.h>,他们保证是原子的,及时在SMP上。

可以通过为操作来模拟锁,但是此中情况最好使用自旋锁,自旋锁很好的调试过,而且很好的处理了中断和内核抢占。

一段模拟锁的为操作代码:

/*try to set lock*/

While(test_and_set_bit(nr,addr)  != 0)

    Wait_for_a_while();

    /*do your work*/

/*release lock,and check… */

If(test_and_clear_bit(nr,addr) == 0)

   Something_went_wrong(); /*already release:error*/

          为操作例子:

               Static int main_init(void)

               {

                                               Unsignedlong v = 0x00;

                    Unsigned log ret =test_and_rest_bit(0,&v);

                    Printk(KERN_INFO “%X,%X/n”,ret,v);

                    Return 0;

               }


               返回结果为0,1。

3、             信号量

4、             自旋锁

5、             Seqlock机制,参见<linux/seqlock.h>

6、             RCU(读取-拷贝-更新),参见<linux/rcupdate.h>。在真实世界中使用RCU的例子如下:<1>、网络路由表;<2>、无线IP驱动。

Rcu_read_lock()速度很快且禁止内核抢占,因此是原子的。

7、             Cpmpletion 完成机制。

原子操作:一个原子上下文只是一个状态,这里多个步骤必须在没有任何类型的并发存取的情况下进行。

Linux中的自旋锁和信号量实现方式 在down()函数中,首先对自旋锁进行加锁操作,然后判断计数器count是否为0,如果为0,则将当前线程添加到等待队列上,并将其状态设置为TASK_UNINTERRUPTIBLE,表示当前线程已经进入阻塞状态;自旋锁是一种基于忙等待的同步机制,它的主要思想是当线程竞争某个锁时,如果锁已经被其他线程持有,那么当前线程就会进入一个忙循环等待的状态,直到锁被释放为止。其中,spinlock_t结构体中的lock成员就是自旋锁的标志位,用于表示锁的状态。1:表示自旋锁当前被多个线程同时申请,此时需要进行自旋等待。 阅读详情

相关推荐

FPGA八股文(2)——笔试的FPGA问题汇总(持续更新)

常见FPGA笔试题的概念总结

居安士的博客 8908

linux信号量和自旋锁区别,linux ldd 信号量与自旋锁

Linux内核中最常见的锁是自旋锁。一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁"。如果锁可用,则"锁定"位被设置,而代码继续进入临界区;相反,如果锁被其他进程争用,则代码进入忙循环并重复检查这个锁,直到锁可用为止。这个循环就是自旋锁的"自旋"。自旋锁最多只能被一个可执行的线程持有。如果一个执行线程试图获得一个被争用的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用。注意...

weixin_29516495的博客 454

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 283

Linux 中自旋锁与信号量的区别

自旋锁是一种忙等待锁,当一个线程试图获取一个被占用的自旋锁时,它会一直循环(“自旋”)在那里,不断地检查锁是否可用,直到锁被释放为止。自旋锁的实现通常基于原子操作,例如在多处理器系统中,通过原子的测试和设置操作来实现锁的获取和释放。信号量是一种睡眠锁,当一个线程试图获取一个被占用的信号量时,它会被挂起,进入睡眠状态,直到信号量被释放并且该线程被唤醒为止。信号量通常使用一个计数器来表示可用资源的数量。当一个线程获取信号量时,计数器减一;当一个线程释放信号量时,计数器加一。

千千道的博客 1290

ADS仿真过孔阻抗(via designer)

目录一、将PCB层叠导入ADS(个人习惯)二、过孔的参数化设置三、过孔的仿真四、仿真结果查看五、导出仿真结果和模型六、过孔的经验法则欢迎交流,欢迎转载,转载请注明出处~ 工具:Via Designer Via Designer 调用的是ADS EMPro 仿真引擎,采用的FEM(三维全波有限元法)。 优点: 1、利用ADS已经做好的参数化和流程化的设计,不需要工程师完成过孔的建模这一繁琐的过程。 2、可以输出EMmodule 完成原理图协仿真。 一、将PCB层叠导入ADS(个人习惯) 个人认为在ADS中设置

luohuo9844的博客 1万+

5、Raspberry Pi CPU架构与多线程编程详解

本文详细介绍了Raspberry Pi的CPU架构(包括ARMv6Z、ARMv7-A和ARMv8-A),通过/proc/cpuinfo解析硬件信息,并深入探讨了多线程编程的核心技术。内容涵盖pthread库的使用,如线程创建、属性设置、等待与分离、线程同步机制(互斥锁),以及实际应用场景如多媒体处理和网络服务。同时强调了线程安全、死锁预防和资源管理等关键注意事项,帮助开发者在Raspberry Pi上构建高效稳定的多线程应用。

sre5engineer的博客 95

Linux多线程同步之信号量、自旋锁、读写自旋锁

1

weixin_45312249的博客 411

Cost-effective Attention Reuse across Multi-turn Conversations in Large Language Model Serving

通过多回合对话与人类互动是大型语言模型(LLM)的一个基本特征。然而,由于需要重复计算历史token的密钥值(KV)缓存,用于执行多回合会话的现有LLM服务引擎效率低下,从而导致高服务成本。为了解决这个问题,本文提出了AttentionStore,这是一种新的注意力机制,可以在多回合对话中重用KV缓存(即注意力重用),显著降低重复计算开销。AttentionStore维护一个分层的KV缓存系统,该系统利用经济高效的内存/存储介质为所有请求保存KV缓存。

c_cpp_csharp的专栏 394

linux内核重入信号量,Linux内核之自旋锁和信号量

Linux内核实现了多种同步方法,指令级支持的原子操作、自旋锁、信号量、互斥锁、完成量、大内核锁等等,我就挑比较有代表性的两个锁——自旋锁和信号量来分析。自旋锁Linux内核中最常用的锁就是自旋锁(spin lock),自旋锁最多只能被一个执行线程持有。如果一个执行线程试图获得一个被已经持有(即所谓争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用。在任意时间,自旋锁都可以防止多于...

weixin_36394468的博客 347

第10章《VTK自定义部件Widget》

是用于交互式操作 3D 场景的组件,例如移动对象、调整尺寸、创建标注等。VTK 提供了一些内置的 Widget,如。,用户可以点击鼠标,在 3D 场景中放置一个点。负责绘制一个点,并控制其颜色、大小等。,可用于 3D 标注、对象拾取等应用!等,但在某些应用中,我们需要。这样,我们就创建了一个。

yumeiguo的博客 523

数据分析之AB测试基础知识

在 A/B 测试中,零假设是两组的指标是相同的,当假设检验推断出两组指标不同,但事实上两组指标相同时,就是第一类错误。

qq_45727498的博客 561

linux下的自旋锁、信号量、互斥、完成量

linux下的竞态和并发都是比较容易发生的,原子操作只能针对整数进行,因此互斥和自旋锁也就被时常用来保护临界资源以解决竞态和并发的问题。在进程上下文中,保持时间长的情况可以用互斥体,因为可以睡眠,保持时间短的可以用自旋锁,减少上下文的切换时间。中断上下文中可以用自旋锁,不能用互斥体,因为可能会睡眠。但是中断上下文获取自旋锁之前要先禁用本地中断,防止中断嵌套。有自旋锁的代码不能睡眠,并且不能用在递归,否则会引起死锁。

weixin_42432281的博客 677

(五)深入理解蓝牙BLE之“Beacon包格式详解”

蓝牙Beacon格式详解 本文重点在结合Bluetooth官网spec和几个例子来使beacon帧格式更加容易被理解。 广播帧格式: 首先beacon是蓝牙BLE广播包的一种,蓝牙广播帧格式如下: PS:其实BLE数据帧除了报头字段和数据字段定义与广播帧不同之外,前导/接入地址/长度/校验格式均相同。 广播帧数据字段格式: 数据字段最长为37个字节:6个字节的广播设备地址 + 31个字节广播数据。 广播数据的格式如下:AD Structure1 +AD Structure2 + .....

1万+

Linux的自旋锁和信号量如何实现?

本篇博客参考《操作系统实战45讲》上节博客,我们学习了解决数据同步问题的思路与方法。Linux作为成熟的操作系统内核,当然也有很多数据同步的机制,它也有原子变量、开启和关闭中断、自旋锁、信号量。那今天我们就来探讨一下这些机制在Linux中的实现。看看Linux的实现和前面我们自己的实现有什么区别,以及Linux为什么要这么实现,这么实现背后的机理是什么。锁,保证了数据的安全访问,但是它给程序的并行性能造成了巨大损害,所以在设计一个算法时应尽量避免使用锁。httpshttps。...

了不起的盖茨比的博客 598

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

信号量与自旋锁 |Linux,信号量,自旋锁,睡眠锁,spinlock,semaphore 【转帖】

为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。 Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有

zhoujk0520的专栏 638

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux自旋锁与信号量

Linux自旋锁与信号量 小狼@http://blog.youkuaiyun.com/xiaolangyangyang     自旋锁与信号量最大的差别在于,自旋锁获得不到资源时的动作是不断的资源(即忙转浪费cpu的cycles),信号量则表现为睡眠等待 http://blog.chinaunix.net/uid-25942458-id-3823545.html

Hello Mr.Z的博客 497

linux自旋锁和java自旋锁,linux驱动开发之信号量与自旋锁(转)

注:下面蓝色的是我的注释和疑惑:在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发"竞态",因此我们必须对共享资源进行并发控制。Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。自旋锁与信号量"类似而不类",类似说的是它们功能上的相似性,"不类"指代它们在本质和实现机理上完全不一样,不属于一类。自旋锁不会引起调...

weixin_33129093的博客 246

Linux内核之自旋锁和信号量

Linux内核实现了多种同步方法,指令级支持的原子操作、自旋锁、信号量、互斥锁、完成量、大内核锁等等,我就挑比较有代表性的两个锁——自旋锁和信号量来分析。 自旋锁 Linux内核中最常用的锁就是自旋锁(spin lock),自旋锁最多只能被一个执行线程持有。如果一个执行线程试图获得一个被已经持有(即所谓争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用。在任意时间,自旋锁都可以

Gavin Guan的专栏 1316

linux信号量与自旋锁

在驅動程序中,當多個線程同時訪問相同的資源時(驅動程序中的全局變量是一種典型的共享資源),可能會引發"競態",因此我們必須對共享資源進行並發控制。Linux內核中解決並發控制的最常用方法是自旋鎖與信號量(絕大多數時候作為互斥鎖使用)。   自旋鎖與信號量"類似而不類",類似說的是它們功能上的相似性,"不類"指代它們在本質和實現機理上完全不一樣,不屬於一類。   自旋鎖不會引起調用者睡眠

kaixinbingju的专栏 802

linux 信号量_Linux学习第29节,从C语言源码分析,信号量和自旋锁有何区别

上一节主要介绍了Linux内核中的自旋锁,知道了自旋锁是不能睡眠的,因此只适合用于短时间的保护临界区。如果需要较长时间的持有锁,就不应该再使用自旋锁了,因为这会大量消耗 cpu 的性能,大大降低整个系统的效率。不过,在Linux内核开发中,不可避免的会遇到需要长时间保护的临界区,该怎么办呢?因此,Linux 内核还提供了一种同步共享数据的机制——信号量。信号量在 1968 年由计算机科学家 Eds...

weixin_39936388的博客 89

linux 线程锁和自旋锁,Linux——临界段,信号量,互斥锁,自旋锁,原子操作

一.linux为什么需要临界段,信号量,互斥锁,自旋锁,原子操作?1.1.linux内核后期版本是支持多核CPU以及抢占式调度。这里就存在一个并发,竞争状态(简称竟态)。1.2.竞态条件发生在两个或更多线程操纵一个共享数据项时,在多处理器(MP)计算机中也存在并发,其中每个处理器中共享相同数据的线程同时执行1.3.临界段,信号量,互斥锁,自旋锁,原子操作可以从不同情形解决上述问题二. 临界区(C...

weixin_30930625的博客 276

信号量与自旋锁 |Linux,信号量,自旋锁,睡眠锁,spinlock,semaphore

内核同步措施 为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。 Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的

slj_win的专栏 826

Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容。 1. Linux 内核中的同步原语介绍 这一部分为 linux-insides 这本书开启了新的章节。定时器和时间管理相关的概念在上一个章节已经描述过了。现在是时候继续了。就像你可能从这一部分的标题所了解的那样,本章节将会描述 Linux 内核中的同步原语。 像往常一样,在考虑一些同步相关的事情之前,我们会尝试去概括地了解什么是同步

RToax 1989

linux内核同步机制 (1) 信号量和自旋锁 的特点

semaphore 信号量 信号量的特点: 1.用于进程和进程之间的同步 2.允许有多个进程进入临界区代码执行 3.进程获取不到信号量锁会陷入休眠,并让出CPU 4.被信号量锁保护的临界区代码允许睡眠 5.本质是基于进程调度器,UP和SMP下的实现无差异 6.不支持进程和中断之间的同步 spinlock自旋锁 自旋锁的特点: 1.spinlock是一种死等的锁机制。 2.semaphore可以允许多个执行单元进入,spinlock不行,一次只能有一个执行单元获取锁并进入临界区,其他的执

caofengtao1314的专栏 245
上一篇: Linux/Android——Input系统之InputMapper 处理 (八)
下一篇: C/C++ 中typedef 用法总结
南丶烟
博客等级 码龄14年 569粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值