首先我想说下我对 同步异步 阻塞非阻塞的理解:
同步异步 指的是线程在处理一件事的时候,能不能去处理另外一件事,然后过一会再给上一件事结果
阻塞非阻塞 指的是线程在处理一件事的时候,会不会被阻塞住 (linux 里的NIO 意思就是no block io)
这在java 等编程语言里 ,应该是一种编程模型,
而在linux 的IO模型里 ,这种表述就不成立 ,因为不管什么IO模型,在从内核复制到用户态的过程 中都是阻塞的,即使是 同步非阻塞模型,
在linux 模型中,阻塞非阻塞指的是 使用系统调用看用户态准备好没有这个过程 ,而对于linux多路复用,系统调用select也阻塞,也没有办法去做别的任务,看起来他应该是同步阻塞,但他却比linux的同步阻塞要好得多,
因为同步阻塞模型是对一个IO ,而多路复用是对多个IO,
关于linuxIO模型 : https://www.jianshu.com/p/486...
我之前也纠结过同步非阻塞和异步非阻塞的事情,但是后来想了想,这个东西要从不同的层面看,就拿netty来说,从整体来看,是属于异步非阻塞,accept的线程处理完请求,交给后面的reactor,
那accept的线程不就去处理别的请求了,这不就达到了异步非阻塞,但他内部reactor 使用的是多路复用模型 而不是 真正的 异步非阻塞模型,
所以说了这么多,其实还是想表达 同步异步,阻塞非阻塞 ,只是一种编程思路,不用去纠结,也不要被linux的IO模型搞混了,
还有就是java的NIO 是 new IO 的意思,不是noblock io ,因为他除了提供selector之外,还有其他的io特性提供,比如大文件的处理