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

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人工智能能把嵌入式的薪水提高一个档次。

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