首页 > 系统相关 >Linux下三组I/O复用函数的比较(select、poll、epoll)

Linux下三组I/O复用函数的比较(select、poll、epoll)

时间:2023-06-04 20:55:59浏览次数:49  
标签:文件 epoll 描述符 事件 Linux poll select

       前面我们讨论了select、poll和epoll三组I/O复用系统调用,这三组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集、最大支持文件描述符数、工作模式和具体实现等四个方面进一步比较它们的异同,以明确在实际应用中应该选择使用哪个。

       这三组函数都通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些文件,并使用该结构体类型的参数来获取内核处理的结果。

       select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此select需要提供3个这种类型的参数来分别传入和输出可读、可写及异常等事件。这一方面使得select不能处理更多类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select不得不重置这三个fd_set集合。

       poll的参数类型pollfd则多少"聪明"一些。它把文件描述符和事件都定义其中,任何事件都被统一处理,从而使得编程接口简洁得多。并且内核每次修改的是pollfd结构体的revents成员,而events成员保持不变,因此下次调用poll时应用程序无须重置pollfd类型的事件集参数。由于每次select和poll调用都返回整个用户注册的事件集合(其中包括就绪的和未就绪的),所以应用程序索引文件描述符的事件复杂度为o(n)。

       epoll则采用与select和poll完全不同的方式来管理用户注册的事件。它在内核中维护一个事件表,并提供了一个独立的系统调用用epoll_ctl来控制往其中添加、删除、修改事件。这样,每次epoll_wait调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读入这些事件。epoll_wait系统调用的events参数仅用来返回就绪的事件,这使得应用程序索引就绪文件描述符的时间复杂度达到o(1)。

       poll和epoll_wait分别用nfds和maxevents参数指定最多监听多少个文件描述符和事件。这两个数值都能达到系统允许打开的最大文件描述符数目,即65536.而select允许监听的最大文件描述符数量通常有限制。

       select和poll都只能工作在相对低效的LT模式,而epoll则可以工作在ET高效模式。并且epoll还支持EPOLLONESHOT事件。该事件能更进一步减少可读、可写和异常等事件被触发的次数。

       从实现原理上来说,select和poll采用的都是轮询的方式,即每次调用都要扫描整个注册文件描述符的集合,并将其中就绪的文件描述符返回给用户程序,因此它们检测就绪事件的算法的时间复杂度是

O(N)。epoll_wait则不同,它采用的是回调的方式。内核检测到就绪的文件描述时,将触发回调函数,回调函数就将该文件描述符上对应的事件插入内核就绪事件队列。内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间。因此epoll_wait无须轮询整个文件描述符集合来检测哪些事件已经就绪,其算法时间复杂度为O(1).但是,当活动连接比较多时,epoll_wait的效率未必比select和poll高,因为此时回调函数被触发的过于频繁。所以epoll_wait适用于连接数量多,但活动连接较少的情况。

 

标签:文件,epoll,描述符,事件,Linux,poll,select
From: https://www.cnblogs.com/lyfily-p-7439305/p/17456297.html

相关文章

  • linux 性能自我学习 ———— 关于内存 [七]
    前言内存的基本知识,将在操作系统篇中详细介绍,这里只说明如何排查问题。正文内存的分配和回收:在malloc是c标准库中的内存分配函数,对应到系统调用上,有两种实现方式,一种是brk()和mmap()对于小块内存,小于128k使用brk来分配,也就是通过移动堆栈的位置来分配内存。这些内存释放......
  • Linux的I/O复用之epoll:EPOLLONESHOT事件
        即使我们使用ET模式,一个socket上的某个事件还是可能被触发多次,这在并发程序中就会引起一个问题,比如一个线程在读取某个socket上的数据后开始处理这些数据,而在数据的处理过程中该socket上又有新的数据可读,此时另外一个线程被唤醒来读取这些新的数据,于是就出现两个线程同......
  • linux zImage 自解压
    顶层的vmlinux:elf文件,反汇编得到的是未压缩的内核的反汇编文件,这个vmlinux才是真正的Linux内核。arch/arm/boot/compressed/vmlinux:elf文件,包含解压缩程序、Image二进制代码的压缩版;反汇编,从指令执行地址可知,只有解压缩程序的汇编代码。 zImage包含了自解压程序和内核镜像......
  • Linux下高并发socket最大连接数所受的各种限制
    1、修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulim......
  • Linux shell command cut All In One
    LinuxshellcommandcutAllInOnecut截取指定符号等号后面的字符串cut截取等号后面的字符串#获取env$env#获取登录当前用户信息$env|grepUSER$env|grepUSER|cut-d"="-f2#获取登录当前用户信息$whomai$echo$USERdemos#!/usr/bin/env......
  • Linux & Window挂着网络磁盘
    :[url]http://feixiang123.blog.51cto.com/285543/137406[/url]在Windows与Linux下Samba共享文件夹以及映射的详细使用[url]http://wenku.baidu.com/view/2ab6906e58fafab069dc02ad.html[/url]][b]在linux下挂载windows系统的网络共享磁盘:[/b]mount-t......
  • linux操作
    vim的工作模式vim一般有6种工作模式。普通模式:使用vim打开一个文件时默认模式,也叫命令模式,允许用户通过各种命令浏览代码、滚屏等操作。插入模式:也可以叫做编辑模式,在普通模式下敲击i、a或o就进入插入模式,允许用户通过键盘输入、编辑。命令行模式:在普通模式下,先输入冒号:,接着......
  • 【Linux文件系统】文件描述符fd是什么?
    fd是什么?fd是Filedescriptor的缩写,即文件描述符,fd是一个非负证书,本质是一个索引值。当打开一个文件时,内核向进程返回一个文件描述符(open系统调用返回得到),后续read、write这个文件时,只需要用这个文件描述符来标识这个文件,将其作为参数传入read、write。fd的不同值代表什么?0......
  • 《Linux就该这么学》--本书组织结构
    部署虚拟环境安装Linux系统:新手必须掌握的Linux命令:管道符、重定向与环境变量:Vim编辑器与Shell命令脚本:用户身份与文件权限:存储结构与磁盘划分:使用RAID与LVM磁盘阵列技术:iptables与firewalld防火墙:使用ssh服务管理远程主机:使用Apacha服务部署静态网站:使用vsftpd服务传......
  • Linux服务器管理系统wdcp v2.5.7版本发布
    wdcp(WDlinuxControlPanel)是一套用PHP开发的Linux服务器管理系统,旨在易于使用和管理Linux服务器,通过web页面操作就可以管理服务器和虚拟主机.简单,方便,易操作.只有Linux版本,没有windows版本,让你方便地使用和管理Linux服务器,让不懂Linux的人也可以用Linux做服务器了.支......