当前位置: 技术问答>linux和unix
不理解为什么这样就是原子的操作了
来源: 互联网 发布时间:2016-01-08
本文导语: 在看linux代码情景分析的时钟中断的时候看到了这样的一句 (*(unsigned long)&jiffies)++; 书中作了解释,说与jiffies++ 相比来说cpu的执行周期几乎是相同的,但是前者被gcc编译成了对内存的inc指令,所以具有原子性? 我很...
在看linux代码情景分析的时钟中断的时候看到了这样的一句
(*(unsigned long)&jiffies)++;
书中作了解释,说与jiffies++ 相比来说cpu的执行周期几乎是相同的,但是前者被gcc编译成了对内存的inc指令,所以具有原子性?
我很不解, 对内存的访问并inc 也不是要分成很多指令来执行吗? 为什么会具有原子性呢?
(*(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中断以保证原子性。
但如果是在RISC CPU平台上,访问内存和算数逻辑运算不能在一条指令实现。要实现该原子操作需要在其前后分别disable和enable中断以保证原子性。
|
inc指令的确可以直接操作内存,而无需先把数据读入寄存器。从这个角度说的确是原子操作。
但是不明白代码为什么写成c语言,而不是汇编语言。毕竟对c语言编译成汇编是依赖于编译器的。为什么gcc要把(*(unsigned long *)&jiffies)++变成单单一个inc指令,而jiffies++却要先读入寄存器那?又如何保证gcc的其他版本,或者其他编译器能正确编译那?
但是不明白代码为什么写成c语言,而不是汇编语言。毕竟对c语言编译成汇编是依赖于编译器的。为什么gcc要把(*(unsigned long *)&jiffies)++变成单单一个inc指令,而jiffies++却要先读入寄存器那?又如何保证gcc的其他版本,或者其他编译器能正确编译那?
|
我想不管怎么样都应该是原子操作, jiffies++ 有一个寻址过程啊,但(*(unsigned long *)&jiffies)++就是地址直接操作了
|
这样的代码夸平台当然是有问题,你看的是什么版本的linux?估计是很老的版本吧?