引言
之前的两篇文章 FastThreadLocal怎么Fast?、ScheduledThreadPoolExecutor源码解读 搞的我心力交瘁,且读源码过程中深感功力不足,遂决定“磨刀”——先达到较熟练使用netty的程度,再回过头来继续啃源码!至于“磨刀石”嘛,选择了《Netty权威指南》(第二版)……哎呦,不错奥!
正文
其实本篇文章更像是一篇读书笔记,记录了Linux网络模型的相关知识。为什么要关注Linux网络模型?因为java的各I/O模型与之关系紧密!
书中根据UNIX网络编程,作了5种I/O模型分类:
阻塞I/O模型
最简单的一种,等待直至完成的过程,不多作解释。
非阻塞I/O模型
这种也很好理解,由阻塞I/O
的死等系统响应进化成多次调用查看数据就绪状态。
I/O复用模型
select/poll,以及它的增强版epoll
就属于该种模型。与非阻塞I/O模型相比,愚以为有两点优势:
- 不需要用户进程进行扫描以确认数据就绪状态,改为系统层面帮你“扫描”。此时用户进程
阻塞在select事件
上,数据就绪系统予以通知。 - epoll 基于事件驱动的方式代替扫描
这里多提一句,epoll把消息通知给用户空间时避免了内存复制(0拷贝),使用的mmap技术,即内核和用户空间映射到同一内存实现。
信号驱动I/O模型
应用进程建立SIGIO信号处理程序时,是非阻塞
的。而数据就绪时,以SIGIO信号的形式通知到用户进程。
异步I/O模型
特点是,几乎全部交由系统处理,数据处理完毕后,才通知到用户进程。
后记
以上的描述中,是不是很多词句都在java I/O相关的世界中听到过?是的——阻塞I/O对应BIO,epoll之于NIO,NIO的多路复用技术对标I/O复用模型,以及AIO和异步I/O模型……
好了,that's all,小记就要有小记的样子。
最后,再次推荐《Netty权威指南》!