2024年3月27日发(作者:)

本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重

要的技术概念,这些概念都是与基于IOCP的开发密切相关的,对开发人员来讲,又不得

不给予足够重视的几个概念:

1) 基于IOCP实现的服务吞吐量

2)IOCP模式下的线程切换

3)基于IOCP实现的消息的乱序问题。

一、IOCP简介

提到IOCP,大家都非常熟悉,其基本的编程模式,我就不在这里展开了。在这里我

主要是把IOCP中所提及的概念做一个基本性的总结。IOCP的基本架构图如下:

如图所示:在IOCP中,主要有以下的参与者:

--》完成端口:是一个FIFO队列,操作系统的IO子系统在IO操作完成后,会把相

应的IO packet放入该队列。

--》等待者线程队列:通过调用GetQueuedCompletionStatus API,在完成端口上

等待取下一个IO packet。

--》执行者线程组:已经从完成端口上获得IO packet,在占用CPU进行处理。

除了以上三种类型的参与者。我们还应该注意两个关联关系,即:

--》IO Handle与完成端口相关联:任何期望使用IOCP的方式来处理IO请求的,必

须将相应的IO Handle与该完成端口相关联。需要指出的时,这里的IO Handle,可以是

File的Handle,或者是Socket的Handle。

--》线程与完成端口相关联:任何调用GetQueuedCompletionStatus API的线程,

都将与该完成端口相关联。在任何给定的时候,该线程只能与一个完成端口相关联,与最

后一次调用的GetQueuedCompletionStatus为准。

二、高并发的服务器(基于socket)实现方法

一般来讲,实现基于socket的服务器,有三种实现的方式(thread per request

的方式,我就不提了:)):

第一、线程池的方式。

使用线程池来对客户端请求进行服务。使用这种方式时,当客