- 阿里云 > 教程中心 > linux教程 > windows IOCP完成端口实用详解
- windows IOCP完成端口实用详解
- 发表文章
- 摘要:开篇之前先放上本次讲的IOCPprojectgithub地址:这里 。这个project中包含了IOCP和select,各自封装成一个动态链接库,可以直接使用。同时项目配有完整的glog支持,方便调试,并可以通过config控制server。如有bug,欢迎大家提出,正在完善过程中,代码可以优化的地方也请大家随时提出,一起进步成长。本文主要从以下几方面讲解IOCP使用及其原理。为什么需要完成端口完成端口能做什么完成端口原理如何使用完成端口1. 为什么需要完
- 开篇之前先放上本次讲的IOCP project github地址:这里 。这个project中包含了IOCP和select,各自封装成一个动态链接库,可以直接使用。同时项目配有完整的glog支持,方便调试,并可以通过config控制server。如有bug,欢迎大家提出,正在完善过程中,代码可以优化的地方也请大家随时提出,一起进步成长。
本文主要从以下几方面讲解IOCP使用及其原理。
- 为什么需要完成端口
- 完成端口能做什么
- 完成端口原理
- 如何使用完成端口
1. 为什么需要完成端口
网络通信模型是编写网络程序的一个比较核心的模块,也直接影响着程序的性能,所以选择合适的网络模型是非常有必要的。
IOCP是一种网络通信模型,但是在IOCP出现之前已经有相关网络通信模型在使用了,比较普遍的应该就是select模型,另外windows自己家也单独实现了alertable I/O等。但是提到的select和alertable I/O都存在一些局限,比如select模型其并发处理量受FDSETSIZE宏大小限制,在windows平台上这个大小默认是64,当然也可以自己在包含select之前手动#define其值,但是如果在使用之前就定义一个很大的值难免有点造成资源浪费,libevent就提供了一种自由的方法来使用select,这个在后面的文章中会详细介绍。alertable I/O一个缺陷是多线程之间无法达到负载均衡的,同一个线程发出的IO请求必须由同一个线程来接收,即使其他线程闲着没事干。所以这不能充分利多核系统的强大资源。那么IOCP有没有缺陷呢,当然也有,首先是使用起来不够简单明了,接口设计的不够简洁直观。但是呢性能还是杠杠的。
上面简单的说了IOCP模型与其他模型的一些对比,另外一点很大的区别是,IOCP模型是一种真正意义上的异步通信模型,具体啥是异步啥是同步可以参考我之前的一篇文章。有一点需要说明的是,并不是所有网络通信项目都必须要使用IOCP模型,对于一些已知的连接数较少的网络程序,完全可以用select甚至是每个客户端对应一个线程这种方式。2. 完成端口能做什么
上面吹了一大波完成端口,那么完成端口究竟能做什么呢。
首先一点是:IOCP会主动帮我们完成网络IO数据复制。这一点其实也就是他与其他网络模型最直接的区别了,一般网络操作包括两个步骤,以recv来说吧,如果是一般模型,那么其第一步是通知等待的线程有数据可以读取,这时候线程会调用recv或者recvfrom等函数将数据从读缓冲区复制到用户空间,然后再做下一步的处理,而IOCP能帮我们的是,他会在内核中帮我们监听那些我们感兴趣的的事件,例如我们希望接收客户端数据,那么我们向完成端口投递一个读事件,完成端口在监测有读事件到来的时候会主动地去帮我们把数据从内存空间复制到用户空间,然后通知我们过来取数据就OK了,这就是IOCP提供的方便之处。另外一点:IOCP在内部管理线程,实现负载平衡。上面提到了windows的alertable I/O的负载均衡是他一个弊端,那么IOCP是如何自己管理线程调度的呢,简单的说就是以栈的方式进行管理,具体内容接下来一节会详细描述。
3. 完成端口原理
先mark下,后续内容会继续补上。
windows IOCP完成端口实用详解
最新推荐文章于 2022-06-10 16:40:58 发布