| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2751 人关注过本帖
标题:数据线与内存访问粒度的区别!!高手进!
只看楼主 加入收藏
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
结帖率:98.26%
收藏
已结贴  问题点数:50 回复次数:8 
数据线与内存访问粒度的区别!!高手进!
cpu与内存之间访问数据的大小是根据数据总线的宽度来决定的,现代的计算机数据总线的宽度是32位,也就是每次都能够从内存中读取32位的数据(即四个字节),但是为什么又出现了一个“内存访问粒度”这样一个概念呢???内存对齐指的是cpu访问内存中的数据在地址上有限制,那么指定字节对齐值对cpu访问数据的大小是不是同样也起作用呢????
搜索更多相关主题的帖子: 粒度 内存 数据线 访问 
2010-11-14 21:51
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:25 
CPU能从内存中读取一个四字节数据,是因为寄存器是32为吧?跟数据总线有什么联系?内存对齐,可以提高CPU效率。总是访问内存对齐的数据是最高效的方式。
2010-11-14 23:49
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:25 
对于概念性的问题不懂应该学会用搜索引擎。
http://tech.
这里相信能解决你的问题了。

离恨恰如春草,更行更远还生。
2010-11-15 15:42
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 3楼 玩出来的代码
你给的这篇帖子我看了,可是依然没有解决我的问题,可能是本人比较愚笨吧!!cpu访问内存中的数据是通过数据总线来访问的,也就是cpu每次取数据应该是32位的,因为数据总线的宽度是32位,所以每次取的数据应该是四个字节。如果是这样的话那么内存访问粒度又有什么用呢???难道我可以改变内存访问粒度吗???我在网上也找了一点资料,其中有个人自己总结了几点:
    1 cpu的内存访问颗粒度是不变的,而这个颗粒度的大小,就是编
    译器默认的对齐。

    2 为什么对于同一台机器,不同的变量对齐却是不同的呢?主要是
    一个折中(tradeoff)的问题。
    假设所有变量的对齐都是4,那么,当访问一个char变量时,编译器
    也要使该变量的地址按照4对齐,为了圆整,又要有三个字节的填充,
    这样做很明显内存的浪费是严重的。不同变量的对齐不同所带来的后
    果是:cpu在访问一个变量的时候,
    仍然一次读取4个字节
,然后做相应的移位操作,找到所需要的地址。
    很明显,效率降低了。

    3 对于double的8字节对齐,在32位机上,是由两次内存访问完成的。

    4 使用#pragma pack(n)改变编译器的默认值的目的,是为了节约内存,
    但这样做的代价就是效率的降低。

    5 凡是地址不是以4对齐的变量(在编译器默认对齐为4的机器上),比
    如short n; char c; 以及使用#pragma pack(1),从cpu的角度看,都
    是不对齐的变量(unaligned address),对于有的cpu,它会采取相应
    的处理,能够正确访问;但对于有的cpu(lazy processor),它会抛出一
    个异常,而对这个异常的处理,则是os的事情。

而在你给出的这篇帖子中却有这样的的描述同样如果'内存访问粒度'为1,CPU从地址1开始读取,也需要4次访问才能将4个字节读到寄存器中;而且对于这种理想中的''内存访问粒度'为1的CPU,所有地址都是'aligned address'........

如果按照这种说法的话那岂不是内存访问粒度改变了呀???可是为什么一个人说改变而另一个人说不改变???难道不让人糊涂吗???
因此众说纷纭谁对谁又错呢??

愿用余生致力编程
2010-11-16 11:07
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
内存访问粒度应该是针对特定的处理器来说的。不同的处理器就可能会有不同的内存访问粒度。
第二点没研究过不清楚,但对起后的数据即使是4字节也是使用单个cpu周期读取的,只是多个移位操作对性能影响应该不大。
这个可能能解释第三点了。
fldl 指令,将浮点数载入fpu寄存器栈中,一条指令就完成了

第五点在"Data alignment: Straighten up and fly right"这个文章中讲的比较多。另外在x86的处理器下cpu会自动处理未对起的数据,永远不会抛出异常。

详细的再看看那篇文章,应该会有收获的。

离恨恰如春草,更行更远还生。
2010-11-16 13:37
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 5楼 玩出来的代码
这个是我在上午的时候通过调式程序自己总结的一点点心得,不知道对不对,贴出来看看!!!

cpu与内存之间访问数据确实是32位,也就是数据线的宽度,即四个字节数!我开始的时候思维存在了一个误区,就是我误认为cpu直接从内存中取一个int类型的或者是一个char类型的数据,其实cpu并不是自己直接去内存中取一个int类型或者是一个char类型的数据,而是cpu从内存中得到存储这些数据的地址,然后通过地址来得到自己要想要的数据,数据总线向cpu传送的永远是一个地址值,而这个地址值就是32位的,所以每次cpu从内存中取数据总是32位的,但是这个数据只是一个地址值,并不代表一个int类型或者代表一个char类型的数据!!再次强调一点:只是一个地址值,不代表任何类型!!当cpu得到一个存储一个类型(比如int ,char ,short等等)数据的地址值的时候,然后通过byte ptr 或者是word ptr 或者是dword ptr 来告诉cpu应该从这个地址值开始的地方向后取多少字节的数据!字节对齐只是将某个类型的数据的位置设置为满足一个什么样的条件!!其目的就是为了节约内存,但是这样做却在效率下造成了一定的损失!


愿用余生致力编程
2010-11-16 14:28
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
呃,这个感觉不太对了,从内存取一个数不可能让cpu去两次访问内存的,这是对效率的无视,从内存取数据时先找到数据所在的地址,然后取数据。当然在内存中的数据是不能表示类型的,你可以用int 、unsigned、等告诉CPU怎样去解释数据。

而是cpu从内存中得到存储这些数据的地址,然后通过地址来得到自己要想要的数据,数据总线向cpu传送的永远是一个地址值,而这个地址值就是32位的,所以每次cpu从内存中取数据总是32位的,但是这个数据只是一个地址值,并不代表一个int类型或者代表一个char类型的数据!
这里所说的应该与指针相关了,用指针取数时才会间接访问内存,而对其他的内置类型来说若CPU总是取32位的数据未免显的有点笨戳了。
字节对齐按照编译器的默认对齐值是为了更高效的处理数据,自己设定的对齐值为节省内存,正如你所说。
这都有点牵扯到组成原理,微机原理的知识了。这东西不好说。

离恨恰如春草,更行更远还生。
2010-11-16 15:12
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 7楼 玩出来的代码
看了你推荐的那篇文章怎么越看越觉得写的垃圾呢??可能是我自己太垃圾了??也许吧!你推荐的那篇文章中说内存访问粒度是可变的,简直是在放屁的吧??内存访问粒度是不应该改变的,这是cpu本身的架构吧!!怎么能够改变呢?内存中的数据是按照块来存储的,也就是四个字节的大小。
我写出来的那个理解只是我的个人理解,现在觉得那个理解是错误的!!
内存访问粒度是不变的,也就是每次从内存中总是取四个字节的数据,如果不存在char与short类型的数据的话cpu每次都会取得想要的值,不用进行一个剔除就能够得到想要的,可是事实上是存在char类型与short类型的数据,这样cpu在取这两种类型的数据的时候就需要进行剔除了,因此在效率上就存在了一个损失,但是永远都不可能实现“利益”的最大化,虽然在效率上存在一定的损失,可是却节约了一部分的内存空间,字节对齐只是一个折中的方法,这种方法并不是十全十美的!!

凡是地址不是以4对齐的变量(在编译器默认对齐为4的机器上),比
如short n; char c; 以及使用#pragma pack(1),从cpu的角度看,都
是不对齐的变量(unaligned address),对于有的cpu,它会采取相应
的处理,能够正确访问;但对于有的cpu(lazy processor),它会抛出一
个异常,而对这个异常的处理,则是os的事情。

而你推荐的那篇文章好像讲解的不是对的,可能本人只是一个菜鸟吧,才疏学浅吧!!希望楼上可以给出更全面的解释!

愿用余生致力编程
2010-11-16 17:15
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
或许我在3楼给出的那个链接讲的不细致吧,但参考在IBM社区的文章我想也不至于说成垃圾。我在5楼已经给你说了,是看"Data alignment: Straighten up and fly right"这篇文章。http://www.
如果你认为这篇文章也是垃圾的话,那我也无从解释了。

离恨恰如春草,更行更远还生。
2010-11-16 20:15
快速回复:数据线与内存访问粒度的区别!!高手进!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022978 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved