数据存储机制研究.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据存储机制研究 1 usb存储方式分类 主要器和子集描述了写入计算机内存的磁盘顺序。Big endian存储方式下字的高位字节存储在内存的低地址,Little endian存储方式下字的高位字节存储在内存的高地址。比如说0x1234这个2字节的数,Big endian方式下在内存中存储为图1,little endian方式下在内存中存储为图2。 网络中数据流以big endian方式传输,所以到达本地计算机时或本地计算机向网络传输数据时要经过转换。在C语言下通常可以用htons(),htonl(),ntohs(),ntohl()这四个函数进行数据转换。 2 缺省对流的实现 在编写程序时我们要访问的数据是随机的,可能是一个或几个字节,也可能是数据中的某些位,即使访问的数据宽度等于数据类型长度,这个数据的起始地址也不一定是数据类型长度的整数倍。这样CPU访问内存中的数据就存在着一个数据对齐的问题。 假设要访问的数据类型字节数是n,而访问的字节地址是p,如果p mod n=0,那么对该数据的此次访问是对齐的。在不对齐的存储器访问中,计算机要重新将字节数对齐,这要比对齐的存储器访问增加不少访问时间。结构(structure)缺省对齐是按照结构中成员变量要求的最大对齐来进行对齐,比如说一个结构中有一个char和int类型的变量,那么就按照int类型变量的4字节进行对齐。表1是常用数据类型在内存中的存储大小和对齐方式。 Sun和ibm平台机器在缺省情况下要求数据访问必须遵循数据对齐,违背数据对齐访问原则将会导致bus error。而INTEL x86的PC不要求必须遵循数据对齐。下面以两个例子来说明这个问题。 例2.1在一般INTELx86的PC上可正常执行,但是在一些Sun或IBM工作站上,虽然compile可以通过,但是在执行时会有bus error。出现bus error的原因是sun工作站上long数据类型的缺省对齐是4字节,而data+1地址不一定是4的整数倍。解决这个问题的方法是当需要进行类型强制时改用内存复制。例2.1可以改为: 这样修改后,程序在所有平台上都能顺利运行。例2.1中出现的问题在编写跨平台软件时经常出现,有的程序在intel平台上运行没有问题,但是移植到sun sparc或ibm平台上就出现bus error等内存错误。注意不同平台中数据对齐方式的区别,并在出错时采用例2.1中的解决办法就可以解决这个问题。 3 性能现状及建议的内容在高效 C语言中的struct类型在缺省情况下,C编译器为struct类型中每一个变量或是数据单元按其自然对界条件分配空间。可以使用编译器指令改变结构中变量的对齐。下面以结构test为例分别在sun sparc平台和Intel x86平台说明这个问题。 图3,图4分别为struct test在缺省对齐下与紧凑对齐下在内存中的存储情况。(单位:位) 下面两个例程说明了缺省对齐和紧凑对齐的区别。 例程1:自然对齐下结构的存储方式。 在sun平台上出现bus error的原因在前面已经提过,因为struct test的缺省对齐是4字节,而p+1地址不是4字节的整数倍。Sun和ibm平台要求数据访问必须对齐,所以出现bus error。而Intel x86平台不要求数据访问必须对齐。 例程2:紧凑对齐下结构的存储方式。 VC6.0编译器#pragma指令以及gcc编译器的__attribute__((__packed__))指令将缺省对齐改为紧凑对齐。注意k-stest3的值在缺省对齐方式下与紧凑对齐方式下的区别。 同时需要注意的是K-ltest1的值在Intel平台上由于是little endian,于是得到的如果在sun sparc平台big endian方式下会得这两个例程非常清楚地说明了结构的对齐方式以及little endian和big endian这两种不同的存储方式区别。 4 位顺序错误的处理 little endian和big endian定义了超过一个字节的变量中的字节顺序,一个字节内部同样存在位(bit)顺序的问题。在写系统程序或进行网络编程时,经常需要对数据流中某些位进行访问,不同计算机平台字节中位(bit)的顺序是不同的。 Sun的sparc工作站,服务器和ibm的小型机上,位顺序是数据中高位在低位地址。比如0x12在字节中Intel x86平台上,位顺序是数据中低位在高位地址。比如0x12在字节中从这个例子可以看出操纵字节中的某些位(bit)时需要注意位在字节中的位置可能随平台发生变化。 位段是以位为单位定义结构体类型中的成员长度的一种特殊结构体。它提供了一种快速访问数据流中特定位的

文档评论(0)

134****3501 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档