您的位置:首页 > 运维架构 > Linux

DirectIO方式读写文件(总结网上其他人的讲解以及本人自己的一定见解)

2011-10-14 17:06 357 查看
DMA:Direct Memory Access。

目的:不使用操作系统缓冲,使得磁盘IO(或者DMA)直接将数据存入用户空间的buffer。避免内核缓冲的内存消耗与CPU拷贝(数据从内核空间到用户空间的拷贝)的消耗。

技术解释:

DirectIO使用场景:DirectIO要读取大文件,因为每次都要初始化DMA;如果是读取小文件,初始化DMA花费的时间比系统读小文件的时间还长,所以小文件使用directIO没有优势。对于大文件也只是在只读一次,并且后续没有其他应用再次读取此文件的时候,才能有优势,如果后续还有其他应用需要使用,这个时候DirectIO也没有优势。

direct实际上有几方面的优势,不使用系统缓存一方面,另一方面是使用dma直接由dma控制从内存输入到用户空间的buffer中不经过cpu做mov操作,不消耗cpu。

参看网页:
http://topic.csdn.net/u/20080806/10/cdb1faa1-0146-4e96-8b12-26ba60acdbb5.html http://blog.csdn.net/nmzrl/article/details/1554772
代码例子:

DirectIO方式读写文件,只需在打开文件时选上O_DIRECT选项就行,但必须在所有的include前加上#define _GNU_SOURCE,另外以DirectIO方式读写时,开辟的Buffer必须是系统每页大小的整数倍而且必须移页大小为标准对齐,例如linux2.6下每页是4096byt(函数getpagesize()),申请的buffer大小只能是4096的整数倍

例子:

(test.c)

#define _GNU_SOURCE

#define BUFFER_SIZE 8192

Int fd = open(“testfile”, O_CREAT | O_RDWR | O_DIRECT);

int pagesize=getpagesize();

char* realbuff=malloc(BUFFER_SIZE+pagesize);

int pagesize=getpagesize();

     char*alignedbuff=(char*)((((inunsigned) realbuff+pagesize-1)/pagesize)*pagesize);

     write(fd, alignedbuff, BUFFER_SIZE);

free(realbuff);

申请的地址realbuff没有对其,经过下面的俩行操作后,alignedbuff是对其的地址,值得注意的是,在施放空间时,要全部释放掉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐