ITPub博客

首页 > > > Linux 互锁斥 信号量 死锁 原子操作

Linux 互锁斥 信号量 死锁 原子操作

作者:dapan 时间:2018-08-31 15:26:27 0 删除 编辑


1 前言

周末时间过得很快,最近在看一个电视剧《岁岁年年柿柿红》,那些年代的感触还是很深的,当年我们家也是那样的状态。想不到几十年就过来了。同是农村过来的可以一起看看。

这次想说一下互斥锁,原子操作,主要是上次说的那个卖票的程序,在出票的时候没有加锁,很容易造成同时出一张票的问题,在Linux内核里面,信号量和锁机制非常重要。大家先了解其中的原理,写代码和看代码的时候才游刃有余。

本想把几个锁机制都一次一起写了,但是周末时间有限,总是没有一个连贯的时间,先把原子操作整理一下。



2 正文

原子操作

为什么有原子操作?

1、多进程之间对同一个资源操作导致问题

2、多CPU对同一资源操作导致问题


什么是原子操作?

答:所谓的原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就是说,它的最小的执行单位,不能有比它更小的执行单元,因此这里的原子实际是使用了物理学里物质微粒的概念。


举个栗子:

1、多线程操作

正常对一个变量自加需要三步操作



如果有两个进程同时对变量i操作的话,可能会出现下面的情况



进程1执行第一条执行后,进程2开始对i进行操作,这时候进程2执行完了,i的值是1,回到进程1,因为eax寄存器的值是0,自增1后也变成了1,但是我们希望两次操作得到的是i变成2。这样问题就出现了。


如何解决?

把三条指令变成一条指令,那就可以解决单CPU多进程的抢占问题

上面三条指令可以变成 inc [i]



2、多cpu操作

上面的情况虽然解决了单cpu问题,但是在多cpu上,多个cpu对同一个资源抢占,同样问出现上面的问题


举个栗子:




看上面的图片,这样操作之后,i 还是1,这又出现问题了


如何解决问题?


在CPU操作之前,先上锁Lock,操作完后才释放锁,这样就避免了问题。




加上lock之后,操作就正常了


我们在写嵌入式代码,不只是Linux,在写其他微处理器,rtos代码的时候,也会有这样的问题,嵌入式虽然这些年工资比不上互联网,但是里面的精髓需要慢慢锤炼的,也希望这一波AI人工智能能把嵌入式的薪水提高一个档次。


​

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87278