线程模型:同步 n,异步 2n,nio n+1,aio n (os thread execute user thread then os can callback execute new other user thread
BIO模型
同步阻塞
在服务器端:有专门的客户连接 接收器Acceptor,当有新的客户端连接到达后,Acceptor负责第一步连接,然后给每一个客户端连接创建一个新的线程来处理对应的业务;处理完成后,通过输出流返回给客户端,并将线程销毁,这也是最典型的一对一服务模型。一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
伪异步IO
通过线程池机制优化了BIO模型
nio模型
同步非阻塞
是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有I/O请求时,才开启一个线程进行处理,也就是一个请求一个线程模式。服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
打开ServerSocketChannel,监听客户端连接
绑定监听端口,设置连接为非阻塞模式
创建Reactor线程,创建多路复用器并启动线程
将ServerSocketChannel注册到Reactor线程中的Selector上,监听ACCEPT事件
Selector轮询准备就绪的key
Selector监听到新的客户端接入,处理新的接入请求,完成TCP三次握手
设置客户端链路为非阻塞模式
将新接入的客户端连接注册到Reactor线程的Selector上,监听读操作,读取客户端发送的网络消息
异步读取客户端消息到缓冲区
对Buffer编解码,处理半包消息,将解码成功的消息封装成Task
将应答消息编码为Buffer,调用SocketChannel的write将消息异步发送给客户端
http://blog.csdn.net/nyyjs/article/details/76209036
aio模型
异步非阻塞
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。
http://zhangming04.iteye.com/blog/2328030
https://www.cnblogs.com/charlesblc/p/6072827.html