源地址:https://blog.csdn.net/zhangzeyuaaa/article/details/50520458
在弄清楚什么是BIO
、NIO
和AIO
之前,需要先搞清楚什么是同步
、异步
、阻塞
、非阻塞
举例说明:
名词 | 解释 | 举例 |
---|---|---|
同步 | 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 | 亲自去买奶茶 |
异步 | 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知) | 网上点一杯奶茶,自己该干嘛干嘛,外卖员送过来打电话通知你 |
阻塞 | 所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止 | 去食堂打饭,轮到你的时候没饭了,你就在那等,, |
非阻塞 | 非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 | 去食堂吃饭,轮到你没饭了,艹,不吃了 |
select
系统调用来完成的,而select
函数本身的实现方式是阻塞的,而采用select
函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select
属于同步操作。因为select
之后,进程还需要读写数据),从而提高系统的并发性!BIO
方式适用于连接数目比较少且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。NIO
方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。AIO
方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。Reactor
模式和Proactor
模式。Reactor
模式应用于同步I/O的场景。
读取操作:
写入操作:
类似于读取操作,只不过第一步注册的是写就绪事件。
Proactor
模式读取操作:
写入操作:
和读取操作类似,只不过感兴趣的事件是写入完成事件。
Reactor
和Proactor
模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/onlyrun/p/15180801.html
内容来源于网络,如有侵权,请联系作者删除!