linux 内核的rt_mutex 锁操作实现的临界区

rt_mutex 定义的锁规则:

以偶对齐的task_struct指针为上锁标记,

偶对齐的指针地址最低位用以标记是否有waiters。

 

rt_mutex的trylock,lock,以及unlock都有fastpath,只用原子变量操作保护并发,并且保证状态转换的前后依赖。

当WAITERS标记位为1时,trylock,lock以及unlock的fastpath都会失效,强迫进入slowpath采用临界区同步。

还有owner已经写上其它task的指针,trylock,lock的fastpath都会失效,强迫进入slowpath采用临界区同步,但不会在fastpath直接将WAITERS标记位标记为1。

当多个线程同时对一个锁进行竞争时,它们的slowpath都必须同步在临界区中,产生额外的开销。trylock不得不与其它lock进行临界区的同步,rt_mutex的trylock的开销其实也不小。当rt_mutex用作pi-futex的委托时,对pi-futex进行trylock,同样也就摊上了不小的开销。

虽然对当前rt_mutex锁进行lock wait或unlock引起的chain walk and adjust priority不会与当前rt_mutex锁同步在相同的临界区,但是那些阻塞在当前rt_mutex锁的waiters持有的锁上引发的chain walk and adjust priority,就会进入临界区同步。临界区都由rt_mutex->wait_lock进行同步。

posted on 2017-05-02 16:44  bbqz007  阅读(709)  评论(0编辑  收藏  举报