IOCP 的意思和SQLSERVER里的IOCP等待 全称 IO_COMPLETION
IOCP 的意思和SQLSERVER里的IOCP等待 全称 IO_COMPLETION
http://baike.baidu.com/view/1256215.htm?fr=aladdin
IOCP编辑
目录
1基本概念编辑
2详细概念编辑
1
2
3
4
|
//初始化套接字库 WSADATAwsaData; WSAStartup(MAKEWORD(2,2),&wsaData); |
1
2
3
4
5
|
//创建IOCP句柄 HANDLEm_hIocp=CreateIoCompletionPort(INVALID_HANDLE_VALUE,0,0,0); //创建服务器套接字,这里要注意的是最后一个参数必须为:WSA_FLAG_OVERLAPPED重叠模式 SOCKETm_Server=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED); |
1
2
3
4
5
|
SOCKADDR_INaddr; addr.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1" ); addr.sin_family=AF_INET; addr.sin_port=htons(2000); bind(m_Server,(SOCKADDR*)&addr, sizeof (SOCKADDR); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//监听线程流程 UINTWINAPIAcceptThreadProc(LPVOIDlpParameter){ sockaddr_insockAddr={0}; intlen= sizeof (sockAddr); while (TRUE){ SOCKETsNew=WSAAccept(m_Server,(sockaddr*)&sockAddr,&len,NULL,NULL); //将客户端加入到IOCP队列中 CreateIoCompletionPort(( HANDLE )sNew,m_hIocp, ULONG_PTR (sNew),0); //这里要注意一下,对网上一些相关的资料,一些新手在写IOCP时 //会发现得不到用户请求及一些事件,那是因为没有对该用户投递一个接收IO //IOCP的工作原理就是,必须对一个连接投递一个接收IO,处理完一个,再投递一个... OVERLAPPEDPLUS*ol; //....对OL结构进行初始化后 intnRet=WSARecv(ol->s,&(ol->wsaBuf),1,&(ol->dwBytes),&(ol->dwFlags),&(ol->ol),NULL); intnError=WSAGetLastError(); //在投递接收IO时。返回值要注意。如果为nError==ERROR_IO_PENDING说明已经投递成功。 }} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
//工作线程流程 UINTWINAPIWorkerThreadProc(LPVOIDlpParameter) { DWORDCompleteBytes=0; DWORDdwKey=0; POVERLAPPEDPLUSol=NULL; BOOLbRet=GetQueuedCompletionStatus(m_hIocp,&CompleteBytes,( PULONG_PTR )&dwKey,(LPOVERLAPPED*)&ol,INFINITE); if (!bRet) { //客户端断开了连接 } //如果为接收时CompleteBytes为实际收到的大,发送时为实际发送的大小 switch (ol->OpCode) { caseIOCP_RECV: //....处理接收请求 break ; caseIOCP_SEND: //....处理发送请求 break ; } } |
SELECT * FROM sys.[dm_os_wait_stats] WHERE [wait_type] LIKE '%io_%' --IO_COMPLETION 640 50813 591 195 --ASYNC_IO_COMPLETION 1 1020 1020 0
简介
IOCP模型属于一种通讯模型,适用于Windows平台下高负载服务器的一个技术。在处理大量用户并发请求时,如果采用一个用户一个线程的方式那将造成CPU在这成千上万的线程间进行切换,后果是不可想象的。而IOCP完成端口模型则完全不会如此处理,它的理论是并行的线程数量必须有一个上限-也就是说同时发出500个客户请求,不应该允许出现500个可运行的线程。目前来说,IOCP完成端口是Windows下性能最好的I/O模型,同时它也是最复杂的内核对象。它避免了大量用户并发时原有模型采用的方式,极大的提高了程序的并行处理能力。
原理图
从图中可以看到,一共包括三部分:完成端口(存放重叠的I/O请求),客户端请求的处理,等待者线程队列(一定数量的工作者线程,一般采用CPU*2个)。
完成端口中所谓的[端口]并不是我们在TCP/IP中所提到的端口,可以说是完全没有关系。它其实就是一个通知队列,由操作系统把已经完成的重叠I/O请求的通知放入其中。当某项I/O操作一旦完成,某个可以对该操作结果进行处理的工作者线程就会收到一则通知。
通常情况下,我们会在创建一定数量的工作者线程来处理这些通知,也就是线程池的方法。线程数量取决于应用程序的特定需要。理想的情况是,线程数量等于处理器的数量,不过这也要求任何线程都不应该执行诸如同步读写、等待事件通知等阻塞型的操作,以免线程阻塞。每个线程都将分到一定的CPU时间,在此期间该线程可以运行,然后另一个线程将分到一个时间片并开始执行。如果某个线程执行了阻塞型的操作,操作系统将剥夺其未使用的剩余时间片并让其它线程开始执行。也就是说,前一个线程没有充分使用其时间片,当发生这样的情况时,应用程序应该准备其它线程来充分利用这些时间片。
IOCP的优点
基于IOCP的开发是异步IO的,决定了IOCP所实现的服务器的高吞吐量。
完成端口的线程并发量可以在创建该完成端口时指定,从而限制了与该完成端口相关联的可运行线程的数目。
通过引入IOCP,会大大减少Thread切换带来的额外开销,最小化的线程上下文切换,减少线程切换带来的巨大开销,让CPU把大量的事件用于线程的运行。当与该完成端口相关联的可运行线程的总数目达到了该并发量,系统就会阻塞任何与该完成端口相关联的后续线程的执行,直到与该完成端口相关联的可运行线程数目下降到小于该并发量为止。
Select是先查询再发起IO请求,IOCP是先发起IO请求再接收通知。但是Select方式在处理大量非活动连接时是比较低效的,因为每次Select需要对所有的Socket状态进行查询,而对非活动的Socket查询是没有意义的浪费,另外由于Socket句柄不能设置用户私有数据,当查询返回Socket句柄时还需要一个额外的查询来找到关联的用户对象,这两点是Select低效的关键。
http://www.cnblogs.com/coder2012/p/3185715.html
MSSQL WIKI
Non-yielding IOCP Listener, Non-yielding Scheduler and non-yielding resource monitor known issues and fixes
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2013-09-16 SQLSERVER中的资源调控器
2013-09-16 挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)
2011-09-16 单例模式