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是对其的地址,值得注意的是,在施放空间时,要全部释放掉
目的:不使用操作系统缓冲,使得磁盘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是对其的地址,值得注意的是,在施放空间时,要全部释放掉
相关文章推荐
- springboot读取自己定义的配置文件的方式以及使用joda_time来处理时间日期
- 网上收集的以及自己总结的iOS开发技巧
- 很全面的ios面试题以及解答,很多答案不一定全对,网上摘录以及自己的理解
- 遍历目录以及目录下文件的函数- 从网上找的不过都用不了,自己用Emeditor修正了一下,2006-6-8-1
- ajax图片上传及时回显图片,自己总结 + ajaxFileUpload 上传文件 以及 返回值 带 <pre> 标签问题
- 很全面的ios面试题以及解答,很多答案不一定全对,网上摘录以及自己的理解
- 打开操作,以及如果没有默认格式,弹出打开方式让用户自己选择何种程序打开文件
- Weblogic配置jms服务文档,是自己总结网上搜集到的资料以及自己亲自动手配置测试的总结。
- QT 全局变量所遇见的问题,以及参考网上的解决方法,做个总结,提醒自己
- 异常解析家族应用点源码讲解:SpringMVC全局异常捕获及SpringMVC文件上传报错的优雅解决方式以及@Exception拦截异常注意点
- 常见的浏览器兼容性问题总结(有自己遇到的还有网上大神总结的)
- 【Struts2实现文件上传】struts2上传文件异常总结及解决方式
- 文本方式与二进制方式读写文件的windows区别总结
- 常用的Eclilpse插件列表以及安装方式总结
- 在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)
- Windows环境打开文件的方式总结
- C语言循环总结以及实例讲解
- 字符串的存储方式,以及sizeof()(字符数组,字符指针,Sizeof总结)
- IOS--工作总结--post上传文件(以流的方式上传)
- 爬取“好孩子”app的所有绘本、以及配套文件、音频(纯属自己娱乐)