BIO

一个线程对应一个连贯,read时阻塞,直到有数据返回.

NIO

select


application晓得有I/O工夫产生,但并不知道哪几个流,所以只能轮询所有流读取数据,工夫复杂度O(n),同时解决的流越多,工夫越多,且有最大连贯限度

poll

application将文件描述符数组拷贝到内核空间,内核轮询每个fd对应的设施状态,工夫复杂度O(n),没有最大连接数的限度,基于链表来存储文件描述符fd

epoll


事件驱动,epoll会把哪个流产生了怎么的I/O事件告诉咱们,
首先通过create函数创立一个epoll实例,而后应用ctl add/delete函数新增删除epoll实例上要监听的事件类型,调用wait函数期待事件产生,当产生事件时,内核会告诉application处理事件,application再去读取流
epoll应用mmap文件映射,能够实现application和内核空间的音讯零拷贝,缩小复制开销.

select,poll,epoll之间的区别

  1. 过程最大连接数:
    select:有,受linux最大连接数影响
    poll:无,基于链表来存储
    epoll:有链接限度,但数量很大 1G内存机器能够关上10万连贯,
  2. fd剧增的IO效率
    select:线性遍历,不论链接是否沉闷均会遍历
    poll:同select
    epoll:基于事件回调,沉闷socket才会被动调起callback,沉闷链接少时,性能很好,但当所有连贯都沉闷时,有性能问题
  3. 消息传递形式
    select: 内核与用户空间之间须要互相拷贝
    poll:同上
    epoll:通过mmap共享内存