如何实现非阻塞 IO?
2022-09-02 21:51:53
在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 操作完成的线程(或至少是托管线程)之间没有 1 对 1 的关联。
有关 Win32 层详细信息的详细信息,请参阅 http://msdn.microsoft.com/en/library/windows/desktop/aa365683(v=vs.85).aspx。有关 I/O 完成端口的信息也请点击此处:http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
我的理解是这样的:
上述注意事项:
我确信我弄错了一部分,但我相信它的整体要点是正确的。埃里克或某人可以进来纠正我离开的地方。
在 .NET 中,有多个 I/O 完成端口线程。我不知道异步 I/O 请求是如何在各种 I/O 完成端口之间分配的。这可能是一种操作系统功能(其中 I/O 可能会在应用程序已打开的任何端口上恢复)。
对于Java,我相信这取决于JVM实现和特定的操作系统。我对它知之甚少,无法推测超出此范围。
编辑:历史更新,更多细节在这里