免费注册 查看新帖 |

Chinaunix

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

关于 atomic 的话题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-11-21 10:09 |只看该作者
谢谢版主的解释!

有几个问题(均针对32-bit CPU):
1. 看Intel的文档,32-bit CPU的几个general-purpose registers均是32-bit的。虽然data path是64-bit的,但它怎样才能做到原子性的read or write 64-bit的数据呢?

2. 以64-bit的data path width为例,是否意味着在数据读取的时候,自动的将进程的地址空间分成8byte组了,比如0~7, 8~15, 16~23, ... ?

3. 从data path的角度理解,进程的地址是物理地址还是虚拟地址?我感觉应该是物理地址,但在程序中开发者怎么能够控制物理地址是否对其呢?

4. 按照描述,读取integer的时候,如果它没有达到doubleword boundary的要求,也有可能不时atomic的,对吗?比如下面的结构体:
typedef struct _TestStruct {
  byte b1;
  byte b2;
  int  i;
  byte b3;
  byte b4;
} TestStruct;

int main()
{
   TestStruct test;

   int result;
   result = test.i;   // Is this a atomic operation ?

}

4. 有时候是否可以从汇编代码直接看出是否是atomic操作。
以openspace的一个例子为例:
/* ull_demo.c */
int main(void)
{
        unsigned long long target = 1;
        unsigned long long tmp = target;

        return 0;
}

gcc -S ull_demo.c得到ull_demo.s
cat ull_demo.s
        .file        "ul_demo.c"
        .text
.globl main
        .type        main, @function
main:
        pushl        %ebp
        movl        %esp, %ebp
        andl        $-8, %esp
        subl        $16, %esp

        movl        $1, (%esp)      // 这两行是对target的赋值
        movl        $0, 4(%esp)     // 一次设置32位,分两次

        movl        (%esp), %eax    // 这两行是将64位值放到eax和edx中
        movl        4(%esp), %edx

        movl        %eax, 8(%esp)   // 这两行是将值赋给tmp变量
        movl        %edx, 12(%esp)

        movl        $0, %eax
        leave
        ret
        .size        main, .-main
        .ident        "GCC: (GNU) 4.4.2 20091027 (Red Hat 4.4.2-7)"
        .section        .note.GNU-stack,"",@progbits


可以看出在操作64-bit的unsigned long long的时候,实际上对memory操作了两次,因此肯定不是atomic的,对吗?

[ 本帖最后由 rc_hz 于 2009-11-21 10:37 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2009-11-21 12:07 |只看该作者
atomic是通过Lock前缀来保证其原子性的,而Lock前缀也只能用于修饰某些指令,例如ADD等,有些指令比如XCHG本身就是原子操作,对于Lock前缀,MP spec明确指明,需要对齐,对于不对齐的操作将不保证原子性。Lock指令锁定了Memory Bus,使得CPU串行化访问某块内存,因此保证了原子性。

论坛徽章:
0
13 [报告]
发表于 2009-11-21 17:36 |只看该作者
原帖由 rc_hz 于 2009-11-21 10:09 发表
谢谢版主的解释!

有几个问题(均针对32-bit CPU):
1. 看Intel的文档,32-bit CPU的几个general-purpose registers均是32-bit的。虽然data path是64-bit的,但它怎样才能做到原子性的read or write 64-bit ...


1、在 32 位代码下,可以使用 SSE 指令 read/write  64 位数据


例如:指令 movntq  qword ptr [eax], mm0

       这条指令将 mm0 写入地址 [eax],64 位的数据

例如:指令 movq mm0, qword ptr [eax]

       这条指令读 64 位数据从内存 [eax] 到 mm0 寄存器



2、 data path 是 processor 的 data bus 分组情况,做数据传送时,processor 根据地址而使用哪些  data path


3、 virtual address 和 physcial address 并无区别,virutal address 与 physcial address 是对应关系。


4、
>> 按照描述,读取integer的时候,如果它没有达到doubleword boundary的要求,也有可能不时atomic的,对吗?

    没错,如果是跨了 doubleword (32位)边界,就不能保证其原子性

    原因是:虽然 data bus 是 64 位, 但 address bus 还是 32 位,
               如果 读/写 doubleword 而跨了 doubleword 边界,那么 address bus 需要送 2 次

-----------------------------------------------------------------------------------------------
关于 address bus 工作原理,稍后再说



>> 有时候是否可以从汇编代码直接看出是否是atomic操作。  

      可以,如果你汇编很在行的话!

    在 32 位系统上 C 语言层面上的 long long 是不能保证 原子性的。

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
14 [报告]
发表于 2009-11-21 19:13 |只看该作者

回复 #15 mik 的帖子

也是
前面例子中也就a是全局变量的时候需要对a的访问进行同步控制
对于局部变量这个就免了

总算把概念澄清了
谢谢版主了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
15 [报告]
发表于 2009-11-22 11:23 |只看该作者
那么:
  (1) processor 先将 BE5# = 0,BE6# = 0,BE7# = 0,其它置 1,使用 data path 5、6、7 有效,其它 data path 无效,先读 24 位,放到 eax 的低 24 位

  (2) 接着 processor 再置 BE0# = 0,其它置1,使 data path 0 有效,其它 data path 无效,
   读 byte 放到 eax 的高 8 位

mik兄,这个地方第(2)只需要BE0#=0即可吗,不需要先将地址调整一下吗?

论坛徽章:
0
16 [报告]
发表于 2012-12-02 09:31 |只看该作者
膜拜楼主!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP