一、BIO——同步阻塞
- 线程是有开销的
- 线程切换也是有开销的
连接建立后并不是时时刻刻都会进行读写数据的,但是在空闲时候服务器也要维护这个连接,就会导致服务器压力太大
- 还有一个问题就是会
阻塞
,【在进行读写的时候】,如果没有读到数据那么就会阻塞在read()函数那里
BIO模型
二、NIO——同步非阻塞
- NIO是BIO的改良
-
Select选择器
(多路复用)就是一个对象
一个线程维护多个连接
NIO模型
三、AIO——异步非阻塞
- 有效的请求才会让服务器启动线程
- 先由OS完成后再通知【服务端程序】启动线程来处理
四、线程模型
- 主从Reactor多线程模型——有多个Reactor
-
传统阻塞IO服务模型
传统阻塞IO服务模型
Handler
是一个【阻塞对象】
五、Reactor模式——反应器模式

也叫【分发者模式】,【通知者模式】
关键点:
- 当初的多个阻塞对象换成了一个阻塞对象
线程池
Reactor详细示意图
六、Reactor模式中的核心组成
- Reactor——示意图中的
ServicHandler
- Handlers——示意图中的
EventHandler
Reactor和Handlers
Reactor模式分类
七、单Reactor单线程

-
Select
监控客户端请求事件 -
Dispatch
进行分发
方案说明
Handler
那里在【进行读写】的时候还是会阻塞
优缺点
八、单Reactor多线程

- 创建多个
Handler对象
- 这里的
Handler对象
不做具体的业务处理,将业务处理分发给Worker线程池
,然后Worker线程池
再分配【独立的线程】来完成真正的业务
注:Handler还会收到Worker返回的结果然后send给客户端
对比一下,其实【单Reactor多线程】和【单Reactor单线程】最大的不同就是将【业务处理部分】拿去给Worker线程池
来处理,本身还是会造成Reator
需要处理所有事件监听和响应
的问题。

九、主从Reactor多线程
分成了3级
- 一级:MainReactor
- 二级:SubReactor, Handler
-
三级:Worker
主从Reactor多线程
【MainReactor对象】是通过
select()
函数来监听【连接事件】的
【SubReactor对象】还是可以监听的,因为它依然有select()
函数;【SubReactor对象】还会创建【Handler对象】进行各种事件的处理
【Handler对象】有read()
和send()
函数
将结果发回给【Client对象】的是【Handler对象】
将结果发回给【Handler对象】的是【worker对象】
【MainReactor】可以关联多个【SubReactor对象】
-
线程池的处理本质是【解码-->计算-->编码】
Model
子线程不用给Reactor主线程返回数据
网友评论