BIO

image.png

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

NIO

select

image.png
application知道有I/O时间发生,但并不知道哪几个流,所以只能轮询所有流读取数据,时间复杂度O(n),同时处理的流越多,时间越多,且有最大连接限制

poll

image.png

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

epoll

image.png
事件驱动,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共享内存

AshShawn
6 声望2 粉丝

下一篇 »
JVM琐碎知识