【问题标题】:How does Windows API readFile implemented?Windows API readFile 是如何实现的?
【发布时间】:2016-03-23 10:11:00
【问题描述】:

听说汇编语言读取文件有两种方式:一种是需要CPU在一个周期内重复查询磁盘读取完成状态;另一种方式是在磁盘读取完成时使用中断回调,并且在读取过程中不需要CPU。

我想知道的是:如果我使用 WinAPI readFile 从文件中读取大量数据(例如千兆字节),是否会占用大量 CPU 时间进行磁盘状态查询?

【问题讨论】:

  • Windows 绝对支持异步 I/O 模型,在等待主机控制器回复时不使用 CPU。如果您看到任何不同的东西,那一定是您系统的特定驱动程序非常糟糕。
  • 除非文件被压缩,否则解压会占用CPU时间。
  • “需要 CPU 反复查询磁盘读取完成状态” - 这听起来像是由不熟悉异步 I/O 编程的人制作的实现。也许你听错人了。

标签: winapi disk


【解决方案1】:

我认为 OP 指的是执行轮询的磁盘驱动程序与中断驱动的驱动程序之间的区别。

使用轮询的驱动程序几乎总是以尽可能低的优先级执行此操作 - 基本上与 Windows 的空闲线程具有相同的优先级。这些驱动程序也很少见。它们只适用于吞吐量比响应时间重要得多的系统。

虽然轮询驱动程序在负载较轻的系统上可能会占用大量 CPU 周期,但它不会占用更重要的任务(而且一切都会变得更重要)的时间。而且它对 CPU 的使用不会反映在 Taskmgr 等实用程序中。实际上,您可能不知道它使用了很多周期。

驱动程序用于确定 I/O 是否已完成的方法与应用程序是否使用 ReadFile 无关。应用程序对磁盘驱动程序的运行方式没有任何选择。如果应用程序需要访问驱动程序控制器磁盘上的文件,那么它必须(间接)使用该磁盘的驱动程序。

作为应用程序开发人员,您实际上有两个选择:ReadFile(几乎所有其他读取 API 最终都通过此 API)或内存映射 I/O。最好通过谷歌搜索并在 MSDN 上查找主题来了解两者之间的权衡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 2020-03-21
    • 2016-12-13
    • 2020-01-31
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多