阻塞
进行读写时,如果没有东西可读,或者暂时不写,程序就进入等待状态直到有东西可读为止。
非阻塞是如果没有东西可读,或者不写,读写函数马上返回。
同步
同步是指用户操作后等待或者轮询的去查看操作是否就绪
异步
异步是指用户某动作操作后便开始做其他动作,而当这个动作操作完成的时候,用户会得到这个动作完后才能的通知。
同步阻塞io
用户进程发起一个io操作,必须等待io操作完成,只有当io操作完成,只有当真正完成io操作以后,用户进程才能执行。
同步非阻塞
用户发起一个io操作以后可以返回做其他事情,但是用户进程需要时不时的询问IO操作是否就绪,引起不必要的资源浪费。
异步阻塞
应用发起一个io操作以后,不会去等待内核io操作的完成,等内核完成io操作以后会通知应用程序。阻塞是因为这是通过select系统调用来完成的,select函数本身实现方式是阻塞的,而采用select函数还有一个好处可以同时监听多个句柄。从而提高系统的并发性。
异步非阻塞
在此种模型下,用户进程只需要发起一个io操作然后立即返回,io真正完成后,应用程序会得到io操作完后通知,此时用户进程只需对数据进行处理就好了,不需要实际操作io读写,真正的io读取由内核完成了
BIO
传统的同步阻塞模型开发,serverSocket负责绑定IP地址,启动监听端口;Socket负责发起链接操作。连接成功后,双方通过输入、输出流进行同步阻塞式通信。
采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责客户端的连接,他接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,完成后通过输出流返回应答给客户端,请求完成,线程销毁,典型的一赢球一应答模式。
缺点
缺乏弹性伸缩,客户并发访问量增加后,服务端的线程个数和客户并发数呈1:1,线程数量膨胀以后,资源消耗,系统性能下降,最后就只能挂了。
适用于
连接数目小且固定的架构,这种方式对服务器资源要求比较好
伪异步I/O
改进bio的一个请求创建一个线程,我们可以使用线程池来管理线程,实现一个或多个线程实现N个客户端的模型(底层还是同步阻塞io)
使用线程池我们就可以控制线程的最大数量,保证对系统资源的有效控制。
缺点:并发量大时,因为限制了线程数量,所以可能部分的请求都会处于等待状态。
NIO编程
异步阻塞IO、同步非阻塞
不同于BIO的Socket和serverSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现。
SocketChannel和ServerSocketChannel支持阻塞和非阻塞两种模式。
适用于连接数目多、连接比较短的架构,比如聊天服务,并发局限于应用中,编程比较复杂
AIO
2.0引入,提供异步文件和异步套接字通道的实现。
异步非阻塞I/O。
适用于连接数目多且连接比较长的架构,比如相册服务器,充分调用os参与并发操作,编程比较复杂,jdk7开会支持。
参考并感谢: