mutex是在进程上下文中使用的睡眠锁。
mutex的结构体中,保存了正在持锁的进程(->owner),在没被申请时为NULL
由于mutex在睡眠时会经过上下文切换,代价较大,在后面的mutex实现中,经过了几轮优化,现在的mutex在申请时有三条路径:
所以,睡眠锁并不一定真的会睡眠。
最后,mutex只能用于进程上下文,不能用于软中断、硬中断上下文,比如tasklet、timers。
- /include/linux/mutex.h # mutex interface
- /kernel/locking/mutex.c # mutex implementation
- /kernel/locking/mutex-debug.c # CONFIG_DEBUG_MUTEXES
DEFINE_MUTEX(name)
静态定义mutex
mutex_init(mutex)
动态初始化mutex
mutex_lock
申请锁,禁用中断
mutex_lock_interruptible
申请锁,允许中断
mutex_unlock
释放锁
mutex_trylock
申请锁,否则返回,不等待
mutex_is_locked
返回锁是否locked
开启mutex debug
CONFIG_DEBUG_MUTEXES=y
开启后,回去在锁申请和释放时自动检查各种mutex约束条件,如重复初始化,嵌套等。