Nginx之epoll和select poll

epoll和 select poll 都是做I/O多路复用的。

区别在于:

epoll较灵活,如果有一百万个链接状态同时保持,但是在某个时刻,只有几百个链接是活跃的。epoll的处理是通过epoll_create()创建对象,epoll_ctl()收集所有的套接字添加到epoll对象,epoll_wait()收集所有发生事件也就是所谓的活跃的链接,并收集到一个List链表中,这样只需要遍历这些List链表里的数据,而不用遍历一百万个链接。 而后者select poll则是每次收集事件时,将这一百万个链接都传给操作系统,再由操作系统内核上判断某些链接产生了事件,造成了巨大的资源浪费(大批量的不同态内存复制)。

为什么epoll效率比较高:

epoll 在epoll_create 时,就已经建立好了一个file节点。创建epoll对象, 同时,在内核cache里建立了一个红黑树,用于存储后续epoll_ctl传来的socket连接。再同时,又建立了一个list链表,用于存储准备就绪的事件。 等到epoll_wait()调用的时候,只需要观察list链表里有没有数据就可以,有数据就返回,没数据就sleep。等到timeout后,及时没数据,也返回了。所以epoll_wait会非常高效

原文地址:https://www.cnblogs.com/camouflage/p/12366648.html

时间: 2024-10-16 21:03:52

Nginx之epoll和select poll的相关文章

select,poll,epoll的归纳总结区分

Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理.这样所带来的缺点是: 1 单个进程可监视的fd数量被限制 2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大 3 对socket进行扫描时是线性扫描 Poll poll本质上和select没有区别,它将用户传入的数组拷贝到内核

Linux内核中网络数据包的接收-第二部分 select/poll/epoll

和前面文章的第一部分一样,这些文字是为了帮别人或者自己理清思路的,而不是所谓的源码分析,想分析源码的,还是直接debug源码最好,看任何文档以及书都是下策.因此这类帮人理清思路的文章尽可能的记成流水的方式,尽可能的简单明了. Linux 2.6+内核的wakeup callback机制 Linux 内核通过睡眠队列来组织所有等待某个事件的task,而wakeup机制则可以异步唤醒整个睡眠队列上的task,每一个睡眠队列上的节点都拥有一个 callback,wakeup逻辑在唤醒睡眠队列时,会遍历

Linux select/poll和epoll实现机制对比

关于这个话题,网上已经介绍的比较多,这里只是以流程图形式做一个简单明了的对比,方便区分. 一.select/poll实现机制 特点: 1.select/poll每次都需要重复传递全部的监听fd进来,涉及用户空间和内核直接的数据拷贝. 2.fd事件回调函数是pollwake,只是将本进程唤醒,本进行需要重新遍历全部的fd检查事件,然后保存事件,拷贝到用户空间,函数返回. 3.每次循环都是对全部的监测的fd进行轮询检测,可能发生事件的fd很少,这样效率很低. 4.当有事件发生,需要返回时,也需要将全

详细说说select poll epoll

(以下内容来自网络和自己的总结,再次感谢网络中的大神们提供的见解) 在探索select poll  epoll之前我们首先要知道什么叫多路复用: 下来探索一下为什么会用到多路复用: 首先我们看看一个客户端请求服务器的完整过程.首先,请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据. 具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧.阻塞调用会进入内核等待,cpu

【Nginx】epoll

epoll的相关系统调用 epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用. 1. int epoll_create(int size); 创建一个epoll的句柄.自从linux2.6.8之后,size参数是被忽略的.需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽. 2. int e

I/O多路复用之select,poll,epoll简介

一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作. 2.select的优点 目前几乎在所有的平台上支持,具有良好的跨平台支持. 3.select的缺点 单个进程能够监视的文件描述符的数量存在最大限制.默认情况下,在Linux上单个进程能够打开的最

Linux中select poll和epoll的区别

在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select.poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并 发的场景下,nginx越来越收到欢迎.这里有个文章参考.Nginx成为全球Top1000网站最受欢迎的Web服务器. 据 w3techs 7月 3 日的统计数据表明

select,poll,epoll最简单的解释

从事服务端开发,少不了要接触网络编程.epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的.笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理. 文章核心思想是:要让读者清晰

Linux下select&poll&epoll的实现原理(一)

最近简单看了一把Linux linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已经有IO事件就绪 如果已经有IO事件就绪,则直接所收集到的IO事件返回,本次调用结束 如果暂时没有IO事件就绪,则根据所给定的超时参数,选择性地进入等待 如果超时参数指示不等待,则