日期:2014-05-16  浏览次数:20816 次

不理解为什么这样就是原子的操作了
在看linux代码情景分析的时钟中断的时候看到了这样的一句
(*(unsigned   long)&jiffies)++;

书中作了解释,说与jiffies++   相比来说cpu的执行周期几乎是相同的,但是前者被gcc编译成了对内存的inc指令,所以具有原子性?

我很不解,   对内存的访问并inc   也不是要分成很多指令来执行吗?   为什么会具有原子性呢?



------解决方案--------------------
在基于intel x86 CISC CPU的PC架构上对一个内存数据做INC操作是可以用一条指令直接完成的,所以用(*(unsigned long *)&jiffies)++的写法的确是原子的,而直接写jiffies++则是一个Read-Modify-Write back的由若干指令实现的非原子操作。
但如果是在RISC CPU平台上,访问内存和算数逻辑运算不能在一条指令实现。要实现该原子操作需要在其前后分别disable和enable中断以保证原子性。
------解决方案--------------------
inc指令的确可以直接操作内存,而无需先把数据读入寄存器。从这个角度说的确是原子操作。

但是不明白代码为什么写成c语言,而不是汇编语言。毕竟对c语言编译成汇编是依赖于编译器的。为什么gcc要把(*(unsigned long *)&jiffies)++变成单单一个inc指令,而jiffies++却要先读入寄存器那?又如何保证gcc的其他版本,或者其他编译器能正确编译那?

------解决方案--------------------
我想不管怎么样都应该是原子操作, jiffies++ 有一个寻址过程啊,但(*(unsigned long *)&jiffies)++就是地址直接操作了
------解决方案--------------------
这样的代码夸平台当然是有问题,你看的是什么版本的linux?估计是很老的版本吧?