Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5760575
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2008-12-10 11:23:34

实验需要对Flash Disk做无系统缓冲的I/O操作,顺便了解了一下Linux下的I/O.

Linux上的块设备的操作可以分为两类:

  • 第一类是使用C标准库中的fopen/fread/fwrite 系列的函数,我们可以称其为 buffered I/O。

具体的I/O path如下

Application<->Library Buffer<->Operation System Cache<->File System/Volume Manager<->Device

library buffer是标准库提供的用户空间的buffer,可以通过setvbuf改变其大小。

  • 第二类是使用Linux的系统调用的open/read/write 系列的函数,我们可以称其为 non-buffered I/O。

I/O Path

Application<-> Operation System Cache <->File System/Volume Manager<->Device

此外,我们可以通过设置open的O_DIRECT标志来实现Direct I/O(或者叫Raw I/O),即绕过OS Cache,直接读取Device ( that's what we want^o^ ), 等于将OS cache换成自己管理的cache。不过,Linus在邮件列表中建议不这么做,而是使用posix_fadvice, madvice。中表明Direct I/O比buffered I/O的性能高很多。

在使用O_DIRECT的注意buffer的address必须是block alignment的(i.e. 初始地址必须是boundary), 可以用posix_memalign()函数分配内存以得到这样的buffer。至于为什么要这样,与实现的mmap有关,参见.

参考:

  1. Linux: Accessing Files With O_DIRECT
  2. Andrea Arcangeli , O_DIRECT Whitepaper
  3. A Trip Down the Data Path: I/O and Performance
  4. Operating Systems System Calls and I/O
  5. Linux Device Drivers, 2nd Edition, Chapter 13 mmap and DMA
  6. http://lists.alioth.debian.org/pipermail/parted-devel/2007-July/thread.html#1855
  7. Read系统调用剖析, http://www.ibm.com/developerworks/cn/linux/l-cn-read/
阅读(1498) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~