共同点:
ServerSocket serverSocket = new ServerSocket(80);
sokcet s = serverSocket.accept();
区别:
1 原始:(线程池)
每来一个请求分配新的一个线程来处理,继续等待下一个请求,这个过程中每一个线程一直等待数据的到来。这种情况导致随并发量多 线程数增加,系统消耗比较大
2 select(2个线程)
每来一个请求则把s给select,继续等待下一个请求。来数据时select里copy一个套接字,来处理缓冲区数据(这个过程很耗时),因当时的条件所限制select里只能放64个套接字,也就是说并发最大量为64. 一个线程处理接受,另一个进程处理套接字处理数据
3 poll(2个线程)
每来一个请求把s给poll(push进去),继续等待下一个请求,来数据时从push里弹出套接字(不用copy了),处理缓冲区的数据。支持并发可以数千个。
一个线程处理接受,另一个进程处理套接字处理数据
4 epoll(2个线程)
每来一个请求把s给epoll(push进去),来数据时缓存,需要处理数据时,把缓冲区的数据和套接字一起返回,这样节省了readBuffer的时间,效率更高
一个线程处理接受,另一个进程处理套接字处理数据
下面深入讲一下epoll模型和iocp模型的异同之处
目前国内的网游研发,在服务器使用的开发平台方面,win和linux的比例各占多少,我一时半会也没有准确数据,但从我了解的这么多公司情况来看,用win系统的还是比较多一点,这些企业一般都是比较单纯的网游公司,而用linux的则多数是一些传统的互联网公司,比如网易和腾讯。
网游服务器用win还是linux,向来都是大家关注的话题。我想,原因可能很多,但此处不想过多论述这个问题,为避免多费口舌,我还是明确表明一下自己的观点:我是推荐用linux作开发的,虽然我也是刚转来作linux平台下的开发。
那么,说具体一点。但凡作过比较深入的网络编程的人,都会知道,在win平台下,高效的IO模型是IOCP,而在linux底下则是epoll。那么,epoll与iocp之间到底有哪些异同之处呢?
首先,我们看一下它们相同的地方。
两者都是处理异步IO的高效模型,这种高效,除了“异步处理”这个共同的特征之外,二者都可以通过指针携带应用层数据:在IOCP里,应用层数据可以通过单句柄数据和单IO数据来与IOCP底层通信;而在epoll里,可以通过epoll_data里的"void *ptr"来传递。这是一种很重要的思想,也是它们高效的原因所在:当事件的通知到来时,它不仅告诉你发生了什么样的事件,还同时告诉这次事件所操作的数据是哪些。
那么,epoll和iocp到底又有什么不同呢?
以我目前粗浅的使用经验来看,至少可以得到以下结论:
1.iocp是在IO操作完成之后,才通过get函数返回这个完成通知的;而epoll则不是在IO操作完成之后才通知你,它的工作原理是,你如果想进行IO操作时,先向epoll查询是否可读或可写,如果处于可读或可写状态后,epoll会通过epoll_wait函数通知你,此时你再进行进一步的recv或send操作。
2.在1的基础上,我们其实可以看到,epoll仅仅是一个异步事件的通知机制,其本身并不作任何的IO读写操作,它只负责告诉你是不是可以读或可以写了,而具体的读写操作,还要应用层自己来作;但iocp的封装就要多一些,它不仅会有完成之后的事件通知,更重要的是,它同时封装了一部分的IO控制逻辑。从这一点上来看,iocp的封装似乎更全面一点,但是,换个角度看,epoll仅提供这种机制也是非常好的,它保持了事件通知与IO操作之间彼此的独立性,使得epoll的使用更加灵活。
分享到:
相关推荐
本文将深入探讨5种常见的Socket模型,以及它们在VC++环境下的实现源码。 一、同步阻塞IO模型 这是最基础的Socket模型,也是最简单的实现方式。在这个模型中,读写操作会一直阻塞,直到数据传输完成。在VC++中,通常...
Java Socket模型是网络编程中的基础概念,主要用于实现客户端与服务器之间的通信。在这个简单的Java Socket模型中,我们将深入探讨如何创建和使用Sockets进行数据传输,这对于初学者来说是一块重要的学习内容。 ...
本篇将深入探讨Windows Socket模型,尤其是select和events两种事件驱动模型,以及如何在实际应用中选择和使用它们。 1. **Windows Socket基础** - Winsock提供了跨平台的网络通信能力,允许开发者通过TCP/IP协议栈...
在Windows操作系统中,Socket编程涉及多种I/O模型,这些模型为开发者提供了处理网络通信的不同方式。以下是五种主要的Windows Socket I/O模型的详细说明: 1. **选择模型(Select)**: Select模型是最传统的I/O...
Socket IO模型是网络编程中用于实现进程间通信的关键技术,特别是在服务器端开发中扮演着重要角色。本文将详细探讨Windows平台下支持的六种Socket IO模型,并以生动的例子进行解释。 首先,我们来看第一种模型——`...
完整介绍了socket编程的各种模型包括 Winsock基础 原始套接字 select模型 WSAAsyncSelect WSAEventSelect 重叠模型 完成端口模型 I/O模型的问题 套接字选项和I/O控制命令 是全面了解socket编程的好书
Socket模型详解 在计算机网络编程中,Socket是客户端和服务器之间通信的基本机制。本文将深入探讨Socket模型,特别是针对Windows平台的Socket I/O操作,包括阻塞模式、非阻塞模式以及五种常见的Socket I/O模型:...
#### Socket简介 Socket是用于网络通信的一种机制,允许程序之间通过网络进行数据交换。在TCP/IP协议栈中,Socket提供了访问底层协议(如TCP、UDP)的接口,使得应用程序可以不关心底层细节,而专注于业务逻辑。 ##...
Socket网络事件通讯模型是计算机网络编程中的一个重要概念,主要用于实现客户端和服务器端的高效通信。在这一模型中,事件驱动机制被用来处理网络连接、数据传输以及错误处理等任务,从而提高了程序的响应速度和资源...
本篇文章将深入探讨基于C#实现的点对点(P2P)Socket通信模型。 首先,让我们理解什么是Socket。Socket是网络上的进程间通信(IPC)的一种接口,它允许两个或更多的应用程序通过网络交换数据。在C#中,`System.Net....
"UNIX SOCKET编程简介" UNIX SOCKET编程是指使用操作系统提供的 SOCKET API 进行网络编程的技术。它提供了一个统一的接口,能够在不同的网络协议和设备上进行通信。 Layered Model of Networking SOCKET 编程的...
### SOCKET模型之重叠IO深度解析 #### 一、重叠模型的优点 重叠I/O模型,作为SOCKET编程中的高级技术,具有显著优势,尤其在高性能网络应用中展现出色性能。 1. **跨平台性**:重叠I/O模型能够运行在所有支持...
【基于Linux的消息驱动Socket模型】 在Linux操作系统中,网络编程主要依赖于Socket接口。传统的Socket模型包括阻塞式、非阻塞式、信号驱动和多路复用等四种输入输出模型,各有优缺点。其中,阻塞式模型简单易用但...
Windows Socket 五种I/O模型是Windows操作系统为网络编程提供的不同方式,以适应不同的应用场景和性能需求。这些模型包括: 1. **选择模型(Select)**: Select模型是基于Berkeley套接字的一个经典I/O管理机制。...
### Socket模型C++版本详解 #### 一、引言 Socket是网络编程中不可或缺的一部分,它使得不同计算机之间能够通过网络进行数据交换。在Windows环境下,实现Socket的主要库是Winsock,而C++作为一种强大的面向对象语言...
socket程序,客户端 服务器,5种模型 select WSAAsyncSelect EventSelect select OVERLAPPED CompletionPort libevent 共9个程序,1个启动client工具,一个client程序,7个服务器程序,各不相同
PPT文件"网络软件设计"系列可能涵盖了这些内容的详细讲解,包括TCP/IP协议栈、网络模型(OSI模型和TCP/IP模型)、套接字API的使用示例、异常处理以及多线程或多进程的并发处理等。 例如,`网络软件设计1.ppt`可能...