WinSock IOCP 模型总结(附一个带缓存池的IOCP类)

前言

  由于篇幅原因,本文假设你已经熟悉了利用Socket进行TCP/IP编程的基本原理,并且也熟练的掌握了多线程编程技术,太基本的概念我这里就略过不提了,网上的资料应该遍地都是。

  IOCP全称IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的Windows I/O模型,它可以自动处理I/O操作,并在I/O操作完成后将完成通知发送给用户。本文主要介绍基于IOCP的网络I/O操作(即socket的Accept、Send、Recv和Close等)。Windows提供了6种网络通信模型,分别是:

  1. 阻塞模型:accept、recv和send操作会阻塞线程,直到操作完成,极其低效。
  2. 选择(select)模型:轮询方式探测socket上是否有收发的操作,再调用accept、recv和send操作,核心是select()函数,比阻塞模型高效一点,缺点是一次只能探测64个socket,需要手动调用recv和send进行收发数据。
  3. 异步选择(WSAAsyncSelect)模型:利用Windows窗口消息机制响应socket操作,即当socket上有Accept、Send、Recv和Close操作发生时发送一条自定义消息给指定窗口,在窗口中响应socket操作,需要手动调用recv和send进行收发数据。与select模型相比,不需要轮询方式探测socket,socket上有操作发生即发送通知给窗口窗口,缺点是需要一个窗口对象处理socket的消息,需要手动调用recv和send进行收发数据。
  4. 事件选择(WSAEventSelect)模型:原理基本同WSAAsyncSelect模型,但是不需要窗口,利用事件(Event)机制来获取socket上发生的I/O操作。缺点是一次只能等待64个事件,需要手动调用recv和send进行收发数据。
  5. 重叠 I/O(Overlapped I/O)模型:利用重叠数据结构(WSAOVERLAPPED),一次投递一个或多个Winsock I/O请求,等这些请求完成后,应用程序会收到通知,用户可以直接使用 I/O操作返回的数据。简单的说:投递一个WSASend请求和接受数据的缓冲区,系统在接收完成后在通知用户,用户可以直接收到的数据,WSASend操作同理。有两种方式来管理重叠IO请求的完成情况(就是说接到重叠操作完成的通知):

    1). 事件对象通知(event object notification)

    2). 完成例程(completion routines) ,注意,这里并不是完成端口

    优点是不用管收发过程,直接提供(发送时)/使用(接收时)数据。缺点是实现略复杂。

  6. IOCP(I/O Completion Port)模型:本文要介绍的模型,见下文。

  以上I/O模型由1-6难度依次提高,性能也相应地依次提高。

  (未完待续……)

原文地址:https://www.cnblogs.com/tanguoying/p/8439701.html

时间: 2024-08-30 12:17:35

WinSock IOCP 模型总结(附一个带缓存池的IOCP类)的相关文章

IOCP模型与网络编

一.前言:        在老师分配任务(“尝试利用IOCP模型写出服务端和客户端的代码”)给我时,脑子一片空白,并不知道什么是IOCP模型,会不会是像软件设计模式里面的工厂模式,装饰模式之类的那些呢?嘿嘿,不过好像是一个挺好玩的东西,挺好奇是什么东西来的,又是一个新知识啦~于是,开始去寻找一大堆的资料,为这个了解做准备,只是呢,有时还是想去找一本书去系统地学习一下,毕竟网络的资料还是有点零散.话说,本人学习这个模型的基础是,写过一个简单的Socket服务器及客户端程序,外加一个简单的Socke

IOCP模型与网络编程

IOCP模型与网络编程 一.前言:        在老师分配任务("尝试利用IOCP模型写出服务端和客户端的代码")给我时,脑子一片空白,并不知道什么是IOCP模型,会不会是像软件设计模式里面的工厂模式,装饰模式之类的那些呢?嘿嘿,不过好像是一个挺好玩的东西,挺好奇是什么东西来的,又是一个新知识啦~于是,开始去寻找一大堆的资料,为这个了解做准备,只是呢,有时还是想去找一本书去系统地学习一下,毕竟网络的资料还是有点零散.话说,本人学习这个模型的基础是,写过一个简单的Socket服务器及客

Window下高性能IOCP模型队列多线程下应用

IOCP,先从概念上认识一下.IOCP全称I/O Completion Port,中文译为I/O完成端口.是Windows平台最高效的I/O模块,现在IIS服务器,就采用IOCP模型.IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序.与使用select()或是其它异步方法不同的是,现在很多书,文字都直接将IOCP模块和网络编程关联起来,好像IOCP就是和网络打交道的.典型的IOCP模型的使用,是 将一个套接字(socket)与一个完成端口关联了起来,当一个网络事件发生的时

Yii的自带缓存的使用

Yii的自带缓存都继承CCache 类, 在使用上基本没有区别缓存基础类 CCache 提供了两个最常用的方法:set() 和 get().要在缓存中存储变量 $value,我们选择一个唯一 ID 并调用 set() 来存储它: Yii::app()->cache->set($id, $value); 被缓存的数据会一直保留在缓存中,直到因一些缓存策略而被删除(比如缓存空间满了,删除最旧的数据).要改变这一行为,我们还可以在调用 set() 时加一个过期参数,这样数据过一段时间就会自动从缓存中

winsock编程IOCP模型实现代码

winsock编程IOCP模型实现代码 话不多说,上代码.借鉴<windows核心编程>部分源码和CSDN小猪部分代码. stdafx.h依赖头文件: 1 #include <iostream> 2 #include <WinSock2.h> 3 #include <MSWSock.h> 4 #include <vector> 5 #include "Singleton.h" 6 #include "IOCPWrap

Winsock IO模型之IOCP模型

http://blog.csdn.net/lostyears/article/details/7436802 Windows平台上伸缩性最好的一种I/O模型莫过IOCP了,不过设计和实现起来比较复杂一些.针对成千上万个套接字的并发处理,IOCP采用了线程池+队列+重叠结构的内核机制完成任务.需要说明的是IOCP其实不仅可以接受套接字对象句柄,还可以接受文件对象句柄等. 为避免线程上下文切换,它采用了线程池.除此之外,在基于事件模型或重叠模型中不得不遇到WSAWaitForMultipleEven

Nginx源码分析 - Nginx启动以及IOCP模型

Nginx 源码分析 - Nginx启动以及IOCP模型 版本及平台信息 本文档针对Nginx1.11.7版本,分析Windows下的相关代码,虽然服务器可能用linux更多,但是windows平台下的代码也基本相似 ,另外windows的IOCP完成端口,异步IO模型非常优秀,很值得一看. Nginx启动 曾经有朋友问我,面对一个大项目的源代码,应该从何读起呢?我给他举了一个例子,我们学校大一大二是在紫金港校区,到了 大三搬到玉泉校区,但是大一的时候也会有时候有事情要去玉泉办.偶尔会去玉泉,但

IOCP模型总结(总结回顾)

IOCP旧代码重提,最近一直在玩其他方面的东东,时不时回顾一下,收益多多. IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型.它是应用程序使用线程池处理异步I/O请求的一种机制.在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求.这样就有很多的线程并行地运行在系统中.而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上.再加上创建新线程的开销比较大,所以造成了效率的

【IOCP】 IOCP模型属于一种通讯模型- 较难

http://baike.baidu.com/link?url=e9vXkKd2aHp8VDr1XTURdwQB4K85r28IYjeMwRIyuaXtsrCsXHY1eohiFgsDXRYRlj6xEQoZFzH9dgKwla2n3q IOCP(I/O Completion Port),常称I/O完成端口. IOCP模型属于一种通讯模型,适用于(能控制并发执行的)高负载服务器的一个技术. 通俗一点说,就是用于高效处理很多很多的客户端进行数据交换的一个模型.或者可以说,就是能异步I/O操作的模型