乐趣区

关于nio:linuxbio与nio的区别

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 共享内存
退出移动版