Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


修改指针值的操作是一个原子操作?
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
iterator   帅哥
骑士




UID:595425
注册:2007-8-2
最后登录: 2008-06-03
帖子:75
精华:0

可用积分:75
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
1楼 发表于 2008-5-18 14:54 
ULK上在讲rcu的时候,提到写者会修改指针,然后说"修改指针值的操作是一个原子操作".
为什么是原子操作呢??怎么保证的?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-09
帖子:1707
精华:3

可用积分:2368
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
2楼 发表于 2008-5-18 15:22 


QUOTE:
原帖由 iterator 于 2008-5-18 14:54 发表
ULK上在讲rcu的时候,提到写者会修改指针,然后说"修改指针值的操作是一个原子操作".
为什么是原子操作呢??怎么保证的?

在x86上单一的写是原子的。每个写操作之前会发起cache同步,所以一个CPU在写的时候,其它CPU无法发起cache同步,必须等该CPU写完(具体机制我也不清楚,原理应该是这样的)。
如果修改指针仅仅是给指针赋值,那就是一个单一的写操作,是原子的。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
crspo
精灵




UID:167638
注册:2004-6-28
最后登录: 2008-07-05
帖子:183
精华:1

可用积分:208
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
3楼 发表于 2008-5-18 20:01 


QUOTE:
原帖由 iterator 于 2008-5-18 14:54 发表
ULK上在讲rcu的时候,提到写者会修改指针,然后说"修改指针值的操作是一个原子操作".
为什么是原子操作呢??怎么保证的?

7.1.1       Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that the following
basic memory operations will always be carried out atomically:
•   Reading or writing a byte
•   Reading or writing a word aligned on a 16-bit boundary
•   Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that the following
additional memory operations will always be carried out atomically:
•   Reading or writing a quadword aligned on a 64-bit boundary
•   16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following
additional memory operation will always be carried out atomically:
•   Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache
    line
Accesses to cacheable memory that are split across bus widths, cache lines, and
page boundaries are not guaranteed to be atomic by the Intel Core 2 Duo, Intel Core
Duo, Pentium M, Pentium 4, Intel Xeon, P6 family, Pentium, and Intel486 processors.
The Intel Core 2 Duo, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, and P6
family processors provide bus control signals that permit external memory
subsystems to make split accesses atomic; however, nonaligned data accesses will
seriously impact the performance of the processor and should be avoided.



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
iterator   帅哥
骑士




UID:595425
注册:2007-8-2
最后登录: 2008-06-03
帖子:75
精华:0

可用积分:75
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
4楼 发表于 2008-5-19 10:48 
多谢.可3楼上怎么又说必须是32位对齐的呢?

另外,请教cacheable memory和externel memory subsystems都是什么意思?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-09
帖子:1707
精华:3

可用积分:2368
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
5楼 发表于 2008-5-19 11:40 


QUOTE:
原帖由 iterator 于 2008-5-19 10:48 发表
多谢.可3楼上怎么又说必须是32位对齐的呢?

另外,请教cacheable memory和externel memory subsystems都是什么意思?

有不对齐的指针吗?
crpso贴的是IA32 spec关于原子操作的规定,里面内容有些是晦涩和不清楚的,例如“16-bit accesses to uncached memory locations that fit within a 32-bit data bus”
通常我们把它归纳成:对于单一的读写操作,对齐的访问是原子的,cacheline内的访问是原子的。
cacheable memory,大部分内存都是cacheable的,这里的cache指用CPU的cache。
externel memory subsystems,应该是指除了本地内存控制器直接访问的内存外,还有通过其它总线间接访问的内存。我觉得NUMA应该属于这种情况。

[ 本帖最后由 zx_wing 于 2008-5-19 11:42 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
iterator   帅哥
骑士




UID:595425
注册:2007-8-2
最后登录: 2008-06-03
帖子:75
精华:0

可用积分:75
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
6楼 发表于 2008-5-19 12:31 
还是不太懂.要是一个结构体用attribute packed声明了,它内部的指针成员不就有可能不对齐了吗?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
版主 albcamus (百無一用書生)
版主-大法师
[ 願天速殞可憐生 ]



UID:140189
注册:2004-3-7
最后登录: 2008-07-09
帖子:10951
精华:20

可用积分:7436
信誉积分:105
专家积分:15 (本版)

来自:嫏嬛閣
状态:...保密...

[资料] [站内短信] [Blog]


顶部
7楼 发表于 2008-5-19 12:35 


QUOTE:
原帖由 iterator 于 2008-5-19 12:31 发表
还是不太懂.要是一个结构体用attribute packed声明了,它内部的指针成员不就有可能不对齐了吗?

是有这个可能。

这样的32位写操作不见得是原子的。

但只要32位对齐(除非你告诉编译器不要这样做,否则都是对齐的),就是原子的。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________




CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-09
帖子:1707
精华:3

可用积分:2368
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
8楼 发表于 2008-5-19 12:41 


QUOTE:
原帖由 iterator 于 2008-5-19 12:31 发表
还是不太懂.要是一个结构体用attribute packed声明了,它内部的指针成员不就有可能不对齐了吗?

不行的,__attribute__ ((packed))不是万能的,它无法构造一个不对齐的指针。
例如

QUOTE:
struct
{
   char a;
   char *str;
   char b;
} __attribute__ ((packed)) x;

仍然会对齐



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-09
帖子:1707
精华:3

可用积分:2368
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
9楼 发表于 2008-5-19 12:46 


QUOTE:
`packed'
     The `packed' attribute specifies that a variable or structure field
     should have the smallest possible alignment--one byte for a
     variable,
and one bit for a field, unless you specify a larger
     value with the `aligned' attribute.

packed带来的紧凑模式是以最小单位对齐,并不是不对齐。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
iterator   帅哥
骑士




UID:595425
注册:2007-8-2
最后登录: 2008-06-03
帖子:75
精华:0

可用积分:75
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
10楼 发表于 2008-5-19 12:48 


QUOTE:
原帖由 zx_wing 于 2008-5-19 12:41 发表

不行的,__attribute__ ((packed))不是万能的,它无法构造一个不对齐的指针。
例如

仍然会对齐

那个str应该不是32位对齐的呀



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布

首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.043661 second(s), 5 queries , Gzip enabled