如何实现非阻塞 IO

本文关键字:IO 实现 何实现 | 更新日期: 2023-09-27 18:33:43

在Java或C#或其他一些语言中,有非阻塞IO工具,例如套接字。

所以我可以将我的回调函数提供给非阻塞 IO,

一旦非阻塞 IO 收到任何内容,它就会调用我的回调。

我想知道它们是如何实施的。如果我在后台创建非阻塞 IO,Java 或 C# 是否只是为它们创建后台线程?或者操作系统底层对它们有本机支持?

如何实现非阻塞 IO

在Windows上,底层操作系统支持非阻塞I/O,Microsoft的CLR利用了这一点。 其他CLR实现(单声道(可能也可以,但我不确定。 在 Microsoft CLR 上执行异步 I/O 时,挂起的异步 I/O 操作与等待这些 I/O 操作完成的线程(或至少是托管线程(之间不存在一对一的关联。

有关 Win32 层详细信息的一些详细信息,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85(.aspx。 还有关于 I/O 完成端口的信息:http://msdn.microsoft.com/en-us/library/aa365198(VS.85(.aspx

我的理解是这样的:

  1. 我在某个应用程序线程上开始异步 I/O 操作。
  2. 如果还没有,将创建一个队列(嗯,实际上是一个称为 I/O 完成端口的内核级构造,它与我的应用程序的内核空间中的队列相关联(。 在 .NET 世界中,称为 I/O 完成端口线程的特别指定的线程将开始等待该队列上的 I/O 完成通知。 这里要注意的重要一点是,我可以发出任意数量的异步 I/O 请求,而无需增加 I/O 完成端口的数量。
  3. 当 I/O 完成时,OS 将通过在队列上排队 I/O 完成消息来通知应用程序。 然后,I/O 完成端口线程将通过在我的 .NET 应用程序中调用 I/O 完成回调来处理该消息。 同时,如果其他 I/O 完成,其结果将排在当前处理结果后面。

上述注意事项:

  1. 确信我错了一部分,但我相信它的整体要点是正确的。 埃里克或其他人可以进来纠正我离开的地方。

  2. 在 .NET 中,有多个 I/O 完成端口线程。 我不知道如何在各种 I/O 完成端口之间分配异步 I/O 请求。 这可能是操作系统功能(其中 I/O 可能会在应用程序打开的任何端口上恢复(。

对于Java,我确信这取决于JVM实现和特定的操作系统。 我对此还不够了解,无法推测除此之外。

编辑:历史更新,更多细节在这里