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进行同步。
逆向深入objc,c++
windows下仿objc动画层UI引擎