Windows平台网络通信中的I/O操作的总结与类比

    此篇博客是我专门针对我的一本教科书进行的笔记整理。以前我一直采用的纸质的笔记本进行的记录,现在将它们转录到博客上,也随一下大流。

这篇文章是刘琰、刘龙等编著的由机械工业出版社出版的《Windows 网络编程》(标准书号:ISBN 978-7-111-44196-0)  一书的第8章进行的笔记(总结)。

总览:

    Windows平台网络通信的I/O模型共有7种:

1、阻塞模型;2、非阻塞模型;3、I/O复用模型;4、WSAAsyncSelect模型;5、WSAEventSelect模型;6、重叠I/O模型;7、完成端口模型。

   计算机的外设设备分为以下三类:

   1,I/O类设备:为慢速设备,常见如显示器,键鼠,打印机,扫描仪等

   2,存储类设备:为快速设备,如硬盘。

   3,网络通信类设备:速度介于慢速外设和快速外设之间,如调制解调器等。

溯源:(书上的原话)

使用网络设备进行数据的发送与接收也面临与传统I/O操作类似的环节,网络操作经常会面临I/O事件的等待,这些等待事件大致可分为以下几类:

等待输入操作:等待网络中有数据可以被接收;

等待输出操作:等待套接字实现中有足够的缓冲区保存待发送的数据;

等待连接请求:等待有新的客户建立连接或对等方断开连接;

等待连接响应:等待服务器对连接的响应;

等待异常: 等待网络连接异常或有带外数据可被接收。

特别说明同步、异步、阻塞、非阻塞四个概念:

同步和异步两个概念与消息的通知机制有关,自己等待消息是否被触发叫同步,由触发机制来通知消息处理者叫异步。

阻塞与非阻塞与消息的处理机制有关,在操作没有完成前,函数不会立即返回则为阻塞模式,立即返回则为非阻塞模式。

同步不一定阻塞,也可以非阻塞,异步不一定非阻塞,也可以被阻塞。

应用程序将控制权交给内核,默认会阻塞,一直等到网络事件满足,操作被处理完成后,控制权返还给应用程序。

阻塞模型的评价:

    优点:常用,简单直接;不足:多套接字时导致处理时间较长,程序执行效率降低。针对此问题有两个解决思路:

思路一:使用多线程并发处理多个I/O请求。     思路二:异步、非阻塞处理多个I/O请求。


调用ioctlsocket()函数将套接字设置为非阻塞模式。

非阻塞模型的评价:

    优点:应用程序进程可以做其他事情,还可以轮询多个套接字,改串行等待为并行等待;不足:不适用于对实时性要求较高的应用中。


I/O复用模型也称为select模型。(此处应该有着重符号!)

调用select()函数可以获取一组指定套接字的状态,以保证及时捕获到最先满足条件的IO事件,进而对select()函数中观测的多个不同套接字上的不同网络事件进行及时处理。

为了对套接字集合进行操作,有四个参数宏比较有用:

FD_CLR(s,*set)     

FD_ISSET(s,*set)

FD_SET(s,*set)

FD_ZERO(*set)

select模型的评价:

    优点:单线程可以达到多线程类似的效果,  最多可以管理的套接字数量是1024个。适合定时精度要求高的应用。不足在于系统调用花销。


WSAAsyncSelect模型又称为异步选择模型,为Windows的消息驱动机制而引入,MFC中的CSocket类也使用了它。

Windows操作系统的消息机制相关的内容此处不作赘述(难得打字)

调用WSAAsyncSelect()函数

异步选择模型的评价:

    优点:消息机制支持。   不足:性能瓶颈。


WSAEventSelect模型依靠事件机制。

相关函数:

1,  WSACreateEvent()函数:    默认创建的事件对象处于人工重置和未授信的状态。

2,WSAResetEvent()函数:将事件对象从事件被响应后的已授信状态重置为未授信状态。

3,WSASetEvent()函数:将指定事件设置为已授信状态。

4,WSACloseEvent()函数:

5,核心函数:WSAEventSelect()函数

6,WSAWaitForMultipleEvents()函数:阻塞等待!

7,WSAEnumNetworkEvents()函数:枚举网络事件

WSAEventSelect模型评价:

    优点:不依赖于消息,不用有窗口;不足:等待的事件对象总数每次最多64个,受限。


重叠I/O模型的核心是一个重叠数据结构体:WSAOVERLAPPED,这个结构体中有成员可以和事件对象关联起来。

相关函数:

1,WSAGetOverlappedResult()函数:查询I/O操作的结果。

2,套接字创建函数:WSASocket();

3,数据发送,接收函数:WSASend()和WSASendTo() ,      WSARecv()和WSARecvFrom()

实际编程中,可以使用事件通知和完成例程两种方式来管理重叠I/O操作,     完成例程就是一个函数指针,或者说是回调函数。

重叠I/O模型的评价:

   更佳的系统性能。


完成端口模型是Windows下伸缩性最好的I/O模型,同时也是最复杂的内核对象。因其内部提供了线程池的管理,从而提高了程序的并行处理能力。

如多人在线游戏,大型即时通信系统,网吧管理系统以及企业管理系统。

循环服务器和并发服务器的区别:单线程与多线程(改进:线程池)

完成端口可看作是系统维护的一个队列,之所以命名为“完成端口”是因为它是标识“操作完成”的事件通知。

相关函数:

1,完成端口对象的创建函数:CreateIoCompletionPort()

2,等待重叠I/O操作结果的函数:GetQueuedCompletionStatus()

完成端口模型的评价:

    完成端口模型是应用程序使用线程池处理异步I/O请求的一种机制,当应用程序需要管理上千个套接字时,利用完成端口模型往往可以达到最佳系统性能。

除了对套接字对象进行管理外,还可以应用于文件对象。


以上是对该书的第8章的一个知识点概括,纯为梳理备忘。





你可能感兴趣的:(Windows平台网络通信中的I/O操作的总结与类比)