1
在Linux內核中,使用讀/寫旋轉鎖來同步對任務列表的訪問。然而,儘管read_(un)鎖用於讀取,但write_(un)lock_irq用於寫入。爲什麼在鎖定寫入時需要禁用中斷?爲什麼使用write_lock_irq而不是write_lock作爲tasklist_lock?
在Linux內核中,使用讀/寫旋轉鎖來同步對任務列表的訪問。然而,儘管read_(un)鎖用於讀取,但write_(un)lock_irq用於寫入。爲什麼在鎖定寫入時需要禁用中斷?爲什麼使用write_lock_irq而不是write_lock作爲tasklist_lock?
對於在IRQ環境中使用的鎖,IRQ必須在保持時被禁用。但有不同的方法來實現這一點。
(我描述自旋鎖,讀/寫鎖在這方面是相同的)
spin_[un]lock
不要禁用的IRQ。只有在知道它們已被禁用時才使用它們(例如,在中斷處理程序中)。spin_[un]lock_irq
禁用/啓用IRQ。在調用函數之前,只有在知道它們未被禁用時才使用它們。sping[un]lock_irq[save|restore]
- 禁用IRQ,然後返回到先前的狀態。無論IRQ狀態如何,都可以使用(成本很低)。我想你看到的差異是由於不同的調用上下文,而不是讀/寫差異。
即使在copy_process中的進程上下文中使用了_irq變體,請參見[this](http://lxr.linux.no/#linux+v3.7.6/kernel/fork.c#L1396)。 – Beginner
這與我所說的相符 - 當IRQ未被禁用時(例如在進程上下文中)使用'_irq'時。 – ugoren