最近需要使用Linux开发,需要在网络连接上复用。原有程序是使用每个请求进行一次创建线程,执行事务,销毁线程,这种模式来实现多个请求。现在希望能够基于线程池实现请求复用。实际上效果应该不会太好,因为:
- 请求都是内部高速Lan连接
- 单台服务器请求数不会超过500
- 属于CPU计算密集型;I/O较少。因此,主要耗时,还是服务本身,平均100ms/每核;假设线程创建销毁1ms,那么这1%即使完全节省下来,也不会有提高。
- epoll模型和select模型。理论上,此时epoll不会比select高效,理由Lan高速连接,连接都是Active而不是wait。当然,无论选择哪种,都不会提升服务质量,理由3
不管怎样,继续学习epoll的使用。
epoll用于Linux2.6上,主要用于处理高并发连接。
epoll 有3个函数:epoll_create,epoll_ctl,epoll_wait
外加一个用于关闭句柄的 close函数;1个对象struct epoll_event。
创建句柄(Handle)
int handle = epoll_create(int size);
返回的是一个句柄,这个句柄最后是需要close的(所有句柄,都需要close,无论windows还是linux,句柄实际上是一个内核对象)。
size表明可监听的并发连接数目,在Linux2.6.8以后,该参数被忽略,仅仅向下兼容考虑。
注册事件
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);
epfd,创建时候的句柄
op,operation的意思,表示执行何种命令,
EPOLL_CTL_ADD;增加
EPOLL_CTL_MOD:修改
EPOLL_CTL_DEL:删除
常见的增删改(不包含查询,实际内部需要使用查询)
//常见的如果存在就修改,否则增加,Redis中有如下源码
int op = eventLoop->events[fd].mask == AE_NONE ?
EPOLL_CTL_ADD : EPOLL_CTL_MOD;
struct epoll_event{
__uint32 events;//epoll事件类型
epoll_data_t data;//用户数据
};
EPOLLIN:触发该事件,有可读数据。(包括对端SOCKET正常关闭);
EPOLLOUT:触发该事件,有可以写数据;
EPOLLPRI:紧急数据处理(可读),urgent data available for read
EPOLLERR:发生错误;
EPOLLHUP:暂时被挂断;
EPOLLET: ET模式
EPOLLONESHOT: 只监听一次事件,用完即结束。
等待事件
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
Epoll是支持多线程的,即多个线程都可以监听各自的epoll,而这些Epoll都监听同一端口,而不用担心惊群。
- libevent中的多线程实现
由于libevent的event base
实现方式:2种
- 类似于memcache的实现,即一个masert,通过管道pipie与子线程通信。其实这个类似于nginx的方式
- 因为,epoll是可以多线程安全的。因此,每个线程创建一个event base,然后关联同一个端口的fd。
相关推荐
linux epoll多线程编程 例子
基于socket epoll的高并发下多线程日志收集程序,可达到10000并发量而不丢失数据
Linux网络编程(四)——epoll+多线程实现简单的聊天(linux 服务器端 windows客户端)
epoll多线程的例子. 使用这个例子来解释下epoll多线程的设计方法和解决方案。
linux下完整的epoll多线程高并发服务器代码
该源代码使用linux的网络IO多路复用模型epoll在建立tcpserver,对用队列来缓存请求,使用线程池来处理请求。
这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间...
epoll+多线程的例子,本例子还有压力测试。
多线程,epoll,libevent网络库分别实现的三个网络HTTP服务器程序
epoll反应堆 libevent.c核心源码
高并发epoll监听,多线程回调处理消息源码。可以直接编译运行。
linux epoll多线程编程实例,在Linux下编译通过
基于EPOLL机制的LINUX网络游戏服务器实现方法.pdf 这个肯定可以打开的
基于EPOLL机制的LINUX网络游戏服务器实现方法.pdf
这个demo,通讯基于socket,使用epoll——支持1024+客户端,使用多线程。 当然我希望他第一是够稳定,第二是有高承载。 /*********************************** 非常不幸,它没办法稳定运行,不知道问题在哪里,会...
EPOLL多线程TCP服务器,可以动态获取连接客户机并且向客户机发送数据
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main...
epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht
附件为本人整理的libevent的入门学习资料,时候零基础学习。