TEXT:
BIO NIO AIO
- socket
- 定义
- socket不是java中独有的概念,而是一个语言无关标准,任何可以实现网络编程的编程语言都有socket
- 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为一个socket
- 连接三次握手
- server启动,开始监听
- 1.client→server
- 启动后,向server发起询问,hi,我准备连接你
- 2.server→client
- 可以,我已经准备好了,可以连接了
- 3.client→server
- 好的,我也准备好了,可以连接了
- 断开四次挥手
- 1.client→server
- hi,我准备断开连接了
- 2.server→client
- 可以,我这边准备好了,你可以断开连接了
- 3.server→client
- 我已经断开连接了
- 4.client→server
- 好的,我也断开连接了
- 1.client→server
- 定义
- 长连接与短连接
- 长连接
- 建立连接后可以多次进行数据交互,io
- 短连接
- http
- 长连接
- 同步异步&阻塞非阻塞
- 同步异步
- 定义:同步和异步是针对应用程序和内核的交互而言的。
- 同步
- 用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪
- 异步
- 用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到OS发来的IO完成的通知
- OS需要支持异步IO操作的API
- 阻塞非阻塞
- 定义:进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,是一种读取或写入操作方法的实现方式
- 阻塞
- 读取或写入方法将一直等待
- 非阻塞
- 读取或写入方法会立即返回一个状态值
- 同步异步 与 阻塞非阻塞 没有直接关联
- 同步异步
- BIO
- Blocking IO
- 同步阻塞的编程方式
- JDK1.4出来之前
- 步骤
- 启动服务端,开始监听
- 请求来了以后,为每一个客户端请求,创建一个socket连接(同时创建一个Thread),socket连接和请求客户端平级
- socket连接和请求客户端,连接后,直接进行IO数据读写
- socket连接和请求客户端,任何一方关闭,服务请求结束
- 缺点
- 并发效率比较低
- 改进
- 使用线程池
- 试用场景
- 连接数目比较小且固定的架构
- NIO
- Unblocking IO
- New IO
- 同步非阻塞的编程方式
- 定义点
- NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题
- NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理
- 不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的
- NIO采用的是一种多路复用的机制,利用单线程轮询事件,高效定位就绪的Channel来决定做什么,只是Select阶段是阻塞式的,能有效避免大量连接数时,频繁线程的切换带来的性能或各种问题。
- 并不能完全解决BIO的问题,当线程有访问JDBC时
- NIO方式适用于连接数目多且连接比较短(请操作)的架构,比如聊天服务器,并发局限于应用中,编程复杂。
- Unblocking IO
- AIO
- Asynchronous IO
- 异步非阻塞的编程方式
- 与NIO不同,当进行读写操作时,只须调用API的read或write方法即可,这两种方法均为异步的
- read/write完成后,会主动调用回调函数。jdk7中,这部分内容被称作NIO.2,借助于OS的读buffer和写buffer
- 异步非阻塞,服务器实现模式为,一个有效请求一个线程
- AIO适用于连接数目多且连接比较长(重操作)的架构,比如 滴滴打车
- Asynchronous IO