Netty 核心源码解读 —— 开篇

NIO 是同步非阻塞 I/O,与 BIO 不同的是,用户线程会不断的发起 read 调用,直到数据到了内核态,read 调用会把数据从内核态拷贝到用户态,不过用户线程在等待数据这段时间里还是阻塞的,等数据到了用户态,内核再把线程叫醒。

I/O 多路复用,与 NIO 不同的是,用户线程把 read 调用分成了两步,第一步线程先发起 select 调用,检查数据是否到了内核态,第二步如果数据到了内核态,用户线程再发起 read 调用,同样在等待数据从内核态拷贝到用户态这段时间里,线程还是阻塞的。那为啥叫 I/O 多路复用呢?这首先要清楚这个“多路”和“复用”指的是什么,其实“多路”指的是多个数据通道(或多个 Socket 套接字),而“复用”指的是复用一个或少量线程,串起来理解就是通过复用一个或少量线程来跟踪每一个 Socket(I/O 流)的状态来同时管理多个 I/O 流,具体来讲,线程一次 select 调用可以获取内核态中多个数据通道的数据状态,顾称 I/O 多路复用。

图片

select、poll、epoll 都是 I/O 多路复用的具体实现,关键点是当有 I/O 事件发生了,如何知道这个事件是哪个 I/O 的?select、poll、epoll 都是通过将当前进程加载到对应的 fd 中,当有 fd 事件发生,调用 fd 事件回调函数,唤醒对应进程。select/poll 与 epoll 不同的是,select/poll 是在用户态管理 fd 监听列表,这就需要 select/poll 先要把监听 fd 列表从用户态传到内核态,每当 fd 有事件,唤醒当前进程,遍历 fd 全部列表,检查就绪事件,再将 fd 全部列表从内核态传回用户态;而 epoll 是在内核态管理 fd 监听列表(采用红黑树存储),epoll 通过增量式操作监听 fd,每当 fd 有事件,唤醒当前进程,会将发生事件的 fd 插入 epoll 的就绪队列,这样 epoll 就不需要遍历 fd 全部列表,只需返回就绪队列的 fd。

epoll

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值