首页 > 其他分享 >同步与互斥的失败例子-02

同步与互斥的失败例子-02

时间:2024-05-03 14:46:49浏览次数:19  
标签:02 同步 驱动程序 程序 CPU 互斥 valid 厕所

一句话理解同步与互斥:我等你用完厕所,我再用厕所。

什么叫同步?就是条件不允许,我要等等。

什么是互斥?你我早起都要用厕所,谁先抢到谁先用,中途不被打扰。

同步与互斥经常放在一起讲,是因为它们之的关系很大,“互斥”操作可以使用“同步”来实现。我“等”你用完厕所,我再用厕所。这不就是用“同步”来实现“互斥”吗?

有时候看代码更容易理解,伪代码如下:

假设有A、B两人早起抢厕所,A先行一步占用了;B慢了一步,于是就眯一会;当A用完后叫醒B,B也就愉快地上厕所了。

在这个过程中,A、B是互斥地访问“厕所”,“厕所”被称之为临界资源。我们使用了“休眠-唤醒”的同步机制实现了“临界资源”的“互斥访问”。

 

 

上面是一个有“味道”的例子,回到程序员的世界,一个驱动程序同时只能有一个APP使用,怎么实现?

 

看第5行,我们使用一个全局变量valid来实现互斥访问。这有问题吗?很大概率没问题,但是并非万无一失。

注意:编写驱动程序时,要有系统的概念,程序A调用驱动程序时,它可能被程序B打断,程序B也去调用这个驱动程序。

下图是一个例子,程序A在调用驱动程序的中途被程序B抢占了CPU资源:

程序A执行到第11行之前,被程序B抢占了,这时valid尚未被改成0;

程序B调用gpio_key_drv_open时,发现valid等于1,所以成功返回0;

当程序A继续从第11行执行时,它最终也成功返回0;

这样程序A、B都成功打开了驱动程序。

注意:在内核态,程序A不是主动去休眠、主动放弃CPU资源;而是被优先级更高的程序B抢占了,这种行为被称为“preempt”(抢占)。

 

上面的例子是不是第5行到第11行的时间跨度大长了?再优化一下程序行不行?代码如下:

 

第5行先减1再判断,这样可以更大概率地避免问题,但是还是不能确保万无一失。对数据的修改分为3步:读出来、修改、写进去。请看下图:

 

进程A在读出valid时发现它是1,减1后为0,这时if不成立;但是修改后的值尚未写回内存;

假设这时被程序B抢占,程序B读出valid仍为1,减1后为0,这时if不成立,最后成功返回;

轮到A继续执行,它把0值写到valid变量,最后也成功返回。

这样程序A、B都成功打开了驱动程序。

 

 

前面2个例子,都是在修改valid的过程中被别的进程抢占了,那么在修改valid的时候直接关中断不就可以了吗?

 

 

第06行直接关中断,这样别的线程、中断都不能来打扰本线程了,在它读取、修改valid变量的过程中无人打扰。

没有问题了?

 

 

 

对于单CPU核的系统上述代码是没问题的;但是对于SMP系统,你只能关闭当前CPU核的中断,别的CPU核还可以运行程序,它们也可以来执行这个函数,同样导致问题,如下图:

 

假设CPU0上进程A、CPU1上进程B同时运行到上图中读出valid的地方,它们同时发现valid都是1,减减后都等于0,在第07行判断条件都不成立,所以在第14行都可以返回0,都可以成功打开驱动。

 

标签:02,同步,驱动程序,程序,CPU,互斥,valid,厕所
From: https://www.cnblogs.com/liusiluandzhangkun/p/18171186

相关文章

  • #22 2024.4.28
    817.loj4143「CCO2019」Sirtet818.loj3364「IOI2020」植物比较819.loj3367「IOI2020」装饼干820.loj3389「NOIP2020」微信步数?计算第\(kn+i\)步还没死的人的个数。每一维是个一次函数,卷起来是个\(k\)次函数,前缀和是\(k+1\)次函数。做完了???821.uoj569【I......
  • hgame2023 vm
    vm逆向hgame2023vm简单翻阅一下发现,sub_140001000里面是vm_init,sub_1400010B0是主要的vm部分查看vm_init部分,发现只知道cpu结构的大小以及初始值和24-32字节的结构,前24字节的结构未知,暂时还无法构建cpu的结构,需要更多的信息。分析下面两图的函数可以得知,opcode总共有8个,byt......
  • 2024-05-02 通达信指标 归零五眼
      涨幅:=C/REF(C,1)>1.098;STICKLINE(涨幅,C,O,2.5,0),COLORWHITE;异动:="999999$C"<REF("999999$C",1)ANDC>REF(C,1);DRAWTEXT(异动,L,'异');黄金阴:=O>REF(C,1)ANDC<OANDV<=REF(V,1);黄金阴眼:=O>REF(C+0.01,1)ANDC<REF......
  • 2024-05-02 通达信指标 大盘涨跌家数
      X_1:="999999$ADVANCE";X_2:="999999$DECLINE";X_3:="399107$ADVANCE";X_4:="399107$DECLINE";总家数:X_1+X_2+X_3+X_4+"880005$LOW",NODRAW;涨家数:X_1+X_3,NODRAW;跌家数:X_2+X_4,NODRAW;差数:涨家数-跌家数,NODRAW;涨占比:涨家数/总家数*100,N......
  • 2024 HE中考 游记
    推歌回到奥奇-icegirls词:郑夏雨曲:Joeway编曲:Joeway表演者:刘程程、李文婕、李碧玉、郑夏雨、洪若虹录音室:星戈录音棚制作发行:星戈音乐(未经许可,不得翻唱或使用)洛世奇:无人的时空灰蓝色的梦记忆的碎片在脑海中来回地游走伊丽莎白:又再一次陷入回忆......
  • [CISCN 2022 华东北] duck
    [CISCN2022华东北]duckUAF|leak_libc|leak_heap_base|指针加密|unsortedbin|one_gadget[*]'/home/bamuwe/duck/pwn'Arch:amd64-64-littleRELRO:FullRELROStack:CanaryfoundNX:NXenabledPIE:PIEenabled$c......
  • 2024.5.2考试总结
    今天又犯傻逼错误A简单背包,背包的大小开小了,100->10B数位DP,答案与输入并不在同一数量级,但我并不这么认为,所以我使用了高精度。说来我也是真的唐,只有加减的高精度调了30分钟以上C类似后效性处理,普通DP不行,用了一种很神秘的DP本来想的缩点转化成DAG做,但是统计方案数会有重复......
  • 从嘉随笔<2024-5-2>
    狂玩了一个月,实属惭愧。 爱爱只是一种狂热自恋的投射(罗翔)人们长期处于迎合自我的垂直领域,因而偏见与狭隘就诞生了。世界本是主观与客观的存在,病态的观察往往只带来苍白的认知。所以:痴愚者盲目,自负者执着;爱人者狂热,被爱者冷血。当爱化作憧憬,幻想与现实的差距随之而来......
  • 001量化项目总结 --02获取五档买盘价格
    一、获取五档买盘price=0.0pmarkcode=0sip=''sport=0l1=[]time_now=datetime.now().minuteif(scode[0]=='0'andscode[1]=='0')orscode[0]=='3':pmarkcode=0else:pmarkcode=1api=TdxHq_API()iftime_no......
  • 2024/5/2 NOIP 模拟赛
    \(90+85+0+45=220\)本来应该\(100+100+15+45=260\)的,这样的成绩是我彩笔导致的。\(A\)题前缀异或桶,开考半个小时就将之秒掉了,但是没开\(\texttt{longlong}\)挂掉了\(10pts.\)非常生气。\(\texttt{B}\)思维题。给一个\(a_i(i=1,2,3,\cdots,n).\)进行无数次下面两种......