五种IO模型 和 IO复用中的select, poll , epoll

阻塞式I/O


非阻塞式I/O


IO复用


信号驱动式I/O


异步I/O


select, poll, epoll

 都是IO多路复用的机制。IO多路复用就是通过一种机制,一个进程可以监控多个描述符, 一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select, poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需息负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

 

select

        select函数监测文件描述符有3种,分别是writefds, readfds, exceptfds.

        调用后select函数会阻塞,直到有描述符就绪(有数据 可读,可写,或者有except),或者超时(timeout指定等待时间,如果立即返回,设为timeout设为null即可), 函数返回。当select函数返回后,可以通过遍历fdset,找到就绪的描述符

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

 

Poll

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

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

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

 

Epoll

        Epoll是在linux2.6内核中提出的, 是之前select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值