一、概念
1、
同步与异步同步和异步关注的是消息通信机制 (synchronous communi
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
2、阻塞
实际上阻塞与非阻塞的概念,通常是针对底层的IO操作来说的。
阻塞IO会一直block住对应的
阻塞I/O特点是调用I/O操作之后一定要等到系统内核层面完成所有操作之后,调用才返回
非阻塞I/O调用后会立即返回一个文件描述符,调用方的数据再通过文件描述符获取
二、网络编程
对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址
1)准备数据
2)将数据从内核缓冲区拷贝到进程地址空间
由于存在这两个阶段,Linux产生了下面五种IO模型。
1.1、阻塞式I/O模型
1.2、非阻塞式I/O模型
1.3、I/O多路复用(事件驱动)模型
1.4、信号驱动式I/O(SIGIO)
1.5、异步I/O模型
关于这张图的解释:
在说明同步IO和异步IO的区别之前,需要先给出两者的定义。Stevens给出的定义(其实是POSIX的定义)是这样子的:
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes; An asynchronous I/O operation does not cause the requesting process to be blocked;
两者的区别就在于同步IO做”IO operation”的时候会将process阻塞。按照这个定义,之前所述的阻塞IO,非阻塞IO ,IO复用都属于同步IO。 有人可能会说,非阻塞IO 并没有被block啊。这里有个非常“狡猾”的地方,定义中所指的”IO operation”是指真实的IO操作,就是例子中的recvfrom这个system call。非阻塞IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段
四、Java的网络io模型
1、最原始的bio模型
2、伪异步io,改进版bio (
3、nio模型
JDK的
netty的线程模型
JDK1.7引入
五、简单的
代码实现:
六、参考
先读篇:
聊聊Unix与Java的IO模型 (返璞归真篇)
medium=toutiao.io&utm source=toutiao.io
JAVA的网络IO模型
https://mp.weixin.qq.com/s/zRBH6SJjRqBiZSmK6fREUw (未读懂)
最全的介绍 (包括java 和 linux io) https://www.cnblogs.com/diegodu/p/6823855.html(未读懂)
详解
网络编程基础知识(必读) https://mp.weixin.qq.com/s? _biz=MzU4ODgyMDI0Mg==&m redirect
半同步 半异步的提出 // 半同步半反应堆 // poll select epoll 解释 https://zhuanlan.zhihu.com/p/58860015?hmsr=toutiao.io&utm medium=toutiao.io&utm source=toutiao.io(不同的解释)
多路复用、非阻塞、线程与协程 (最通俗,引入为什么需要多路复用+go现实实现逻辑)
https://www.nosuchfield.com/
为什么 多路复用 是 异步阻塞的解释 https://www.jianshu.com/p/2f2fe920ed25
reactor的发展史 https://www.cnblogs.com/doit8791/p/7461479.html
选读篇:
Linux网络编程之IO模型 https://mp.weixin.qq.com/s/b-5AZnWNMfzZ2xZb 6 mgw
零拷贝及 java上的应用
https://mp.weixin.qq.com/s/cR5gEpapE-V43Pi4LoET8g
java nio 基础篇
https://mp.weixin.qq.com/s? _biz=MzU2NjIzNDk5NQ==&mid=2247483837&idx=1&sn=b51954fd4644feeddde61daed5d273b6&scene=21#wechat redirect
java nio 实战篇
https://blog.csdn.net/elricboa/article/details/79034617
Java网络编程- IO多路复用(多Reactor)(主从式Reactor) 三篇
https://blog.csdn.net/weililansehudiefei/article/details/70889544
接下来的文章会去重点 研究nio的相关实现,尽情期待
如果喜欢,欢迎关注我的公众号:乔志勇笔记