nit*_*ian 10 locking linux-kernel preemption
当内核空间中spin_lock的进程持有a时,由于以下任何一种情况,该进程无法被抢占:
但是,如果处理器阻塞,休眠或显式调用,则该过程可以产生处理器schedule().我的理解是否正确?
当内核空间mutex_lock中的进程持有a时,由于上面列出的条件为1,2和3,该进程可以被抢占.
Dip*_*ick 18
旋转锁的当前实现使用两个完全独立的机制来确保互斥,一个用于处理处理器间排除,一个用于处理本地处理器线程和中断处理程序.
spin_lock本身只是在两个或多个处理器内核之间提供互斥锁.任何处理锁定自旋锁的处理器基本上都会被卡住,直到另一个处理器释放它.自旋锁在单处理器系统上没有用处 - 除了增加完全死锁的可能性 - 因此通常在内核编译时删除.
为了提供本地处理器互斥,spin_lock()调用preempt_disable()(在抢先调度系统上)以防止任何其他线程在锁定时运行; 类似地,spin_lock_irqsave()也执行相当于local_irq_save()的操作来禁用中断,以防止在本地处理器上运行任何其他操作.
从上面应该可以明显看出,使用旋转锁可以使整个机器上胶,因此旋转锁只能在很短的时间内使用,你不应该做任何可能导致重新安排同时握住锁的东西.
使用mutex_lock的情况完全不同 - 只有尝试访问锁的线程受到影响,如果线程遇到锁定的互斥锁,则会发生重新安排.因此,mutex_locks不能用于中断(或其他原子)上下文.
| 归档时间: |
|
| 查看次数: |
8984 次 |
| 最近记录: |