免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mingjwan
打印 上一主题 下一主题

对int变量的赋值是原子操作吗? [复制链接]

论坛徽章:
0
71 [报告]
发表于 2006-08-11 12:32 |只看该作者
原帖由 思一克 于 2006-8-11 12:31 发表
To jsjfk,

对齐的问题我也知道。在linux的众多atomic.h中就可以看到。
我一开始就建议去看这些文件。

-_-|||...


坐不改名行不改姓,我的 ID 是 isjfk......

论坛徽章:
0
72 [报告]
发表于 2006-08-11 12:33 |只看该作者
TO isjfk  

哈。SORRY,不是COPY的。

论坛徽章:
0
73 [报告]
发表于 2006-08-11 12:36 |只看该作者
原帖由 gvim 于 2006-8-11 12:29 发表
>>>b = a;
movl a, %eax  //1
movl %eax, b  //2

1,2之间发生中断,会发生不一致。
b = a;被分开了,何来原子?
int是高级语言中的概念,所以"int变量赋值"不是原子的。
OS理论书籍的 ...

嗯,严格来说是这样。只不过不管这两条语句间是可能中断还是不会中断,对于下一条语句来说都是一样的。所以粗略地看成是原子的也未尝不可

论坛徽章:
0
74 [报告]
发表于 2006-08-11 12:41 |只看该作者
中断处理程序不保护寄存器吗?

原帖由 gvim 于 2006-8-11 12:29 发表
>>>b = a;
movl a, %eax  //1
movl %eax, b  //2

1,2之间发生中断,会发生不一致。
b = a;被分开了,何来原子?
int是高级语言中的概念,所以"int变量赋值"不是原子的。
OS理论书籍的 ...


原帖由 isjfk 于 2006-8-11 12:36 发表

嗯,严格来说是这样。只不过不管这两条语句间是可能中断还是不会中断,对于下一条语句来说都是一样的。所以粗略地看成是原子的也未尝不可

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
75 [报告]
发表于 2006-08-11 12:44 |只看该作者
原帖由 isjfk 于 2006-8-11 12:36 发表

嗯,严格来说是这样。只不过不管这两条语句间是可能中断还是不会中断,对于下一条语句来说都是一样的。所以粗略地看成是原子的也未尝不可


呵~怎么能这么看?
MP,NUMA等体系的最大实现难度就在于原子和一致,原子和一致为这些多机系统提供了最基本的正确性。然后在保证正确的前提下实现本地优化。
按照你的意思:如果"对于下一条语句来说都是一样"的话,那么multithreading将和uniprocessing没有任何本质区别。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
76 [报告]
发表于 2006-08-11 12:49 |只看该作者
原帖由 思一克 于 2006-8-11 12:41 发表
中断处理程序不保护寄存器吗?


寄存器不是唯一的存储器,或者在多机环境下存储也不是唯一的本地存储器。
两条机器指令间只要有中断的可能,就有发生危险的可能。

论坛徽章:
0
77 [报告]
发表于 2006-08-11 12:54 |只看该作者
To gvim,

想的太复杂了。问题一般是问的简单的情况,而且是用户程序的多THREAD程序的一个全局变量的复制原子问题。

多机,多CPU,情况当然会有变化。如同一个跑的很好的SERVER程序,如果变到多机甚至多CPU都可能要做PORTING工作,而且还是比较复杂的工作。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
78 [报告]
发表于 2006-08-11 13:07 |只看该作者
这不是复杂不复杂的问题。即便在up上也如此。

如果a ,b 都是系统级的全局变量
a=10;
b=a;
movl a,%eax   #1
movl %eax, b  #2

1) 进程x 在#1, #2之间发生中断,切换到其他程序y。%eax现在是10,被自动保存。
2) y赋值b=20
3) 切换回x
4) x执行#2句,取出%eax的值10,付给b。
那么,b到底应该是x赋的10还是y赋的20?

问题在于,你能保证#1,#2之间不会发生中断?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
79 [报告]
发表于 2006-08-11 13:11 |只看该作者
在操作系统的基本课程中早就提到过了 ,

int变量的赋值操作如果翻译成汇编语句不是单条指令的话,那么肯定不是原子的.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
80 [报告]
发表于 2006-08-11 13:14 |只看该作者
原帖由 mq110 于 2006-8-11 13:11 发表
在操作系统的基本课程中早就提到过了 ,

int变量的赋值操作如果翻译成汇编语句不是单条指令的话,那么肯定不是原子的.


正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP