0
点赞
收藏
分享

微信扫一扫

原子操作的理解

眸晓 2022-03-23 阅读 86

        今天学习了原子操作,原子操作的本质其实在我看来是做了一对指令标记,因为我们知道单条指令是不会被打断的。当我们修改一个变量的值时,比如i++,从C语言的角度看是一个语句,但是到指令层次其实涉及读出修改写入三个指令,那么可能在我们读出时被其他cpu或者其他线程抢占,把该变量处理成了其他值,这时候再返回我们之前程序时,我们是不知道的此变化的,我们会继续进行之前的操作,从而引发一系列错误。这里内核提供了两种方案:

第一种:

关中断,因为我们都知道任务线程等切换是依赖于中断进行的,我们关中断,操作完成后,再打开中断。这个方法问题也很明显,开关中断的开销都不小,并且中断关闭后对系统的影响是非常大的。

第二种:

采用ldrex等指令,它的具体原理就是读出指令时,对读出的地址进行独占标记,这里它的意思不是不可访问,从我的理解中来说是一个flag,你后面写入的strex(跟前面的ldrex有着指令对的感觉),这个指令会去检查你的flag,如果有则说明此次操作是没有被打断的,就可以返回0,当发现flag没了,那肯定是被别人改了啊,所以会放弃写入并且返回1,这样我们可以根据此返回值去判断有变量有无被更改,并且重新去做读出修改写入操作,这里重新的读出就能更新后变量的值,直到完整的一次过程后即可。这里也可以看出,我们原子的根本意图可能不是说防止被修改,而是防止不同步造成的后果,被别人抢占了无所谓,但是我们不能还被蒙在鼓里。更加说明了操作系统就是安排轮转,我们可以等待,但是绝对不能起冲突。就跟医院取号,1号和100号都得乖乖等着,但是如果两个人拿到一个号,那冲突是在所难免的。

在原子操作的内核实现中,还有内联汇编的一些用法知识,都是可以去了解的。我们同时使用找到对应的宏定义和接口即可,关键是有这个使用的意识和规范是最难得的。

举报

相关推荐

0 条评论