内存对齐的原因调查

在读《c专家编程》的3.2.1关于结构:

struct pid_tag {

unsigned int inactive:1;

unsigned int :1; /*1位的填充*/

unsigned int refcount : 6;

unsigned int :0; /*填充到下一个子边界*/

short    pid_id;

}

很有意思,严格遵守了字对齐,字对齐的原因、用法在课堂也曾提到过,

用法为:

#pragma pack(n) /* n = 1, 2, 4, 8, 16 */

当内存存放没有对齐的时候会影响机器性能,一直都记着这句话,却知其然不知其所以然,今天偶然翻看《计算机组成与设计硬件/软件接口》(强烈推荐,没有系统学过计算机课程,这本书作为计算机组成原理看最好了)才算是对其中原理有了点了解,记录下来,防备以后忘了。

 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。

更为严重的是,所影响到的并不仅仅是一个读周期,MIPS对内存的操作仅出现在存取操作中,这一限制意味着可以在指令执行级计算内存地址,在下一个步骤访问内存。在流水线操作中,内存没有对齐,将出现一条数据传输指令需要两次内存访问的情况,所请求的数据不能在单个流水线步骤内完成在处理器和内存之间的传输。这时候流水线将发生数据冒险:一个操作必须等待另一个操作完成后才能进行,流水线必须停顿!这才是造成性能下降的主要因素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章