锁(自旋锁等)与阻塞之间的区别

时间:2014-01-17 03:47:10

标签: linux-device-driver semaphore blocking spinlock

这看起来有点荒谬,但我很困惑。

  1. 锁定和阻止操作之间有什么区别?
  2. 我们何时使用Block,何时使用Lock?
  3. 当我们可以使用自旋锁,信号量等将调用进程置于睡眠状态时(我想它会发生,请提一下,如果我错了)那么为什么我们创建wait_queues以使进程进入休眠状态(我希望这是阻塞)。
  4. 请回答。

1 个答案:

答案 0 :(得分:1)

  

当我们可以使用自旋锁,信号量等将调用进程置于睡眠状态时(我想它会发生,如果我错了请提及)

这是错误的,当你使用自旋锁,信号量等时,你让进程进入睡眠状态。在自旋锁的情况下,如果你在获得螺旋锁时睡觉会很危险。

锁定是必要的,以避免并发访问。假设您正在编写打印机驱动程序。驱动程序从应用程序接收文本,并在纸上打印出文本。如果您有两个需要同时打印的应用程序怎么办?如果您不使用锁定策略,您将在同一页面上阅读来自两个不同应用程序的混合文本。例如,在这种情况下,您可以使用信号量或互斥量。当第一个应用程序访问驱动程序时,驱动程序获取互斥锁(信号量),直到应用程序完成发送文本。当第二个应用程序访问驱动程序时,驱动程序无法继续,因为另一个进程具有活动的互斥锁。因此,第二个打印过程可以睡眠,直到第一个打印过程结束。当第一个打印过程释放互斥锁时,第二个开始打印。

您的用户空间应用程序可以使用阻止或非阻止方法(man open(2))。当驾驶员忙于第一打印过程并且第二打印过程发生时,根据应用选择,驾驶员可以阻止第二过程,或立即返回。如果它是阻塞的,驱动程序将使用wait_queues使进程进入休眠状态,直到有人进行唤醒(第一个进程结束时)。如果它是非阻塞的,则驱动程序返回错误代码(例如:EBUSY,EAGAIN)并且控件返回应用程序;现在应用程序可以决定稍后重试,睡一会儿或丢弃打印并将控件返回给用户

Spinlock用于低级并发。例如,不同进程同时使用的变量。在这种情况下,我们必须保证两个不同的处理器不会同时写入同一个变量,因为结果是不可预测的。因此,我们将在保护变量

上执行以下操作
[get the spin lock]
[chage the variable(s)]
[release the spin lock]

这保证了一次只有一个进程会修改用spinlock保护的变量。在睡觉时使用自旋锁是危险的,因为自旋锁不会睡觉。当进程找到一个活动的自旋锁时,它不会休眠,但它会在一个while循环中等待,直到有人释放自旋锁。如果您使用主动螺旋锁睡眠,则有其他人因此而无法入睡。

无论如何,这是一个有用的链接LDD3 Chapter 5