关于IO完成端口,尚有疑惑的地方,特请教各位。欢迎参与讨论。
首先,下述的讨论假定IO操作已经与完成端口绑定在一此,且所进行的正常的IO操作可以通知该IO完成端口。1、系统在一次I/O操作完成后将通知IO完成端口,后者可以通过GetQueuedCompletionStatus来取得。对此,我假设
进行了一次WSARecv的操作,而后我断开与客户机相联的网络,服务器何以得到与该客户相关的Socket?
换句话说,我的疑问是:
IO完成端口的状态队列(first-in-first-out)是下面哪种方式入队的:
当调用WSARecv(或其它)后,将该CompletionKey入队 还是
当该操作完成后,系统将与之相关的CompletionKey及状态入队,等待GetQueuedCompletionStatus来取?
又或是其它的情况?2、曾看过有篇文章讲,IO完成端口可能会在程序进行IO操作时分配“非分页核心内存”。严重时会导致系统的崩溃,与程序无关的其它进程或者某个驱动发生错误(我就遇到过这样的情况),尤其是在同时有较多的send或recv时。对此,我想问一下,导致这样的原因会是什么?与程序中发送数据时开的缓冲大小有没有关系?
3、为程序指定多大的发送、接收缓冲区较为合适?如果因为某些原因,底层的发送(或接收)缓冲(我指的是网络层afd.sys?)已满,那么程序中的发送(或接收)操作时所分配的缓冲(不是动态分配的)会被锁定(?我认为可能是),这样下去,必定导致系统配额不足而出错。4、个人在工作中遇到了难以索解的现象,疑与IO完成端口有关。现说一下我所见到情况,也请高手帮忙分析一下,谢谢!
程序在运行时,虚拟内存会突然激增(此时程序将出错),然后系统会报错:配额不足。此时无法运行其它程序,因为系统认为该程序不是一个合法的windows可执行程序,连记事本也不行。有时提示桌面非active...(记不清楚).有时候关机时,系统会出现提示:你没有权限...某个服务发生错误...等相类似的错误。个人对此的看法,是程序中有些地方处理不当,持续分配“非分页内存”,最终导致系统崩溃。只是会是什么原因造成的,至今没有找到答案。请各位就自己所知,发表自己的看法。谢谢。
首先,下述的讨论假定IO操作已经与完成端口绑定在一此,且所进行的正常的IO操作可以通知该IO完成端口。1、系统在一次I/O操作完成后将通知IO完成端口,后者可以通过GetQueuedCompletionStatus来取得。对此,我假设
进行了一次WSARecv的操作,而后我断开与客户机相联的网络,服务器何以得到与该客户相关的Socket?
换句话说,我的疑问是:
IO完成端口的状态队列(first-in-first-out)是下面哪种方式入队的:
当调用WSARecv(或其它)后,将该CompletionKey入队 还是
当该操作完成后,系统将与之相关的CompletionKey及状态入队,等待GetQueuedCompletionStatus来取?
又或是其它的情况?2、曾看过有篇文章讲,IO完成端口可能会在程序进行IO操作时分配“非分页核心内存”。严重时会导致系统的崩溃,与程序无关的其它进程或者某个驱动发生错误(我就遇到过这样的情况),尤其是在同时有较多的send或recv时。对此,我想问一下,导致这样的原因会是什么?与程序中发送数据时开的缓冲大小有没有关系?
3、为程序指定多大的发送、接收缓冲区较为合适?如果因为某些原因,底层的发送(或接收)缓冲(我指的是网络层afd.sys?)已满,那么程序中的发送(或接收)操作时所分配的缓冲(不是动态分配的)会被锁定(?我认为可能是),这样下去,必定导致系统配额不足而出错。4、个人在工作中遇到了难以索解的现象,疑与IO完成端口有关。现说一下我所见到情况,也请高手帮忙分析一下,谢谢!
程序在运行时,虚拟内存会突然激增(此时程序将出错),然后系统会报错:配额不足。此时无法运行其它程序,因为系统认为该程序不是一个合法的windows可执行程序,连记事本也不行。有时提示桌面非active...(记不清楚).有时候关机时,系统会出现提示:你没有权限...某个服务发生错误...等相类似的错误。个人对此的看法,是程序中有些地方处理不当,持续分配“非分页内存”,最终导致系统崩溃。只是会是什么原因造成的,至今没有找到答案。请各位就自己所知,发表自己的看法。谢谢。
解决方案 »
- IsDlgButtonChecked 的参数是啥子意思?函数是啥子功能
- 用什么函数可以生成圆弧上每点的坐标?
- 请教关于龚大侠串口助手V1.0 SCommT 的问题。
- 请问CWebBrowser2是不是不能在CView中创建,我在CView中创建CRichEidt是可以的!!!!!!!!!!
- 为什么我有个结了的帖子左边的勾是红色的?
- COM接口访问失败的问题,请大家帮忙!!!
- 知者请进:如何获得sql中日期的年月日?
- WIN2000下是否能格式化超过80个磁道的1.44MB高密软盘
- 求救,如何通过编辑框输入日期,实现SQL日期查询
- 看到一段代码与大家共享,用窗口过程实现多线程.
- 求:压缩控件及用vc调用控件的例程
- 关于throw,为什么运行的时候报说Unhandled exception in test.exe(kernel32.dll)
1、fifo是对 PER_IO_CONTEXT 而言的。
2、没听说过。我做的每秒通讯27000次的服务器没出现这类问题。
3、如果可以满足需要,通常缓冲区设置成8k字节比较好。
4、看起来像是病毒发作,先杀杀毒吧。iocp请参考微软的iocp_standard例子,那是一个相当不错的例子。
在系统在wsarecv,wsasendto,writefile,readfile最终都要通过devioctrl来完成的,这个函数完成后会检查当前句柄是否与完成端口相联系(你可能猜到文件句柄的私有变量中有一个完成端口句柄),假如是的话就推到完成端口队列中。
iocp_standard 那有下载,能否提供!
to wwwsq:确实有病毒,但不知是否就是病毒引发的
我再想想。谢谢各位!