【问题标题】:Does IO device (HDD like example) work without CPU?IO 设备(如 HDD 示例)是否可以在没有 CPU 的情况下工作?
【发布时间】:2024-04-17 03:40:02
【问题描述】:

当我异步执行 IO 操作时,我的应用程序线程不会被阻塞。

比如这个操作:

FileStream fs = new FileStream("...", ..., ..., ..., 4096, FileOptions.Asynchronous);
await fs.WriteAsync(bytes, 0, bytes.Length);

我知道,调用者线程将调用具有 OVERLAPPED 结构的 Write API。因此,当线程将 IRP 交给 IO 管理器时,他将被释放以进行其他工作。

但是,我找不到任何描述我需要的设备工作的信息。:

  1. 我想知道,当设备在我的异步 IO 操作上工作时,CPU 或某些线程是否与设备一起工作?

  2. 可能是某个线程或 CPU 控制设备执行?

  3. 或者,设备只需要一个命令,它应该执行并且设备可以在没有 CPU 和线程的情况下执行它?如果有人知道,请描述设备和 CPU 的交互。我想知道,什么时候设备不需要 CPU 和线程,如果那是真的。

谢谢

【问题讨论】:

    标签: c# .net windows file-io operating-system


    【解决方案1】:

    一旦 CPU 确定必须从存储中检索数据(即不位于操作系统管理的内存缓存中),它就基本上不参与现代硬件从磁盘到内存的数据传输。

    它提供有关所需磁盘部分的信息,并指定 RAM 中数据应该去往的地址。 CPU 外部的硬件然后使用直接内存访问 (DMA) 执行读取并将数据放入内存中。当内存可供读取时,底层硬件会向 CPU 发出信号。

    在 DMA 出现之前,CPU 通常参与(在某些情况下,100% 被占用)磁盘到内存的数据传输。

    【讨论】:

    • Eric,这意味着 Win API 级别的所有异步操作,例如使用硬盘或网卡,都需要设备使用 DMA?是否存在一些指标,该设备可以使用 DMA?如果 DMA 不可用,这意味着异步操作将需要线程或 CPU 才能与设备一起工作?
    • 我想不出任何插入到不支持 DMA 的现代系统总线的设备。至少从最初的 PC/XT 开始,它就已经存在了。在 DMA 之前,CPU 负责设备和内存之间的传输。如果今天有这样的设备(不可能),它必须以同样的方式工作。
    • 埃里克,感谢您提供的信息,它对我很有帮助。我还有几个问题。设备默认使用 DMA 还是需要一些标志来激活此模块?您是否知道逐点描述 cpu 和 hdd 工作的书籍(使用 DMA 和不使用 DMA)?喜欢: 1. 名为 ReadAPI 的程序 2. IO 管理器创建 IRP 包 3. IO 管理器选择设备 4. IRP 包排队到设备工作 5. CPU 设置读取 4. CPU 等待的第一个偏移字节。 5. CPU 首先将偏移字节传输到内存。 6. CPU 等待的第二个偏移字节。等等……非常感谢……
    • 专为 DMA 设计的设备始终使用它。由于我们谈论的是 1970 年代及更早的时期,因此我不知道有关非 DMA 设备的书籍。其他问题我无能为力。
    最近更新 更多