问题标签 [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 回答
301 浏览

windows - iocpreactor 以扭曲的形式发布状态

我们在 Windows 2008 上的默认选择反应器存在问题。有一个替代反应器,iocpreactor,它看起来是 Windows 的理想解决方案。它在文档中被列为实验性的,并且“几乎准备就绪”。

这实际上意味着什么?到目前为止,我们已经毫无问题地对其进行了测试。是通用的吗?其他人可以推荐吗?

0 投票
2 回答
733 浏览

c++ - 强制 WSARecv 重叠

我正在尝试实现一个使用 IOCompletionPort 从其客户端读取的服务器。我有一些与这个例子非常相似的东西。

如果我理解正确,这应该是我的设计:

  1. 【主线程】创建监听socket,绑定监听
  2. [主线程] 创建一个事件并使用 WSAEventSelect 将其附加到套接字接受信号
  3. [Accept Thread] 等待事件并接受客户端
  4. [Accept Thread] 当客户端连接时,使用 CreateIOCompletionPort 与它一起使用 IOCompletion 队列
  5. [Accept Thread] accept 线程调用第一个 WSARecv 并带有重叠参数
  6. 【Worker Threads】使用队列在WSARecv上实现leader-follower模式

在阅读了 WSARecv ( Here)之后,我发现如果数据准备好,WSARecv 可能会立即返回数据。这似乎有点奇怪,因为这意味着如果客户端发送速度足够快,工作人员可以在 WSARecv 上循环而不返回 IO 队列——这可能导致客户端饥饿......

在此我的问题是:

  1. 有没有办法“强制” WSARecv 不立即返回?我的意思是,100% 的时间返回 IO_PENDING?
  2. 如果不是 - 什么是正确的设计,针对可扩展性进行了优化?

这就是我使用 WSARecv 的方式:

olStruct 是 OVERLAPPED 结构的扩展。

EDIT: I ended up reposting what I got from WSARecv using PostQueuedCompletionStatus. I'd love to hear other solutions though See Answer

0 投票
1 回答
138 浏览

windows - I/O 完成端口静默读取失败

我正在开发一个程序,该程序需要将大量数据写入磁盘,然后稍后再读回少量数据。它需要将相关数据“合并”在一起,然后一旦弄清楚如何处理它,就可以进一步处理数据。它基本上就像一个数据库,但在磁盘上有临时文件。临时文件的一部分被相当频繁地重用,因为我不关心磁盘上的数据在我读回它之后,所以文件的一部分可以被回收。我正在使用 I/O 完成端口来实现这一点,因为顺序 I/O 太慢了。

问题是有时当我读取数据时,我并没有全部取回。例如,我将我的读取缓冲区清零,执行 20 字节的读取操作,当相应的完成事件触发时,我的读取缓冲区中的一些甚至没有一个与磁盘上应该存在的内容匹配,但全部不会被清零。有时,我可以检测到这一点并尝试睡 5 秒并再次阅读相同的部分,它与我在第一次尝试中阅读的内容相匹配。这是在顶级 SSD 上进行的,因此 5 秒应该足够刷新到磁盘。但是,当我停止我的应用程序并查看文件的内容时,它在磁盘上是正确的。就好像之前的写入没有刷新到磁盘并且它尝试读取旧数据。

为了验证这个理论,我在阅读时尝试在整个部分上写 0xFF。当这个错误再次发生时,我的读取缓冲区没有像我预期的那样包含 0xFFs。所以大概,我不是在阅读旧数据。

我还检查以确保从完成事件返回的字节数与我传递给 ReadFile 的字节数匹配,并且它们确实匹配。完成事件或 ReadFile(ERROR_IO_PENDING 除外)没有返回错误。我正在使用 FILE_ATTRIBUTE_NORMAL、FILE_FLAG_OVERLAPPED 和 FILE_FLAG_RANDOM_ACCESS 创建我的临时文件。

我还尝试在尝试读取之前等待文件给定部分的所有挂起写入完成,但无济于事。我希望 Windows 会为我做到这一点,但我读过的任何文档中都没有涵盖它。

我真的不知道为什么我会得到看起来是部分或损坏的读取。我真的只是在寻找一些可能导致这种行为的想法,因为我全力以赴。

0 投票
3 回答
3357 浏览

c# - 在 .NET 中处理大文件

问题

我需要能够使用 C# 保存和读取一个非常大的数据结构。结构本身相当简单;它是一个非常长的数组,包含一个恒定大小的简单结构。

只是为了清楚起见的例子:

我希望能够尽可能快速高效地保存这些文件并将其加载到文件中。

总体方向

到目前为止,我的想法是将数据切割成段,当然从概念上讲,将这些段分配给任务,然后将它们异步写入文件。FileStream.WriteAsync 似乎非常适合这一点。

我的问题在于阅读,从 FileStream.ReadAsync API 看来,可以在每个结构的中间切割结果似乎是完全合理的,实际上是一个原语的一半。当然我可以解决这个问题,但我不确定最好的方法是什么,以及我会在多大程度上干扰操作系统的缓冲机制。

最终,我计划从每个缓冲区创建一个 MemoryStream,MemoryStream.MemoryStream(byte[])并使用二进制读取器将每个缓冲区读入结构。

问题

那么解决这个问题的最佳方法是什么?我的方向好吗?有没有更好的解决方案?代码示例和链接将不胜感激......

结论

在进行性能测试后,我发现使用 BinaryReader 读取文件或使用 FileStream.ReadAsync 使用多个读取器可以提供大致相同的性能。

苏……这个问题毫无意义。

0 投票
1 回答
1121 浏览

winapi - I/O 完成端口与 RegisterWaitForSingleObject?

RegisterWaitForSingleObject使用 I/O 完成端口与仅使用让线程池线程等待 I/O 完成有什么区别?

其中一个更快,如果是,为什么?

0 投票
1 回答
743 浏览

winapi - 收到警报时的 GetQueuedCompletionStatusEx 行为

我在 fAlertable 设置为 TRUE 的情况下使用此函数,因为我在我的框架中使用用户警报作为通用线程中断机制。根据该功能的MSDN页面上的评论,

当调用进入警报等待状态并且用户 APC 可用于调度 GetQueuedCompletionStatusEx 的返回值为 TRUE 时,ulEntriesRemoved 非零并且您的 OVERLAPPED_ENTRY 的“包”未触及。因此,如果您确保所有的 OVERLAPPED_ENTRY 都为其 lpOverlapped 成员设置了一个已知的唯一值,那么在调用 API 之前,您可以通过检查 lpOverlapped 的魔力来更轻松地检测删除的条目是 APC 还是 I/O 完成数据包价值。

为什么我需要检查所有的 OVERLAPPED_ENTRY 而不仅仅是第一个?GetQueuedCompletionStatusEx() 不会总是按顺序填充输出数组,因此我应该只检查第一个而不是循环整个数组(或至少到 ulEntriesRemoved)?此外,鉴于此函数同时使多个完成端口条目出列,是否可以保证它永远不会返回警报和一个或多个完成条目?我特别担心这种可能性,因为评论中指出 ulEntriesRemoved 在警报期间将不为零。尽管页面上的评论进一步提到“如果队列中有任何 I/O 完成数据包,用户 APC 将不会被调度。”,

假设系统在对线程和完成端口条目的用户警报的某种混合中排队,然后线程运行 GetQueuedCompletionStatusEx()。从文档中,我无法确定该函数是否使此调用中的所有完成条目出列,然后每次后续调用都会发出一个用户警报(假设没有更多的完成条目排队)。鉴于文档,这似乎是最有可能的情况,但我不想做出可能被证明是错误的假设......

0 投票
1 回答
285 浏览

c++ - 窗口 HTTP IO 完成端口

我正在阅读与 Windows HTTP Server API 相关的 Windows 编程的 IO 完成端口文档。

因此,在 HTTP Server API 中,我们有一个队列,它是对响应/请求的抽象。我们有队列的句柄来获取相关信息。

如果我要将 IO 完成端口与此相关联,这是否意味着我已使用队列作为句柄?这不会降低粒度吗?我不能将 IO 完成端口与每个请求关联,而不是与完整队列关联。

详细查询:我们使用windows http server api中的请求队列注册某个URL。所以队列上可能有很多请求。我如何将 IO 完成端口与每个请求/响应关联,而不是与队列本身关联。

IO 完成: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa363862 (v=vs.85).aspx

队列文档: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa364483 (v=vs.85).aspx

接收请求: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa364495 (v=vs.85).aspx

0 投票
1 回答
1045 浏览

c++ - 使用重叠结构进行回调?

对于使用 IO 完成端口的异步 IO,我有自己的重叠结构。

现在我收到读/写完成的通知。我可以将 CALLBACK 函数作为重叠结构中的参数传递吗?

这将允许我根据我传递的重叠结构的类型指定各种回调函数

有人对此有任何运气吗?

0 投票
1 回答
845 浏览

asp.net - 异步操作方法和 IO 完成端口

当我们的应用程序依赖于外部服务时,使用异步编程很重要的原因之一是允许 ASP.NET 使用 IO 完成端口,而不是阻塞等待外部服务响应的线程,ASP.NET可以将执行停在 IO 完成端口并使用线程来处理另一个请求,只要外部服务响应,ASP.NET 就会再次获取该执行并恢复它。这样,没有线程是阻塞的。

异步方法的一个示例是:

但是如果我们对外部服务使用多个请求会发生什么?ASP.NET 如何处理它?

它还在使用 IO 完成端口吗?还是因为Task.WhenAll阻塞了一个线程?

0 投票
1 回答
546 浏览

sockets - Winsock:带 IO 完成端口的 DisconnectEx

注意:OP 在评论线程中确认问题是由于拼写错误,未在发布的代码中显示。


在使用 DisconnectEx 安排重叠断开连接后,我希望使用 GetQueuedCompletionStatus 收到通知。我从来没有得到过——这是设计使然吗?如果我在 OVERLAPPED 结构中指定手动重置事件,则会发出信号以指示断开连接已完成,但 GetQueuedCompletionStatus 永远不会返回。

我对 DisconnectEx 的调用看起来有点像这样(注意上下文有一个运算符 LPOVERLAPPED 并且 ol 是结构中的第一个元素):

当我发现 GetQueuedCompletionStatus 没有返回时,我添加了 WaitForSingleObject。检测 DisconnectEx 完成的正确方法是什么?我想在对 AcceptEx 的调用中再次使用套接字。