IOCP

来源:互联网 发布:电子商务模式价值网络 编辑:程序博客网 时间:2024/06/06 02:16

IOCP

IOCP   常称 I/O完成端口。  IOCP模型属于一种通讯模型,适用于(能控制并发执行的)高负载服务器的一个技术。 通俗一点说,就是用于高侠侣处理很多很多的客户端进行数据交换的一个模型。 或者可以说,就是能异步I/O操作的模型


基本概念

        IOCP全程I/O  Completion Port,   中文译为I/O完成端口。  IOCP是一个异步I/O的API,  它可以高效地将I/O事件通知给应用程序。与使用select()或是其他异步方法不同的是,一个套接字socket与一个完成端口关联起来, 然后就可以继续进行正常的winsock操作了。  然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口


IOCP模型的优缺点

        优点

           1 帮助维持重复使用的内存池。(与重叠I/O技术有关)

           2 去除删除线程创建/终结负担。

           3 利于管理,分配线程,控制并发,最小化的线程上下文切换。

           4 优化线程调度,提高CPU和内存缓冲的命中率。

         缺点

            理解以及编码的复杂度较高。对使用者有一定要求

         需了解一下基本知识

            1 同步与异步

                逻辑上来讲做完一件事后再去做另一件事就是同步, 而同时一起做两件或两件以上事的就是异步了。

            2 阻塞与非阻塞

            3 重叠I/O技术

            4 多线程

            5 栈 队列这两种基本的数据结构


相关API

        1 与socket相关

           1.1  链接套接字动态链接库:                         int WSAStartup(...);

           1.2 创建套接字库:                                          SOCKET socket(....);

           1.3 绑定套接字:                                              int bind(....);

           1.4 套接字设为监听状态:                              int listen(...);

           1.5 接收套接字:                                              SOCKET accept(...);

           1.6 向制定套接字发送消息:                          int send(...);

           1.7 从制定套接字接收消息:                          int recv(...);

         2 与线程相关

            2.1 创建线程:                                                 HANDLE CreateThread(...);

         3 重叠I/O技术相关

            3.1 向套接字发送数据                                     int WSASend(...);

            3.2 向套接字发送数据包                                 int WSASendTo(...);

            3.3 从套接字接收数据                                     int WSARecv(...);

            3.4 从套接字接收数据包                                 int WSARecvFrom(...);

          4 IOCP相关

             4.1 创建/关联完成端口:                               HANDLE WINAPI CreateloCompletionPor(.....);

             4.2 获取队列完成状态:                                BOOL WINAPI GetQueuedCompletionStatus(...);

             4.3 投递一个队列完成状态:                        BOOL WINAPI PostQueuedCompletionStatus(...);