设备通讯(1)----缓冲区方式(DO_BUFFERED_IO)

驱动的AddDevice中,若做了如下设置:fdo->Flags |= DO_BUFFERED_IO ,则意味着指定该设备为缓冲区方式工作。

以ReadFile和WriteFile为例,下面看看这种方式究竟是如何工作的,先看一个概要图,

对着图来说明比较容易:


1:上层程序创建用户缓冲区,然后调用ReadFile/WriteFile 对设备进行读写操作

2:I/O管理器将会发起主功能号为IRP_MJ_READ或IRP_MJ_WRITE的IRP

3:I/O管理器将创建一个与用户模式缓冲区大小相等的系统缓冲区

4:系统缓冲区的地址为: Irp->AssociatedIrp.SystemBuffer,长度和偏移量分别为:IO_STACK_LOCATION->Parameters->Read(或Write)->Length,

      IO_STACK_LOCATION->Parameters->Read(或Write)->ByteOffset

5:驱动程序对该系统缓冲区进行读写操作,I/O管理器会自动完成系统缓冲区和用户缓冲区之间的数据拷贝。


优点:数据复制,内核模式下的缓冲区都是由系统管理,使用方便。

缺点:数据拷贝增加了系统开销,适合小数据量读写时使用。


注:原创文章,用于学习和交流,转载请注明出处点击打开链接,谢谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以使用BufferedInputStream和BufferedOutputStream来进行带有缓冲区的输入输出操作。这两个类的构造方法都提供了一个可以设置缓冲区大小的参数。以下是一个简单的示例代码: ```java import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedExample { public static void main(String[] args) throws IOException { String sourceFile = "source.txt"; String targetFile = "target.txt"; int bufferSize = 8192; // 设置缓冲区大小为8KB FileInputStream fileInputStream = new FileInputStream(sourceFile); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, bufferSize); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, bufferSize); byte[] buffer = new byte[bufferSize]; int len; while ((len = bufferedInputStream.read(buffer)) != -1) { bufferedOutputStream.write(buffer, 0, len); } bufferedOutputStream.flush(); bufferedInputStream.close(); bufferedOutputStream.close(); } } ``` 在上面的示例中,我们通过BufferedInputStream和BufferedOutputStream来进行带有缓冲区的输入输出操作,并通过构造方法设置了一个缓冲区大小为8KB。在读取数据时,我们使用了一个byte数组来存储读取到的数据,并使用bufferedInputStream.read(buffer)方法来读取数据。在写入数据时,我们使用了bufferedOutputStream.write(buffer, 0, len)方法来写入数据,其中len表示实际读取到的数据长度。最后,我们使用bufferedOutputStream.flush()方法来将缓冲区中的数据写入目标文件中,并关闭流。 需要注意的是,在实际使用中,我们应该根据实际情况来设置缓冲区大小,通常情况下,缓冲区大小应该越大越好,但是过大的缓冲区也可能会导致性能下降。因此,我们可以通过多次测试来找到最佳的缓冲区大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值