问题标签 [io-completion-ports]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1031 浏览

windows - 做 I/O 完成端口时是否需要在 OVERLAPPED 结构上设置 hEvent?

我在 Windows 上使用 I/O 完成端口进行串行端口通信(我们可能会大量使用串行端口)。我已经完成了通常的操作,创建了 IOCP,启动了 I/O 线程,并将我的CreateFile()句柄与 IOCP 相关联(CreateFile()用 调用FILE_FLAG_OVERLAPPED)。这一切都很好。我已将COMMTIMEOUTSall 设置为 0,除了ReadIntervalTimeout设置为MAXDWORD完全异步。

在我的 I/O 线程中,我注意到GetQueuedCompletionStatus()无限期地阻塞。我正在使用INFINITE超时。因此,我在将ReadFile()句柄与 IOCP 关联后立即拨打电话。现在GetQueuedCompletionStatus()由于某种原因导致立即释放,传输了 0 个字节,但没有错误(它返回 true,GetLastError() 报告 0)。如果它无事可做,我显然希望它阻止。如果我ReadFile()在 GetQueuedCompletionStatus() 之后放置另一个,那么池中的另一个线程将在传输 0 字节且没有错误的情况下拾取它。

在我看到和遵循的示例中,我没有看到任何人在使用 IOCP 时设置hEvent结构OVERLAPPED。那有必要吗?我不在乎阻塞 IOCP 线程——所以我永远不会对CreateEvent(...) | 1.

如果没有必要,可能导致问题的原因是什么?GetQueuedCompletionStatus()需要阻塞,直到数据到达串行端口。

有没有好的 IOCP 串口示例?我还没有找到完整的串行端口+ IOCP 示例。它们中的大多数是用于套接字的。理论上,它应该适用于串口、文件、套接字等。

0 投票
3 回答
1767 浏览

asynchronous - Mac OS X 的 IO 完成端口

Mac OS X 上是否有任何等效的 IO 完成端口用于在文件上实现异步 IO....

谢谢....

0 投票
1 回答
61 浏览

synchronization - 关于 I/O 中的同步访问 Works in I/O Completion

假设有 4 个 I/O worker 在使用对应于处理器数量的 I/O Completion Port,它们之间是否需要对客户端上下文进行同步访问?

这里的客户端上下文是指通过 I/O CompletionKey 传递的内容。问题可能是,如果工作人员 A 已将 I/O 发布到带有上下文的 I/O 完成队列,但现在正在更改上下文。被唤醒处理 I/O 的 Worker B 正在同时读取上下文。会发生什么?

0 投票
2 回答
4853 浏览

c - 在 Windows 上学习 IOCP 的资源

我最近在 Windows 上意识到了这个叫做 IOCP 的东西,我开始搜索关于它的更多信息,但我找不到任何最新的东西(大多数例子都是在将近 5 年前的 codeproject 上)并且没有太多的指南或教程。任何人都可以以在线教程或示例项目(您编写并可以分享或其他开源项目)的形式推荐任何关于它的最新资源,甚至是一本关于它的书,因为如果它和听起来一样好,我打算使用它广泛,所以我会投资它。

谢谢你。

0 投票
3 回答
2597 浏览

c++ - Winsock:重叠的 AcceptEx 表示新连接,而没有客户端连接

在我的程序中,我使用 的重叠版本AcceptEx()来接受新的连接。在接受新连接后,程序会发起另一个重叠调用以AcceptEx()接受更多连接。这工作正常,我可以成功地将多个客户端连接到服务器。

但是,如果我只连接一个客户端并让服务器应用程序在此套接字上调用 WSARecv(重叠), AcceptEx()则会神奇地接受一个新的“幽灵”连接(第一个客户端什么都不做)。当然,当我调用WSARecv它时 - 它给出了一个错误。

该程序为所有重叠调用合并了一个I/O 完成端口。

我不知道假连接来自哪里。但这似乎是我无法找到的代码中的错误。

我可以明确排除的错误原因:1.我使用的重叠结构和铸造参数正确。2. IOCP 包装类

以下是相关代码(在我看来) - 如果您需要更多,请告诉我:)

编辑:写了一个工作得很好的测试服务器

0 投票
0 回答
981 浏览

windows - 为什么 I/O 完成端口中有 CompletionKey?

MSDN 关于CreateIoCompletionPort函数中的 CompletionKey 的评论:

使用 CompletionKey 参数帮助您的应用程序跟踪哪些 I/O 操作已完成。CreateIoCompletionPort 不使用此值进行功能控制;相反,它在与 I/O 完成端口关联时附加到 FileHandle 参数中指定的文件句柄。这个完成键对于每个文件句柄应该是唯一的,并且在整个内部完成排队过程中伴随文件句柄。当完成数据包到达时,它在 GetQueuedCompletionStatus 函数调用中返回。PostQueuedCompletionStatus 函数还使用 CompletionKey 参数来对您自己的专用完成数据包进行排队。

上面的评论给我留下了一个问题。为什么要使用 CompletionKey ,因为我们可以将用户上下文与文件句柄以扩展的重叠结构关联起来,如下所示:

并在完成后通过 CONTAINING_RECORD 宏检索?

酷,我只相信 CompletionKey 是每个句柄上下文,而扩展重叠结构是每个 I/O 一个。但是这种设计背后的理念是什么?在什么情况下,就用户上下文而言,有必要使用 CompletionKey 而不是扩展的重叠结构?

0 投票
2 回答
2063 浏览

sockets - GetQueuedCompletionStatus 永远阻塞

我正在编写一个服务器应用程序并且我想使用 IOCompletion 端口,所以我为服务器编写了一个原型,但是我遇到了 GetQueuedCompletionStatus 的问题,它永远不会返回(它阻塞)。下面是我的代码:

任何想法?提前致谢。

0 投票
1 回答
816 浏览

windows - 没有 ConnectEx 的 Windows 上的非阻塞套接字连接

我需要在单个进程中启动 1000 个客户端连接,我需要解决的关键限制是驱动程序不支持 ConnectEx,因此我无法拥有纯 IOCP 解决方案。

我的第一个想法是处理连接的线程池,其中每个句柄可以使用普通的连接/选择语义处理多达 64 个连接,一旦连接就继续使用 IOCP。但这行不通;一旦选择运行,我就不能向 FD_SET 添加另一个套接字。所以我必须将套接字设置为非阻塞并轮询它们。
最好的解决方案可能是最简单的;每个线程一个连接客户端。假设我可以保持合理的连接率,池中的线程数可能会很小。

这是一个奇怪的情况,理想情况下,驱动程序会支持 ConnectEx,但它(目前)不支持,我需要以最好的方式解决它。

还有其他方法吗?

0 投票
2 回答
467 浏览

asp.net - 将多个 HTTP 请求等待同一个 I/O 完成端口

我的应用程序从 Web 服务和“Application_Start”异步加载大量信息。

如果用户请求想要使用该信息,并且它还没有准备好,则线程将被 Monitor.Wait 阻塞。当信息准备好后,缓存对象会Monitor.Pulse所有等待的线程。这应该没问题,因为信息需要十几秒钟,并且必须将用户重定向到登录页面,发布登录信息,然后再次重定向。

问题是 Monitor.Wait 会阻塞 CLR ThreadPool 线程,据我所知,如果有大量请求到达要求“大信息”,应用程序可能会被 CLR ThreadPool 饥饿阻塞(我有点乱与当前的 IIS/ASP.NET 线程门控)。

由于大部分信息来自我异步调用的 Web 服务,因此我拥有该操作的 IAsyncResult。

那么,有没有办法告诉 CLR ThreadPool 线程“等待这个 IOCP”,以便线程池线程可以开始参加其他调用?

我觉得这没有得到很好的解释,如果不清楚我在问什么,请告诉我。

问候。

PS:虽然赏金已经结束,但如果有人知道如何做到这一点,我会提出一个新的并授予作者。

0 投票
3 回答
10843 浏览

c# - .NET 套接字与 C++ 套接字的高性能

我的问题是与我的同事就 C++ 与 C# 解决争论。

我们已经实现了一个接收大量 UDP 流的服务器。该服务器是用 C++ 开发的,使用异步套接字并使用完成端口重叠 I/O。我们使用 5 个完成端口和 5 个线程。该服务器可以轻松处理千兆网络上的 500 Mbps 吞吐量,而不会丢失任何数据包/错误(我们的测试没有超过 500 Mbps)。

我们尝试在 C# 中重新实现相同类型的服务器,但我们无法达到相同的传入吞吐量。我们使用异步接收 usingReceiveAsync方法和池SocketAsyncEventArgs来避免为每个接收调用创建新对象的开销。每个SAEventArgs都设置了一个缓冲区,因此我们不需要为每个接收分配内存。池非常非常大,所以我们可以排队超过 100 个接收请求。此服务器无法处理超过 240 Mbps 的传入吞吐量。超过这个限制,我们会在 UDP 流中丢失一些数据包。

我的问题是:我应该期望使用 C++ 套接字和 C# 套接字具有相同的性能吗?我的观点是,如果在 .NET 中正确管理内存,它应该具有相同的性能。

附带问题:有人会知道一篇很好的文章/参考资料来解释 .NET 套接字如何在后台使用 I/O 完成端口吗?