Linux中select poll和epoll的区别

news/2024/7/9 16:43:00 标签: nginx, select poll, epoll

        在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并发的场景下,nginx越来越收到欢迎。

一.select

        下面是select的函数接口:

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

        select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。

        select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但 是这样也会造成效率的降低。

二.poll

int poll (struct pollfd *fds, unsigned int nfds, int timeout);

        不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。

struct pollfd {
int fd; /* file descriptor */
short events; /* requested events to watch */
short revents; /* returned events witnessed */
};

        pollfd结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。

        从上面看,select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。

三.epoll

        epoll的接口如下:

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
            typedef union epoll_data {
                void *ptr;
                int fd;
                __uint32_t u32;
                __uint64_t u64;
            } epoll_data_t;

            struct epoll_event {
                __uint32_t events;      /* Epoll events */
                epoll_data_t data;      /* User data variable */
            };

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

        主要是epoll_create,epoll_ctl和epoll_wait三个函数。epoll_create函数创建epoll文件描述符,参数size并不是限制了epoll所能监听的描述符最大个数,只是对内核初始分配内部数据结构的一个建议。返回是epoll描述符。-1表示创建失败。epoll_ctl 控制对指定描述符fd执行op操作,event是与fd关联的监听事件。op操作有三种:添加EPOLL_CTL_ADD,删除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分别添加、删除和修改对fd的监听事件。epoll_wait 等待epfd上的io事件,最多返回maxevents个事件。

        在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一 个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。

四.epoll的优点主要是一下几个方面

        1. 监视的描述符数量不受限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左 右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。select的最大缺点就是进程打开的fd是有数量限制的。这对 于连接数量比较大的服务器来说根本不能满足。虽然也可以选择多进程的解决方案( Apache就是这样实现的),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也 不是一种完美的方案。

        2. IO的效率不会随着监视fd的数量的增长而下降。epoll不同于select和poll轮询的方式,而是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数。

        3.支持电平触发和边沿触发(只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)两种方式,理论上边缘触发的性能要更高一些,但是代码实现相当复杂。

        4.mmap加速内核与用户空间的信息传递。epoll是通过内核于用户空间mmap同一块内存,避免了无畏的内存拷贝。

 

文章来源:http://www.cnblogs.com/bigwangdi/p/3182958.html


http://www.niftyadmin.cn/n/1317792.html

相关文章

08_PHP数组,键值对

<?php//php数组 //1.声明数组 $arr array(); $arr[0]hello; $arr[1]world; $arr[2]2; $arr[3]3.14;print_r($arr); echo <br>;//2.键值对 $obj array(); $obj[h]Hello; $obj[w]world; $obj[x]BowenXu; echo $obj[x];//调用//3.声明的同时赋值 $arr2 array(0>bow…

Google Hacking

Google Hacking 000摘要 Google黑客搜索查询可用于识别Web应用程序中的安全漏洞&#xff0c;收集任意或单个目标的信息&#xff0c;发现泄露敏感信息的错误消息&#xff0c;发现包含凭据和其他敏感数据的文件。001Resource: Google黑客数据库&#xff08;GHDB&#xff09; 搜…

11_PHP处理JSON数据

<?php //JSON FORMAT //数组[1,2,3,4,5,6,"hello",[6,7,8],{"h":"hello"}] //对象{"h":"hello","w":"world",[1,2,3]}//PHP数组转JSON $arr array(); $arr[0]hello; $arr[1]world; $arr[2]2; $arr…

比较跨语言通讯框架:thrift和Protobuf

在现在的技术体系中&#xff0c;能用于描述通讯协议的方式很多&#xff0c;如xml、json、protobuf、thrift&#xff0c;如果在有如此众多选择的基础上&#xff0c;在设计系统时&#xff0c;还自造协议&#xff0c;自己设计协议类型和解析方式&#xff0c;那么我只能说&#xff…

我们为什么需要威胁情报?

0x00 前言 最近被谈论的异常火热的一个术语就是威胁情报&#xff0c;那么威胁情报到底是什么意思&#xff0c;它是一种什么概念或者机制呢&#xff1f;本文中我们就来亲密接触一下威胁情报&#xff0c;并了解它所具有的功能&#xff0c;然后给出几个威胁情报的最佳实践示例&am…

细数跨语言通信的选择

对编程语言的选择的规则其实很简单&#xff0c;优先选用自己或者团队熟悉的语言&#xff0c;优先选择项目中用到开源产品稳定版本所用的语言。 为了提高开发效率&#xff0c;需要融合不同语言。回顾以前项目中用到的几种不同语言间通信的几种方式: 一. XML-RPC 可能是应用最广泛…

shellcode 小知识

shellcode About shellcode Shellcode实际是一段代码&#xff08;也可以是填充数据&#xff09;&#xff0c;是用来发送到服务器利用特定漏洞的代码&#xff0c;一般可以获取权限。另外&#xff0c;Shellcode一般是作为数据发送给受攻击服务器的。Shellcode是溢出程序和蠕虫病…

跨平台数据传递方法

一.二进制 无法直接阅读&#xff0c;需在二进制层面编码解码&#xff1b; 格式由厂商定义&#xff0c;特定应用需要表示的对象很复杂时&#xff0c;格式也非常复杂&#xff0c;例如office文件格式&#xff1b; 通常需要充分考虑协议的扩展性、兼容性&#xff0c;例如windows…