基于多线程的高性能服务器程序的设计

  • 格式:doc
  • 大小:74.50 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于多线程的高性能服务器程序的设计

摘要:随着网络应用的迅猛发展,高性能服务器程序越来越凸显出其重要地位。

文中基于多线程设计了高性能服务器程序,从而对处理客户端的并发请求问题提出了很好的解决方案。文中首先介绍了IOCP模型的原理,接着分别运用Select 模型和IOCP模型对高性能服务器程序的设计提出了不同的设计方法,通过比较时间、CPU的利用率和内存的使用率等参数,得出IOCP在设计服务器上提供了最佳的系统性能。最后提出了高性能服务器程序的设计方案。

关键字:Select 模型;IOCP模型;并发控制;事件;流的控制

1引言

目前很多服务器程序都是采用“一对一”处理模式,即一个客户占用一个线程,基于这种模式的服务器程序在框架上设计很简单,但是由于采用的是“一客户/一线程”的模式,所以这种服务器程序对于上千客户的请求连接,其在性能上就显得很低,在系统资源上的开销也很大。由于操作系统必须为大量的线程进行调度,从而会损耗大量的系统资源,另外互斥控制也会显得很困难,死锁发生的频率也会大幅度的增大。

现如今高性能服务器程序的设计显得越来越重要,高性能服务器程序的主要作用是能够高效的处理大量并发客户的请求,并且快速及时的处理客户的数据,同时将部分应答信息回传给客户端。要设计好一个性能优良的服务器程序,要考虑很多方面的因素,如CPU的使用率、Memory的开销等。要想做到高效处理并发用户的请求,服务器程序就需要解决两个主要的问题,一是处理并发客户的连接请求,二是对并发数据的处理。要解决这些问题,可以根据处理器内核的数量,来创建等量的工作线程,并结合IOCP(Input/Output Completion Port,IOCP))模型,以及操作系统的线程调度机制。文中采用多线程并结合IOCP模型对高性能的服务器程序设计进行了深入的探讨。

2 IOCP模型原理

IOCP(I/O Completion Port 输入/输出完成端口)是一种能够合理利用与管理多线程的机制。它是迄今为止Windows平台上最为复杂的一种I/O模型,当应用程序必须一次管理多个套接字时,完成端口模型提供了最好的系统性能,这个模型也提供了最好的伸缩性,非常适合用来处理上百、上千个客户。

IOCP模型提供了一个高效复杂的内核对象,该对象通过指定数量的线程,可

以在套接字上投递重叠发送和接收请求处理I/O。它的核心思想简单概括如下:将所有用户的请求投递到一个消息队列中,利用事先创建好的若干个工作者线程逐一从消息队列中取出消息并加以处理。它可以为任何用户的任何I/O操作服务,只需少数几个线程就可以处理大量I/O请求,避免CPU花费时间在大量的线程调度上,提高了资源的利用率。

3 服务器程序的设计

3.1采用Select模型处理并发用户

Select模型是一个广泛在Winsock中使用的I/O模型。该模型主要用select函数来管理I/O,避免了服务器程序因接收来自客户端数据而发生阻塞的现象,从而使服务器可以有能力管理多个客户。下面先看看Select函数,

intselect(

intnfds,

fd_setFAR*readfds,

fd_setFAR*writefds,

fd_setFAR*exceptfds,

const struct timevalFAR*timeout

);

该函数中的readfds参数用于对套接字的可读性进行检查,writefds参数用于检查数据是否可以外出,exceptfds参数检查是否有带外数据可读取。下图1所示为使用Select确定套接字状态的过程。

图1 Select 模型的原理图

使用Select模型的好处是程序能够在单线程内同时处理多个套接字连接,这避免了阻塞模式下的线程膨胀问题。在C/S模式中,Select 模型能够解决服务器程序等待客户端发送数据而阻塞的问题。同时,在Ioctsocket(SOCKET,NULL)API函

数的使用上,由于要为每个客户端的连接开辟一个单独的线程,使用Select模型就可以解决系统资源大量消耗的瓶颈问题。该模型对于少量的客户连接其效率是可以接受的。但是对于大量并发客户的连接,处理起来性能就比较低下。另外基于select 模型的服务器程序处理的客户连接是非常有限的,因而大型服务器程序很少采用该模型。然而IOCP模型恰恰能够很好的解决这个问题。

3.2采用IOCP模型处理并发用户

3.2.1多线程的并发处理

众所周知,高并发的大型服务器程序一直面临着架构复杂、线程众多难以管理、并发性能提升困难的问题。为此,各种平台都提供系统级的高级设施来协助开发者解决这个难题,例如Linux平台的epoll。对于我们熟悉的Windows平台,则有一个名为IOCP(完成端口)的内核对象,通过它,我们可以方便地创建高并发、高性能、可伸缩的网络服务器程序。下图2为IOCP模型用来解决大量用户同时请求连接服务器问题的示意图。

图2 IOCP模型图

秉承低耦合的原则,在服务器程序设计中,我们为并发用户的连接请求,创建了四个独立的线程来进行调度处理客户的连接请求。采用这种四个线程(双核处理器)处理的机制,用来处理用户连接请求的建立,能够很好的解决大量并发用户的连接请求。

3.2.2并发客户缓冲链表策略

在该服务器程序的设计中我们采用链表缓冲策略来进一步的解决这个问题。该策略的原理图如下图3所示。

图3 缓冲链表图

把已经建立的客户插入到缓冲链表中以供其他线程接收客户端发送过来的数据。在这种模式下,这四个线程只需与客户建立连接,而不去处理客户的其他请求,从而提高了服务器程序处理客户请求的速度。也不必因为等待客户端的数据,而阻塞在建立连接的线程中。

3.2.3 并发互斥的控制

当然这几个服务器程序中的几个线程之间要处理好互斥问题,因此我们还采用了临界段(Critical section),通过临界段来控制线程之间的对共享数据(数据缓冲链表)的操作。这种机制在很大程度上可以解决服务器程序因为访问同一内存地址,而导致的内存访问冲突(内存不能为read或者不能为write)。

3.2.4懒惰资源的智能回收机制

在服务器程序设计过程中还考虑到系统的有限资源,不能把系统宝贵的资源分配给一些长时间没有任何操作的客户。在该服务器程序中把分配给这些用户的资源称为懒惰资源。为了充分利用系统资源,服务器程序还采用了清理策略,即在规定的时间内,只要客户不进行任何相关的操作如:未发送数据,则强制关闭该客户并将其所占的懒惰资源进行回收重新利用。

这种采用链式的处理思想存在一定的误差,即不能够很准确的在规定的时间内将所有符合条件的客户连接给断开,但是这种思想能够减少系统宝贵资源的消耗。

3.3大量并发数据的处理

在该服务器程序中客户端每隔一定的时间便向服务器发送指定格式的信息,所以数据信息量是非常庞大的。为了解决这个问题,采用了双缓冲机制的策略,通过使用两个缓冲区实现了对大量数据的接收和处理。其原理图如下图4所示。