linux之自旋锁

本文深入探讨了锁与并发的关系,介绍了自旋锁的应用场景及其如何避免线程上下文切换带来的性能损耗。同时,还讨论了自旋锁的运行机制及内核态与用户空间自旋锁的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题一:锁与并发的关系?

对于服务器程序来说,锁对于服务器的并发性能影响是至关重要的。过多锁的使用必然会导致服务器的并发性能下降,虽然有时候应用程序中使用锁是在所难免的,但是如何使用锁,使用什么样子的锁,却能大大的影响应用程序的并发性能以及应用程序的吞吐量。

问题二:自旋锁使用什么场景?

有这么一个场景,有一个临界区很小,任何一个线程进入临界区后,马上又退出临界区。很显然当一个线程已经进入临界区,那么其他线程就得阻塞,阻塞导致线程释放cpu,内核重新调度,使得其他线程占用该cpu,导致线程上下文的切换。频繁的线程上下文切换对于应用程序的性能影响很大,所以诞生了自旋锁,自旋锁以一种紧凑循环中重复的检测锁是否已经可用,即忙等待(busy wait)的方式代替阻塞,不释放cpu,所以也就不产生线程上下文切换。

问题三:线程上下文切换有哪些副作用?

线程上下文切换是由内核完成的,将导致两个方面的性能消耗,一个必然发生的,一个可能发生的。

(1)内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

(2)另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。

如果是发生进程上下文切换,还会产生另一个性能消耗,就是过多的缺页中断。因为进程是有一个虚拟地址空间的,虚拟地址需要映射为物理地址,是通过页表映射的,页表也是有页表缓冲的,进程上下文切换,导致页表缓冲区将被刷新,这将导致内存的访问在一段时间内相当的低效。

问题四:自旋锁会让线程以自旋的方式运行不释放CPU,那么线程调度或者进程调度是否能让自旋的线程释放CPU?

线程调度或者进程调度(调度的实质就是释放CPU,让其他线程占用CPU)都会产生上下文切换,自旋锁是为了减少上下文切换而设计的一款锁,那么如何防止调度产生上下文的切换呢?肯定是有方法,通过需要关闭中断来关闭调度。但是问题四的真正要探讨的内容是:内核态的自旋锁和用户空间自旋锁有什么区别?

问题五:内核态的自旋锁和用户空间的自旋锁区别?

??



转载于:https://my.oschina.net/yangan/blog/190842

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值