标签: iocp

.NET中工作程序和I/O线程的简单描述

在.NET中很难找到工作者和I/O线程的详细但简单的描述

我对这个主题有什么了解(但可能在技术上不精确):

  • 工作线程是应该为其工作使用CPU的线程;
  • I/O线程(也称为"完成端口线程")应该为其工作使用设备驱动程序,并且基本上"什么都不做",只监视非CPU操作的完成.

不清楚的是:

  • 虽然方法ThreadPool.GetAvailableThreads返回两种类型的可用线程数,但似乎没有公共API来为I/O线程安排工作.您只能在.NET中手动创建工作线程?
  • 似乎单个I/O线程可以监视多个I/O操作.这是真的吗?如果是这样,为什么ThreadPool默认有这么多可用的I/O线程?
  • 在某些文本中,我读到了I/O线程执行I/O操作完成后触发的回调.这是真的吗?考虑到这个回调是CPU操作,这不是工作线程的工作吗?
  • 更具体一点 - ASP.NET异步页用户I/O线程吗?将I/O工作切换到单独的线程而不是增加最大工作线程数的性能有什么好处?是因为单个I/O线程确实监视多个操作吗?或者Windows在使用I/O线程时进行更有效的上下文切换?

.net multithreading iocp

60
推荐指数
2
解决办法
2万
查看次数

I/O完成端口的优缺点

为什么很多人说I/O完成端口是快速而漂亮的模型?
什么是I/O完成端口的优缺点?

我想知道一些比其他模型更快的IOCP的要点.

如果你可以解释它比较其他模型(选择,epoll,传统的多线程/进程),那会更好.

windows io network-programming device-driver iocp

51
推荐指数
2
解决办法
2万
查看次数

Linux和I/O完成端口?

使用winsock,您可以将套接字或单独的I/O操作配置为"重叠".这意味着立即返回执行I/O的调用,而实际操作由单独的工作线程异步完成.

Winsock还提供"完成端口".据我所知,完成端口充当句柄(套接字)的多路复用器.如果句柄不在I/O操作的中间,即如果其所有I/O操作都已完成,则可以解复用句柄.

那么,关于我的问题...... linux是否支持完成端口甚至是套接字的异步I/O?

sockets linux posix asynchronous iocp

37
推荐指数
4
解决办法
2万
查看次数

在哪里/如何查找.net类是否使用IOCP?

更新

我问错了问题,改写(根据答案和评论的重要信息):

.net的异步操作是否是真正的异步,因此是IOCP还是异步(重叠)?有没有快速的方法来确定几个类是否正在这样做?

盲目地不信任框架开发人员的示例

创建FileStream的自然起点是静态File.Open()方法,该文档没有提及创建的FileStream的同步性!它也不允许您提供FileOptions(用于指定魔术FileOptions.Asynchronous标志).

而是使用FileOptions.None创建FileStream.任何异步操作都是由Stream基类的强制实现悄然伪造的,它只是将相应的同步方法包装在委托中,并使用BeginInvoke()方法在线程池上调用它.

这偏离了通常的"成功之坑"设计理念,即.NET中的所有内容似乎都能按照您的想法运行,而无需仔细阅读文档和/或逐渐发现模糊的捕获和陷阱.


我一直在努力寻找有关使用IO完成端口的信息.NET.

有没有什么好方法可以知道给定的.NET类是否使用IO完成端口?(每次使用新类时都不必运行一些测试.

我尝试了msdn文档的一些类和方法,我找不到任何东西.

更好的是,如果有一些列表使用IOCP的类列表.

.net c# asynchronous iocp

20
推荐指数
2
解决办法
3437
查看次数

使用IOCP和UDP?

我很熟悉的东西输入/输出完成端口是当它涉及到TCP.

但是,如果我编写一个FPS游戏,或者需要低延迟的任何东西都可以成为交易破坏者 - 我希望立即响应玩家以提供最佳的游戏体验,即使以丢失一些空间数据为代价走.很明显我应该使用UDP,除了频繁发送坐标更新外,我还应该实现一种半可靠的协议(afaik TCP在UDP中引起数据包丢失,所以我们应该避免混合这两个)来处理聊天消息等事件,或者枪支丢失可能是至关重要的.

假设我的目标是适用于MMOFPS游戏的性能,该游戏允许在一个持久的世界中遇见数百名玩家,除了与枪支战斗之外,它还允许他们通过聊天消息等进行交流 - 这样的事实实际存在并且运作良好 - 查看PlanetSide 2.

网上有很多文章(例如来自msdn的文章)说重叠套接字是最好的,而IOCP是神层概念,但它们似乎并没有区分我们使用其他协议而不是TCP的情况.

所以几乎没有关于开发这样一个服务器时使用的I/O技术的可靠信息,我看过这个,但这个话题似乎备受争议,我也看到过这个,但考虑到第一个链接中的讨论,我不知道我是否应该遵循第二个假设,是否应该将IOCP与UDP一起使用,如果不是,那么在UDP方面,最具可扩展性和效率的I/O概念是什么.

或许我只是做了另一个过早的优化,目前还不需要提前思考?

考虑将其发布在gamedev.stackexchange.com上,但这个问题更适用于我认为的通用网络.

c++ performance networking udp iocp

13
推荐指数
2
解决办法
7676
查看次数

C++中的可扩展服务器框架

我期待用C++编写一个服务器应用程序,用于同时处理数万个客户端.它应该在Windows和Linux下运行.我一直在寻找框架和库,并遇到了Boost Asio,这似乎是一个非常成熟和广泛使用的替代品.我只是在绞线/线程池周围缠绕我很困难,主要是因为有数百万个模板.我的背景主要是在C中,所以我并不习惯Boost一般似乎充满了模板的混乱.我试图找人开发围绕升压短耳相对较薄的包装将采用股,绑定等的照顾线程/同步方面的,但一直未能找到一个还没有谁可以在我的预算之内做到这一点(2或300美元).

您是否可以推荐任何其他可扩展的库以及Boost Asio(例如,在Windows上使用IOCP,在Linux上使用epoll等),或者我可能会找到熟练的Boost开发人员寻找较小的自由职业的来源?

非常感谢您的任何帮助.

亲切的问候,

Philip Bennefall

c++ epoll iocp scalable boost-asio

12
推荐指数
1
解决办法
1万
查看次数

如果最初发出IO的线程在Windows 8下的ReadFile中阻塞,则GetQueuedCompletionStatus无法从IOCP中取消IO

我的应用程序在切换到Windows 8后停止工作.我花了几个小时调试问题,发现IOCP在Windows 8和以前的版本之间表现不同.我提取必要的代码来演示和重现问题.

SOCKET sListen;

DWORD WINAPI WorkerProc(LPVOID lpParam)
{
    ULONG_PTR dwKey;
    DWORD dwTrans;
    LPOVERLAPPED lpol;
    while(true)
    {
        GetQueuedCompletionStatus((HANDLE)lpParam, &dwTrans, &dwKey, (LPOVERLAPPED*)&lpol, WSA_INFINITE);
        printf("dequeued an IO\n");
    }
}
DWORD WINAPI StartProc(LPVOID lpParam)
{
    WSADATA WsaData;
    if (WSAStartup(0x202,&WsaData)!=0) return 1;
    sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
    SOCKADDR_IN si;
    ZeroMemory(&si,sizeof(si));
    si.sin_family = AF_INET;
    si.sin_port = ntohs(1999);
    si.sin_addr.S_un.S_addr = INADDR_ANY;
    if(bind(sListen, (sockaddr*)&si, sizeof(si)) == SOCKET_ERROR) return 1;
    listen(sListen, SOMAXCONN);
    HANDLE hCompletion = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
    CreateIoCompletionPort((HANDLE)sListen, hCompletion, (DWORD)0, 0);
    CreateThread(NULL, …
Run Code Online (Sandbox Code Playgroud)

c++ sockets winsock iocp windows-8

12
推荐指数
1
解决办法
3814
查看次数

IOCP线程 - 澄清?

阅读本文后指出:

设备完成其作业后(IO操作) - 它通过中断通知CPU.

...... ......

但是,"完成"状态仅存在于操作系统级别; 该进程有自己的内存空间,必须通知

...... ......

由于库/ BCL使用标准的P/Invoke重叠I/O系统,因此它已经使用I/O完成端口(IOCP)注册了句柄,IOCP是线程池的一部分.

...... ......

因此,简单地借用 I/O线程池线程来执行APC,APC通知任务它已完成.

关于大胆的部分,我很有趣:

如果我理解正确,在IO操作完成后,它必须通知执行IO操作的实际进程.

问题#1:

这是否意味着它为每个完成的IO操作抓取一个新的线程池线程?或者这是一个专门的线程数?

问题2:

看着 :

for (int i=0;i<1000;i++)
    {
      PingAsync_NOT_AWAITED(i); //notice not awaited !
    }
Run Code Online (Sandbox Code Playgroud)

这是否意味着我将同时运行1000个IOCP线程池线程(某种类型),当它们全部完成时?

c# iocp async-await

12
推荐指数
3
解决办法
3653
查看次数

是否有基于I/O完成端口的Delphi组件?

我知道Indy,ICS,SynapseClever InetSuite,它们都不支持IOCP.还有什么吗?

编辑:我找到了iocpclasses,它是用Delphi5编写的.我想,总比没有好.

delphi iocp

8
推荐指数
3
解决办法
4456
查看次数

从IOCP线程调用WSAGetLastError()会返回不正确的结果

我已经打电话WSARecv()回来了WSA_IO_PENDING.然后我RST从另一端发送了一个数据包.GetQueuedCompletionStatus()存在于另一个线程中的函数已FALSE按预期返回,但是当我调用时,WSAGetLastError()我得到了64而不是WSAECONNRESET.

那为什么WSAGetLastError()不回来WSAECONNRESET


编辑:

我忘了提到当我WSAGetLastError()在失败后直接调用时WSARecv()(由于RST收到了数据包),返回的错误代码是WSAECONNRESET和不是64.

所以看起来返回的错误代码取决于在WSARecv()调用它之后是否直接失败,或者在检索完成数据包之后失败.

c++ sockets iocp

8
推荐指数
1
解决办法
1158
查看次数