linux禁用内核驱动程序,关于驱动程序:为什么在内核代码持有自旋锁之后linux禁用内核抢占?...

我是Linux新手,正在阅读Rubini&Corbet撰写的Linux设备驱动程序书。 我对与spinlocks有关的一条陈述感到困惑; 这本书说

If a nonpreemptive uniprocessor system ever went into a

spin on a lock, it would spin forever; no other thread would ever be able to obtain

the CPU to release the lock. For this reason, spinlock operations on uniprocessor systems

without preemption enabled are optimized to do nothing, with the exception of

the ones that change the IRQ masking status.

本书进一步指出

The kernel preemption case is handled by the spinlock code itself. Any time kernel

code holds a spinlock, preemption is disabled on the relevant processor. Even uniprocessor

systems must disable preemption in this way to avoid race conditions.

问题:在单处理器系统上,如果每当一个内核代码(代表用户进程执行)持有自旋锁时,内核抢占就被禁用,那么另一个进程怎么可能有机会运行并因此尝试获取自旋锁? 为什么每当内核代码持有自旋锁时,Linux内核都会禁用内核抢占?

第一个问题的答案就是第二个问题的原因。

内核获取的自旋锁可以通过关闭抢占来实现,因为这确保了内核将完成其关键部分而不会受到其他进程的干扰。整个问题是,直到内核释放锁,其他进程才能运行。

没有理由必须采用这种方式实施;这只是实现它的一种简单方法,它可以防止任何进程在内核持有的锁上旋转。但这仅适用于内核已获得锁的情况:用户进程无法关闭抢占,并且如果内核正在旋转(即,它试图获取自旋锁,但另一个进程已经持有该锁),则最好保留抢占状态上!否则,系统将挂起,因为内核正在等待不会释放的锁,因为持有该锁的进程无法释放它。

获得自旋锁的内核是一个特例。如果用户级程序获得了自旋锁,则不会禁用抢占。

感谢超级桌面,但我仍然有疑问; 如果获取自旋锁禁用内核抢占,则已获得自旋锁的进程具有对关键部分的独占访问权限,并且甚至可以在不抢占先机的情况下执行它(除非持有自旋锁的进程明确释放了cpu)。 那么,另一个进程如何运行并在自旋锁上"旋转"呢? 我在这里错过了一些基本的东西吗?

仅当抢占锁的是内核,并且可以信任内核在锁完成后释放锁时,才能禁用抢占。 你是绝对正确的; 在这种情况下,没有其他进程会旋转锁。 但这是特例。 大多数时候,都是用户级别的程序试图获取自旋锁。 抢占不会被禁用,并且如果两个进程尝试获取相同的锁,则其中一个将最终旋转。

得到它了! 谢谢你的澄清..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值