不理解为什么这样就是原子的操作了

softwarewander 2007-02-01 11:07:58
在看linux代码情景分析的时钟中断的时候看到了这样的一句
(*(unsigned long)&jiffies)++;

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

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

...全文
500 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingdog 2007-02-08
  • 打赏
  • 举报
回复
这样说也有道理。

但是我还是认为这种c语言翻译成汇编是编译器相关的,这样写不保险。
Rainyor 2007-02-08
  • 打赏
  • 举报
回复
我想不管怎么样都应该是原子操作, jiffies++ 有一个寻址过程啊,但(*(unsigned long *)&jiffies)++就是地址直接操作了
zgz 2007-02-08
  • 打赏
  • 举报
回复
这样的代码夸平台当然是有问题,你看的是什么版本的linux?估计是很老的版本吧?
flyingdog 2007-02-06
  • 打赏
  • 举报
回复
inc指令的确可以直接操作内存,而无需先把数据读入寄存器。从这个角度说的确是原子操作。

但是不明白代码为什么写成c语言,而不是汇编语言。毕竟对c语言编译成汇编是依赖于编译器的。为什么gcc要把(*(unsigned long *)&jiffies)++变成单单一个inc指令,而jiffies++却要先读入寄存器那?又如何保证gcc的其他版本,或者其他编译器能正确编译那?
江南一书生 2007-02-01
  • 打赏
  • 举报
回复
在基于intel x86 CISC CPU的PC架构上对一个内存数据做INC操作是可以用一条指令直接完成的,所以用(*(unsigned long *)&jiffies)++的写法的确是原子的,而直接写jiffies++则是一个Read-Modify-Write back的由若干指令实现的非原子操作。
但如果是在RISC CPU平台上,访问内存和算数逻辑运算不能在一条指令实现。要实现该原子操作需要在其前后分别disable和enable中断以保证原子性。
softwarewander 2007-02-01
  • 打赏
  • 举报
回复
哦写错了 应该是 (*(unsigned long *)&jiffies)++;
softwarewander 2007-02-01
  • 打赏
  • 举报
回复
cisc的这么强 内存数据的修改他都可以用一条指令完成阿,还是不懂。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧