内容摘要:本文首先介绍了同步选择机制和异步选择机制的基本概念,然后通过讲述消息驱动与socket服务机制的矛盾引入了异步选择机制,接着本文结合一个实际的异步选择通信案例来具体介绍异步选择机制设计中的相关细节和方法,最后对异步选择机制的特点进行总结并和同步选择机制做了一番比较,得出结论。
关键字:异步选择 同步选择 socket服务
Abstract:In this essay, the Synchronized Selection mechanism and Asynchronized Selection mechanism is introduced at first. Then it tells why Asynchronized Selection mechanism is needed via the conflict between event-driven system and socket service mechanism. After that a practical instance for Asynchronized Selection mechanism is given to explain it more clearly concerned with corresponding design methods and details. At last a conclusion for the feature of Asynchronized Selection mechanism and the difference between Synchronized Selection mechanism and it is shown.
Key Words:Asynchronized Selection, Synchronized Selection, socket service
一、同步选择机制与异步选择机制的基本概念
1.同步选择机制简介
同步选择机制的应用是基于多路复用的实际问题模型。为了能够使多条连接上的数据同时通信,select()同步选择机制应运而生。
Select()函数是同步选择机制中最基础最核心的概念,下面对此函数的功能、参数和相关要素做必要的说明:
功能——该函数能检查多个套接字的状态,服务器可以根据这些信息做出相应的处理;
输入——套接字队列;
输出——各待查套接字的当前状态;
函数定义:
int select ( IN int nfds, IN OUT fd_set * readfds,
IN OUT fd_set *writefds, IN OUT fd_set *exceptfds,
IN struct timeval *timeout )
基于select()的程序可以认为是具有事件驱动的特点,而select可以看做事件发生器,对事件进行分发处理。
Select同步选择机制处理事件的基本流程如下图1所示:
图1 select同步选择机制的事件处理流程
2.异步选择机制简介
异步选择机制的提出是为了解决窗口程序中所遇到的窗口无响应问题,这一点将在第二部分进行详细的说明。
因为异步选择机制是对同步选择机制的一些修正和改良,所以它不仅能够解决窗口不响应的问题,并且同样能顾实现多路复用。
异步选择机制中最核心的概念是WSAAsyncSelect()函数,这一函数的详细说明也将在第二部分展开。
异步选择机制处理事件的基本流程如下图2所示:
图2 异步选择机制的事件处理流程
二、选用异步选择机制的背景
1.消息驱动与socket服务机制的矛盾
下图是基于select的消息驱动机制基本框架,可以看到,该框架中有两个循环:一个是基于Windows(窗口)消息的循环,一个是基于select(读事件、写事件等)的循环。
图3 基于select的消息驱动机制
一个显而易见的事实是:当程序陷入基于select的事件循环后,没有办法跳出,则不能正常响应窗口消息。
矛盾的根源在于:循环等待客户连接和循环等待客户数据。在窗口程序中循环或者阻塞都会影响到主线程对消息的响应。
2.解决矛盾的两种思路
根据上面提出的矛盾,有两种解决问题的思路:第一种办法是为所有需要循环等待的程序段生成线程,第二种办法是不在程序中循环等待并不断接受客户连接。
第一种办法的解决思想是:为需要循环等待客户连接的部分生成子线程,为需要循环等待数据连接的部分生成子线程。则程序框架如下所示:
图4 多线程解决方案
第二种办法的解决思想如下图所示: