首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞IO是如何实现的?

非阻塞IO是如何实现的?
EN

Stack Overflow用户
提问于 2012-05-11 00:47:43
回答 1查看 6.9K关注 0票数 18

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-11 00:51:26

在Windows上,底层操作系统支持非阻塞I/O,微软的CLR利用了这一点。其他CLR实现(mono)可能也是如此,但我不确定。在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在某个应用程序线程上开始异步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

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10538708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档