目录
编辑
io 多路复用
NIO
多线程 和 io多路复用区别 :
Netty 操作流程
看了众多精简总结
Netty
Bio
Nio
Aio
Io多路复用
事件驱动
信号驱动
io 多路复用
I/O 多路复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。
NIO
多线程 和 io多路复用区别 :
多线程,切换线程进程需要切换内核,消耗时间和内存资源,io多路复用,单个线程处理不需要切换线程,高并发性能极佳,但是io多路复用开发复杂写的多,多线程写的少,io多路复用有点门户级开发思想,
举个例子:
一个餐厅有多个客人,餐厅等于一个线程,多个客人=多路复用统一个餐厅
跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源。而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳。但多线程编程逻辑和处理上比I/O多路复用简单,而I/O多路复用处理起来较为复杂。
Netty 操作流程
创建ServerBootStrap
- 绑定端口等待链接
- 客户端链接,服务端注册信息出发 accpt方法
- 服务端注册通道,监测通道
- 通道检查道读写操作
- 通道处理程序header 处理读写任务
看了众多精简总结
Netty
链接socket使用了同步非阻塞 实现多次询问链接众多链接
注册的通道层实现了io多路复用,就是用的时候就去调用通知执行
使用 nio 不用aio原因
- Aio 是异步的 但底层也是epoll,加上jdk做了一层深层封装不便于开发加性能没有明显优势所以未选择
- Aio是 异步模式,netty 是 反应模式,如果吧异步模式开发成反应模式,相当于多此一举绕回来了,没必要
2.aio传数据的时候会提前创建内存区域,占用性能,nio 传输的时候开辟内存区域,在链接量大的时候非常好内存资源
Bio
是同步阻塞
Nio
是同步非阻塞
Aio
是异步实现
Io多路复用
使用select 和epoll 实现
平常一个线程注册多个通道 ,通过轮询检测那个通道有读写任务,然后对应去执行实现单线程io多路复用
事件驱动
Io多路复用就是事件驱动,循环发现有读写任务事件,就去驱动执行任务。
信号驱动
信号驱动是针对一个io完成过程,当一个任务完成主动通知调用预设的任务,无需轮询检测
ok
持续更新