参考文章:窝窝科技 mutex
1. struct mutex
成员 | 描述 |
---|---|
atomic_long_t owner | 这个成员有两个作用:1记录该mutex对象被哪一个task持有(struct task_struct *)。如果等于NULL表示还没有被任何一个任务持有。2、由于task struct地址是L1_CACHE_BYTES对齐的,因此这个成员的有若干的LSB可以被用于标记状态(在ARM64平台上,L1_CACHE_BYTES是64字节,因此LSB 6-bit会用于保存mutex状态信息)。具体的状态包括:MUTEX_FLAG_WAITERS:wait_list非空,即有任务阻塞在该mutex锁上,owner在unlock的时候必须要执行唤醒动作。MUTEX_FLAG_HANDOFF:为了防止mutex等待队列的任务饿死,在唤醒的时候top waiter会设置该flag(由于乐观自旋的task不断的插入,唤醒的top waiter也未必一定会获取到锁)。有了这个设定后,锁的owner 在解锁的时候会将该锁转交给top waiter,而不是唤醒top waiter去竞争锁。MUTEX_FLAG_PICKUP:该flag表示mutex已经万事俱备(即完成了转交),只等待top waiter来持锁。 |
struct optimistic_spin_queue osq | 在配置了MUTEX_SPIN_ON_OWNER的时候,mutex支持乐观自旋机制,osq成员就是乐观自旋需要持有的MCS锁队列。数据结构optimistic_spin_queue只有一个tail的成员,如果等于0,那么说明是一个空队列,没有乐观自旋的任务。否则tail指向一个节点是optimistic_spin_node对象队列的尾部(tail并不是一个指针,它是一个cpu number,optimistic_spin_node对象是per-cpu的,有了cpu number就可以定位到其optimistic_spin_node对象)。 |
spinlock_t wait_lock | 用于保护等待链表wait_list操作的自旋锁 |
struct list_head wait_list | Mutex是睡眠锁,当无法获取锁并且不具备乐观自旋条件的时候需要挂入这个等待队列,等待锁的owner释放锁。 |
void *magic | 和debug相关的成员 |
Struct lockdep_map dep_map | 和debug相关的成员 |