我是 Linux 新手,正在阅读 Rubini & Corbet 撰写的 Linux 设备驱动程序书籍。我对与以下相关的一项声明感到困惑spinlocks
;书中指出
如果非抢占式单处理器系统曾经进入
旋转一把锁,它会永远旋转;没有其他线程能够获得
CPU释放锁。因此,单处理器系统上的自旋锁操作
没有启用抢占的情况下,优化后不执行任何操作,但以下情况除外
改变 IRQ 屏蔽状态的那些。
书中进一步指出
内核抢占情况由自旋锁代码本身处理。任意时间内核
代码持有自旋锁,相关处理器上的抢占被禁用。甚至单处理器
系统必须以这种方式禁用抢占以避免竞争条件。
问题:在单处理器系统上,如果每当内核代码(代表用户进程执行)持有自旋锁时就禁用内核抢占,那么另一个进程如何有机会运行并尝试获取自旋锁?为什么只要内核代码持有自旋锁,Linux 内核就会禁用内核抢占?
第一个问题的答案就是第二个问题背后的推理。
内核获取的自旋锁可以通过关闭抢占来实现,因为这可以确保内核在没有其他进程干扰的情况下完成其关键部分。重点是,在内核释放锁之前,另一个进程将无法运行。
没有理由必须以这种方式实施;这只是一种简单的实现方法,可以防止任何进程在内核持有的锁上旋转。但这个技巧仅适用于内核已获取锁的情况:用户进程无法关闭抢占,并且如果内核正在旋转(即它尝试获取自旋锁,但另一个进程已经持有它),最好保留抢占在!否则系统将挂起,因为内核正在等待一个不会被释放的锁,因为持有它的进程无法释放它。
内核获取自旋锁是一种特殊情况。如果用户级程序获取自旋锁,抢占将不会被禁用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)