在 Java 或 C# 或其他一些语言中,有非阻塞 IO 工具,例如用于套接字。
所以我可以将我的回调函数提供给非阻塞 IO,一旦非阻塞 IO 接收到任何东西,它就会调用我的回调。
我想知道它们是如何实现的。如果我在幕后创建非阻塞 IO,Java 或 C# 是否只是为它们创建后台线程?或者底层的操作系统对它们有原生支持?
在 Java 或 C# 或其他一些语言中,有非阻塞 IO 工具,例如用于套接字。
所以我可以将我的回调函数提供给非阻塞 IO,一旦非阻塞 IO 接收到任何东西,它就会调用我的回调。
我想知道它们是如何实现的。如果我在幕后创建非阻塞 IO,Java 或 C# 是否只是为它们创建后台线程?或者底层的操作系统对它们有原生支持?
在 Windows 上,底层操作系统支持非阻塞 I/O,微软的 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
我的理解是这样的:
上述注意事项:
我确信我错了一部分,但我相信它的整体要点是正确的。Eric 或其他人可以进来纠正我的错误。
在 .NET 中有多个 I/O 完成端口线程。我不知道如何在各种 I/O 完成端口之间分配异步 I/O 请求。这可能是一个操作系统特性(其中 I/O 可能会在应用程序打开的任何端口上返回)。
对于 Java,我确信它取决于 JVM 实现和特定的操作系统。我对它的了解几乎不足以推测除此之外。
编辑:历史更新,这里有更多细节