标签:负载 i/o 结构 内存 大数 文件 等待事件 方式 客户端
常见的Linux并发服务器模型有:多进程并发服务器、多线程并发服务器、select多路I/O转接模型、poll多路I/O转接模型、epoll多路I/O转接模型。
1、多进程并发服务器、多线程并发服务器
多进程并发服务器考虑因素:
多线程并发服务器考虑因素:
多进程和多线程模型在实现过程相对简单,但其系统开销和CPU使用率过高
2、select多路I/O转接模型、poll多路I/O转接模型
多路I/O复用:指内核一旦发现指定的一个或者多个IO条件准备读取,它进通知该进程。适用于以下场合:
于多进程和多线程相比,多路I/O复用最大优势在于系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而减小系统开销
select多路I/O转接模型:
select缺点:
poll多路I/O转接模型:
相比于select模型,poll模型适用链表保存文件描述符,因此没有1024的限制,但select模型的其他的三个缺点依然存在
select和poll模型I/O事件工作方式:电平触发(Level Triggered)
3、epoll多路I/O转接模型
epoll是Linux下select/poll模型的增强版,能显著提高程序在大量并发链接中只有少数活跃的情况下的系统CPU使用率,原因有二:(1)epoll会复用文件描述集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被监听的文件描述符集合;(2)epoll在获取时间的时候,无需遍历整个被监听的描述符集合,只需要遍历那些被内核I/O事件异步唤醒而加入Ready队列的描述符集合即可。
epoll模型除了电平触发,还支持边沿触发(Edge Trigered)。
4、工作方式:
LT(level triggered):水平触发,缺省方式,同时支持block和no-block socket,在这种做法中,内核告诉我们一个文件描述符是否被就绪了,如果就绪了,你就可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错的可能性较小。传统的select\poll都是这种模型的代表。
ET(edge-triggered):边沿触发,高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪状态时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如:你在发送、接受或者接受请求,或者发送接受的数据少于一定量时导致了一个EWOULDBLOCK错误)。但是请注意,如果一直不对这个fs做IO操作(从而导致它再次变成未就绪状态),内核不会发送更多的通知。
区别:LT事件不会丢弃,而是只要读buffer里面有数据可以让用户读取,则不断的通知你。而ET则只在事件发生之时通知。
标签:负载 i/o 结构 内存 大数 文件 等待事件 方式 客户端
原文地址:http://www.cnblogs.com/lianshuiwuyi/p/7788213.html