Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)

【Linux】---互斥与同步、死锁与饥饿、实现生产者消费者模型、常见锁类型 目录梳理前言互斥与同步互斥量与条件变量信号量线程池死锁与饥饿死锁条件避免死锁避免饥饿常见特殊锁乐观锁悲观锁自旋锁读写者锁公平与非公平锁 梳理前言 进程线程间的互斥相关背景概念: 临界资源:多线程执行流共享的资源就叫做临界资源 临界区:每个线程内部,访问临界资源的代码,就叫做临界区 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。 死锁:两个或两个以上的进程(LWP)都在等待互相释放自 阅读详情

一、死锁(deadlock)

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。

1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。因此,对资源的分配要给予合理的规划。

避免死锁算法1:

有序资源分配法
这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3等等),申请时必须以上升的次序。系统要求申请进程:
1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2、在申请不同类资源时,必须按各类设备的编号依次申请。

例如:

进程PA,使用资源的顺序是R1,R2;

进程PB,使用资源的顺序是R2,R1;

若采用动态分配有可能形成环路条件,造成死锁。
采用有序资源分配法:R1的编号为1,R2的编号为2;
PA:申请次序应是:R1,R2
PB:申请次序应是:R1,R2
这样就破坏了环路条件,避免了死锁的发生。

避免死锁算法2:

银行算法
避免死锁算法中最有代表性的算法是DijkstraE.W于1968年提出的银行家算法:
该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。
这样申请者就可很快完成其计算,然后释放它占用的资源,从而保证了系统中的所有进程都能完成,所以可避免死锁的发生。

二、活锁(livelock)

指事物1可以使用资源,但它让其他事物先使用资源;

事物2可以使用资源,但它也让其他事物先使用资源,于是两者一直谦让,都无法使用资源。

避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。

三、饥饿(hungry)

所谓饥饿,是指如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求…T2可能永远等待,这就是饥饿。

四、优先级反转(Priority inversion)

优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源。高优先任务由于因资源缺乏而处于受阻状态,一直等到低优先级任务释放资源为止。而低优先级获得的CPU时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务反而超过这两个任务而获得CPU时间。如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,因为此时低优先级进程无法与高优先级进程争夺CPU时间,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资源而继续推进。

解决方案:
(1)设置优先级上限,给临界区一个高优先级,进入临界区的进程都将获得这个高优先级,如果其他试图进入临界区的进程的优先级都低于这个高优先级,那么优先级反转就不会发生。

(2)优先级继承,当一个高优先级进程等待一个低优先级进程持有的资源时,低优先级进程将暂时获得高优先级进程的优先级别,在释放共享资源后,低优先级进程回到原来的优先级别。嵌入式系统VxWorks就是采用这种策略。

这里还有一个八卦,1997年的美国的火星探测器(使用的就是vxworks)就遇到一个优先级反转问题引起的故障。简单说下,火星探测器有一个信息总线,有一个高优先级的总线任务负责总线数据的存取,访问总线都需要通过一个互斥锁(共享资源出现了);还有一个低优先级的,运行不是很频繁的气象搜集任务,它需要对总线写数据,也就同样需要访问互斥锁;最后还有一个中优先级的通信任务,它的运行时间比较长。平常这个系统运行毫无问题,但是有一天,在气象任务获得互斥锁往总线写数据的时候,一个中断发生导致通信任务被调度就绪,通信任务抢占了低优先级的气象任务,而无巧不成书的是,此时高优先级的总线任务正在等待气象任务写完数据归还互斥锁,但是由于通信任务抢占了CPU并且运行时间比较长,导致气象任务得不到CPU时间也无法释放互斥锁,本来是高优先级的总线任务也无法执行,总线任务无法及时执行的后果被探路者认为是一个严重错误,最后就是整个系统被重启。Vxworks允许优先级继承,然而遗憾的工程师们将这个选项关闭了。

(3)第三种方法就是使用中断禁止,通过禁止中断来保护临界区,采用此种策略的系统只有两种优先级:可抢占优先级和中断禁止优先级。前者为一般进程运行时的优先级,后者为运行于临界区的优先级。火星探路者正是由于在临界区中运行的气象任务被中断发生的通信任务所抢占才导致故障,如果有临界区的禁止中断保护,此一问题也不会发生。

五、护航现象(Lock Convoys)

Lock Convoys是在多线程并发环境下由于锁的使用而引起的性能退化问题。

当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lockconvoys问题,一般而言,lockconvoys并不会像deadlock或livelock那样造成应用逻辑停止不前,相反地,遭受lock convoys的系统或应用程序仍然往前运行,但是,由于线程们频繁地争抢锁而导致过多的线程环境切换,从而使得系统的运行效率大为降低,而且,若存在同等优先级下不参与锁争抢的线程,则它们可以获得相对较多的处理器资源,从而造成系统调度的不公平性。

本文将解释lockconvoys问题的缘由。

假设一组线程在频繁地获取锁(所谓频繁,指在一个时间片的执行周期内多次获取锁),比如在Windows应用程序中常常用临界区(criticalsection)来保护一个共享变量或者防止一段代码被重入,这是极有可能发生的。

假设线程A获取到了锁,这时发生了线程调度中断,它的时间片用完了,于是,系统调度器交给下一个线程执行,不妨设线程B获得了执行权。由于此锁被线程A获取,所以,当线程B执行到获取锁的操作时,虽然时间片未用完,但不得不放弃执行权。如此继续,所有同等优先级且要竞争此锁的线程都被阻塞。调度器再次回到线程A,很快地线程A释放了锁。在操作系统中,释放一个锁,意味着内核中如果有线程正在等待该锁,则它的状态就可以变成运行态。比如,线程B的获取操作成功。但此时,内核只是将线程B标记为锁的所有者,而线程A继续执行。很快地,线程A又要获取锁了,由于该锁已经被标记给线程B了,所以线程A不得不放弃时间片,将控制权交给调度器。调度器终于可以捡起线程B,将处理器的执行权交给它。等到线程B释放了锁,下一个线程获得锁的所有权,并且等到线程B放弃执行权或者结束时间片之后就有机会被执行。此过程一直持续,经过一轮之后又会回到线程A,从而继续下一轮的争抢。在此期间,这些线程总是未执行满时间片就不得不放弃执行权。下面的图说明了三个线程在争抢一个锁时候的执行情况。

假设一个线程在一个满时间片的执行过程中要多次获取/释放锁,它一旦释放了锁,则意味着,只要存在锁竞争,它在分配给它的当前时间片内已经无法再重新获得锁了。所以,它只能执行到它的下一次获取操作为止。譬如,参与竞争的线程平均执行1/3时间片就要获取锁,那么,线程的实际执行时间变成了1/3时间片。系统的调度粒度变成原来的1/3时间间隔。这引起了3倍数量的线程切换。从上图的右半部分可以看出,每个线程在一轮的循环中,只有1/3时间片的机会。这导致了3倍的线程切换。

除了引起调度粒度变小以外,lockconvoys的另一个问题是造成调度器的时间分配不公平。假设另有一个线程X也是在同等的优先级上运行,但没有参与锁竞争。于是,在每一轮的锁竞争过程中,线程X都有机会被分配一次完整的时间片,于是,这些竞争的线程在一轮中获得1/3时间片,而非竞争的线程可以获得完整的时间片。当然,你可以说这种不公平是由于它们抢锁而引起的,但从时间分配比例而言,参与竞争与不参与竞争的线程是不公平的。下图说明了线程X和A、B、C之间的执行时间差异。

由以上描述可以看出,Lockconvoys的存在条件是,参与竞争的线程频繁地获取锁,锁被一个线程释放以后其所有权便落到了另一个线程的手里。在操作系统中,相同优先级的线程按照FIFO的顺序被调度和执行,竞争同一个锁的线程也按照FIFO的顺序被依次成功地获取到锁。这些条件在现代操作系统中都能被满足,包括Windows。

Lock convoys虽然不是致命的问题,但也可能在实际系统中发生。Sue Loh在她的博客文章中展示了在Windows CE中发生的lock convoy问题。她也讨论了一种合理的缓解lockconvoy的方案,要求在每个线程获取锁的时候先尝试(try),如果尝试多次仍不成功,再阻塞。

本文转载自:https://www.cnblogs.com/linuxbug/p/4840148.html

TCGA数据下载保姆级教程:用GDC-client从零搞定,附配置文件避坑指南 本文提供TCGA数据下载的完整教程,详细讲解如何使用GDC-client工具从零开始配置到高效获取基因组数据。涵盖环境准备、认证配置、数据检索、高效下载及故障处理等关键步骤,并附配置文件避坑指南,帮助生物医学研究者快速掌握TCGA数据下载技巧。 阅读详情

相关推荐

微信公众号开发实战:如何高效推送模板消息(附完整代码示例)

本文详细解析了微信公众号开发中模板消息推送的核心流程与实战技巧。文章从OpenID获取、模板申请、Access Token缓存管理到完整PHP代码实现,逐步拆解了高效推送模板消息的关键步骤,并提供了可直接复用的代码示例,帮助开发者快速集成这一提升用户体验的重要功能。

weixin_29009971的博客 793

死锁(Deadlock)与活锁(Livelock)的区别?

死锁指的是两个或多个进程在互相请求对方占有的资源时,由于彼此之间的占用资源和等待资源形成了环路,导致所有参与的进程无法继续执行的状态。

程序猿老白~的博客 2796

【低空经济】多源异构数据融合的低空智能感知系统设计与实现

本文探讨了低空智能感知系统在多源异构数据融合中的设计与实现,重点解决无人机等低空飞行器的安全监测问题。通过雷达、光学和红外传感器的数据融合,系统识别准确率提升至92%,并实现120ms的低延迟处理。文章详细介绍了时空对齐、特征级融合和动态权重自适应等关键技术,为低空经济发展提供可靠技术支持。

weixin_29065659的博客 342

死锁(Deadlock)、活锁(LiveLock)、饥饿(Starvation)、挂起(Suspension)

最近在做并发缺陷的分类,发现不同学者对缺陷分类粒度不同,现对其中几个概念重述,欢迎交流! 本文以书面文字为准,附上说明来源。 若希望简单易懂的举例,请移步死锁,活锁和饥饿 死锁 1971年,Coffman总结系统产生死锁必定同时保持如下4个必要条件。 互斥条件(mutual exclusion):临界资源是独占资源,进程应互斥且排他地使用这些资源。 占有和等待条件(hold and wait):...

SUKI547的博客 4245

Class AB OPA STB仿真相位异常:从corner case到碰撞电离的排查与规避

本文深入分析了Class AB运算放大器(OPA)在STB稳定性仿真中,特定工艺角(corner case)下出现相位从0°开始的异常现象。排查发现,其根本原因在于高Vds引发的碰撞电离效应,通过衬底和电源网络引入了隐藏的正反馈通路。文章对比了修改衬底连接与优化电路降低Vds两种解决方案,并基于工程实践推荐了代价更小、兼容性更好的电路优化方案,成功规避了问题并完成流片验证。

grape的博客 636

Anaconda启动失败,一直在loading application的问题

实战基础新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本

Tristan的博客 2771

死锁(deadlock)、活锁(livelock)与饿死(starvation)

这个术语是在 20 世纪 70 年代的某个时候正式定义的——最早出现在已发表的文献中,是 Babich 1979 年关于程序正确性的文章。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T的请求…T2可能永远等待,这就是活锁。现实世界中活锁的一个示例是,两个人在一条狭窄的走廊里相遇,每个人都试图礼貌地让开让对方通过,但他们最终左右摇摆,没有取得任何进展,因为他们都在同一时间反复朝同一个方向移动。

极客神殿 645

Isograph Reliability Workbench 14实战:从零构建故障树分析模型

本文以“马达不转”为例,手把手教你使用Isograph Reliability Workbench 14从零构建故障树分析模型。内容涵盖创建工程、定义顶事件、添加逻辑门与基础事件等核心步骤,并介绍了模型检查与定性定量分析,帮助你系统掌握这一强大的可靠性工程工具。

weixin_29309213的博客 359

dead lock vs live lock

文章目录前言死锁活锁sync.condlivelock 前言 因为有一些工程上的问题一直被活锁给折磨,这里我要讲一下死锁和活锁的区别 死锁 死锁和活锁非常相似,死锁就是一个线程直接占有一个公共变量,且因为一些原因不能release,其他的线程访问直接被阻塞,死锁不消耗cpu如下 package main import ( "fmt" "sync" "time" ) type pub struct { mu sync.Mutex element int } func goroutin

qq_37026934的博客 732

静态分析工具COBOT与Testbed对比

Testbed为规则检查工具的代表,市场占有量非常大,但随着时间的推移,大家从规则匹配转向了用静态分析工具检查Bug,所以规则检查型工具占有量比开始时候已经减少,但仍有一些比较落后的单位还在继续采购此类工具。3、通过对开源工程的测试,进行误漏报率的对比,发现COBOT(库博)的误漏报率相比Testbed较低,因COBOT主打国内市场,在众多军工单位进行大量试用及使用,吸取了众多单位的意见和建议,更加符合国内军工单位的使用习惯及测试要求。4、此外库博在功能上还可以进行计划任务,检测队列,检测并发的功能支持。

chengoodflower的博客 2055

5个必知的脑网络图论指标:从聚类系数到小世界特性(附BCT工具包使用指南)

本文深度解析脑网络图论分析中五个核心指标:聚类系数、特征路径长度、全局效率、局部效率及节点效率,并详解其计算与解读。结合Brain Connectivity Toolbox工具包,提供从实战计算、常见报错解决到小世界特性统计检验的完整指南,帮助研究者跨越理论与实操鸿沟,让连接矩阵数据真正服务于神经科学研究。

blue42的博客 925

死锁,活锁,饿死,优先级反转,护航现象 (转)

死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某...

weixin_30938149的博客 260

配置 SAP Web Dispatcher 的实战指南:打通 SAP Fiori、SAP Gateway 与前端系统的关键一跳

SAP Web Dispatcher 在 Fiori 架构中扮演关键角色,作为统一入口处理 HTTPS 请求、实现安全代理和流量分发。它将分散在不同系统的访问路径统一收口,解决浏览器同源策略限制,集中管理 HTTPS 终止和客户端信息传递。典型配置中,Web Dispatcher 监听 443 端口,根据路径将 OData 请求转发至 Gateway 系统,静态资源请求送至前端服务器。SSL 相关配置(如 PSE 文件)确保安全通信,而路由规则(wdisp/system_xx)决定请求转发目标。实施时需注意

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 102

Linux同步机制部分术语(20%)

用于记录Linux同步机制中常见到的术语; 1. 饥饿(饿死hungry) 饥饿:指如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待; T3也请求封锁R,当T1释放了对R的封锁之后,系统首先批准了T3的封锁请求,于是T2仍然等待; T4又请求封锁R,当T3释放了对R的封锁之后,系统又批准了T4的请求,于是T2仍然等待;。。。 ...

weixin_30646315的博客 83

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

七天冲刺计算机基础八股文:从操作系统到数据库的面试通关攻略

在技术面试中,扎实的计算机基础是衡量候选人能力的重要标尺。无论是操作系统中的进程线程与内存管理,还是计算机网络里的TCP握手与HTTP协议,亦或是数据结构中的B+树与哈希表,这些核心知识并非孤立考点,而是彼此串联的知识体系。理解其底层原理与技术价值,才能在面试官的连环追问中游刃有余。本文从高频考点出发,梳理了操作系统、计算机网络、数据库索引与事务等核心模块的学习路径,结合实际工程场景与面试实战经验,帮助时间紧迫的求职者在短期内建立知识框架,掌握答题节奏,将死记硬背转化为自然流畅的技术表达。

weixin_34221036的博客 446

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

嵌入式开发中RTOS选择的七大核心理由与实战指南

实时操作系统(RTOS)是嵌入式系统开发中实现确定性响应的关键技术,其核心原理在于基于优先级的抢占式调度和低中断延迟,确保任务在最坏情况下也能在确定时限内完成。这一特性为工业控制、汽车电子等对实时性有严格要求的领域提供了关键价值。在应用场景上,RTOS通过任务管理、资源同步机制(如队列和信号量)以及高效内存管理,有效解决了裸机开发中常见的代码耦合与维护难题。本文聚焦于FreeRTOS等主流RTOS的选型考量,深入剖析其如何通过多任务并发与确定性响应提升系统可靠性,并涵盖从裸机迁移到RTOS的实战技巧与常见问

weixin_34416649的博客 415

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深入解析Linux死锁:原理、原因及解决方案

死锁(Deadlock)是指在多进程或多线程的系统中,多个进程或线程因争夺资源而互相等待,导致系统中所有相关进程都无法继续执行的状态。

A.的博客 5732

linux多线程

就是线程在获取锁和解锁这个过程中,他想要释放锁,比如写线程的buffer满了,想短暂的释放锁,让读线程来清理buffer,引入了条件变量机制。主要还是线程锁是采用争抢机制的,你无法按照你想的流程来进行,引入条件变量就好很多。竞争产生的原因:多个线程对同一个变量进行+1操作,如果线程A对变量先读后写的过程中,线程切换到B,B对变量进行+1后,切换回A,但是A是按照之前读的变量值进行+1再赋值给变量,所以相当于B没进行+1。当有读锁时,写锁无法获得,防止别的线程在读,你突然写了,久会导致数据出现问题。

zhanshengouzi的博客 465

公平锁与非公平锁、可重入锁(递归锁)、自旋锁、独占锁(写锁)、共享锁(读锁)、互斥锁

文章目录三、自旋锁1.理论2.代码验证①AtomicInteger实现原理CAS②自己编写一个自旋锁3.结论:自旋锁会使线程通过循环比较方式获取锁直到成功为止。四、读写锁1.理论2.代码验证:模拟一个分布式缓存进行多线程读写操作问题:发现不符合写操作的原子+独占3.结论:读写锁ReentrantReadWriteLock可以保证缓存中的读共享,写独占操作 三、自旋锁 四、独占锁(写锁)/共享锁(读锁)/互斥锁 三、自旋锁 1.理论 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁。 目的:

qq_43357394的博客 2201

有关于并发中的死锁(Deadlock)、饥饿(Starvation)、活锁(Livelock)

  最近在看《实战Java高并发程序设计》,发现了之前没有接触过的几个名词。 死锁:之前在接触多线程的时候,接触过死锁的情况。死锁是线程中最糟糕的情况,如下面的图中的四辆车子一样,如果没有一辆车主动出来。那么这种状态永远会这样维持下去    饥饿(Starvation):饥饿是指某一线程或多个线程在某种情况下无法获取所需要的资源,导致程序无法执行。比如,当某个线...

deke3032的博客 1747

01-1 死锁(Deadlock)、饥饿(Starvation)、活锁(LiveLock)

死锁、饥饿和活锁都属于多线程的活跃性问题。如果发生了上述几种情况,那么表示相关线程可能就不活跃了,也就是说它可能很难再继续往下执行了。 1、死锁 死锁应该是最糟糕的一种情况了,比如两个人再吃饭,吃饭需要筷子和碗,假设现在都只有一个,A率先拿到了筷子,而B率先拿到了碗,此时A和B都再互相等待着对方手中的资源,没有的到资源之前,都一直处于等待的状态,此时就会造成两个人永远再互相等待,这是一件非常可怕的事情。 死锁是一个很严重的并且应该避免和时时小心的问题。 ...

lwd2621的博客 938

关于Linux同步机制知识点整理

内核抢占是指内核在某些情况下可以抢占正在运行的进程或线程,以保证内核的响应能力和稳定性。内核抢占通常发生在中断处理程序中,当中断处理程序需要执行一些紧急的操作时,可以抢占正在运行的进程或线程,以保证中断处理程序的及时响应。在多线程编程中,需要考虑线程安全性,使用合适的同步机制和设计,来保证程序的正确性和可靠性。线程的使用可以提高程序的并发性和响应能力,但是需要注意线程安全性和同步机制的设计。同步机制是一种操作系统提供的机制,用于协调多个进程或线程之间的访问共享资源,防止出现竞态条件和死锁等问题。

瞌睡的洋葱的博客 1127

Linux 中的同步机制

指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。指在每个线程中访问临界资源的那段代码。由于临界资源需要互斥访问,因此每个线程的临界区代码在执行时需要确保没有其他现成同事访问该资源。

私房菜 1830

[一文搞懂]深入浅出linux同步机制

进程同步机制 因为现代操作系统是多处理器计算的架构,必然更容易遇到多个进程,多个线程访问共享数据的情况,如下图所示: 图中每一种颜色代表一种竞态情况,主要归结为三类: 进程与进程之间:单核上的抢占,多核上的SMP; 进程与中断之间:中断又包含了上半部与下半部,中断总是能打断进程的执行流; 中断与中断之间:外设的中断可以路由到不同的CPU上,它们之间也可能带来竞态; 本章主要是学习的内容如下: 原子锁解决什么问题,有什么缺陷 自旋锁解决什么问题,原理和应用场景 睡眠锁解决什么问题,mutex和Sema

奇小葩 2796
上一篇: TCP连接问题之close_wait
下一篇: Linux-系统及版本分支大全
Run_Feng
博客等级 码龄11年 144粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值