比较IOCP与传统Server/Client实现的利弊

本文从 IOCP 的基本概念和思想出发,比较 IOCP 与传统 Server/Client 实现的利弊,分析了 JDK 中异步 I/O 和 IOCP 的具体实现,并以一个 Log 集中处理的实例分析和介绍了 IOCP 思想在具体实践中的应用。

随着计算机技术,尤其是">网络技术的飞速发展,如今的程序开发人员不仅仅局限于基于单机运行或单一线程的应用程序的开发。服务器端 / 客户端模式的最显著的特点是一个服务器端应用能同时为多个客户端提供服务。而传统的服务器端 / 客户端模式通常为每一个客户端创建一个独立的线程,这种实现方式在客户端数量不多的情况下问题不大,但对于类似于铁路网络订票这样的瞬间客户数量巨大的系统来说,效率极端低下。这是因为一方面创建新线程操作系统开销较大,另一方面同时有许多线程处于运行状态,操作系统内核需要花费大量时间进行上下文切换,并没有在线程执行上花更多的时间。

因此,微软在 Winsocket2 中引入了 IOCP(Input/Output Completion Port)模型。IOCP 是 Input/Output Completion Port(I/O 完成端口)的简称。简单的说,IOCP 是一种高性能的 I/O 模型,是一种应用程序使用线程池处理异步 I/O 请求的机制。Java7 中对 IOCP 有了很好的封装,程序员可以非常方便的时候经过封装的 channel 类来读写和传输数据。

同步 / 异步,阻塞 / 非阻塞

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数或方法都是同步调用。

异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

通俗来讲,完成一件事再去做另外一件事就是同步,而一起做两件或者两件以上的事情就是异步了。

拿一个服务器与客户端通信的例子来说。

如果是同步:

Client 发送一条请求消息给 Server,这个时候 Client 就会等待 Server 处理该请求。这段时间内 Client 只有等待直到 Server 回复响应信息给 Client。Client 只有收到该响应信息后,才能发起第二条请求消息。这样无疑大大降低了系统的性能。

而如果是异步:

Client 发送一条请求消息给 Server,Client 并不等待 Server 的处理结果,而是继续发送第二条甚至更多的请求消息。Server 会将这些请求都存入队列,逐条处理,并将处理完的结果回复给 Client。这样一来,Client 就可以不用等待,效率大大提高。

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数或方法只有在得到结果之后才会返回。阻塞和同步有点类似,但是同步调用的时候线程还是处于激活状态,而阻塞时线程会被挂起。

非阻塞调用和阻塞的概念相对应,指在不能立刻得到结果之前,该函数或方法不会阻塞当前线程而是立刻返回。

清单 1. 传统的网络应用代码

try { ServerSocket server = new ServerSocket(9080); while (true) { Socket client = server.accept(); new Thread(new SocketHandle(client)).start(); } } catch (IOException e) { e.printStackTrace(); }

相信只要写过网络应用程序的朋友,应该对这样的结构再熟悉不过了。Accept 后线程被挂起,等待一个客户发出请求,而后创建新线程来处理请求。当新线程处理客户请求时,起初的线程循环回去等待另个客户请求。在这个并发模型中,对每个客户都创建了一个线程。其优点在于等待请求的线程只需要做很少的工作,而大部分的时间,该线程在休眠,因为 recv 处于阻塞状态。如前文所述,创建线程的开销远远大于程序员的预计,尤其是在并发量巨大的情况下,这种传统的并发模型效率极端低下。

解决这个问题的方法之一就是 IOCP,说白了 IOCP 就是一个消息队列。我们设想一下,如果事先开好 N 个线程,让它们 hold 住,将所有用户的请求都投递到一个消息队列中去。让后这 N 个线程逐一从消息队列中去取出消息并加以处理。这样一来,就可以避免对没有用户请求都开新线程,不仅减少了线程的资源,也提高了线程的利用率。

时间: 2024-08-26 20:25:45

比较IOCP与传统Server/Client实现的利弊的相关文章

A simple IOCP Server/Client Class

  Download demo project v1.13 - 64.4 Kb Download source v1.13 - 121 Kb 1.1 Requirements This article expects the reader to be familiar with C++, TCP/IP, socket programming, MFC, and multithreading. The source code uses Winsock 2.0 and IOCP technology

winsock-如何在本地测试Server/Client程序,UDP和TCP协议,本地需要在命令行测试还是在哪里测试

问题描述 如何在本地测试Server/Client程序,UDP和TCP协议,本地需要在命令行测试还是在哪里测试 写好的程序怎么测试通信是否正常,如何在本地测试Server/Client程序,UDP和TCP协议,本地需要在命令行测试还是在哪里测试 解决方案 可以用命令行执行服务端和客户端,然后打印输出,也可以在局域网内,一台机器跑服务端,一台跑客户端 解决方案二: 直接将客户端和服务器端运行起来,测试下就可以了.

指令-MFC socket server/client

问题描述 MFC socket server/client 使用MFC socket编程,想读取传感器的数据.传感器是该作为server端还是client端?为什么在网口调试助手里发送传感器内部指令没有任何反馈信息呢? 解决方案 一般的设备server端和client端都是支持的,请检查一下选择的协议是否两边的都对应,如果都是tcp就都用tcp如果是udp就都用udp. 其他的也就是楼上说的看看时候建立了连接,IP和端口,再查下数据格式是否正确. 解决方案二: 谁向谁发信息,谁就可以看作是客户端

【APACHE MINA2.0开发之二】自定义实现SERVER/CLIENT端的编解码工厂(自定义编码与解码器)!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/apache-mina/839.html 在上一篇博文中已经简单介绍过"过滤器"的概念,那么在Mina 中的协议编解码器通过过滤器 ProtocolCodecFilter 构造,这个过滤器的构造方法需 要一个 ProtocolCodecFactory,这从前面注册 TextLineCodecFactory 的代码就可以看出来. Pr

TCP SERVER/CLIENT UDP通讯

问题描述 花了快10天学习了TCPUDP这块的程序,今天终于把UDP和TCPServer端与Client端的程序调试通了.现在把源码分享给需要的朋友!http://pan.baidu.com/s/1nt20VVV程序还有很多可以完善修改的地方,也欢迎大家提出指导意见!分享是为了以后能学习到更多的知识!

使用Java实现简单的server/client回显功能的方法介绍_基础知识

Socket是指在一个特定编程模型下,进程间通信链路的端点.因为这个特定编程模型的流行,Socket这个名字在其他领域得到了复用,包括Java叫技术. 如果要建立连接,一台机器必须运行一个进程来等待连接,而另一台机器必须试图到达第一台机器.这个电话系统类似:一方必须发起呼叫,而另一方在此时必须等待电话呼叫. java网络模型图 下面通过一个有"回显"功能的服务器和客户端来介绍应用java.net包编写网络应用程序.   这个例子主要功能是服务器端的程序等待客户的输入,然后将读取到的信息

Mysql Client链接Mysql Server的认证方式

参见:http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Password_functions 我意译一下,大致就是以下内容: 4.0版本之前 1.服务器发送随机字符串(scramble_buff)给客户端. 2.客户端把用户明文密码加密一下,然后将hash加上服务器的随机字符串加密一下变成新的scramble_buff.(参见sql/password.c:scramble()). 3.客户端将加密后的scrambl

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

Client:TSocketConnection 和Server: Scktsrvr关系----压缩数据传输方案

Client:TSocketConnection 和Server: Scktsrvr关系----压缩数据传输方案 一直用SocketConnection和服务端的传输数据在三层数据库中,从来没有注意到它们之间的数据传输,只是想着,管它了,网络的事,前段时间在Delphi中的Demos中发现Demos/Midas/Intrcpt.dpr例子,呵呵,再看了半天的VCL发现可以将Client端发送的给Server的数据,和Server发送给Client的数据是可以进行压缩的.呵呵,不敢藏私,Share