首页 > 试题广场 >

请你说说IO多路复用(select、poll、epoll)

[问答题]
请你说说IO多路复用(select、poll、epoll)
IO多路复用指的是单个进程或者线程能同时处理多个IO请求,select,epoll,poll是LinuxAPI提供的复用方式。本质上由操作系统内核缓冲IO数据,使得单个进程线程能监视多个文件描述符。select是将装有文件描述符的集合从用户空间拷贝到内核空间,底层是数组,poll和select差距不大,但是底层是链表,这就代表没有上限,而select有数量限制。epoll则是回调的形式,底层是红黑树,避免轮询,时间复杂度从O(n)变为O(1)
编辑于 2022-06-21 23:54:01 回复(4)
IO多路复用是指单个线程或进程能够处理多个IO请求。select调用主要统计有多少个文件描述符需要进行IO操作。缺点:内存开销大,支持的的文件描述符的个数有限。poll和select调用差别不大,主要是底层数据结构变成了链表,支持的文件描述符的个数无上限。epoll调用是更加高效的方式,底层数据结构使用了红黑树和链表,避免了大量的内存分配和轮询。
发表于 2022-05-28 15:33:02 回复(0)
IO多路复用指的是单个进程或者线程能同时监听处理多个IO请求,select、epoll、poll是LinuxAPI提供的复用方式。本质上是由操作系统内核缓存fd文件描述符,使得单个进程线程能监视多个文件描述符。select是将所有文件描述符的集合从用户空间拷贝到内核空间,底层是数组。poll和select相似,主要区别是底层采用链表,从而使得监听文件描述符个数不再受限,但是还是需要多次内核与用户的复制,并且用户空间需要通过轮询O(n)才能确定哪些文件描述符上发生了事件。epoll底层采用红黑树,在内核空间创建需要关注的文件描述符的红黑树,内核监听时会将发生事件的描述符加入队列中,返回到用户空间的时候只需要返回队列中的数据即可。epoll通过这种方式使得减少了每次用户到内核的复制过程,同时用户空间通过O(1)复杂度就可以知道哪些文件描述符发生了事件。
发表于 2022-06-13 20:01:48 回复(0)
IO多路复用是指一个进程或线程能够同时处理多个IO请求,select、poll、epoll是linuxAPI提供的复用方式。本质上由操作系统内核缓冲数据,让单个进程线程能够监视多个文件描述符。select是将装有文件描述符的集合从用户空间拷贝到内存空间,底层是数组,poll和select的区别在poll底层使用的是链表,这也就意味着没有上限,而select有数量限制,epoll则是回调的形式,底层是红黑树。
发表于 2022-07-03 10:44:34 回复(0)
传统的BIO,NIO,AIO有一个缺点就是每执行一次io事件就会执行一次系统调用,系统调用需要从用户态陷入到内核态中,非常影响性能。而IO多路复用可以降低系统调用的次数从而达到提升效率的效果。IO多路复用提供三种实现方式分别是select,poll和epoll。在select中,会通过轮循的方式去执行select,若当前没有就绪事件即select函数返回值为0,那么便会阻塞直到有就绪事件进入结束阻塞然后将数据从内核态拷贝到用户态再去处理数据。处理完毕后开始下一次的select轮循。select函数包括如下参数:1,nfds:当前监听的事件描述符的最大值加一,因为select只会返回有事件就绪不会告诉你那些事件就绪,所以需要去遍历并判断,加入该参数就可以缩小遍历范围提高效率。2,三种需要监听的描述符类型的内容集合,分别为readfds,writefds,exceptfds,分别代表读取事件集合,写入事件集合,异常事件集合。这三个参数既可以用于调用函数时作为需要监听的判断集合(集合本身是一个数组,长度为1024,所以select类型有监听事件的数量限制,数组内容种0表示不需要监听,1表示需要监听),同时也可以作为select返回后的就绪事件的集合(0表示未就绪,1表示就绪),因为其双重功能的原因,所以在每次系统调用时都需要重置这三个集合。3,timeout:0表示执行超时,-1表示出现异常。select函数的返回值为当前就绪事件的个数。poll方式的执行效果和select类型,它通过以链表来记录事件的方式解决了每次都需要重设监听描述符集合的问题和监听描述符数量有限的问题。poll函数参数列表:1,用来记录监听描述符和就绪描述符的链表。链表的每个节点记录了当前监听节点的描述符的值和它是否已经就绪判断。2,nfds:需要监听的描述符个数,和select类似。3,timeout,超时时间,和select类似。返回值及其意义和select函数相同。但是poll依然存在着每次系统调用都需要传入fd和不知道具体那些描述符就绪需要遍历的问题。epoll,epoll系统调用包含三个方法:1,epoll_create(epoll对象创建):需要传入一个监听描述符个数的参数size。生成一个epoll对象并将其放入到内核态中并返回该epoll的描述符,在内核态的该epoll对象有三个属性分别是:1,wq:阻塞队列。2,rdllist:就绪事件列表。3,事件集合:通过红黑树来实现,方便中epoll_crtl事件注册中事件监听事件集合的增删改查。也就实现了避免每次系统调用都需要传入fds描述符集合。 2,epoll_crtl(事件注册):将具体的事件通过该方法注册到epoll对象中并再内核态生成一个epitem来关联epoll对象,同时epitem还会关联一个回调函数,当该事件就绪后通过epoll_wait()进入回调函数将数据从内核态赋值到用户态并处理。3,epoll_wait():会先去判断epoll对象的就绪列表中是否有内容。若没有则阻塞,只有事件就绪。若有则取调用相应的回调函数处理数据。epoll通过注册和更新红黑树的形式来存储fds使得其不用每次系统调用是都传入fds。通过就绪队列的方式实现了不用一一判断就绪事件。epoll存在两个就绪事件触发方式分别是:LT:水平触发,即一次就绪触发回调未执行完毕时,下一次依然能在就绪队列中找到继续执行,这种方式比较安全。它是epoll的默认就绪事件触发方式。ET:边缘触发,即触发后未执行完毕下一次就绪队列中无法找到也就无法继续执行。这种方式性能高。epoll缺点是:1,只支持再linux中使用,移植性较差。2,对于请求较少的情况效果反而没有select好。
发表于 2022-07-28 14:33:19 回复(0)
对于一次IO访问,数据会会先被拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间,所以,当一个read操作发生时,会经历两个阶段,先等待数据准备就绪,然后将数据从内核拷贝到进程中,由于这两个阶段,Linux系统产生了下面五种网络模式的方案:阻塞IO,非阻塞IO,IO多路复用,信号驱动IO,异步IO,其中前面四种可以归类为同步IO。select、poll、epoll本质上也是同步IO,因为他们都需要在读写事件就绪后自己负责读写,也就是这个过程是阻塞的,与多进程和多线程技术相比,IO多路复用的最大优势是系统开销小,系统不必创建进程或线程,从而大大减少了系统的开销,能力更多的连接。 其中IO多路复用的本质就是通过系统内核缓冲IO数据,让单个进程可以监视多个文件描述符(FD),一旦某个描述符读就绪或者写就绪,可以通知程序进行相应的读写操作,也就是使用单个进程同时处理多个网络连接IO,它的原理就是select、poll、epoll不断轮询所负责的socket,当某个socket有数据达到了,就通知用户进程,select和poll的时间复杂度都是O(n),epoll的时间复杂度是O(1)。 Select:仅仅知道有IO事件发生,但并不知道是哪几个流,所以只能无差别的轮询所有流,找出能读出数据或者写入数据的流,并对其进行操作,每次调用select,都需要把fd集合从用户态拷贝到内核态,底层实现使用了数组。 Poll:本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,但是它没有最大链接数的限制,每次调用poll,都需要把fd集合从用户态拷贝到内核态,是基于链表来储存的。 Epoll:可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的IO事件通知我们,所以说epoll是时间驱动的,即每个事件关联上fd,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到readyList里面,是基于红黑树实现的。Epoll是Linux目前大规模网络并发程序开发的首选,在绝大多数情况下性能远超select和poll,但是在并发连接不高的情况下,多线程+阻塞IO的方式可能会更好。
发表于 2022-07-20 20:06:28 回复(0)
IO多路复用是一种使程序能够同时监听多个文件描述符的操作,它能在单个线程中监听多个IO的状态进行对IO进行管理。一旦检测某个文件描述符上我们关心的事情发生,就可以通知程序进行相应处理。Linux中实现IO多路复用的系统调用主要有select、poll、epoll。 1.select:select主旨思想是有一个文件描述符列表,为一个整型数组,共1024个bit,每个bit代表一个文件描述符的状态。调用select(),这个函数是阻塞的,直到一个或多个文件描述符进行IO操作时返回并修改文件描述符状态。0为未检测到该事件,1为检测到该事件。返回时会告诉进程有多少个文件描述符要进行IO操作,接下来遍历文件描述符列表进行IO操作。 2.poll:poll和select相似。poll支持的文件描述符没有限制。 3.epoll:epoll是一种更加高效的IO多路复用技术,使用步骤及原理如下:调用epoll_create()会在内核中创建一个eventpoll结构体数据。其中包含一个用于检测文件描述符的红黑树,一个检测到数据改变的文件描述符。epoll_ctrl()可以增删改文件描述符及事件。epoll_wt()可以检测文件描述符状态并添加到列表进行返回,通过返回的事件数组做进一步处理。epoll有两种工作模式:水平触发和边沿触发模式,水平触发当每个文件描述符状态改变时就进行IO读写操作,如果不进行操作内核会继续通知。支持block和nonblock socket方式。边沿触发是高速工作方式,当某个文件描述符变成就绪状态时,它会假设你已经知道了它为就绪且直到你做某个操作将其变为未就绪之前不会发送通知。边沿触发方式减少了epoll被重复触发的次数从而提高了效率。但必须使用一个非阻塞接口,以免一个文件描述符的阻塞读写导致其他的被饿死。
发表于 2022-06-16 18:35:11 回复(0)
作用:单线程同时处理多个IO请求 I/O多路复用三种实现机制: ● select ○ 构造一个关于文件描述符的列表fd_set, 1024 个比特位,每一个比特位代表一个文件描述符的状态 ○ 调用 select() 系统调用,监听该列表中的文件描述符的事件,去到内核态 ○ select() 返回时,会告诉进程有多少描述符要进行 I/O 操作,接下来遍历文件描述符的列表进行 I/O 操作 ● poll ○ 和select一样 ○ poll 支持的文件描述符没有限制 ● epoll ○ 调用 epoll_create() 会在内核中创建一个 eventpoll 结构体数据,称之为 epoll 对象 ■ 文件描述符的信息 struct_root rbr(红黑树) ■ 就绪列表struct list_head rdlist,存放检测到数据发送改变的文件描述符信息(双向链表) ○ 调用 epoll_ctrl() 可以向 epoll 对象中添加、删除、修改要监听的文件描述符及事件; ○ 调用 epoll_wt() 可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理 epoll的两种模式 ● - LT 模式(水平触发) ● - ET 模式(边沿触发)
发表于 2023-11-03 14:56:53 回复(0)
1、IO多路复用是什么?单个进程或者线程能够同时处理多个IO请求。IO多路复用的方式:1、Select 2、poll 3、epoll。 Select是将装有文件描述符的集合从用户空间转移到内核空间,底层是数组。Poll原理和select类似,但底层是链表,所以文件描述的数量没有限制。epoll底层是红黑树,是回调的形式,降低了时间复杂度。
发表于 2023-03-25 10:57:22 回复(0)
IO多路复用:单个进程或线程能同时处理多个IO请求 select:底层使用的是数组 用来统计有多少个文件描述符需进行IO操作 内存开销大 文件描述符有限 poll 与 select 差别不大 区别链表 文件描述符无上限 epoll:更高效 使用的是红黑树+链表 避免了大量的内存分配和轮询
发表于 2024-03-16 17:23:18 回复(0)
io多路复用是值单个线程或者单个进程可以处理多个IO请求,实现IO不阻塞。主要有select,poll和epoll.select调用主要统计有多少个文件描述进行IO操作,但是内存开销很大,支持的文件描述符个数有限,poll和select差别不大,但是支持的文件描述符无上限。epoll由于底层是红黑树因此性能更好,内存开销小
发表于 2023-08-14 10:44:53 回复(0)
IO多路复用是一种同步IO模型,实现一个线程可以监听多个句柄 一旦某个句柄就绪,就通知应用程序进行相应的读写操作 没有句柄就绪,就阻塞应用程序,交出cpu 1. select: 每次调用select时,需要将文件描述符集合从用户态拷贝到内核态,开销大, 采用线性扫描,轮询,底层是数组 2. poll:跟select差不多,但是没有最大连接数的限制。底层是链表 3. epoll:事件通知方式,每当文件描述符就绪时,系统注册的回调函数就会被调用。底层是红黑树
发表于 2023-03-30 11:09:40 回复(0)
一个进程包含一个或者多个线程
发表于 2023-03-09 20:46:12 回复(0)
IO多路复用指的是一个进程或线程同时可以处理多个IO请求,有三种模型,select,poll,epoll 模型,是linuxApi的复用方式,可以同时监控多个socket文件,select模型底层是数组,有数量限制,采用的方式的轮询,时间复杂度是O(n),poll模型底层是链表,没有数量限制,也是采用轮询的方式,时间复杂度0(n),epoll模型采用的是回调的方式,底层是红黑树和队列的方式,时间复杂度是0(logn)。BIO是阻塞IO一个线程同时只能处理一个socket连接,NIO一个线程同时可以处理多个socket连接,AIO是在NIO的基础上演变的,采用的是多线程的方式。
发表于 2023-03-02 10:41:25 回复(0)
IO多路复用指的是单个进程或者线程能同时处理多个IO请求,select,epoll,poll是LinuxAPI提供的复用方式。本质上由操作系统内核缓冲IO数据,使得单个进程线程能监视多个文件描述符。select是将装有文件描述符的集合从用户空间拷贝到内核空间,底层是数组,poll和select差距不大,但是底层是链表,支持拷贝的文件描述符的个数无上限,而select有数量限制。epoll则是回调的形式,底层是红黑树,避免了文件在用户空间和内核空间反复拷贝及上下文切换的开销。
编辑于 2023-02-10 12:34:52 回复(0)
他们是NIO(同步非阻塞)多路复用的三种实现机制,是由liunx操作系统提供。 用户空间和内核空间:操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备,必须通过内核空间 select机制:会维护一个FD的集合fd_set,将fd_set从用户空间复制到内核空间,激活socket; poll机制:和select机制差不多,把fd_set进行了优化,FD集合的大小就突破了操作系统的限制。pollfd结构来代替fd_set,通过链表实现的。 Epoll:Event Poll ; Epoll不再扫描所有的FD,只将用户关系的FD事件存放到内核的一个和事件表中.
编辑于 2023-02-07 14:41:22 回复(0)
IO多路复用指的是单个进程或者线程能同时处理多个IO请求,select,epoll,poll是LinuxAPI提供的复用方式。本质上由操作系统内核缓冲IO数据,使得单个进程线程能监视多个文件描述符。select是将装有文件描述符的集合从用户空间拷贝到内核空间,底层是数组,poll和select差距不大,但是底层是链表,这就代表没有上限,而select有数量限制。epoll则是回调的形式,底层是红黑树,避免轮询,时间复杂度从O(n)变为O(1)
发表于 2023-02-06 15:48:25 回复(0)
1.IO多路复用指的是单个进程或者线程能同时处理多个IO请求, Linux 下实现 I/O 复用的系统调用主要有 select、poll 和 epoll。
2.select调用主要统计有多少个文件描述符需要进行IO操作。缺点:内存开销大,支持的的文件描述符的个数有限。
3.poll和select调用差别不大,主要是底层数据结构变成了链表,支持的文件描述符的个数无上限。
4.epoll调用是更加高效的方式,底层数据结构使用了红黑树和链表,避免了大量的内存分配和轮询。时间复杂度从O(n)变为O(1)
编辑于 2023-01-16 22:07:17 回复(0)
IO多路复用,多路指的是多个socket连接,复用指的是一个线程或者进程处理这些连接;主要有select、poll和epoll这三种模型,select使用的数组存储socket连接文件描述符,容量是1024,使用轮询来判断是否发生了IO事件,poll使用的链表存储socket连接文件描述符,容量不固定也是使用轮询来判断是否发生了IO事件,而epoll使用的是红黑树存储socket连接文件描述符,是回调的形式,避免轮询
发表于 2022-12-21 15:15:58 回复(0)
I/O多路复用能够在单个线程中,通过监视多个I/O流的状态来同时管理多个I/O流,一旦检测到某个文件描述符上我们关心的事件发生,能够通知程序进行相应的处理。
发表于 2022-12-08 01:02:01 回复(0)