我有考题(面试)。
您需要同时抓取spin_lock和互斥以做一些事情。获得的正确顺序是什么?为什么?
我对此有一些想法,但对答案没有强烈的看法。
发布于 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和互斥锁之间也可以休眠。自旋锁定将得到较少的非睡眠区域,它是好的。
发布于 2015-03-26 10:22:39
TL;DR:先锁定互斥体,然后旋转锁定。
首先,您需要避免这种情况,并且要非常小心地避免死锁。
然后,您应该考虑锁定的效果。互斥锁可能导致线程阻塞和休眠,而自旋锁则可能导致线程占用繁忙等待循环中的处理器。因此,一般建议将拥有自旋锁的关键部分保持较短的时间,这将导致以下经验规则:在拥有自旋锁时不睡觉(即通过锁定互斥锁),否则会浪费CPU时间。
https://stackoverflow.com/questions/29274660
复制相似问题