Netty前置-----IO简单介绍

171 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

Netty前置-----IO简单介绍

1、关于Netty的基本介绍

​ Netty是一个基于Java NIO和异步事件驱动模型实现的客户端/服务器框架,使用它可以快速开发高性能、高可扩展的网络服务器和客户端程序;

​ Netty 的设计主要基于主从 Reactor 多线程模式;

2、了解一下IO事件模型

​ 常见的IO模型有五种

  • 同步阻塞IO(Blocking IO)

​ 线程主动发起资源请求到操作系统内核区,线程请求操作到达,内核空间需要完成资源的完全IO操作,在这一过程中线程处于阻塞状态,直至从内核缓冲区复制到用户缓冲区;

​ 阻塞IO会为每个IO请求都分配线程资源,当并发量大的时候,系统对这些线程的维护将会耗费巨大的资源;

  • 同步非阻塞(Non-Blocking IO)

​ 同步非阻塞的调用到达时,首先判断内核缓冲区是否有就绪数据,有则会阻塞线程将数据复制到用户缓冲区;没有的话,则将线程直接返回,但是这个时候就存在一个问题,线程又不知道内核缓冲区啥时候有数据,因此就需要用户线程不断的轮训,直到内核缓冲区有数据为止,因此这种轮训操作将会耗费很多cpu资源,效率很低;

  • IO多路复用模型

​ IO多路复用模型是通过引入select/epoll系统调用的方式,把想要读写操作的文件描述符(fd)注册到epoll选择器,然后开启轮训模式;

​ 这种方式就是用一个进程监视注册在epoll上的多个fd,一旦某些fd准备就绪,内核将这些fd加入到一个就序列表返回到用户程序发起IO调用;在IO操作内核缓冲复制到用户缓冲的过程中线程仍然是阻塞的;

​ 一个选择器的查询线程就可以处理成百上千的连接事件,不需要单独为这些事件单独创建线程,大大降低了系统的线程开销,提升了性能;java的NIO使用的就是这种方式;

  • 异步IO模型(Asynchronous IO)
  • 信号驱动IO模型(SIGIO、Signal Driven I/O)
3、Java中的NIO

​ Netty是基于NIO(NEW IO)的,也就是基于IO多路复用模型的实现;

​ 相比较java中的另外一个IO-----BIO而言,NIO是非阻塞 的,基于Buffer缓冲区的、可以双向操作的,BIO是基于流式操作只能单向操作;而且基于缓冲的操作效率方面也会比流操作要高;BIO有链接到达时会阻塞线程,而NIO则是通过Selector轮询线程,不会阻塞;