1.libevent、libev框架介绍
2.网络I/O库总结(libevent,libuv,libev,libeio)
3.C语言10个经典开源项目
4.Gevent源码剖析(二):Gevent 运行原理
libevent、libev框架介绍
探索高性能事件驱动编程的世界,libevent和libev作为C语言中的重要库,以简洁的接口和跨平台兼容性闻名。它们在事件管理、全民 奇迹源码网络IO、定时任务和信号处理方面提供了强大的支持,尤其在简化跨操作系统事件处理方面独具优势。libevent:灵活的事件库
libevent的核心在于其event_base结构,它是事件检测的基石,通过`event_base_new()`创建并初始化,`event_base_free()`释放资源。该库支持Linux的epoll、Mac的kqueue和Windows的iocp,用户只需关注事件处理逻辑,底层的IO细节由libevent隐藏。事件管理与封装
libevent的封装层次分明,网络操作与问题解决分离,用户只需处理业务逻辑。事件检测通过底层高效实现,如epoll,用户只需关注如何在回调中进行IO操作。例如,qq 分享裂变源码`event_new()`用于创建事件对象,`event_base_loop()`驱动事件循环,直到事件激活或循环结束。libev的改进与libuv的诞生
libev在libevent的基础上,通过移除全局变量,采用回调传递上下文,以及使用最小四叉堆优化计时器,进一步提升性能。然而,对于Windows的支持不足催生了libuv,后者被node.js采用,优化了Windows上的多路IO处理。安装与使用
安装libevent的步骤包括下载源码、配置、编译和安装。在使用时,确保链接到 `-levent` 库,如在主函数中设置`event_base`结构并调用`event_base_loop()`。示例代码
通过以下代码片段,展示了基础的事件监听和回调处理,以及如何创建`event_base`并进入事件循环:```c
struct event_base *base = event_base_new();
event_base_set_timeout(base, -1, EV_TIMEOUT, timeout_handler, NULL); // 定时器处理
event_base_set(&listenfd, EV_READ|EV_PERSIST, accept_handler, base); // 监听事件
event_base_dispatch(base); // 进入事件循环
event_base_free(base);
```
高级操作:bufferevent
libevent的`bufferevent`提供了更高级别的IO操作,例如`bufferevent_socket_new()`用于基于已存在的socket创建事件监听器,支持BEV_OPT_CLOSE_ON_FREE和BEV_OPT_THREADSAFE等选项。逼真qb充值源码事件回调如读写、异常处理等,是事件驱动编程的核心内容。 在处理网络连接时,`bufferevent_read`和`bufferevent_write`用于读取和写入数据,`bufferevent_enable`控制回调触发。`evconnlistener`用于监听连接请求,简化了新连接的接纳和处理。 总结来说,libevent和libev为开发者提供了强大的事件驱动框架,无论是基础的网络IO还是高级的定时任务管理,都以易用性和性能为首要目标。通过合理的封装和底层优化,使得开发人员能够专注于业务逻辑,而无需过多关注底层实现的复杂性。网络I/O库总结(libevent,libuv,libev,libeio)
Libevent
Libevent 是一个基于事件驱动模型的非阻塞网络库,用于构建高速、可移植的非阻塞 IO 应用。广泛应用于 memcached、Vomit、Nylon、Netchat 等项目中,作为底层网络库,udp传输文件源码用于实现 TCP 或 HTTP 服务。Libevent 的 GitHub 源码可访问。
Libev
Libev 是由 Marc Lehmann 独立完成的,对不同系统非阻塞模型进行简单封装,解决了不同 API 之间的不兼容问题,保证程序在大多数 *nix 平台上运行。Libev 支持类 UNIX 系统的多种 I/O 多路复用模型,如 select、poll、epoll、kqueue、evports 等,但对于 Windows 的支持仅限于 select 模型,效率较低,性能不如 Libuv 封装的 IOCP。Libev 目标是修复 Libevent 的一些设计问题,如避免使用全局变量,提供更高效的事件类型管理。
Libuv
Libuv 是一个跨平台、高性能、事件驱动的异步 IO 库,用 C 语言编写,封装了不同平台底层的exe加密码源码高性能 IO 模型,如 epoll、kqueue、IOCP、event ports,具有高度可移植性。Libuv 为 Node.js 设计,但因其高效模型逐渐被其他语言和项目采纳,用于底层库,如 Luvit、Julia、uvloop、pyuv 等。
Libevent、Libev、Libuv 比较
根据 GitHub 星标数,Libuv 的影响力最大,其次是 Libevent,Libev 关注较少。在优先级、事件循环、线程安全等方面,Libuv 更为现代,支持多种平台和 IO 模型,提供了更优的性能和功能。Libevent 和 Libev 分别针对不同平台和需求进行优化,Libev 旨在修复 Libevent 的问题。性能和可移植性方面,Libuv 优于 Libevent 和 Libev。
异步 IO 实现
目前 Linux 异步 IO 实现有原生异步 IO 和多线程模拟异步 IO 两种方式。原生异步 IO 支持特定场景,但不充分利用 Page cache;多线程模拟异步 IO 方式如 Glibc AIO、libeio、io_uring 等,提供更广泛的适用场景。
C语言个经典开源项目
C语言个经典开源项目
一、Webbench
Webbench是一款用于linux下的网站压测工具,通过模拟多个客户端并发访问指定URL,测试网站在高负载下的性能。最多支持3万并发连接,代码简洁,总共不到行。
下载链接: home.tiscali.cz/~cz...
二、CMockery
CMockery是Google提供的一款轻量级的C语言单元测试框架,简洁且无需依赖其他开源包,对被测试代码的侵入性低。源代码不到3K行。
主要特点:免费开源、兼容旧版本编译器、无需C标准依赖。
下载链接: code.google.com/p/cmock...
三、Libev
Libev是一个基于epoll、kqueue等OS基础设施的高效事件驱动库,使用Reactor模式处理IO事件、定时器和信号,代码量少至4.版本的多行。
下载链接: software.schmorp.de/pkg...
四、Memcached
Memcached是一个用于动态Web应用的高性能分布式内存对象缓存系统,通过缓存数据和对象减少数据库读取次数,加速动态数据库驱动网站的速度。Memcached-1.4.7版本代码量在K行左右。
下载地址: a distributed memory object caching system
五、SQLite
SQLite是一个开源的嵌入式关系数据库引擎,实现自包容、零配置,支持事务的SQL数据库,代码量约3万行,大小K。
下载地址: SQLite Home Page
六、Redis
Redis是一个使用ANSI C编写的开源数据结构服务器,代码量相对较小(4.5w行),几乎不依赖其他库,大部分为单线程。
下载地址: Redis
七、Nginx
Nginx是一款高性能的HTTP和反向代理服务器,设计简洁、功能丰富,具有低系统资源消耗的特性。已发布多年,获得广泛好评。
下载地址: http://nginx.org/en/download.html
八、UNIXv6内核源代码
UNIX V6内核源代码约为1万行,适合初学者理解。与现代操作系统内核源代码(如Linux的万行)相比,UNIX V6源代码在可理解性上有优势。
下载地址: minnie.tuhs.org/cgi-bin...
九、NetBSD
NetBSD是一个免费的、高度移植性的UNIX-like操作系统,支持多种平台,设计简洁、代码规范,具有多项先进特性,广受好评。
下载地址: The NetBSD Project
十、Tinyhttpd
Tinyhttpd是一个超轻量型HTTP服务器,全部代码仅行(包括注释),附带一个简单的客户端,可用于理解HTTP服务器的基本原理。
下载链接: Tiny HTTPd
Gevent源码剖析(二):Gevent 运行原理
Gevent的运行原理在python2.7.5版本下,涉及多个关键概念。简单来说,它通过Greenlet类和Hub事件循环实现并发执行。以下是核心步骤:
首先,通过导入gevent模块,引入其初始化设置,greenlet的运行函数通过gevent.spawn()方法注册到Hub,这个过程包括获取Hub实例、初始化greenlet并保存函数和参数。get_hub()利用线程局部存储保证Hub的多线程一致性。
接着,greenlet通过g.start()注册到事件循环,回调事件由switch()控制,而不是直接运行函数,实现了协程的切换。Gevent提供了join()和joinall()两个入口,其中joinall()控制了整个流程。
在详细流程中,iwait()函数扮演重要角色,通过创建Waiter对象,将协程的switch()链接到目标,通过waiter.get()控制协程执行和返回。Hub事件循环与运行协程通过waiter.get()和waiter.switch()协同工作,实现了并发执行。
目标协程的执行涉及事件循环的启动,通过Cython调用libev库执行。目标函数在run()中执行,并通过_report_result()和_report_error()处理结果或异常。"绿化"函数是实现并发的关键,它们允许在等待I/O操作时释放控制权,从而实现多任务并发。
总的来说,Gevent的运行涉及复杂的协程调度和事件驱动,虽然本文仅触及表面,但其背后的并发机制和技术细节更为丰富,包括异常处理和大量"绿化"函数的使用,这将在后续深入探讨。