繁体   English   中英

如何实现非阻塞IO?

[英]How is Non-Blocking IO implemented?

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

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

我想知道它们是如何实施的。 如果我在场景后面创建非阻塞IO,那么Java或C#是否只为它们创建了后台线程? 或OS底层有本机支持吗?

在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. 我确信我错了一部分,但我相信它的整体要点是正确的。 埃里克或某人可以进来纠正我在哪里。

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

对于Java,我确信它取决于JVM实现和特定的操作系统。 我不太清楚,除此之外,我还不太清楚。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM