网络通信,即两个进程之间的通信,有服务器端提供IP和端口并进行监听,客户端进行连接,通过三次握手建立连接,然后通过网络套接字(socket)进行通信
一个完整的IO读请求操作过程包括两部分
a 查看数据是否就绪
b 进行数据拷贝
阻塞IO和非阻塞IO的区别:
在第一个阶段(查看数据是否就绪),这个阶段是有用户线程操作的,如果数据没有就绪,查看数据是否就绪的过程是否一直等待,如果一直等待,就是阻塞IO,如果不等待,直接返回一个标志状态,则为非阻塞IO
同步IO和异步IO的区别:
同步IO的定义:A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
异步IO的定义:An asynchronous I/O operation does not cause the requesting process to be blocked.
事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的:
对于同步IO,当用户线程发出IO请求操作后,如果数据没有就绪,需要通过用户线程去不断的轮询是否就绪(用户线程没有被阻塞,不释放CPU),当数据就绪后,再将数据从内核拷贝到用户线程
对于异步IO,当用户线程发出IO请求操作后,该线程就会得到一个返回值,查看数据是否就绪和数据拷贝都交由内核就行处理,所以异步IO需要操作系统的底层支持。
1、传统的同步阻塞式I/O编程
服务端由一个独立的Acceptor线程负责监听客户端的连接请求,监听到后为每一个客户端创建一个线程进行链路处理,处理完成后有线程返回给客户端应答
BIO通讯模型的问题:
缺乏弹性的伸缩能力,客户端并发访问增加时,服务端的线程数和客户端的并发数成1:1的正比关系增长,客户端增大到一定程度后,服务端的系统性能会急剧下降,最终不能对外提供服务
2、基于NIO的非阻塞式编程(non-blocking IO)
工作原理:
a 由一个专门的线程来处理所有的IO请求,负责分发;
b 事件驱动机制:事件到的时候触发,而不是同步的去监听事件;
c 线程通讯,线程之间都是通过wait、notify等方式进行通讯,保证每一次上限问切换都是有意义的,减少无谓的线程切换
相关概念:
a 缓冲区Buffer:包含了一些要写入或者要读出的数据
b 通道Channel:可以通过通道来读取或写入数据,通道是双向的,流是单向的(一个流必须是InputStream或OutputStream的子类)
c 多路复用器Selector:提供选择已就绪的任务的能力,Selector会不断的轮询注册在其上的Channel,如果Channel上有新的TCP连接接入、读或写事件,这个Channel就是激活状态,会被Selector轮询出来
一个Selector可以同时轮询多个Channel
Reactor模式:
Reactor模式角色分类:
a Reactor,将IO事件发派给对应的handler
b Acceptor,处理客户端的连接请求
c handlers,执行非阻塞的读/写操作
在NIO通讯模型中,
Selector充当Reactor模式的Reactor角色,不断的轮询注册在其上的Channel,判断Channel是否就绪,
ServerSocketChannel会监听客户端的连接请求,该线程就是Acceptor,
一个完整的IO读请求操作过程包括两部分
a 查看数据是否就绪
b 进行数据拷贝
阻塞IO和非阻塞IO的区别:
在第一个阶段(查看数据是否就绪),这个阶段是有用户线程操作的,如果数据没有就绪,查看数据是否就绪的过程是否一直等待,如果一直等待,就是阻塞IO,如果不等待,直接返回一个标志状态,则为非阻塞IO
同步IO和异步IO的区别:
同步IO的定义:A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
异步IO的定义:An asynchronous I/O operation does not cause the requesting process to be blocked.
事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的:
对于同步IO,当用户线程发出IO请求操作后,如果数据没有就绪,需要通过用户线程去不断的轮询是否就绪(用户线程没有被阻塞,不释放CPU),当数据就绪后,再将数据从内核拷贝到用户线程
对于异步IO,当用户线程发出IO请求操作后,该线程就会得到一个返回值,查看数据是否就绪和数据拷贝都交由内核就行处理,所以异步IO需要操作系统的底层支持。
1、传统的同步阻塞式I/O编程
BIO的通信模型
服务端由一个独立的Acceptor线程负责监听客户端的连接请求,监听到后为每一个客户端创建一个线程进行链路处理,处理完成后有线程返回给客户端应答
BIO通讯模型的问题:
缺乏弹性的伸缩能力,客户端并发访问增加时,服务端的线程数和客户端的并发数成1:1的正比关系增长,客户端增大到一定程度后,服务端的系统性能会急剧下降,最终不能对外提供服务
2、基于NIO的非阻塞式编程(non-blocking IO)
NIO的通信模型
工作原理:
a 由一个专门的线程来处理所有的IO请求,负责分发;
b 事件驱动机制:事件到的时候触发,而不是同步的去监听事件;
c 线程通讯,线程之间都是通过wait、notify等方式进行通讯,保证每一次上限问切换都是有意义的,减少无谓的线程切换
相关概念:
a 缓冲区Buffer:包含了一些要写入或者要读出的数据
b 通道Channel:可以通过通道来读取或写入数据,通道是双向的,流是单向的(一个流必须是InputStream或OutputStream的子类)
c 多路复用器Selector:提供选择已就绪的任务的能力,Selector会不断的轮询注册在其上的Channel,如果Channel上有新的TCP连接接入、读或写事件,这个Channel就是激活状态,会被Selector轮询出来
一个Selector可以同时轮询多个Channel
Reactor模式:
Reactor模式角色分类:
a Reactor,将IO事件发派给对应的handler
b Acceptor,处理客户端的连接请求
c handlers,执行非阻塞的读/写操作
在NIO通讯模型中,
Selector充当Reactor模式的Reactor角色,不断的轮询注册在其上的Channel,判断Channel是否就绪,
ServerSocketChannel会监听客户端的连接请求,该线程就是Acceptor,