当前位置: 首页 > 网络应用技术

Java的四个通用网络IO模型和简单的简介

时间:2023-03-08 11:29:05 网络应用技术

  本文详细介绍了Java中常用的四个常见IO Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model,IO Multi -Way,AIO和Select,Poll和Epoll系统功能。

  网络中请求和响应的过程可以简单地分为以下步骤。以服务器接收消息为例:

  在网络IO的过程中,它可以分为两个阶段:

  基于上述步骤,有四个通用网络IO模型:

  同步I/O:每个请求都必须一一处理。请求的处理将导致整个过程暂时等待。这些事件不能一起执行。用户线程在启动I/O请求后需要等待或咨询内核I/O操作。

  异步I/O:可以一起执行多个请求。请求或任务的执行不会导致整个过程的临时等待。用户线程在启动I/O请求后继续执行。内核I/O操作完成后,将通知用户线程,或将调用用户线程注册的回调功能。

  障碍物和非覆盖是处理该过程在访问数据时是否准备就绪的过程。

  障碍物:发出请求后,由于未满足请求操作的要求,请求操作已被阻止,并且在满足条件之前不会退还。

  非块:发出请求后,如果不满足所需的条件,徽标信息会通知条件不满足条件,并且不会等待。从基因上讲,您需要通过循环判决请求获得请求结果健康)状况。

  同步和异步焦点是多个任务的过程。是否必须在完成第一个启动任务后必须执行启动任务。首先启动的任务请求是阻塞性等待完成,或者立即返回周期等待请求成功。

  障碍物和非阻塞的重点是,当未满足条件并立即返回时,请求方法是否被阻止。

  同步阻止IO(阻止IO)模型也称为BIO,这是最简单,最常见的模型。在Linux中,所有插座默认情况下都阻止IO。

  在此模型中,用户空间的应用通过执行读取呼叫(基础是RECVFROM系统调用)来读取数据以从套接字读取数据。在空间中启动读取调用后,将在从内核空间复制到用户空间后将其返回。

  很多时候,当程序执行读取呼叫时,尚未达到数据包,也没有复制到内核空间。目前,在复制到应用程序空间的过程中,读取调用(底层被调用),调用线程仍将被阻止。

  同步IO模型的特征是IO操作的两个阶段将阻止调用线程。

  生物模型易于编程。在阻止数据的期间,用户线程被挂起。目前,将不使用CPU资源,并且可以及时返回数据。没有延迟;

  但是,由于同步阻塞的特性,服务器通常会为每个客户连接(即多线程解决方案)关联一个独立的线程。

  当客户连接的数量不高时,这是可以的。但是,当面对100,000甚至一百万级连接时,都需要大量线程来维护大量的网络连接。内存和线程开关费用将是巨大的。传统的生物模型无能为力。因此,我们需要更有效的I/O处理模型来应对更高的并发。

  在Linux系统下,您可以通过设置套接字来将其转换为非阻滞,即同步非阻止IO(非阻止IO)型号。在Java中,它通过执行Channel.ConfigureBlocking(false)而变成非阻滞。方法。

  有两种可能性:

  返回过程后,由于数据尚未准备就绪,过程(过程)可以做其他事情,然后启动RECVFROM系统调用以重复上述过程。此过程通常称为轮询。有效地使用CPU。

  在每个启动IO系统调用之后,如果它处于IO准备阶段(数据尚未准备就绪),则立即返回。通过旋转的操作,可以避免调用线。

  但是,简单的NIOS需要连续重复IO系统调用。这种连续的旋转查询将继续询问内核,该内核将占用大量的CPU时间并导致上下文切换。系统资源利用率较低。

  各种Web服务器和框架的底层很少直接使用,但是在其他更高级的IO模型中使用了非块IO的特征。在Java的实际开发中,该IO模型将不参与。Java的Nio在这里不是Nio,而是另一个IO多路复用模型。

  IO多路复用(IO多路复用)用于解决在同步非块NIO模型中消耗大量CPU的问题。

  IO Multi -Road Reuse模型通过监视线程启动了另一种形式的系统调用形式。一个线程监视多个文件描述符(FD,Linux系统以通过一个FD识别所有网络请求),一旦某个FD操作已准备就绪(通常可以读取/书面的内核缓冲区),则系统调用将返回,然后返回监视线程可以通知程序以调用相应的IO系统,例如通过recvFrom读取数据。一些地方还说,在准备好不同的IO行为后,将返回不同的事件以区分,例如阅读准备就绪事件,编写准备就绪的事件, ETC。

  当前支持系统调用功能,例如IO Multi -Road Reuse,我们可以注册多个套接字连接到同一选择操作,我们可以同时收听多个套接字连接。流程调用RECVFROM系统。将数据从内核复制到用户流程。当然,此副本的过程被阻止。

  系统调用函数调用后,它也将阻止调用线程,但是与封锁I/O不同,可以阻塞选择,民意调查和EPOLL功能的调用,并聆听在此处的多个插座连接的IO操作同一时间。在一个线程中,同时监视多个IO请求,在同步阻止模型中,必须通过多个线程实现该目标来实现此目标。这是IO Multi -Way Reuse的好处之一,从而极大地降低了系统的费用。

  在IO多路重用模型中,插座注册的插座通常设置为非阻滞模型,但对于用户程序是透明的。同样,还选择了原始非阻滞模型所需的旋转操作,民意调查,,,,,,,,,,,,,,,,,,,,,poll,coll,,,,,, poll ,,,,,,,,,,其他系统调用功能在内核空间中有助于我们,减少无效的系统调用和上下文切换,并减少CPU资源的消耗。这是另一个好处。

  在使用IO Multi -Way Reuse模型的Java4的新NIO软件包中引入了选择器。通过它,您只能管理多个客户端连接。在Linux系统上的底层,使用EPOLL系统。Selector与频道通道,缓存缓冲区等合作,可以构建多通道重复使用,同步不同步-Blocking IO程序,并提供靠近操作系统底层的高性能数据操作方法。

  基于IO多路重用模型,进一步的封装产生了更容易理解的反应器模式。Netty,redis,nginx,tomcat和其他软件和框架都在反应堆模式下使用,也称为反应器模式(右事件反应).Java Nio的选择器实际上是简单反应器模式的实现。

  选择调用和民意调查之间没有根本区别。他们在内部使用“线性结构”来存储互相关注的插座集合。

  首先,将绑定插座放在文件描述符号中。使用时,首先需要从Soluect/Coll系统复制选择调用,以通过SELECT/COLL系统从用户状态复制到内核状态,然后将其从内核中阻止。当发生网络事件时,网络事件,然后穿越该过程以注意套接字集合,找到相应的套接字,将其状态设置为可读/书面,然后将整个套接字从内核状态复制到用户模式。用户的态度将继续遍历整个套接字集合以找到可读/书面套接字,然后对其进行处理。

  选择具有固定长度的调用BITSMAP以指示一组文件描述符,并且支持的文件描述符数受到限制。最大默认值只能监视1024个插座。拨打电话不再使用bitsmap存储您遵循的文件描述符,替换为动态数组,在链接列表中组织的,并突破select的文件描述符的数量。当然,它将受到系统文件描述符的限制。

  对于选择和轮询方法,您需要从头到尾两次进行文件描述性符号的集合。第一个是内核状态,另一个是在用户模式下,将有两个复制文件描述符号。首先是从用户出发,首先是从用户中引入空间,然后在内核修改后,将其传输到用户空间。

  客户连接的越多,收集越大,插座集合的遍历和复制将带来很多费用,这非常差,因此有以下EPOLL模型。

  完成EPOLL操作的三个步骤,即,三个函数相互合作:

  首先使用epoll_create创建一个epoll对象EPFD,然后通过epoll_ctl将套接字添加到EPFD,最后调用epoll_wait等待数据。

  执行epoll_create时,系统将在内核缓存中创建一个红色和黑色树和突出的链接列表。

  当epoll_ctl在套接字中执行时,EPOLL将检测到上面的红色黑树是否具有此插座,并且如果存在,它将立即返回。然后注册内核中断处理程序的回调函数,以告诉内核插座手柄被中断,将其放置在“就绪列表”链接列表中。如果网卡具有数据可以访问的数据,则将中断信号发送到CPU,则中断CPU响应被中断,并且中断程序将执行先前的回调函数。红树和黑树是有效的数据结构。一般时间的复杂性为O(logn)。

  EPOLL_WAIT仅检查链接列表。如果链接列表不是空的,您将返回到现成的链接链接列表,否则您将等待。仅将事件中发生的套接字集传递给应用程序。它不需要查询整个集合(包括无事件的插座),例如Select/Poll,这大大提高了检测效率。

  EPOLL具有两种工作模式:LT(级别触发,水平触发)模式和ET(边缘触发,边缘触发器)模式。

  级别构成:当它处于某个状态时,它总是会触发。

  边缘触发:触发一次在状态转换的边缘。

  简而言之,ET模式仅在可读和写作时才通知一次,并且在满足条件和书面的情况时将通知LT模式。。此时,将通知ET模式和LT模式。然后,应用程序可以读取数据。假设只读取1K,可以读取缓冲区,读取缓冲区区域,并且读取缓冲区区域。剩下1K。目前,缓冲区仍然可以阅读。如果再次检查,则不会通知ET模式,并且将再次通知LT模式。

  ET模式的性能优于LT模式,因为如果您需要大量读取和编写系统中的描述符,则您将在使用LT模式后返回每次EPOLL_WAIT。描述符!如果您使用ET模式,则不会通知您第二次通知,并且该系统不会填充很多您不在乎的有用文件描述符。

  因此,当使用ET模式时,您需要一次读取缓冲区的数据,也就是说,它始终读取直到您读取egain(例如,表明缓冲区是空的),否则不完整的阅读数据问题可能发生。

  以同样的方式,LT模式可以处理阻塞和非隔离插座,而ET模式仅支持非屏蔽插座,因为如果被阻止,当没有数据读取和写入数据时,该过程将阻止读取和读取和写功能,并且程序将无法继续执行。

  默认情况下,选择和民意调查仅支持LT模式。Epoll使用LT模式工作,可以将其设置为ET模式。

  从本质上讲,属于同步io的选择/epoll系统被称为io。读取和写作事件后,它负责阅读和写作,这意味着读取和写作的过程被阻止。- Road Reuse仍然可以总结为同步阻止模型。

  IO Multi -Road Reuse要求选择首先询问数据状态的请求,然后通过应用程序启动真实的阅读数据请求,以及异步的非块IO(AIO)(AIO)(AIO),您无需在应用程序中调用。

  AIO的基本过程是:通过系统调用用户线程,以告知内核启动某个IO操作,并立即返回用户线程。在整个IO操作过程中完成内核后(包括数据准备和数据复制)),将通知用户程序执行后续业务操作。

  AIO是根据事件和回调机制实现的,也就是说,它将在应用程序操作后直接返回,该操作不会阻止那里,并且内核将完成数据准备和复制的两个阶段操作。当内核处理完成后,操作系统将通知相应应用程序的相应应用程序。线程执行后续操作。

  在AIO模式下,在内核和重复数据的等待数据的两个阶段中,用户线程不会受到阻碍,并且实现了真实的异步非屏幕。接收相应的通知。因此,异步IO有时称为信号驱动程序IO。

  目前,AIO的应用程序并不宽。Netty也尝试使用AIO,但再次放弃。这是因为Netty使用AIO之后,Linux系统上的性能无法改善。

  在Java.nio.nio.Channels软件包下,基于Java7期间,基于异步通道的IO,使用异步开始的许多频道接口和类在AIO中进行通信。Java7称他们为Nio.2。

  基于异步IO模型和进一步的封装,这是易于理解的ProCractor模型。

  参考资料:

  如果您需要交流或文章错误,请直接留言。此外,我想喜欢,收集和关注,我将继续更新各种Java学习博客!