linux线程同步互斥锁_linux线程同步与互斥

linux线程同步互斥锁_linux线程同步与互斥Linux内核同步机制(5)_互斥锁一、互斥锁原理mutex 结构体从定义里可以看出来 (1)互斥锁的实现里使用了一个原子变量,1表示锁没有被占用,小于1的值表示锁被占用。 (2)wait_lock是防止在操作wait_li

Linux内核同步机制(5)_互斥锁
  一、互斥锁原理

  mutex 结构体

  从定义里可以看出来 (1)互斥锁的实现里使用了一个原子变量,1表示锁没有被占用,小于1的值表示锁被占用。 (2)wait_lock是防止在操作wait_list的时候出现并发引起的数据错误

  在这里我们就明白了,Linux系统互斥锁,如果mutex_fastpath_lock加锁成功就不用执行mutex_lock_slowpath,如果失败则执行mutex_lock_slowpath (1)首先原子变量所属的结构体 (2)调用mutex_lock_common

  __mutex_lock_common是整个互斥锁加锁的重中之重,用preempt_disable关闭抢占,并且多次尝试再次拿锁,尽可能避免进入到操作唤醒队列以提升性能

  二、互斥锁使用

  下面代码定义了名为my_mutex的互斥体并初始化它:

  下面的两个函数用于互斥体:

  mutex_lock()与mutex_lock_interruptible()的区别和down()与down_trylock()的区别完全一致,前者引起的睡眠不能被信号打断,而后者可以。mutex_trylock()用于尝试获得mutex,不到mutex时不会引起进程睡眠。

  下列函数用于释放互斥体:

  mutex的使用方法和信号量用于互斥的场合完全一样:

  由此,可以总结出自旋锁和互斥体选用的3项原则。 1)当锁不能被到时,使用互斥体的开销是进程上下文切换时间,使用自旋锁的开销是等待自旋锁(由临界区执行时间决定)。若临界区比较小,宜使用自旋锁,若临界区很大,应使用互斥体。 2)互斥体所保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区。因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程企图本自旋锁,死锁就会发生。 3)互斥体存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在互斥体和自旋锁之间只能选择自旋锁。当然,如果一定要使用互斥体,则只能通过mutex_trylock()方式进行,不能就立即返回以避免阻塞。

  三、实时互斥锁

  实时互斥锁是对互斥锁的改进,实现了优先级继承(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。

  实时互斥锁的定义如下:

  初始化静态实时互斥锁的方法如下:

  在运行时动态初始化实时互斥锁的方法如下:

  申请实时互斥锁的函数如下。

  (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。

  释放实时互斥锁的函数如下:

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/95963.html

(0)
上一篇 2024年 5月 23日 21:28
下一篇 2024年 5月 23日

相关推荐

关注微信