机械类网站如何做网站优化,注册安全工程师查询官网,wordpress 获取模板路径,公司网站建设需要咨询什么问题1.IOCP是什么 IOCP是Input/Output Completion Ports的简称#xff0c;中文翻译为完成端口#xff0c;完成是应用程序向系统发起一个IO操作#xff0c;系统会在操作结束后#xff0c;将IO操作完成结果通知应用程序#xff0c;端口指的是机制 2.重叠IO#xff08;Overlappe…1.IOCP是什么 IOCP是Input/Output Completion Ports的简称中文翻译为完成端口完成是应用程序向系统发起一个IO操作系统会在操作结束后将IO操作完成结果通知应用程序端口指的是机制 2.重叠IOOverlapped
针对一个Socket可以发起多个IO操作无需等待上一个IO完成尽管调用IO操作是按顺序的但是IO操作完成通知是随机的无序的
3.实现流程 2.原理
IOCP的基本原理是通过事件驱动的方式来处理I/O请求以避免传统的阻塞式I/O操作带来的性能问题具体来说IOCP通过一下几个步骤完成异步I/O操作
1.应用程序首先创建一个或多个 I/O 端口并将它们关联到套接字或文件句柄上2.当应用程序需要进行 I/O 操作时它调用系统级别的 API将请求提交到 I/O 端口上3.操作系统内核将 I/O 请求与相应的 I/O 端口关联并立即返回使得应用程序可以继续执行其他操作。4.内核在后台异步地执行 I/O 操作并将结果存储在完成队列中。5.当 I/O 操作完成时内核会通知完成端口并将完成信息添加到完成队列中。6.应用程序通过调用 GetQueuedCompletionStatus() 函数获取完成队列中的已完成请求并按需处理它们。7.如果完成队列为空则应用程序可以等待新的完成事件发生或者继续执行其他操作。
3.函数
3.1CreateIoCompletionPort 这个函数是个本身具有多重功能的函数Windows平台上这样的函数并不多需要用不同的方式来调用以实现不同的功能 HANDLE WINAPI CreateIoCompletionPort(__in HANDLE FileHandle,__in HANDLE ExistingCompletionPort,__in ULONG_PTR CompletionKey,__in DWORD NumberOfConcurrentThreads
);创建内核
HANDLE hICP ::CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,1);前三个参数在这种情况下是没有意义的只需要全部传递NULL即可第一个参数不是NULL而是INVALID_HANDLE_VALUE因为第一个参数按照定义是一个文件的句柄也就是需要IOCP操作的文件句柄而代表“NULL”文件句柄的实际值是INVALID_HANDLE_VALUE这是因为NULL实际等于0而0这个文件句柄被用于特殊用途所以要用INVALID_HANDLE_VALUE来代表“NULL”意义的文件INVALID_HANDLE_VALUE的值是-1或者0xFFFFFFFF。最后一个参数NumberOfConcurrentThreads默认的推荐值就是CPU个数的2倍了 3.2GetQueuedCompletionStatus
BOOL WINAPI GetQueuedCompletionStatus(__in HANDLE CompletionPort,__out LPDWORD lpNumberOfBytes,__out PULONG_PTR lpCompletionKey,__out LPOVERLAPPED* lpOverlapped,__in DWORD dwMilliseconds
);第一个参数就是我们之前创建的那个完成端口内核对象的句柄这个参数实际也就是告诉系统我们当前的线程是归哪个完成端口对象来调度。第二个参数是一个比较有用的参数在函数返回后它将告诉我们这一次的IO操作实际传输或者接收了多少个字节的信息这对于我们校验数据收发完整性非常有用。第三个参数是与完成端口句柄绑定的一个一对一的数据指针第四个参数就是重叠操作的数据结构第五个参数是一个等待的毫秒数