精华内容
下载资源
问答
  • select缺点 poll模型 poll优点 poll缺点 epoll模型 epoll优点 epoll缺点 首先我们要知道,这三种都是IO多路转接模型 什么叫IO多路转接 所谓IO多路转接模型,就是指对大量描述符进行监控,大量描述符中有...

    select模型

    select优点

    select缺点

    poll模型

    poll优点

    poll缺点

    epoll模型

    epoll优点

    epoll缺点


    首先我们要知道,这三种都是IO多路转接模型

    什么叫IO多路转接

    所谓IO多路转接模型,就是指对大量描述符进行监控,大量描述符中有我们所关心的描述符就绪了,则调用返回,并且告诉哪些进程就绪了

    select模型

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

    参数解释:

    参数nfds是需要监视的最大的文件描述符值+1;

    rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合;

    参数timeout为结构timeval,用来设置select()的等待时间

    其中fd_set是一个整形数组,于其说是整形数组,倒不如说是位图,使用位图中对应的位来表示要监视的文件描述符

    select工作流程,将fd加入监控集合前,我们首先将fd备份一份记作array,用于一会fd返回时作为源数据进行判断,然后将fd加入监控集合开始监控,当有描述就绪或者没有描述符就绪但是时间到了,则返回,返回之前会将监控集合中所有以前加入但是无事发生的fd清空掉,然后select从监控集合中进行轮询对比,找到所有就绪描述符,完成下重复下一次,要将array中所有描述符重新添加到监控集合中

    select优点

     

    • select遵循posix标准,可以跨平台
    • select监控时间能精确到微秒

    select缺点

    • select所能监控的描述符有上限,为1024和__fd_SETSIZE这个宏有关
    • select每次都需要将描述符集合拷贝到内核进行监控,设计用户态到内核态之间的数据拷贝
    • select在内核中对描述符集合进行轮询遍历,随着描述符增多性能而逐渐下降
    • select返回时会将所有未就绪描述符移除,所以下次使用又需要重新添加,编码变得更加复杂
    • select返回给用户态的集合,并没有告诉用户哪个描述符就绪了,仍需要用户对集合进行轮询判断,随着描述符增多而性能下降

    poll模型

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

    fds是一个poll函数监听的结构列表. 每一个元素中, 包含了三部分内容: 文件描述符, 监听的事件集合, 返回的事件集合.

    nfds表示fds数组的长度.

    timeout表示poll函数的超时时间, 单位是毫秒(ms).

    用户为每一个关心的描述符定义事件结构,然后将描述符事件结构数组拷贝到内核中进行监控,轮询遍历事件数组中的描述符,判断描述符是否就绪了某个事件,若有描述符就绪了用户关心的事件,则会将就绪的事件放到事件结构的revents中,并调用返回,当调用返回后,用户遍历事件结构数组,判断结构中的revents事件中是否包含用户关心的事件,进而对描述符进行相应操作

    poll优点

    • poll采用事件结构的方式对描述符进行监控,简化了多个描述符集合的监控编码流程
    • poll没有描述符数量的上限限制

    poll缺点

    • poll每次监控都需要将所有的事件结构信息拷贝到内核,涉及用户态到内核态之间的数据拷贝
    • 在内核中poll进行就绪判断同样使用轮询遍历的判断,性能随着描述符增多而降低
    • 描述符事件就绪后,poll修改描述符事件结构中的revents信息为当前就绪的事件,但是poll并不会直接告诉用户哪一个事件就绪,仍需要用户对时间结构数组进行遍历,判断哪一个时间结构中的revents是用户关心的事件,进而对其操作
    • poll不能跨平台

    epoll模型

    每当一个进程调用epoll_create方法时,Linux内核就会创建一个eventpoll结构体,这个结构体中有两个成员,rdlist和rbr

    struct eventpoll{  
       ....  
       /*红黑树的根节点,这颗树中存储着所有添加到epoll中的需要监控的事件*/  
       struct rb_root rbr;  
       /*双链表中则存放着将要通过epoll_wait返回给用户的满足条件的事件*/  
       struct list_head rdlist;  
       ....  
    };  

     

    每个epoll对象都有这样一个独立的结构体,通过使用epoll_ctl方法向epoll对象中添加进来的事件,添加的事件都会挂载在rbr这颗红黑树上,所以插入的效率很高,同样的每个事件都会与程序建立回调关系,也就是说当响应的事件发生时会调用这个回调函数,这个回调函数会将发生的事件添加到rdlist双链表中,也就是说,用户只需要遍历这个双向链表就可以知道就绪的事件了

    epoll优点

    •  监控的描述符数量无上限

    • 采用事件结构对描述符进行监控,简化了对多个描述符集合的监控操作流程
    • epoll的事件信息,每条信息只需要向内核拷贝一次
    • opoll是一个异步阻塞操作,操作系统对描述符事件进行监控,这个操作系统实现的监控采用事件回调的方式,不需要轮询遍历事件描述符集合,性能不会随着描述符增多而下降
    • 当描述符就绪后将事件信息添加到rdlist双向链表中,epoll_wait只需要看一下双向链表中是否为空就可以知道是否有描述符就绪和就绪的描述符是什么,避免了无谓的遍历操作

    epoll缺点

    • epoll不能跨平台
    • 监控超时等待事件只能到毫秒
    展开全文
  • select,poll,epoll优缺点及比较

    万次阅读 2016-08-17 01:51:11
    在之前我已经分析了这三个函数,请看我之前的文章: IO多路复用之select函数详解 IO多路复用之poll函数详解 IO多路复用之epoll函数详解  这篇文章只总结优缺点,以便面试时回答。...select缺点1) 单个进程

    在之前我已经分析了这三个函数,请看我之前的文章:
    IO多路复用之select函数详解
    IO多路复用之poll函数详解
    IO多路复用之epoll函数详解
      这篇文章只总结优缺点,以便面试时回答。

    select优点

    1)select()的可移植性更好,在某些Unix系统上不支持poll()
    2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。

    select缺点

    1) 单个进程可监视的fd数量被限制。
    2) 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。
    3) 对fd进行扫描时是线性扫描。fd剧增后,IO效率较低,因为每次调用都对fd进行线性扫描遍历,所以随着fd的增加会造成遍历速度慢的性能问题
    4)select() 函数的超时参数在返回时也是未定义的,考虑到可移植性,每次在超时之后在下一次进入到select之前都需要重新设置超时参数。

    poll

      poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制, 
      pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。
      poll的实现机制与select类似,其对应内核中的sys_poll,只不过poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,相比处理fdset来说,poll效率更高。 
      poll返回后,需要对pollfd中的每个元素检查其revents值,来得指事件是否发生。

    poll优点

    1)poll() 不要求开发者计算最大文件描述符加一的大小。
    2)poll() 在应付大数目的文件描述符的时候相比于select速度更快
    3)它没有最大连接数的限制,原因是它是基于链表来存储的。

    poll缺点

    1)大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。
    2)与select一样,poll返回后,需要轮询pollfd来获取就绪的描述符

    epoll

      epoll是Linux下多路复用IO接口select/poll的增强版本。
      它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合。
      另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
      epoll除了提供select/poll 那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

    底层实现

      epoll在底层实现了自己的高速缓存区,并且建立了一个红黑树用于存放socket,另外维护了一个链表用来存放准备就绪的事件。

    工作过程:

      执行epoll_ create时,创建了红黑树和就绪链表,执行epoll_ ctl时,如果增加socket句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,用于当中断事件来临时向准备就绪链表中插入数据。执行epoll_wait时立刻返回准备就绪链表里的数据即可。

    epoll优点

    1)支持一个进程打开大数目的socket描述符(FD)

    2)IO效率不随FD数目增加而线性下降

    3)使用mmap加速内核与用户空间的消息传递。

    总结

    (1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。
      而epoll其实也需要调用 epoll_ wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在 epoll_wait中进入睡眠的进程。 
      虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的 时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间,这就是回调机制带来的性能提升。

    (2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内 部定义的等待队列),这也能节省不少的开销。

    展开全文
  • SELECT通信模型缺点

    2012-04-18 22:35:19
    #ifndef FD_SETSIZE #define FD_SETSIZE 64 ...WINSOCK2.h头文件里面的,select通信模型可能会用到这个,可以修改FD_SETSIZE的大小,但是不能超过1024,这个值也不能设置太大,否者严重影响服务程序的性能。
    #ifndef FD_SETSIZE
    #define FD_SETSIZE      64
    #endif /* FD_SETSIZE */

    WINSOCK2.h头文件里面的,select通信模型可能会用到这个,可以修改FD_SETSIZE的大小,但是不能超过1024,这个值也不能设置太大,否者严重影响服务程序的性能。
    展开全文
  • select与epoll优缺点比较

    千次阅读 2018-08-29 21:01:46
    select 异步阻塞设计,具有良好的跨平台支持。...但是其具有一个缺点select在单个进程中能够监听的文件描述符的数量存在最大限制,在linux上为1024,对于socket进行扫描时是依次扫描,效率低,浪费cpu时间。 ...

    select 异步阻塞设计,具有良好的跨平台支持。原理
    发送io后即返回,当内核文件加载好后,通过socket
    发送消息提醒用户线程任务可以继续执行,单个IO速度并没有改善,但是配合多线程使用,可以同时进行多个IO任务

    但是其具有一个缺点,select在单个进程中能够监听的文件描述符的数量存在最大限制,在linux上为1024,对于socket进行扫描时是依次扫描,效率低,浪费cpu时间。

    epoll的优点:
    并没有最大连接限制,没有监听上限,效率提升不是轮询的方式,只有活跃的FD才会调用callback函数

    两种工作模式:
    LT模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll时,会再次响应应用程序并通知此事件。

    ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll时,不会再次响应应用程序并通知此事件。

    展开全文
  • SELECT * 语句的缺点

    千次阅读 2012-12-03 16:48:16
    1、SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。 2、如果表的结构在以后发生了改变,那么SELECT * 语句...
  • select、poll和epoll的优缺点

    千次阅读 2018-07-17 16:43:19
    Linux中高级IO多路转接中select、poll和epoll的优缺点,这里主要谈select和poll的缺点以及epoll的优点。 一、select缺点: 1、编写难度大 2、同时处理的文件描述符是有上限的 3、每次需要重新设定fd集合 4、...
  • .select服务器优缺点:  优点:  (1)select()的可移植性更好,在某些Unix系统上不支持poll() ;  (2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒;  (3)select服务器不需要建立多个线程、...
  • I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪)...但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过...
  • select和epoll的区别

    千次阅读 2017-08-04 12:13:07
    select和epoll的区别 select原理概述 epoll原理概述 select缺点 epoll的优点 select一定没有epoll高效么
  • 缺点: 1)每次调用select,都存在 fd 集合在用户态与内核态之间的拷贝,I/O 的效率会随着监视 fd 的数量的增长而线性下降。 2)select()调用的内部,需要用轮询的方式去完整遍历每一个 fd,如果遍历完所有 fd
  • 上期的 MySQL 面试题:ID自增主键 - 无名的小猪... 本期的面试题是:SELECT * 和 SELECT 全部字段的 2 种写法有何优缺点? 知道答案的知友可以评论留言,该期问题答案会在下期的分享!随手点个赞,赠人玫瑰,手留余香!
  • select、poll、epoll优缺点总结

    千次阅读 2017-08-01 22:52:19
    IO多路复用之select IO多路复用之poll IO多路复用之epollselect、poll、epoll共同优点: (1)占用资源少,因为是单进程处理。(相比于多进程、多线程) (2)性能好,可一次等待多个进程。一、select服务器总结...
  • select和epoll 原理概述&优缺点比较

    万次阅读 多人点赞 2016-03-06 08:49:10
    这个问题在面试跟网络编程相关的岗位的时候基本都会被问到,刚刚看到一个很好的比喻: 就像收本子的班长,以前得一个个学生地去问有没有本子,...也许在细节方面不是特别恰当,但是总的来说,比较形象地说出了select
  • Linux多路复用之select/poll/epoll实现原理及优缺点对比
  • 数据库的select几种方式的优缺点

    千次阅读 2016-04-28 21:09:33
    1、SELECT A.*,B.* FROM table_A A LEFT JOIN table_B b ON B.id = A.id ...缺点:是如果两个表数据多,则中间结果集太大,需要较多的内存资源。 2、 $result = SELECT id FROM table_A; $data=arr
  • Linux 2.6.9内核实现的select,poll,eventpoll优缺点比较 通过前面三个博客可以得知select,poll,eventpoll 的详细实现,现在来总结对比下它们之间的不同: select 流程图 poll 流程图 eventpoll 流程图 优缺点...
  • select和epoll原理和优缺点使用场景

    千次阅读 2019-04-15 17:03:11
    select()的使用 所需头文件: #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> ...
  • Linux中高级IO多路转接中select、poll和epoll的优缺点,这里主要谈select和poll的缺点以及epoll的优点。 一、select缺点: 1、编写难度大 2、同时处理的文件描述符是有上限的(1024 ) 3、每次需要重新设定fd...
  • select缺点 输入参数和输出参数是同一个,就意味着每次调用select都要重新设置 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 select关心的文件描述符是有上限的(底层是位图...
  • select模型的原理、优点、缺点

    千次阅读 2019-04-30 15:53:00
    select缺点: (1)每次调⽤用select,都需要把fd集合从⽤用户态拷贝到内核态,这个开销在fd很多时会很⼤大 (2)同时每次调⽤用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很⼤大 (3)...
  • select,poll,epoll区别面试常问

    千次阅读 2020-08-26 21:34:56
    select缺点 1) 单个进程可监视的fd数量被限制。 2) 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。 3) 对fd进行扫描时是线性扫描。fd剧增后,IO效率较低,...
  • **关于I/O多路复用:** I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一个通知。...操作系统的这个功能通过select/pol
  • select()和poll() IO多路复用模型 ...select缺点: 1.能监听的文件描述符有上限,这个上限是由fd_set决定的。 2.它返回的只是就绪事件的个数,要判断是那个事件满足,需要遍历文件描述符。 3.select监听的集合是输
  • select网络模型

    2017-10-25 12:47:41
    详细讲解了select网络模型,包括select模型执行的原理,富含有整个select模型的流程图,关于select模型的优点缺点,内在的运行原理。欢迎各位挑错,共同进步

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,140
精华内容 66,856
关键字:

select缺点