x86_64系统编程的一点体验~!

1正确的使用变量类型。在编程中碰到的一个整数乘法溢出问题,用了半天的时间才找到问题所在,用了一秒钟把错误改正过来。问题是这样的,首先用mmap()将一个37G大小的文件映射到程序的内存空间,之后用mmap()得到的起始地址和一个偏移量进行文件的定位,问题就出在偏移量的计算中,本偏移量是通过两个int类型的整数相乘得到的,当文件访问到足够大的位置时,会发生内存无效访问的错误。错误就在于两个整数(sizeof(int) = 4)在一定的情况下相乘可能发生溢出, 比如说两个大于0的相乘可以返回一个负的,所以内存访问可能就指向mmap()返回地址的前面去。这里的教训就是用足够大的类型去表示地址、文件偏移等;使用系统内定义的类型size_t, off_t, ptrdiff_t等,表达式中如果有不同类型的混合运算,一定要用类型强制转换以适应当前的计算需要。


2对大文件用mmap()进行文件的IO操作。64位系统的寻址空间非常大,对大文件来说,与其他IO操作相比,mmap()不仅提供简单的文件操作界面(直接读写内存),对IO的效率影响也很大,mmap()跳过块设备的高速缓存,直接通过系统的守护进程kswapd进行内存数据和磁盘文件数据的swap in/ swap out交换,相当于多了一个进程为程序工作。此外与传统的read/write系统IO函数相比,程序可以通过madvise()函数提示内核,以优化IO的效率,read/write很难做到这一点,还有就是对很大的文件来说,如果文件系统对大文件支持不是很好的话,传统IO函数在处理到接近文件尾端的时候,比起处理文件开始部分会有很大不同,因为此时文件的inode中可能要搜索很多的间接磁盘索引块,对于mmap()来说,kswapd在后台都已经做了这些工作,所以程序执行起来很流畅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值