最近需要使用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。
相关推荐
在IT领域,网络编程是构建高性能、高并发...总结来说,这个项目为C++网络编程的学习者提供了一个宝贵的资源,涵盖了多线程、epoll和libevent等关键概念的实际应用,有助于提升对高性能HTTP服务器设计和实现的理解。
标题与描述中的“unbound + libevent + epoll学习”指向了深入探讨三个关键概念:Unbound(一个DNS解析器),Libevent(一个事件驱动库),以及epoll(一种高效的I/O多路复用机制)。这三者在现代网络编程、尤其是高...
这种模型非常适合处理大量并发连接,因为它可以减少CPU资源的浪费,避免了传统的轮询或者多线程模型中的上下文切换开销。 1. **libevent的基本原理**: - `libevent`维护了一个事件循环,当有事件发生时(例如,...
在本文中,我们将深入探讨libevent的工作原理,以及如何在多个平台上利用其功能,特别是针对Linux系统中的epoll机制。 一、libevent基础 libevent的核心概念是事件模型,它提供了一种统一的方式来处理来自不同源的...
在libevent 1.4.13的源码中,可以深入学习其内部事件调度算法(如epoll、poll或select)以及多线程实现的细节。通过对源码的阅读和分析,可以了解如何高效地将libevent与多线程结合,优化网络通信模块的性能。 总的...
总的来说,《libevent源码深度剖析》涵盖了libevent的原理、API使用、事件调度机制、定时器以及多线程支持等多个方面,是学习和掌握网络编程底层技术的重要参考资料。通过深入学习libevent,不仅可以提升网络编程...
5. **Android中的线程和Libevent** 在Android上,Libevent通常在单独的工作线程中运行,避免与UI线程冲突。通过使用`event_base_once()`或`event_base_loopexit()`,可以在适当的时候结束事件循环。 6. **内存管理...
4. **事件机制**:阐述LibEvent如何利用底层的操作系统特性,如epoll、kqueue等,实现高效的时间轮询和事件分发。 5. **多线程支持**:讨论LibEvent在多线程环境中的使用,包括事件基的创建和管理、线程安全问题及...
通过使用libevent,开发者可以避免传统的轮询或多线程模型,从而提高程序的效率和响应性。 **libevent的主要组件** 1. **事件基(Event Base)**:这是libevent的基本工作单元,用于管理事件处理。一个事件基可以...
6. **线程安全**:在多线程环境下,libevent提供了线程安全的API,可以方便地在多线程程序中使用。 通过这个libevent聊天室的例子,我们可以学到如何利用libevent构建高并发、实时交互的应用。无论是对于新手还是...
- **内核事件机制**:libevent利用了操作系统的事件机制,如epoll(Linux)、kqueue(FreeBSD)和poll(其他系统)来提高性能。 ### 4. libevent的应用场景 - **网络服务器**:libevent常用于构建高性能的网络...
2. **多事件机制支持**:`libevent` 支持多种底层事件机制,包括`select`、`poll`、`epoll`(Linux)、`kqueue`(FreeBSD、Mac OS X)、`dev/poll`(Solaris)等,根据运行的操作系统自动选择最高效的方式。...
2. **多线程支持**:libevent提供了对多线程编程的支持,可以在多个线程之间共享事件结构,实现并发处理事件。 3. **HTTP服务器**:libevent内建了简单的HTTP服务器模块,可以用于快速搭建轻量级的HTTP服务,或者...
- **多线程支持**:libevent可以通过多线程来处理并发事件,提高系统的并行处理能力。 - **内存管理**:libevent内部采用内存池技术,减少了内存分配和释放的开销。 6. **libevent与其它库的比较**: - **对比...
6. **内存管理和线程安全**:libevent库具有良好的内存管理机制,同时也支持多线程环境下的线程安全操作。 **三、libevent与ACE比较** 与ACE(Adaptive Communication Environment)相比,libevent更轻量级,体积...
4. **多线程支持**:虽然Libevent 的核心是单线程的,但它提供了线程安全的接口,使得开发者可以将Libevent 应用于多线程环境中。 5. **信号处理**:Libevent 还可以处理操作系统发送的信号,如SIGINT(中断)和...
传统的处理方法主要包括循环、`poll`/`epoll`等机制,以及基于多线程的方案。虽然这些方法在一定程度上能够满足并发连接的需求,但它们都存在一定的局限性: - **循环**:这种方法简单粗暴,但效率低下。随着连接...
6. **多线程支持**:在多线程环境中协调事件处理。 7. **时间管理**:包括定时器事件和延时操作。 使用Libevent开发应用程序时,需要注意以下几点: 1. **事件循环**:所有事件都在一个事件循环中处理,直到没有更...
7. **多线程支持**:尽管libevent本身不是线程安全的,但可以通过使用多个`event_base`实例和适当的同步机制(如互斥锁)来支持多线程环境下的事件处理。 8. **版本兼容性**:Libevent有多个版本,每个版本可能有...
本实例中的C++代码会涉及网络编程的基本概念,如套接字(socket)创建、连接、监听和数据传输,以及多线程编程,以实现服务器端的并发处理。 在Linux环境下,开发者可以充分利用系统提供的各种API,例如socket编程...