社区
Linux_Kernel
帖子详情
不理解为什么这样就是原子的操作了
softwarewander
2007-02-01 11:07:58
在看linux代码情景分析的时钟中断的时候看到了这样的一句
(*(unsigned long)&jiffies)++;
书中作了解释,说与jiffies++ 相比来说cpu的执行周期几乎是相同的,但是前者被gcc编译成了对内存的inc指令,所以具有原子性?
我很不解, 对内存的访问并inc 也不是要分成很多指令来执行吗? 为什么会具有原子性呢?
...全文
500
7
打赏
收藏
不理解为什么这样就是原子的操作了
在看linux代码情景分析的时钟中断的时候看到了这样的一句 (*(unsigned long)&jiffies)++; 书中作了解释,说与jiffies++ 相比来说cpu的执行周期几乎是相同的,但是前者被gcc编译成了对内存的inc指令,所以具有原子性? 我很不解, 对内存的访问并inc 也不是要分成很多指令来执行吗? 为什么会具有原子性呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的这么强 内存数据的修改他都可以用一条指令完成阿,还是不懂。
韦东山升级版嵌入式视频之快速入门
那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频...
C语言的
原子
操作
原子
操作
是不可分割的,在执行完毕之前不会被任何其它任务或事件中断,可以视为最小的
操作
单元,是在执行的过程中、不会导致对数据的并发访问的、最小
操作
,因此称为
原子
操作
。最简单的
原子
操作
,就是交换一个寄存器...
什么叫
原子
性(
原子
操作
),同步锁和
原子
操作
有区别吗(重要的)
也就是说,只要
原子
操作
有一处失败,那么 整体失败 3.
原子
操作
中,
操作
中的 共享资源,只能被这个 线程的 这个
原子
操作
获得, 其他
操作
,或者其他线程的任何
操作
(
原子
/不是
原子
的),都不能获得这个 共享...
什么是
原子
操作
原子
操作
是指一个不受其他
操作
影响的
操作
任务单元。
原子
操作
是在多线程环境下避免数据不一致必须的手段。 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的
原子
操作
。 在Java中可以通过锁和循环...
【C/C++】深入
理解
原子
操作
& volatile i为什么不能保证i++的
原子
性
首先我们来讲一下处理器支持的
原子
操作
以及为什么i++不是
原子
操作
。 从处理器层面上来讲,处理器保证基本的访存事务的
原子
性,例如当处理器读取存储器中的一个字节时,在读取过程未结束之前,其他的任何设备都不可以...
Linux_Kernel
4,436
社区成员
17,460
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章