4种IO模型 java相关
1 . 同步阻塞IO
典型的一个就是socket的TCP例子
服务端和客户端交流
类似这样
以下都是伪代码
// server端 阻塞自己直到收到消息
// 没收到 线程被挂起
msg = server.accept()
// 收到再执行
handler(msg)
2. 同步非阻塞IO
// server端
while(msg=server.accpet() !=null){
handle(msg)
}
不同于阻塞性的IO,每次都一定有返回值。
3. 多路复用IO
这个 应该是使用最多IO模型了,许多高性能IO框架都是基于多路复用IO
像netty
nio是多路复用IO的基础
多路复用有两种模式Proactor模式和Reactor模式
Proactor 是用于异步IO
Reactor 是用于同步IO
-
Reactor 模式
通俗理解就是
老妈(客户端)要我(服务端)中午煮饭
(事件/或者IO请求),但是我现在想打游戏(我不想一直等待时间然后去煮饭),
我先告诉小爱同学(事件注册器)
到时候小爱同学的闹钟(条件)提醒我可以去煮饭了(callbakc 回调通知我)
然后我知道我要去煮饭了(准备完成IO)事件注册的 是“我要亲自煮饭这件事“
回调的结果是 “这件事可以做了”
-
Proactor 模式
通俗理解就是
老妈(客户端)要我(服务端)中午煮饭(事件/或者IO请求),
但是我现在想打游戏(我不想一直等待时间然后去煮饭),
我先告诉小爱同学我要煮饭(事件分离器)大概一杯米和1.5杯水(数据大小和缓冲区),小爱同学直接启动全自动电饭煲(操作系统)把米倒进去,加上水。电饭煲煮好了,小爱同学知道饭煮好了(完成了IO)。提醒我可以吃饭了(通知我可以吃饭)
然后我知道了(完成事件了)
事件注册的 是“我反正要饭煮好怎么实现我不在乎“
回调的结果是 “这件事按照一杯米1.5杯水的要求做完了”
仔细分析一下Reactor模式 一般都是使用Reactor 模式 ,因为Proactor需要操作系统
处理高并发的IO请求常见有下面3种模式
以下代码及图片来源于
并发包大神Doug Lea
传统IO模型
-
单Reactor 单处理线程
一个Reactor 处理所有的请求,包括 io 和其他操作
-
单Reactor 多处理线程
Reactor只完成IO ,剩下的交给工作线程去做
-
多Reactor 多处理线程
分离了请求和实际操作
4 . 异步IO
很少用,需要操作系统
file = socket.getfile(buff,size);
// 等待一段时间
// buff size 中已经有了file
// 告诉我 我收到了
res = server.finishfile()