1

引言

之前的两篇文章 FastThreadLocal怎么Fast?ScheduledThreadPoolExecutor源码解读 搞的我心力交瘁,且读源码过程中深感功力不足,遂决定“磨刀”——先达到较熟练使用netty的程度,再回过头来继续啃源码!至于“磨刀石”嘛,选择了《Netty权威指南》(第二版)……哎呦,不错奥!

正文

其实本篇文章更像是一篇读书笔记,记录了Linux网络模型的相关知识。为什么要关注Linux网络模型?因为java的各I/O模型与之关系紧密!

书中根据UNIX网络编程,作了5种I/O模型分类:

阻塞I/O模型

clipboard.png

最简单的一种,等待直至完成的过程,不多作解释。

非阻塞I/O模型

clipboard.png

这种也很好理解,由阻塞I/O的死等系统响应进化成多次调用查看数据就绪状态

I/O复用模型

clipboard.png

select/poll,以及它的增强版epoll就属于该种模型。与非阻塞I/O模型相比,愚以为有两点优势:

  1. 不需要用户进程进行扫描以确认数据就绪状态,改为系统层面帮你“扫描”。此时用户进程阻塞在select事件上,数据就绪系统予以通知。
  2. epoll 基于事件驱动的方式代替扫描

这里多提一句,epoll把消息通知给用户空间时避免了内存复制(0拷贝),使用的mmap技术,即内核和用户空间映射到同一内存实现。

信号驱动I/O模型

clipboard.png

应用进程建立SIGIO信号处理程序时,是非阻塞的。而数据就绪时,以SIGIO信号的形式通知到用户进程。

异步I/O模型

clipboard.png

特点是,几乎全部交由系统处理,数据处理完毕后,才通知到用户进程。

后记

以上的描述中,是不是很多词句都在java I/O相关的世界中听到过?是的——阻塞I/O对应BIO,epoll之于NIO,NIO的多路复用技术对标I/O复用模型,以及AIO和异步I/O模型……

好了,that's all,小记就要有小记的样子。
最后,再次推荐《Netty权威指南》!


青鱼
268 声望25 粉丝

山就在那里,每走一步就近一些