问题标签 [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.
winapi - Win32 重叠 I/O - 完成例程或 WaitForMultipleObjects?
我想知道哪种方法更快,为什么?
在编写 Win32 服务器时,我已经阅读了很多关于 Completion Ports 和 Overlapped I/O 的内容,但我没有阅读任何内容来建议哪组 API 在服务器中产生最佳结果。
我应该使用完成例程,还是应该使用 WaitForMultipleObjects API,为什么?
windows - 什么时候发送 IO 完成端口数据包,什么时候不发送?
我目前正在使用 IO 完成端口研究基于命名管道的 IPC 机制。
不幸的是,我在使用 msdn 文档时遇到了一些问题,因为我不清楚在哪些情况下调用 ReadFile/WriteFile 会导致完成数据包。
ERROR_IO_PENDING 返回 FALSE 的情况很清楚,但是当 ERROR_MORE_DATA 返回时显然可能的情况呢?这种情况下会有完成包吗?此外,如果返回其他错误怎么办?在哪些情况下我必须直接而不是在完成处理程序中处理结果和释放资源?
另一种情况是如果 ReadFile/WriteFile 甚至成功,这显然也是可能的。谢天谢地, MSDN 对此非常清楚:
此外,WriteFile 函数有时会返回 TRUE,GetLastError 值为 ERROR_SUCCESS,即使它使用异步句柄(也可以返回 FALSE 和 ERROR_IO_PENDING)。...在此示例中,建议允许完成端口例程单独负责此类资源的所有释放操作。
这个建议是否在所有情况下都是正确的,并且分配给完成端口的句柄的 ReadFile/WriteFile 操作的结果实际上可以(并且应该)被完全忽略,因为无论如何都会将数据包发送到端口?
asynchronous - epoll、poll、threadpool有什么区别?
有人可以解释epoll
,poll
和线程池之间的区别吗?
- 有什么优点/缺点?
- 对框架有什么建议吗?
- 对简单/基本教程有什么建议吗?
- 似乎
epoll
并且poll
是特定于 Linux 的...... Windows 是否有等效的替代方案?
c++ - 我对基于套接字的模型的图形表示和解释
http://img600.imageshack.us/img600/3567/graphicrepresentation.png
我的推理方式正确吗?如果是这样,谁能告诉我,就像上面的方案一样,I/O 完成端口将如何工作?在我开始学习如何为 MMORPG 制作高性能服务器之前,我想确定这一切是如何工作的。
c# - HttpWebRequest 和 I/O 完成端口
我正在开发一个应用程序,该应用程序需要一种类型的消息访问数据库,而另一种类型的消息需要访问一些外部 xml api。
我必须处理很多......最大的挑战之一是让 HttpWebRequest 类表现良好。我最初只使用标准同步方法和线程池化整个事情。这不好。
因此,经过一番阅读,我看到推荐的方法是使用 Begin/End 方法将工作委托给 IO 完成端口,从而释放线程池并产生更好的性能。情况似乎并非如此……性能稍微好一些,但与线程池相比,我当然看不到 IO 完成端口的使用量那么多。
我有一个旋转的线程并向我发送线程池中可用的工作线程+完成端口。完成端口总是非常低(我见过最多使用 9 个),而且我总是使用大约 120 个工作线程(有时更多)。我对所有方法都使用了开始/结束模式httpwebrequest
:
我做对了吗?我错过了什么吗?我可以(有时)同时使用多达 2048 个 http 连接(来自 netstat 输出) - 为什么完成端口号会这么低?
如果有人可以就如何管理工作线程、完成端口提供一些认真的建议,httpwebrequest
我们将不胜感激!
编辑:.NET 是一个合理的工具吗?我可以获得大量使用 .NET 和 System.Net 堆栈的 httpconnections 吗?有人建议使用 WinHttp(或其他一些 C++ 库)之类的东西,并从 .NET 中 pInvoke 它,但这不是我特别想做的事情!
c++ - 通过 boost::asio / io 完成端口间歇性没有数据传递
问题
我将boost::asio用于同一台机器上的两个进程使用 TCP/IP 进行通信的项目。一个生成要被另一个读取的数据,但是我遇到了一个问题,即间歇性地没有数据通过连接发送。基于async tcp echo server example,我将其归结为一个非常简单的示例。
进程(下面的源代码)开始时很好,以快速的速度将数据从发送方传送到接收方。然后突然之间,大约五秒钟内根本没有数据传送。然后再次传递数据,直到下一次莫名其妙的停顿。在这 5 秒内,这些进程占用了 0% 的 CPU,而其他进程似乎没有做任何特别的事情。暂停总是相同的长度 - 五秒。
我试图弄清楚如何摆脱这些摊位以及导致它们的原因。
整个运行期间的 CPU 使用率:
请注意在运行过程中 CPU 使用率如何下降 3 次——“运行”是对服务器进程和客户端进程的一次调用。在这些低谷期间,没有提供任何数据。每次运行之间下降的次数和时间不同 - 有时根本没有下降,有时很多。
我可以通过更改读取缓冲区的大小来影响这些停顿的“概率”——例如,如果我将读取缓冲区设置为发送块大小的倍数,那么这个问题似乎几乎消失了,但并非完全消失。
源和测试说明
我使用 Boost 1.43 和 Boost 1.45 用 Visual Studio 2005 编译了以下代码。我已经在 Windows Vista 64 位(四核)和 Windows 7 64 位(四核和双核)上进行了测试。
服务器接受连接,然后简单地读取和丢弃数据。每当执行读取时,都会发出新的读取。
客户端连接到服务器,然后将一堆数据包放入发送队列。在此之后,它一次写入一个数据包。每当写入完成时,就会写入队列中的下一个数据包。一个单独的线程监视队列大小并每秒将其打印到标准输出。在 io 停顿期间,队列大小保持完全相同。
我曾尝试使用 scatter io(在一个系统调用中写入多个数据包),但结果是一样的。如果我使用 Boost 禁用 IO 完成端口BOOST_ASIO_DISABLE_IOCP
,问题似乎会消失,但代价是吞吐量显着降低。
所以我的问题基本上是:
我如何摆脱这些摊位?
是什么导致这种情况发生?
更新:与我上面所说的相反,似乎与磁盘活动有一些相关性,所以如果我在测试运行时在磁盘上启动一个大目录副本,这可能会增加 io 停顿的频率。这可能表明这是启动的Windows IO 优先级?由于暂停总是相同的长度,这听起来有点像 OS io 代码中某处的超时......
windows - 套接字服务器的高效重叠 I/O
这两种不同模型中的哪一种更有效(考虑抖动、处理器缓存的利用、整体设计、一切等)?
1 个 IOCP 和启动 X 个线程(其中 X 是计算机拥有的处理器数量)。这意味着我的“服务器”对于所有请求和 X 线程只有 1 个 IOCP(队列)来服务/处理它们。我已经阅读了许多讨论这种设计效率的文章。使用此模型,我将拥有 1 个也与 IOCP 关联的侦听器。让我们假设我可以弄清楚如何保持数据包/请求同步。
X IOCP(其中 X 是计算机拥有的处理器数量)并且每个 IOCP 有 1 个线程。这意味着每个处理器都有自己的队列和 1 个线程来服务/处理它们。使用此模型,我将有一个单独的侦听器(不使用 IOCP)来处理传入连接并将 SOCKET 分配给正确的 IOCP(创建的 X 之一)。让我们假设我可以弄清楚负载平衡。
对两种设计(银行)使用过于简化的类比:
一条线有几个收银员来处理交易。每个人都在同一条线上,每个收银员都在排队等候下一个可用的人。
每个收银员都有自己的线路,人们被“放置”到其中一条线路中
在这两种设计之间,哪一种更高效。在每个模型中,重叠 I/O 结构将使用带有 MEM_COMMIT 的 VirtualAlloc(而不是“新”),因此交换文件不应成为问题(无分页)。根据向我描述的方式,将 VirtualAlloc 与 MEM_COMMIT 一起使用,内存被保留并且不会被分页。这将允许 SOCKETS 将传入数据直接写入我的缓冲区,而无需通过中间层。所以我不认为颠簸应该是一个因素,但我可能是错的。
有人告诉我 #2 会更有效率,但我没有听说过这个模型。提前感谢您的评论!
winsock - GetQueuedCompletionStatus returns ERROR_NETNAME_DELETED on remote socket closure
I am writing a small server-client-stuff using an I/O-Completion Port.
I get the server and client connected successfully via AcceptEx over my completion port. After the client has connected the client socket is associated with the completion port and an overlapped call to WSARecv on that socket is invoked.
Everything works just fine, until I close the client test program.
GetQueuedCompletionStatus()
returns FALSE
and GetLastError
returns
ERROR_NETNAME_DELETED
, which makes sense to me (after I read the description on the MSDN).
But my problem is, that I thought the call to GetQueuedCompletionStatus
would return me a packet indicating the failure due to closure of the socket, because WSARecv
would return the apropriate return value.
Since this is not the case I don´t know which clients´ socket caused the error and cant act the way i need to (freeing structures , cleanup for this particular connection, etc)...
Any suggestion on how to solve this, Or hints?
Thanks:)
EDIT: http://codepad.org/WeYINasO <- the code responsible... the "error" occures at the first functions beginning of the while-loop (the call to GetCompletionStatus()
which is only a wrapper for GetQueuedCompletionStatus() working fine in other cases) [Did post it there, because it looks shitty & messy in here]
winapi - 我的循环错了吗?我是否滥用 ReadFile() 和 I/O 完成端口?
我想使用命名管道(用于 IPC)实现服务器/客户端。我正在使用异步(重叠)连接和 I/O 完成端口(我搜索了很多,似乎这是最有效的方法) .
首先是代码:
服务器: http: //pastebin.com/XxeXdunC
和客户: http: //pastebin.com/fbCH2By8
问题出在服务器上(我可以改进客户端,但当服务器工作时我会这样做)。
我使用这样的 I/O 完成端口:基本上,我运行一个调用 ReadFile() 的线程。如果它返回 TRUE,我得到所有数据,如果它返回 FALSE,并且错误是 ERROR_IO_PENDING,我等待 GetQueuedCompletionStatus()。
奇怪的是,即使我读取了所有数据,最后一次 ReadFile() 调用失败并且错误是 ERROR_IO_PENDING
我调用 ReadFile() 的线程是服务器代码的第 64 行的开始。
客户端发送 24 个字节(字符串“salut, c'est le client !”)并且 ReadFile() 缓冲区的长度为 5 个字节(检查我的服务器如何处理大于 Readfile() 缓冲区的数据)
输出是:
我不明白的是,即使我读取了所有数据,ReadFile() 仍然返回一个挂起的操作(它是最后一个“msg”输出之后的“ReadFile2:ERROR_IO_PENDING”错误消息)
我的循环错了吗?我是否滥用 ReadFile() / GetQueuedCompletionStatus() ?
谢谢你
c# - 退出没有循环的线程
我需要一种方法来停止不包含循环的工作线程。应用程序启动线程,然后线程创建一个FileSystemWatcher对象和一个Timer对象。其中每一个都有回调函数。到目前为止我所做的是向线程类添加一个volatile bool成员,并使用计时器来检查这个值。一旦设置了这个值,我就挂断了如何退出线程。
因此,当线程被告知停止时,我可以处理 Timer / FileWatcher - 但是我如何实际退出/停止线程?