Netty介绍及实战(二)之IO与NIO和多路复用与零拷贝
Netty介绍及实战(一)
一、Netty到底是什么?什么是多路复用?什么叫做零拷贝?
Netty是一个NIO客户端服务器框架,可以快速、轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和简化了网络编程,避免了程序本身去处理断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流等操作,也避免了程序直接对NIO的操作。使我们更加专注于业务的实现。
二、性能方面有哪些优势
1.更高的吞吐量,更低的延迟
2.减少资源消耗
3.最小化不必要的内存拷贝
三 、IO与NIO的区别
step1.首先我们了解一下什么是阻塞和非阻塞
阻塞:阻塞的例子包括RPC和web service的调用。
非阻塞:包含非阻塞的队列和非阻塞模式的websocket,还有一些非阻塞模式的数据库等。
我们根据上图(左)可以看到:阻塞模式是一个线程发出请求后,阻塞等待调用结果。
上图(右):当一个线程发出请求后,不需要等待返回结果,可以再次发送请求。
step2.我们接下来看一个网络模型示意图:
我们有一个线程池去管理线程和不同的客户端进行通信,其中有两个线程在阻塞状态,一个线程在传输状态,当第四个客户端连接的时候,我们发现没有线程可以用了,我们把他放在队列里面,当第五个线程来了,发现队列也满了,那么我们就只能丢弃这个客户端的连接了。
那么我们传统的网络模式有哪些有劣势呢?
优点:因为线程是阻塞的,直到整条请求发送完毕,我们不需要处理报文的粘包、拆包等。
缺点:频繁的上下文切换 , cpu消耗过高。如果线程过多的话,会导致内存使用过高。
四 、多路复用与零拷贝
step1.我们看一下阻塞io和非阻塞io的工作模式
图左:一个线程对应一个socket连接。
图右: 一个线程对应不同的buffer,然后再通过buffer和socket channel建立连接。
step2:什么是零拷贝?
上图1,2: 可以看到,如果我们想要发送/接收一个报文,首先需要把内核数据拷贝到缓冲区里面,再进行操作
上图3: 可以看到线程直接去读取内核的数据,这样就减少了内核到buffer的拷贝操作,直接操作堆外内存。
为什么非要操作堆外内存呢?这里画个重点
1.操作系统并不感知jvm堆内存,而且jvm的内存布局与操作系统分配的不一致,所以操作系统不会直接操作jvm堆内存来处理数据
2.我们知道jvm有着强大的GC机制,这也就意味着同一个对象的内存地址会随时发生变化。由于JNI(java native interface) 在调用IO操作的C语言的类库时,规定写入时地址不能失效,所以我们无法直接使用jvm堆内存。
step3:什么是多路复用?
释义:多路指的是多个socket连接,复用指的是复用同一个线程。
上图可以看到,我们利用一个线程select去管理不同的channel,只有当channel中有读写操作,才真正调用ready的channel去进行实际的IO操作。
那多路复用模型的优势时什么呢?
IO多路复用使得我们只需要建立一个线程去维护客户端不同的请求(channel),不需要为每一个channel创建一个独立的线程,大大降低了系统的资源开销。
下一篇文章会和大家分享,传统的NIO架构和我们Netty的架构的区别,本文如有错误,欢迎大家批评指出。
Netty介绍及实战(二)之IO与NIO和多路复用与零拷贝相关推荐
- Netty介绍与实战(三)之粘包拆包
一.传统NIO架构 step1. 我们传统的nio架构已经解决了多路复用,零拷贝等问题,已经十分优秀了,那为什么我们现在Netty如此火热呢? 1) 首先他使用简单,基本上都是模板化,我们可以更专注业 ...
- STM32之震动传感器、继电器介绍及实战
目录 一.震动传感器介绍及实战 二.编程代码实现 1.gpio.c---------初始化GPIO口引脚函数 2.编写中断服务函数 3.用外部中断共用入口函数,来调用外部中断处理回调函数 4.编写外部 ...
- netty如何实现零拷贝
根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...
- (七)Netty与零拷贝
零拷贝基本介绍 零拷贝是网络编程的关键,很多性能优化都离不开 在Java程序中,常用的零拷贝有mmap(内存映射)和sendFile.那么,他们在OS里,到底是怎么样一个涉及?我们分析mmap和sen ...
- Netty中ByteBuf 的零拷贝
转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...
- 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...
- 彻底搞懂Netty高性能之零拷贝
作为Java网络编程学习者,不仅要知道NIO,还一定要学习Mina和Netty这两个优秀的网络框架.作为上一篇NIO效率高的原理之零拷贝与直接内存映射的补充,本文将针对Netty的零拷贝特性进行详细分 ...
- AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之二、会中智能
AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...
- Netty网络编程实战3,使用Netty远程传输文件
目录 一.Netty中的一些常见关键字 1.EventLoopGroup 2.ServerBootstrap 3.ChannelFuture 4.ServerSocketChannel 5.group ...
最新文章
- 退出oracle系统,配置Oracle随系统启动和关闭
- 《javascript模式》 容易踩中的那些坑
- 分享Silverlight/WPF/Windows Phone一周学习导读(3月14日-3月19日)
- Invalid packet stream index
- Java关键字final、static、this、super使用总结
- mysql group by over,PostgreSQL相当于MySQL GROUP BY
- ubuntu 16.04 x86_64中arm-none-linux-gnueabi-不起作用时的解决方案
- 图片上传工具 java_图片上传工具类-fileUtil
- Java proxy 子类代理
- Linux桌面没有minidwep,ubuntu 12.04完整安装minidwep-gtk教程
- arduino SIM868发送post请求到服务器,解决只能成功发送一次的问题
- 如何安装TFP(tensorflow概率编程)
- android patch app,AndroidN,O 加载到patch 以后重启app crash了.
- Android Things:外设I/O接口-PWM
- 自动安装JDK、HADOOP、ZOOKEEPER、HIVE的shell脚本
- dirbuster暴力破解工具
- python代码如何加密
- 从2010 IDF 看英特尔固态硬盘现状及策略
- GEA 3.3 捕捉及处理错误
- 《先知·哀乐》《先知·苦痛》