问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux中的mutex机制[一] - 加锁和osq lock

发布网友 发布时间:2024-09-27 03:06

我来回答

1个回答

热心网友 时间:2024-10-04 20:25

在Linux系统中,mutex(互斥锁)是实现线程间同步的重要工具,它类似于spinlock(自旋锁)但具有更多特性。相比于spinlock的“自旋”特性,即线程在获取锁时持续占用CPU资源直到释放,mutex采用“阻塞”策略,允许线程在获取锁失败时进行睡眠,从而避免了CPU资源的无效占用。

mutex的基本结构包含了一个spinlock和一个表示等待队列的双向链表(wait_list),以及一个记录锁持有状态的owner指针。当没有线程持有锁时,owner值为0;若线程持有锁,则owner指向该线程的task_struct指针。task_struct指针对齐于L1_CACHE_BYTES,最低三位用于存储额外信息。

早期mutex实现中使用了一个count字段来记录锁的持有状态,值为1表示锁空闲,0表示锁持有,负数表示等待锁的线程。后来,通过重构将count的信息整合到owner中,并新增了一个MUTEX_FLAG_WAITERS位来标识等待队列的存在。

获取mutex的函数主要为mutex_lock_interruptible(),它允许线程在等待锁时睡眠,从而避免了中断上下文的锁争用问题。此函数在没有其他线程持有锁时,可立即获得锁,实现快速路径(fast path),与qspinlock类似。而当存在持有锁的线程时,程序将进入慢路径(slow path),等待锁可用后再唤醒。

在慢路径中,线程会尝试乐观等待,即假定持有锁的线程很快就会释放锁,因此在临界区短暂等待。这种策略被称为mid path(中间路径)或乐观自旋(optimistic spinning),允许线程保持运行状态,从而减少上下文切换的开销。在mid path中的线程被称为spinner,这种机制需要内核配置选项“CONFIG_MUTEX_SPIN_ON_OWNER”。

当另一个线程试图获取同一个锁时,会根据当前CPU的状态决定是否进入mid path。如果当前CPU上没有更高优先级的任务,线程会进入mid path等待;否则,线程会被更高优先级的任务抢占,从而进入慢路径等待。等待线程的身份会从spinner变为waiter,此时线程状态会变为“TASK_INTERRUPTIBLE”,并调用schedule()让出CPU。

当持有锁的线程释放锁时,处于mid path的线程会获取锁,从而进入自己的临界区。如果释放锁时线程正处于睡眠状态,那么它会被重新添加到慢路径等待队列中,身份变为waiter。整个过程涉及公平与效率的权衡,乐观等待机制在提高效率的同时增加了系统复杂性。

至此,mutex的加锁过程已经介绍完毕,下文将详细探讨mutex的解锁过程和死锁问题。

热心网友 时间:2024-10-04 20:23

在Linux系统中,mutex(互斥锁)是实现线程间同步的重要工具,它类似于spinlock(自旋锁)但具有更多特性。相比于spinlock的“自旋”特性,即线程在获取锁时持续占用CPU资源直到释放,mutex采用“阻塞”策略,允许线程在获取锁失败时进行睡眠,从而避免了CPU资源的无效占用。

mutex的基本结构包含了一个spinlock和一个表示等待队列的双向链表(wait_list),以及一个记录锁持有状态的owner指针。当没有线程持有锁时,owner值为0;若线程持有锁,则owner指向该线程的task_struct指针。task_struct指针对齐于L1_CACHE_BYTES,最低三位用于存储额外信息。

早期mutex实现中使用了一个count字段来记录锁的持有状态,值为1表示锁空闲,0表示锁持有,负数表示等待锁的线程。后来,通过重构将count的信息整合到owner中,并新增了一个MUTEX_FLAG_WAITERS位来标识等待队列的存在。

获取mutex的函数主要为mutex_lock_interruptible(),它允许线程在等待锁时睡眠,从而避免了中断上下文的锁争用问题。此函数在没有其他线程持有锁时,可立即获得锁,实现快速路径(fast path),与qspinlock类似。而当存在持有锁的线程时,程序将进入慢路径(slow path),等待锁可用后再唤醒。

在慢路径中,线程会尝试乐观等待,即假定持有锁的线程很快就会释放锁,因此在临界区短暂等待。这种策略被称为mid path(中间路径)或乐观自旋(optimistic spinning),允许线程保持运行状态,从而减少上下文切换的开销。在mid path中的线程被称为spinner,这种机制需要内核配置选项“CONFIG_MUTEX_SPIN_ON_OWNER”。

当另一个线程试图获取同一个锁时,会根据当前CPU的状态决定是否进入mid path。如果当前CPU上没有更高优先级的任务,线程会进入mid path等待;否则,线程会被更高优先级的任务抢占,从而进入慢路径等待。等待线程的身份会从spinner变为waiter,此时线程状态会变为“TASK_INTERRUPTIBLE”,并调用schedule()让出CPU。

当持有锁的线程释放锁时,处于mid path的线程会获取锁,从而进入自己的临界区。如果释放锁时线程正处于睡眠状态,那么它会被重新添加到慢路径等待队列中,身份变为waiter。整个过程涉及公平与效率的权衡,乐观等待机制在提高效率的同时增加了系统复杂性。

至此,mutex的加锁过程已经介绍完毕,下文将详细探讨mutex的解锁过程和死锁问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
心理咨询师培训怎么收费标准是多少 2024心理咨询师培训费用是多少钱 心理咨询师培训费用大概是多少 心理咨询师培训课程收费标准 新蒙迪欧空调怎么用? 福特蒙迪欧16款2.0T冷车启动怠速会一抖一抖的是什么情况 牛油果冻了还能吃不 牛油果冻过了能吃吗 泰兴人很有钱吗? 江苏有多少百万人口以上的城市 眉山办信用卡怎么那么难 请问,四川省眉山市能不能办理交行的信用卡 我只担心一件事,我怕我配不上自己的苦难 什么意思? ...说:“我只担心一件事,就是怕我配不上我所受的苦难。” 我只担心一件事,就是怕我配不上我所受的苦难 出自哪里 我只担心一件事 我怕我配不上自己所受的苦难 赏析一下啊 我只担心一件事,我怕我配不上自己所受的苦难。 老牛打栏两个月了,还甩清怎么办? 五十岁左右的妇女后脑勺总是热的发烫,晚上睡觉也总是出汗,是怎么... ...更年期有两年了 主要症状有潮热出汗 乏力 最主要的是 阴道难受 总... 更年期发热出汗怎么治疗 更年期一定要吃药吗,半夜总是出汗,因为这样第二天总是没精神 迅雷网盘怎么打不开了? CMA证书为什么要考?就业前景如何? 请问一下吉利英伦金刚那个离合器哆嗦发颤是不是离合器片的事?_百度知... 图解:为什么要在大学备考CMA 高中化学中的原电池中,得失电子,是作用于正负极,使之变成离子态,还是作 ... 吉利英伦门把手里的弹簧怎么放的 吉利英伦后减震器怎么拆卸? ...只知道负氧正还。为什么有些反应式除了得失电子还要... 工行信用卡怎样办理? Linux 系统编程笔记8——多任务同步与互斥 Linux内核:进程管理——互斥锁 Linux内核机制—mutex 高并发环境下诡异的加锁问题(你加的锁未必安全) 山顶有什么景点 判官松云山山顶有什么 微信如何交2023农村合作医疗保险 500w电脑一天24小时多少度电 - 知百科 联想拯救者Y9000P一天大概要用多少电? 220v是多少瓦一个小时多少电 - 知百科 武术未来10年的发展空间 ...和 我了解武术的哪方面 谈谈你对武术未来的发展趋势什么 歌曲,明星。这张图片里右边红头发仰头的女明星是谁,有没有大图,请各位... 传统武术的出路在哪里? 各位大侠,这张图片的篮球人物是谁?赐教赐教 请问哪位大侠认识图片里的是什么文字内容,谢谢!急,抱拳!!! 哪位大侠提供点奋斗中演露露弟弟的郑凯的资料和图片啊?谢谢啦 传智播客到底怎么样? 最低工资标准上调!即日起,月薪不到这个数,违法!