首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spin_lock与互斥锁顺序

Spin_lock与互斥锁顺序
EN

Stack Overflow用户
提问于 2015-03-26 09:14:25
回答 2查看 1.4K关注 0票数 1

我有考题(面试)。

您需要同时抓取spin_lock和互斥以做一些事情。获得的正确顺序是什么?为什么?

我对此有一些想法,但对答案没有强烈的看法。

EN

回答 2

Stack Overflow用户

发布于 2015-03-26 11:07:49

您应该使用grub锁的理由是保护SMP上的“关键区域”或单个CPU上的“关键区域”不受抢占性相对损坏(race)的影响。这是非常重要的,你的机器类型SMP或单CPU。旋转和互斥内部的代码也很重要。是否有kmalloc、vmalloc、mem_cache_alloc、alloc_bootmem或函数具有__user内存访问oe,甚至可以睡眠。

spin_lock --它是/include/asm/spinlock.h中最简单的锁。只有一个线程可以在同一时间锁定在spin_lock中。尝试获取spin_lock的任何其他线程都将在相同的位置(指令)上旋转,直到前面的线程释放spin_lock为止。刺线不会睡觉。因此,在使用spin_lock的同时,您可以有两个或多个线程来执行某些任务(一次工作,一次旋转)。在单CPU计算机上是不可能的。但在SMP方面做得很好。spin_lock中的代码部分应该是小而快速的。如果您的代码应该在不同的机器上工作,请尝试检查CONFIG_SMP和CONFIG_PREEMPT。

互斥-另一方面,工作舔信号量/内/asm/smaphore.h但计数器是一个。如果计数器是一个,那么只有一个线程可以进入互斥锁区域。任何其他试图锁定的线程都会看到计数器为零,因为里面只有一个计数器。线程将进入等待队列。它会被唤醒时,互斥被释放和对相等的一。互斥锁内的线程可以休眠。它可以调用内存分配函数,获得用户空间内存。

(SMP)所以假设你有自旋锁和下一个互斥锁。因此,只有一个线程可以得到第一个自旋和下一个互斥。但潜在的内部互斥锁代码无法睡眠,这是不好的。因为内旋的互斥物。

(SMP)如果你将得到互斥锁和下一个自旋锁。同样的情况,只有一个线程可以进入锁定区域。但是在互斥锁和自旋锁之间,代码可以休眠,spin_unlock和互斥锁之间也可以休眠。自旋锁定将得到较少的非睡眠区域,它是好的。

票数 3
EN

Stack Overflow用户

发布于 2015-03-26 10:22:39

TL;DR:先锁定互斥体,然后旋转锁定。

首先,您需要避免这种情况,并且要非常小心地避免死锁。

然后,您应该考虑锁定的效果。互斥锁可能导致线程阻塞和休眠,而自旋锁则可能导致线程占用繁忙等待循环中的处理器。因此,一般建议将拥有自旋锁的关键部分保持较短的时间,这将导致以下经验规则:在拥有自旋锁时不睡觉(即通过锁定互斥锁),否则会浪费CPU时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29274660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档