一个IO传奇的一生-1

http://alanwu.blog.51cto.com/3652632/1286553

前言

前几天同事提议写一篇文章来仔细分析一下一个IO从创建到消亡的整个过程,我觉得这个想法很好,一个IO从创建到消亡经历了千山万水,从软件到硬件涉及到很多很多的技术。一个看似简单的IO读写操作,其实汇集了从计算机软件技术、硬件技术、电子技术、信号处理等各个方面的内容。所以,我想把IO的一生通过自己的认识把他描述一下,让世人看清在执行一个简单的DMA内存,初始化DMA控制器,并且启动DMA操作,将2KB数据传输至内存。并且当DMA完成操作之后,会对CPU产生一个中断。板卡的设备驱动程序在接收到这个中断请求之后,面临一个重要的问题:如何将内核空间DMA过来的数据传输给用户空间?通常有两种方法:一种是直接将内核内存映射给用户程序;另一种是进行数据拷贝的方式。对于PCI数据采集卡而言,一个很重要的特性是实时数据采集,在板卡硬件FIFO很小的情况下,如果主机端的数据传输、处理耗费太多的时间,那么整条IO流水线将无法运转,导致FIFO溢出,数据采集出现漏点的情况。所以,为了避免这样的情况,在这些很严格应用的场合只能采用内存映射的方法,从而实现数据在操作系统层面的零拷贝。在Linux中,我们可以采用memory map的方法将内核空间内存映射给用户程序,从而实现用户程序对内核内存的直接访问。在Windows操作系统中,这种内核空间和用户空间的数据交互方式定义成两种:Map IODirect IOMap IO就是采用内存拷贝的方式,Direct IO就是采用MDL内存映射的方式。在编写WDM Windows设备驱动程序的时候经常会用到这两种数据传输模式。值得注意的是,Windows中的Direct IOLinux中的Direct IO是完全不同的两个概念。在LinuxDirect IO是指写穿page cache的一种IO方法。

第二个问题是异步IO和同步IO的问题。对于普通文件而言,为了提高效率,通常会采用page cache对文件数据在内存进行缓存。Cache虽然提高了效率,但是有些应用一旦发出写请求,并且执行完毕之后,其期望是将数据写入磁盘,而不是内存。例如,有些应用会有一些元数据操作,在元数据操作的过程中,通常期望将数据直接刷新至磁盘,而不是Cache在内存。这就提出了同步IO的需求。为了达到这个效果,可以在打开文件的时候设置O_SYNC标记。当数据在page cache中聚合之后,如果发现O_SYNC标记被设置,那么就会将page cache中的数据强制的刷新到磁盘。对于EXT3文件系统,该过程在ext3_file_write函数中实现。

第三个问题是普通文件的cache问题。对于普通文件,由于磁盘性能比较低,为了提高读写性能,通常会采用内存作为磁盘的cache。文件系统会采用预读等机制对文件读写性能进行优化,避免磁盘随机IO性能过低对文件读写性能造成影响。但是,page cache虽然提高了性能,但是也会对文件系统的可靠性造成一定影响。例如,当数据已经被写入内存之后,系统Crash,内存中的磁盘数据将会遭到破坏。为了避免这种情况,Linux文件系统提供了Direct IOIO方式。该方式就是让一次IO过程绕过page cache机制,直接将文件内容刷新到磁盘。与上面的同步IO相比,Direct IO达到的效果似乎有点类似。其实,同步IO是一种write throughCache机制,而Direct IO是完全把Cache抛弃了。同步IO的数据在内存还是有镜像的,而Direct IO是没有的,这是两者的区别。在Linux中的__generic_file_aio_write_nolock函数中,会判断O_DIRECT标记是否被设置,如果该标记被设置,那么调用generic_file_direct_write函数完成数据磁盘写入过程。如果该标记不存在,那么调用generic_file_buffered_write函数将数据写入page cache

 

本文出自 “存储之道” 博客,转载请与作者联系!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值