<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p>
讯享网
linux内核演变:

讯享网
实现
- 简单的c/s模型,通常一个client分配一个线程处理(可以使用队列+线程池优化模型)
缺点
- 数量少(线程有限)
- 影响性能(可用线程池缓解)
实现
BIO和NIO的区别在于时:
- 阻塞IO,直到数据就绪并从内核态拷贝到用户态后返回
- 非阻塞IO用户态错误
改进后
可以在一个线程中管理多个client
设置非阻塞IO
- 方法创建时候第二个参数设置
- 方法第三个参数设置
缺点
需要询问内核数据是否就绪,涉及到很多无效的(system call)
问题点
改进
- 每个client都要询问 —> 批量询问(系统 O(n) —> O(1))
- 从主动询问变成等待通知(系统下降)
缺点
- 每次查询都会把多个client从。(管理百万级别及以上的时候会带来很大开销)
- 处理有响应的client的时候要遍历所有client判断是否有响应。()

改进:
- 监听fd每次全量维护 —> 监听fd初始化 +
- 模糊通知 —> (内部使用就绪列表)

区别
无需进程主动去check活跃的socket,把检查工作交给内核。
缺点
当有大量IO操作时,信号较多,SIGIO处理函数不能及时处理可能导致,而且内核空间与用户空间的频繁信号。
区别
- (同步非阻塞IO)封装了一个异步事件的通知机制,
- (异步IO)封装了异步的消息事件的通知机制,同时
将接收发送等io操作也封装到了内核中,对处理大量短连接比较高效。
也有,如、等。
流程如下:




- ,大大降低了I/O请求的处理效率。
- 无法充分利用和发挥多核 CPU 的性能。
- 可靠性问题,线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。
经典实现
redis:
使用单单线程,在6.0版本前,核心业务部分使用单线程。官方数据:10万QPS。
6.0版本之后多线程处理网络数据的读写和协议的解析,单线程执行命令。QPS还能提高1~2倍。
为什么用单线程
- 抛开持久化不谈,Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。
- 多线程会导致过多的上下文切换,带来不必要的开销。
- 引入多线程会面临线程安全问题
单线程的缺点:顺序执行影响后续事件

- 多线程数据共享和访问比较复杂。
- 管理百万级连接、高并发大数据量时,单个线程仍然会效率比较低下。

改进:扩展了。引入多个。也称为主从结构。父线程和子线程的职责明确。
扩展Reactor可以是多线程也可以是多进程。
方式资源分配经典实现多线程线程之间如果涉及资源竞争的话,需要通过锁来保证同步netty、memcached等多进程需要进程间通信nginx等

对比:
- 在处理高耗时 IO 时的性能要高于 ,但对于低耗时 IO 的执行效率提升并不明显
- 的异步性使其并发处理能力要强于
- 的实现逻辑复杂,编码成本较 要高很多
- 的异步高度依赖于操作系统对于异步的支持。若操作系统对异步的支持不好, 的性能还不如
- 是同步非阻塞网络模型, 是异步非阻塞网络模型
问题:Linux 对 AIO支持的不太友好
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/183247.html