【问题标题】:How is Non-Blocking IO implemented?Non-Blocking IO是如何实现的?
【发布时间】:2012-05-10 16:47:42
【问题描述】:

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

所以我可以将我的回调函数提供给非阻塞 IO,一旦非阻塞 IO 接收到任何东西,它就会调用我的回调。

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

【问题讨论】:

  • 在此查看备注:msdn.microsoft.com/en-us/library/dxkwh6zw.aspx。它似乎使用了一个后台线程,如果重复使用相同的上下文,它会被缓存。
  • @mellamokb 它说执行上下文被缓存和重用,它没有说明线程的任何内容。

标签: c# java sockets nonblocking


【解决方案1】:

在 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 完成时,操作系统将通过将 I/O 完成消息排入队列来通知应用程序。然后,I/O 完成端口线程将通过在我的 .NET 应用程序中调用 I/O 完成回调来处理该消息。同时,如果其他 I/O 完成,其结果将排在当前处理结果的后面。

以上注意事项:

  1. 我确信我理解了其中的一部分错误,但我相信它的整体要点是正确的。 Eric 或其他人可以进来纠正我的错误。

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

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

编辑:历史更新,更多细节here

【讨论】:

  • For C# there is underlying OS support... 是什么意思。操作系统不知道 .NET 在其上运行,理论上 .NET 可以在 Windows 和 Linux 上运行(通过单声道)。
  • 请写的更详细
  • 这里,为你添加了更多细节,Jack。可能有些地方有点不对劲,但我认为总的来说我的理解是正确的。
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 2014-05-14
  • 2011-09-27
  • 2014-12-03
相关资源
最近更新 更多