Netty入门笔记-Linux网络I/O模型介绍

在之前的博客中并没有将关于Netty的知识系统的总结起来。从这篇博客开始就将关于Netty的有关知识点总结起来顺便提升自己的分析问题的能力,通过博客分享的形式将学习的知识点形成体系,希望也可以帮助大家一起学习提高。

引言

  在之前老版本的JDK中,对于IO性能问题支持的并不是太好,很多的情况下并不能正常的完成对于IO性能的要求。对于IO的操作问题主要体现在以下的几个方面。

  • 1、没有很好的数据缓冲,使得IO在性能上有一定的损耗。
  • 2、在Java中并没有出现Channel的概念,这个概念是在后期JDK1.4版本之后才出现的概念。
  • 3、都是同步阻塞的IO形式、如果通信出现问题就会导致线程被一直阻塞。

  在Java支持异步I/O之前,在开发高性能的服务器领域一直都是C语言和C++语言占有一定的优势,所以不得不在JDK1.4开始支持关于高性能I/O的操作。

Linux网络I/O模型介绍

  用过Linux的人都知道,在Linux中会把所有的东西都看作是一个文件来处理,常见的文件描述符有八种,d-表示文件夹,-表示普通文件,l-表示链接,b-块设备文件(例如硬盘,光驱等),p-管道文件,c-字符设备文件(串口设备),s-套接口文件/数据接口文件(例如启动一个MySql服务器时会产生一个mysql.sock文件)。也就是说在Linux中一切皆文件,对一个文件的读写操作会调用内核提供的系统级命令,返回一个file descriptor(fd,文件描述符)。也就是说对于一个socket的读写操作也会有对应的描述符,这个描述符就是一个数字,这个数字在指向内核中的一个结构体,在这个结构体中存储了一些信息(文件路径,数据区等一些属性)。

Unix五种I/O模型
一、阻塞I/O模型

  在一般开发中最为常用的I/O模型就是阻塞模型,也就是说在不说明的情况下对于所有的文件操作都是阻塞的,在一个进程空间中调用接收数据,系统会一直调用,直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才会返回。在这个过程中会一直处于等待状态,所以被称为是阻塞I/O。
Netty入门笔记-Linux网络I/O模型介绍_第1张图片

二、非阻塞I/O模型

  接收数据的时候从应用层到内核,如果缓冲区没有数据的话,就直接返回一个错误,一般情况下对于非阻塞I/O模型进行轮询检查这个错误状态,从而判断是不是有数据到来。
Netty入门笔记-Linux网络I/O模型介绍_第2张图片

三、I/O 复用模型

  Linux中提供了select/poll,进程通过将一个或者多个fd传递给select或者poll系统调用,从而在select上被阻塞,这样的情况下,select/poll就会检测多个fd是否都是出于就绪状态,但是有一个弊端,就是select/poll是顺序扫描,所以能打开的fd是数量有限的,收到了一定的限制,在Linux中提供了epoll系统调用,epoll使用基于时间驱动方式代替顺序扫描,所以在性能上有了很大的提升,在fd就绪的时候就执行回调函数。
Netty入门笔记-Linux网络I/O模型介绍_第3张图片

四、信号驱动I/O模型

  首先开启套接口信号驱动I/O功能,在进程中生成一个信号,当数据准备好的时候通知对应的进程进行调用,并且通知主循环继续进行同样的事件操作。
Netty入门笔记-Linux网络I/O模型介绍_第4张图片

五、异步I/O

  首先对于异步操作来说所使用到的一个机制就是缓存机制,也就是缓冲区的概念,首先在整个内核操作完成之后将数据复制到缓冲区中,当数据被复制到缓冲区中之后,将通知进程从缓冲区中进行读取操作。整个与信号驱动模型的的区别就是信号驱动模型是告诉我们什么时候开始操作,而异步I/O是告诉我们什么时候完成操作。
Netty入门笔记-Linux网络I/O模型介绍_第5张图片

I/O多路复用技术

  在I/O编程的过程中,当一个程序需要处理多个客户端请求的时候,可以利用多线程技术或者使用I/O多路复用技术进行解决。I/O多路复用技术就是将多个I/O的阻塞复用到同一个select的阻塞上,从而使得单线程的情况下可以同时处理多个客户端的请求,而多路复用的最大的优点就是系统开销小。系统不需要像多线程一样维护多个进程,降低了系统维护的工作量,节省系统资源。下面就来详细介绍一下I/O多路复用技术
  在LinuxI/O模型中说到对于Linux中select会对fd调用进行一个阻塞,也就是说在调用I/O的时候可以使用同一个select对多个需要调用的fd进行阻塞操作。这样的操作形式就是比较微观上的多路复用。

I/O多路复用的场景
  • 1、服务器需要同时处理多个监听状态或者多个连接状态的套接字
  • 2、服务器需要同时处理多种网络协议的套接字
多路复用支持

  目前比较流行的有select、pselect、poll、epoll,在linux网络编程过程中都是使用select作为网络轮询和事件通知,在select中我们知道所能支持的fd的数量是有限的。所以在新版本中出现了epoll。原理是一样的,但是克服了fd数量的问题。主要体现的以下的几个方面

一、支持一个进程打开的fd不受限制
二、I/O的效率不会因为FD的数目增加而下降
三、使用到了mmap增加了内核与用户空间之间的消息传递速率
四、epoll支持的API非常简单

总结

  在这个篇博客中从理论上总结了关于Linux的I/O模型的介绍,一共介绍了五种I/O模型。并且简单的说明了五种场景。

你可能感兴趣的:(Netty,Netty,Linux)