个人网站设计介绍文字,深圳十大科技公司排名,高校建设主流的校园网站,网站建设月流量实时互斥锁是对互斥锁的改进#xff0c;实现了优先级继承#xff08; priority inheritance#xff09;#xff0c;解决了优先级反转#xff08; priority inversion#xff09;问题。 什么是优先级反转问题#xff1f; 假设进程 1 的优先级低#xff0c;进程 2 的优先…实时互斥锁是对互斥锁的改进实现了优先级继承 priority inheritance解决了优先级反转 priority inversion问题。 什么是优先级反转问题 假设进程 1 的优先级低进程 2 的优先级高。进程 1 持有互斥锁进程 2 申请互斥锁因为进程 1 已经占有互斥锁所以进程 2 必须睡眠等待导致优先级高的进程 2 等待优先级低的进程 1。 如果存在进程 3优先级在进程 1 和进程 2 之间情况更糟糕。假设进程 1 仍然持有互斥锁进程 2 正在等待。进程 3 开始运行因为它的优先级比进程 1 高所以它可以抢占进程 1导致进程 1 持有互斥锁的时间延长进程 2 等待的时间延长。 优先级继承可以解决优先级反转问题。如果低优先级的进程持有互斥锁高优先级的进程申请互斥锁那么把持有互斥锁的进程的优先级临时提升到申请互斥锁的进程的优先级。在上面的例子中把进程 1 的优先级临时提升到进程 2 的优先级防止进程 3 抢占进程 1使进程 1 尽快执行完临界区减少进程 2 的等待时间。 如果需要使用实时互斥锁编译内核时需要开启配置宏 CONFIG_RT_MUTEXES。 实时互斥锁的定义如下 include/linux/rtmutex.h struct rt_mutex { raw_spinlock_t wait_lock; struct rb_root_cached waiters; struct task_struct *owner; #ifdef CONFIG_DEBUG_RT_MUTEXES int save_state; const char *name, *file; int line; void *magic; #endif #ifdef CONFIG_DEBUG_LOCK_ALLOC struct lockdep_map dep_map; #endif }; 初始化静态实时互斥锁的方法如下DEFINE_RT_MUTEX(mutexname); 在运行时动态初始化实时互斥锁的方法如下rt_mutex_init(mutex); 申请实时互斥锁的函数如下。 1 void rt_mutex_lock(struct rt_mutex *lock); 申请实时互斥锁如果锁被占有进程深度睡眠。 2 int rt_mutex_lock_interruptible(struct rt_mutex *lock); 申请实时互斥锁如果锁被占有进程轻度睡眠。 3 int rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout); 申请实时互斥锁如果锁被占有进程睡眠等待一段时间。 4 int rt_mutex_trylock(struct rt_mutex *lock); 申请实时互斥锁如果申请成功返回 1如果锁被其他进程占有进程不等待返回 0。
释放实时互斥锁的函数如下void rt_mutex_unlock(struct rt_mutex *lock);