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

86 篇文章 1 订阅
69 篇文章 1 订阅
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是对其的地址,值得注意的是,在施放空间时,要全部释放掉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值