本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载、复制、引用。但任何对本文的引用,均须注明本文的作者、出处以及本行声明信息。
目前国内的网游研发,在服务器使用的开发平台方面,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的使用更加灵活。
这只是我初步使用epoll开发过程中的体会,以后有更深的体会时还会发上来跟大家分享。
分享到:
相关推荐
不同的操作系统提供了不同的I/O多路复用机制,如Linux中的epoll和Windows上的IO完成端口(iocp)。这里我们将深入探讨这些机制,并对比它们的工作原理、性能特点以及适用场景。 1. **epoll** - **定义**:epoll是...
与之相比,`IOCP`在Windows中提供了更底层的异步I/O控制。它是一个内核对象,应用程序可以提交I/O请求,并在操作完成后收到通知。`IOCP`的关键优势在于它能处理多个并发的I/O操作,并且在操作完成时能异步地通知线程...
iocp-epoll的几个例子,提供参考。 其中,iocp包含了几种使用方式,同步异步处理方式, epoll为linux下面使用,编译时可以使用下面简单命令, g++ -p -g -o hhh ***.cpp -l pthread
使用libevent库设置httpserver所使用的系统特征值(select、epoll、iocp等)
本报告对比了两种主要的异步I/O模型:Windows平台的IO Completion Ports (IOCP) 和Linux平台的Epoll (EOPLL)。测试在相同的硬件环境下进行,以评估它们在处理不同数量连接时的性能表现。 1. 环境 1.1 基础架构 ...
`epoll`利用内核与用户空间的共享数据结构来减少上下文切换,提高了系统在高并发环境下的性能。本篇文章将详细探讨如何使用Golang语言在Linux、MacOS和Windows平台上实现`epoll`。 首先,我们来理解`epoll`的工作...
在Windows平台上,IOCP是解决复杂、频繁的网络IO操作的最好机制,而在LINUX平台上,epoll是IOCP的等价机制。IOCP的内部机制是靠投递队列、完成队列、闲线程栈和事件触发机制实现的。 IOCP是一种高效的异步I/O模型,...
由于此处仅为Epoll类库的第一个版本, 因此错误之处必然会存在, 如果读者在阅读的过程中发现了该类库的BUG, 还望这篇博客的读者朋友不吝赐教; 而作者也会不断的更新该类库(主要更新代码我会发布到此处), 以处理新的...
Linux 类 IOCP 接口是一种基于 Epoll 的高效网络编程模型,它借鉴了 Windows 操作系统中的 I/O 完成端口(IOCP)概念,实现了异步非阻塞的 I/O 处理。在 Linux 环境下,由于没有原生的 IOCP 实现,开发人员通常会...
在内核源码中,epoll涉及到的结构体和函数与poll有明显差异,比如`epoll_wait`系统调用,其核心在于管理就绪事件的红黑树和链表结构,并在适当的时候通知用户空间。 ### 总结 在分析了poll和epoll的机制后,我们...
线程池与epoll结合,可以在多线程间共享epoll实例,提高系统资源利用率。 线程池 + epoll 的简单实现通常包括以下步骤: 1. 创建epoll实例:使用`epoll_create()`函数创建一个epoll实例,返回一个epoll文件描述符...
### epoll原理与实现 #### 一、概述 `epoll`是Linux系统中高效地进行I/O多路复用的一种机制,它相比之前的`select()`和`poll()`提供了更好的性能和扩展性。本文将深入探讨`epoll`的工作原理、内部实现细节以及如何...
《深入理解libevent-1.4.4-iocp-3:事件驱动编程与I/O复用技术的应用》 在IT行业中,事件驱动编程和I/O复用技术是构建高性能网络服务的关键技术之一。libevent是一个广泛使用的开源库,它为开发者提供了在多种操作...
1. **创建IOCP**:通过调用`CreateIoCompletionPort`函数创建一个IOCP,指定一个设备句柄或文件描述符与之关联,从而让该设备的I/O操作完成后通知IOCP。 2. **启动工作线程**:创建一组工作线程,它们将负责调用`...
相比于传统的同步I/O或异步I/O模型,如Select、Poll或Epoll,IOCP通过将I/O操作与处理结果的回调分离,提高了处理效率并减少了上下文切换的开销。 在Socket通讯中,服务端通常需要接受来自多个客户端的连接请求,并...
epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht
客户端则会创建一个普通套接字,通过`connect`与服务器建立连接。之后,客户端和服务端都可以通过`epoll_wait`来等待数据的读写。 四、epoll的事件模型 `epoll`支持两种事件模型: - LT(水平触发):当文件描述符...
### Linux网络编程之 epoll简介 #### 一、引言 在网络服务器编程中,当面对大量客户端连接时,传统的多线程或select模型已不再适用。本文将深入探讨一种高效的I/O事件处理机制——epoll,并简要介绍另一种高级I/O...
在深入讨论IOCP之前,首先需要理解基本的I/O模型,如同步阻塞I/O、异步非阻塞I/O以及I/O多路复用(如select、poll、epoll等)。然后,IOCP提供了一种更高级别的抽象,它允许多个线程并发地处理完成的I/O操作,从而...
linux 网络编程 epoll 简单示例 客户端 源码 只为学习epoll用 有不妥之处欢迎指正