Linux内核中的同步_第1页
Linux内核中的同步_第2页
Linux内核中的同步_第3页
Linux内核中的同步_第4页
Linux内核中的同步_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

内核中的同步临界区和竞争状态内核同步措施并发控制什么是临界区(criticalregions)?就是访问和操作共享数据的代码段,这段代码必须被原子地执行什么是竞争状态?多个内核任务同时访问同一临界区什么是同步?避免并发和防止竞争状态称为同步(synchronization)

<>临界区和竞争状态考虑一个非常简单的共享资源的例子:一个全局整型变量和一个简单的临界区,其中的操作仅仅是将整型变量的值增加1:

i++

该操作可以转化成下面三条机器指令序列:(1)得到当前变量i的值并拷贝到一个寄存器中(2)将寄存器中的值加1(3)把i的新值写回到内存中

<>临界区举例内核任务1内核任务2获得i(1)---增加i(1->2)---写回i(2)---

获得i(2)

增加i(2->3)

写回i(3)<>临界区举例内核任务1内核任务2获得i(1)------获得i(1)

增加i(1->2)------增加i(1->2)

写回i(2)------写回i(2)

可能的实际执行结果:期望的结果

当共享资源是一个复杂的数据结构时,竞争状态往往会使该数据结构遭到破坏。

对于这种情况,锁机制可以避免竞争状态正如门锁和门一样,门后的房间可想象成一个临界区。

在一个指定时间内,房间里只能有个一个内核任务存在,当一个任务进入房间后,它会锁住身后的房门;当它结束对共享数据的操作后,就会走出房间,打开门锁。如果另一个任务在房门上锁时来了,那么它就必须等待房间内的任务出来并打开门锁后,才能进入房间。

<>共享队列和加锁任何要访问队列的代码首先都需要占住相应的锁,这样该锁就能阻止来自其它内核任务的并发访问:

<>任务1

试图锁定队列成功:获得锁访问队列…为队列解除锁…任务2试图锁定队列失败:等待…等待…等待…成功:获得锁

访问队列…

为队列解除锁共享队列和加锁

找出哪些数据需要保护是关键所在

内核任务的局部数据仅仅被它本身访问,显然不需要保护

如果数据只会被特定的进程访问,也不需加锁

大多数内核数据结构都需要加锁:若有其它内核任务可以访问这些数据,那么就给这些数据加上某种形式的锁;若任何其它东西能看到它,那么就要锁住它

<>确定保护对象

死锁产生的条件:有一个或多个并发执行的内核任务和一个或多个资源,每个任务都在等待其中的一个资源,但所有的资源都已经被占用。所有任务都在相互等待,但它们永远不会释放已经占有的资源,于是任何任务都无法继续

典型的死锁:

四路交通堵塞

自死锁:一个执行任务试图去获得一个自己已经持有的锁

<>死锁

加锁的顺序是关键。使用嵌套的锁时必须保证以相同的顺序获取锁,这样可以阻止致命拥抱类型的死锁

防止发生饥饿

不要重复请求同一个锁。

越复杂的加锁方案越有可能造成死锁,因此设计应力求简单

<>死锁的避免

中断——中断几乎可以在任何时刻异步发生,也可能随时打断正在执行的代码。

内核抢占——若内核具有抢占性,内核中的任务就可能会被另一任务抢占

睡眠及与用户空间的同步——在内核执行的进程可能会睡眠,这将唤醒调度程序,导致调度一个新的用户进程执行

对称多处理——两个或多个处理器可以同时执行代码

<>并发执行的原因

为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护

原子操作自旋锁信号量

<>内核同步措施

原子操作可以保证指令以原子的方式被执行

两个原子操作绝对不可能并发地访问同一个变量

Linux内核提供了一个专门的atomic_t类型(一个24位原子访问计数器)和一些专门的函数,这些函数作用于atomic_t类型的变量

<>原子操作

自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分,而对于单处理器来说,可简单采用关闭中断的方式防止中断处理程序的并发执行

自旋锁最多只能被一个内核任务持有,若一个内核任务试图请求一个已被持有的自旋锁,那么这个任务就会一直进行忙循环,也就是旋转,等待锁重新可用

<>自旋锁

设计自旋锁的初衷是在短期间内进行轻量级的锁定。一个被持有的自旋锁使得请求它的任务在等待锁重新可用期间进行自旋,所以自旋锁不应该被持有时间过长

自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争

自旋锁不允许任务睡眠,持有自旋锁的任务睡眠会造成自死锁,因此自旋锁能够在中断上下文中使用<>自旋锁

Linux中的信号量是一种睡眠锁。若有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由而去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量

信号量具有睡眠特性,适用于锁会被长时间持有的情况,只能在进程上下文中使用<>信号量信号炭量的犯使用<>信号形量的忧定义st险ru峰ctse鸽ma察ph炉or退e怒{染a棒to拦mi料c_除t贤co条un腥t;in啦tsl睛ee铺pe扑rs贪;密w略ai蠢t_姨qu家eu港e_压he省ad狮_t赶w贿ai窗t;裹}st汗at市ic茶D禽EC喂LA尼RE牲_M搁UT薯EX誓(mr_se袄m);/*声明语并初奴始化示互斥善信号仆量*/if满(d兄ow倚n_坟in洁te然rr佣up汽ti传bl甩e(通&mr_se哥m))/*信号鸭被接计收,信号萝量还校未获蛋取*//*临界忍区…*只/up架(&mr_se届m);信号巡寿量<>信号殊量与岛自旋定锁的遭比较需求

建议的加锁方法

低开销加锁

优先使用自旋锁

短期锁定

优先使用自旋锁

长期加锁

优先使用信号量

中断上下文中加锁

使用自旋锁

持有锁时需要睡眠、调度

使用信号量

假设兆存在谜这样睡一个捡的内未核共以享资型源-提链表伶。另酿外我级们构蒸造一残个内引核多晒任务盟访问活链表毛的场判景:悉内核约线程燥向链腹表加康入新旅节点牲;内剧核定犬时器姐定时兔删除舌接点焦;系刷统调术用销显毁链唤表。上面罗三种事内核渡任务熊并发社执行率时,而有可打能会希破坏狮链表刺数据胁的完老整性甚,所倡以我索们必竟须对这链表酒进行狭同步柳访问逐保护丛,以造确保涝数据交一致池性。<>并发勾控制际实例系统州调用:是用筒户程毙序通练过门战机制柏来进遣入内乞核执列行的必内核泥例程葬,它铃运行朽在内傅核态菊,处启于进伴程上董下文角中,浙可以愉认为本是代援表用绩户进励程的作内核饺任务内核梢线程咸:内核撕线程魔可以大理解践成在勾内核敞中运英行的螺特殊粮进程异,它及有自总己的语“进敌程上汪下”,定时蠢器任醉务队肉列:任务奇队列讯属于兵下半遍部,恨主要活有调亩度队竿列、攻定时坑器队栏列和近及时辟队列稍等三歪种任澡务队破列<>内核泳任务户及其钳之间国的并渐发关损系系统锈调用满和内梁核线驾程可蔽能和群各种幕内核腰任务令并发协执行饿,除准了中掩断(甩定时联器任兔务队挨列属亩于软丧中断叹范畴蛙)抢冲占它尾产生前并发双外,深它们铃还有送可能折自发荷性地馅主动若睡眠隶(比希如在旗一些陪阻塞乱性的反操作次中)还,于兆是放娘弃处病理器旦,从理而重骂新调萄度其奥它任切务,截所以扮系统卷调用服和内主核线沈程除留与定晓时器壳任务牧队列合发生君竞争柜,也娱会与蚀其他放(包阻括自贡己)宗系统伏调用汁与内达核线派程发处生竞市争。<>内核范任务垫及其摩之间宇的并猎发关丛系主要公的共铜享资棵源是盾链表赶(mi突ne),操作诵它的徐内核掉任务舍有三唯个:旗一是10两0个内犯核线悲程(sh恨ar纸el法is铜t),它们铅负责游从表庭头将命新节涨点(st警ru央ctmy己_st舅ru申ct)插入邻链表朝。二杯是定敞时器洁任务(qt夸_t骡as讽k),它负舌责每这个时仅钟节成拍时抬从链稀表头胡删除颜一个络节点态。三临是系紫统调掠用sh劳ar倒e_予ex筋it,它负拾责销灭毁链别表并种卸载承模块抽。<>实现框机制内核孤线程sh鹊ar薯el仍is少t:该函烤数是纸作为哨内核棕线程骑由ke衡ve滑nt说d调度扩执行沈的,亩作用子是向扑链表滋中加堤入新株节点st肿ar景t_kt动hr依ea旅d:该函勺数用跃来构洋建内趁核线俘程Sh蹈ar墓el村is退t的封豪装函走数kt暗hr跟ea由d_l争au扇nc娱he呀r,并启舍动它kt路hr送ea兔d_l摧au咬nc泥he适r蔑:该函腰数作许用仅吉仅是河通过ke岂rn仆el嫩_t始hr业ea啄d方法启动菠内核紫线程sh萍ar忠el悟is勺t<>实现成机制qt颗_t静as祝k盒:该函锹数删匆除链扑表节渠点,报作为津定时谨器任暗务运艺行sh等ar骂e_辩in胜it托:该函巨数是迅我们轨的模栽块注瞒册函购数,泻也是婚通过嗽它启焰动定珍时器加任务尼和内汽核线何程sh茎ar擦e_拐ex碎it贼:这是渴模块差注销登函数恐,负辟责销冷毁链餐表<>实现笋机制sh啄ar进e_叠ex仔itsh歼ar减el大is陷t链表qt宽_t箩as锡kke切ve银ntst槐ar连t_kt迎hr义ea柔d进程涨上下控文中断填上下坝文进程阵上下握文do荷wnup上锁添加泽节点删除狐节点链表衣是内熊核开淘发中珍的常威见数项据组倘织形异式,释为了芳方便外开发健和统苏一结岭构,爱内核所提供破了一行套接音口来洒操作产链表城,我究们用皱到的习接口睬其主哑要功鼻能为寻:LI根ST妥_H果EA爆D:声明挣链表专结构li荒st熔_a狱dd继():添加时节点剧到链渣表li文st号_d浩el岔():删除坟节点li头st梨_e册nt马ry凳():遍历默链表任务冈队列驻结构偶为st谊ru球ct阵t份q_st初ru归ctki粗ll倡_p趋ro竹c,该函闹数在宅模块愉注销员时被鹿调用饰,其石主要夺作用伟有两它个:身第一洗杀死度我们派生成核的内翠核线躲程;该第二护告诉ke泻ve冻nt梳d回收剥相关铸子线桥程,说以免乏产生

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论