IO接口演化

(1)阻塞

(2)多线程/进程

Thread-safe 与 Deadlock 问题难以解决,开销大

“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。“连接池”维持连接的缓存池,尽量重用已有的连接、减少创建和关闭连接的频率。这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如apache,MySQL数据库等。

 

(3)非阻塞

如果所有设备都一直没有数据到达,调用者需要反复查询做无用功

 

(4)IO复用事件驱动服务器模型 即select poll

使用 select() 接口同时从多个客户端接收数据的过程;由于 select() 接口可以同时对多个句柄进行读状态、写状态和错误状态的探测,

单个进程能够监视的文件描述符的数量存在最大限制;select需要复制大量的句柄数据结构,产生巨大的开销 ;应用程序需要消耗大量时间去轮询各个句柄才能发现哪些句柄发生了事件

(5)epoll

linux 2.5.44中引入的类似select,它把描述符列表交给内核,一旦有事件发生,内核把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。

遗憾的是不同的操作系统特供的 epoll 接口有很大差异,所以使用类似于 epoll 的接口实现具有较好跨平台能力的服务器会比较困难。

 

(6)libevent Libevent框架本质上是一个典型的Reactor模式,所以只需要弄懂Reactor模型,libevent就八九不离十了

libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。

 

libevent 库实际上没有更换 select()poll() 或其他机制的基础。而是使用对于每个平台最高效的高性能解决方案在实现外加上一个包装器。

为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层 I/O 复杂性。这是 libevent 系统的核心。

 

1)event 及 event_base事件管理包括各种IO(socket)、定时器、信号等事件,也是libevent应用最广的模块;
     2 ) evbuffer  event 及 event_base 缓存管理是指evbuffer功能;提供了高效的读写方法
     3)  evdns  DNS是libevent提供的一个异步DNS查询功能;
     4)  evhttp HTTP是libevent的一个轻量级http实现,包括服务器和客户端

     libevent也支持ssl,这对于有安全需求的网络程序非常的重要,但是其支持不是很完善,比如http server的实现就不支持ssl。

 

 

(7) libev 比libevent更高效的实现,bug更少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值