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

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是对其的地址,值得注意的是,在施放空间时,要全部释放掉
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭