【问题标题】:How to understand asynchronous io in Windows?如何理解 Windows 中的异步 io?
【发布时间】:2010-10-20 02:07:49
【问题描述】:

1.如何理解Windows中的异步io??

2.如果我使用异步 io 向文件写入/读取内容:

WriteFile();
ReadFile();
WriteFile();

操作系统会生成多少线程来完成这些任务?

这 3 个任务是否同时以多线程方式运行 还是以不同的顺序依次运行?

3.我可以使用多线程并在每个线程中使用异步io吗 读还是写同一个文件?

【问题讨论】:

  • 你指的是哪个操作系统?

标签: windows multithreading operating-system filesystems io


【解决方案1】:

我想这取决于您使用的操作系统。但无论如何您不必担心这一点,它是透明的,不应该影响您编写代码的方式。

【讨论】:

    【解决方案2】:

    如果您在 windows 中使用标准读写,则不必担心系统可能不会立即写入,除非您在命令行上写入并等待用户键入一些输入。操作系统负责确保您写入的内容最终会写入硬盘驱动器,并且会做得更好。

    如果您正在处理一些奇怪的异步 io,请重新格式化您的问题。

    【讨论】:

      【解决方案3】:

      对于您的问题:

      操作系统生成多少线程 完成这些任务?

      取决于您是否使用 Windows 池、iocp 等。通常由您决定。

      这 3 个任务是否同时运行并且 以多线程方式或运行一个 接二连三只是与不同 订购?

      这取决于您的架构。在单核机器上,3个任务一个接一个地运行,顺序由os决定。在多核机器上,它们可能一起运行,具体取决于操作系统如何调度线程。

      3.我可以使用多线程并在每个线程中使用异步io来读取吗 还是写同一个文件?

      我不知道,所以需要其他人来回答。

      我建议获取一份 Windows via C/C++ 的副本,因为其中有很大一章是关于异步 IO 的。

      【讨论】:

      • @Blank..:这两个线程是用来处理写/读任务还是在写/读任务结束时处理入队队列中的条目?
      • 我相信这个答案完全偏离目标。内核中的线程数与 IO 无关,你知道的可能有一个。
      • 我在哪里提到内核?我只是说操作系统调度线程。根据此页面(msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx),它们似乎会连续运行,因为它没有说明会有多少内核进程,但按什么顺序取决于时间表 - 这就是我在回答中所说的。
      • 这是错误的 - 底层数据传输是顺序发生还是并行发生取决于磁盘硬件,在 CPU 上,并且操作的其他部分通常完成与 CPU 无关。磁盘 I/O 没有传递给内核线程进行处理。相反,数据传输通常是通过 DMA 进行的,并且中断由当时恰好正在运行的任何线程处理。
      【解决方案4】:

      1.如何理解Windows中的异步io??

      阅读 Win32 文档。在网上搜索。不要期望在 SO 中回答如此大而广泛的问题。

      2.如果我使用异步 io 向文件写入/读取内容:

      WriteFile(); 读取文件(); 写入文件();

      操作系统会生成多少线程来完成这些任务?

      我认为不会。它将重新使用现有的线程上下文来执行内核函数调用。基本上,操作系统会安排工作并借用一个线程来完成它——这很好,因为内核上下文总是相同的。

      3.我可以使用多线程并在每个线程中使用异步io来读取或写入吗 同一个文件?

      我相信是的,是的。我不知道执行顺序是否保证与提交顺序一致,在这种情况下,如果您在相同的字节范围上发出并发读/写,您将获得不可预知的结果。

      【讨论】:

        【解决方案5】:

        我建议寻找 Jeffery Richter 关于 Win32 编程的书籍。对于这类事情,它们是写得非常好的指南。 我认为他有一本关于 C# 的新书,所以请注意不要买错了。

        【讨论】:

          猜你喜欢
          • 2013-01-30
          • 1970-01-01
          • 2014-07-08
          • 2010-10-10
          • 1970-01-01
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多