ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – Spinlock与Semaphore

2019-09-18 20:16:25  阅读:173  来源: 互联网

标签:c-3 c linux operating-system unix


信号量和信号量之间的基本区别是什么?自旋锁?

什么时候我们会使用信号量而不是自旋锁?

解决方法:

Spinlock和信号量主要有四个不同之处:

1.它们是什么
自旋锁是锁的一种可能实现,即通过忙等待(“旋转”)实现的锁.信号量是锁的推广(或者,相反,锁是信号量的特殊情况).通常,但不一定,自旋锁仅在一个进程内有效,而信号量也可用于在不同进程之间进行同步.

锁可用于互斥,即一次一个线程可以获取锁并继续执行代码的“关键部分”.通常,这意味着修改多个线程共享的某些数据的代码.
信号量有一个计数器,它将允许自己被一个或多个线程获取,具体取决于你发布给它的值,并且(在某些实现中)取决于它的最大允许值.

就此而言,可以将锁定为信号量的特殊情况,其最大值为1.

他们做了什么
如上所述,自旋锁是锁,因此是互斥(严格1对1)机制.它通过重复查询和/或修改存储器位置来工作,通常以原子方式.这意味着获取自旋锁是一种“繁忙”操作,可能会长时间(可能永远!)消耗CPU周期,同时它有效地实现“无需”.
这种方法的主要动机是上下文切换具有相当于旋转几百(或几千)次的开销,因此如果通过燃烧几个周期旋转可以获得锁定,这可能总体上很好更高效.此外,对于实时应用程序,阻止和等待调度程序在将来某个遥远的时间返回它们可能是不可接受的.

相比之下,信号量要么根本不旋转,要么只旋转很短的时间(作为优化以避免系统调用开销).如果无法获取信号量,它会阻塞,将CPU时间放到准备运行的其他线程上.这当然意味着在再次调度线程之前经过几毫秒,但如果这没有问题(通常不是),那么它可以是一种非常有效的,CPU保守的方法.

3.他们如何在拥挤的情况下表现
一般的误解是自旋锁或无锁算法“通常更快”,或者它们仅对“非常短的任务”有用(理想情况下,任何同步对象都不应该保持比绝对必要的更长时间).
一个重要的区别是不同的方法在拥挤的情况下如何表现.

设计良好的系统通常具有较低或没有拥塞(这意味着并非所有线程都试图在同一时间获取锁定).例如,通常不会编写获取锁的代码,然后从网络加载半兆字节的压缩数据,解码并解析数据,最后修改共享引用(将数据附加到容器等)在释放锁之前.相反,只能为了访问共享资源而获取锁.
因为这意味着临界区之外的工作量远远超过其内部,所以线程在临界区内的可能性自然相对较低,因此很少有线程同时争夺锁.当然,每当有两个线程会同时尝试获取锁(如果这不会发生,你就不需要锁!),但这是一个例外,而不是“健康”系统中的规则.

在这种情况下,自旋锁的性能大大优于信号量,因为如果没有锁定拥塞,获取自旋锁的开销仅为十几个周期,相比上下文切换的数百/数千个周期或者丢失10-20万个周期时间片的剩余部分.

另一方面,由于拥塞很高,或者锁被长时间保持(有时候你无法帮助它!),一个自旋锁会烧掉疯狂的CPU周期而无法实现任何效果.
在这种情况下,信号量(或互斥)是一个更好的选择,因为它允许不同的线程在此期间运行有用的任务.或者,如果没有其他线程可以做有用的事情,它允许操作系统降低CPU并减少热量/节省能源.

此外,在单核系统上,在锁拥塞的情况下,自旋锁效率会非常低,因为旋转线程将浪费其完整时间等待状态更改,这种状态更改不可能发生(直到发布线程被调度,这不是在等待线程运行时发生!).因此,在给定任何争用量的情况下,获取锁定在最佳情况下需要大约1 1/2个时间片(假设释放线程是下一个被调度的线程),这不是非常好的行为.

4.他们是如何实施的
现在,信号量通常会在Linux下包装sys_futex(可选择使用在几次尝试后退出的自旋锁).
自旋锁通常使用原子操作实现,而不使用操作系统提供的任何东西.过去,这意味着使用编译器内在函数或非便携式汇编程序指令.同时C 11和C11都有原子操作作为语言的一部分,因此除了编写可证明正确的无锁代码的一般困难之外,现在可以以完全可移植和(几乎)无痛的方式实现无锁代码.

标签:c-3,c,linux,operating-system,unix
来源: https://codeday.me/bug/20190918/1811514.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有