当前位置 > 首页 > 国内新闻 > 正文

常见JAVA IO/NIO模型|建议收藏|入门必备
  • 发布时间:2019-09-04
  • www.princesdrawingschool.org
  • d0d1ed56-4d31-4e68-a3a1-8c8589b4e1aa

    你个人可以相信我“学习”接收学习材料。

    我们常见的IO模型有:阻塞IO模型,非阻塞IO模型,多路复用IO模型,信号驱动IO模型,异步IO模型;让我们简要介绍一下上面的IO模型。

    1.阻止IO模型

    最传统的IO模型,即阻塞发生在数据读写期间。当用户线程发出IO请求时,内核会检查数据是否准备就绪。如果它还没有准备好,它会等待数据准备好,并且用户线程被阻塞,并且用户线程移交CPU。数据准备就绪后,内核会将数据复制到用户线程,并在用户线程解除阻塞状态之前将结果返回给用户线程。典型的阻塞IO模型的示例是:data=socket.read();如果数据没有准备好,它将阻止读取方法。

    2.非阻塞IO模型

    当用户线程启动读操作时,它不需要等待,但会立即获得结果。如果结果是错误,它知道数据尚未就绪,因此它可以再次发送读取。一旦内核中的数据准备就绪并再次收到用户线程的请求,它就会立即将数据复制到用户线程并返回。所以实际上,在非阻塞IO模型中,用户线程需要不断询问内核数据是否准备就绪,也就是说,非阻塞IO不会放弃CPU,但总会占用CPU。典型的非阻塞IO模型通常如下:

    而(真){

    Data=socket.read();

    如果(数据!=错误){

    处理数据

    打破;

    }

    }

    但是,非阻塞IO存在非常严重的问题。在while循环中,有必要不断询问内核数据是否准备就绪。这将导致非常高的CPU使用率,因此很少使用while循环来读取它。拿数据。

    3.多路复用IO模型

    多路复用IO模型是当前使用的模型。 Java NIO实际上是多路复用IO。在多路复用IO模型中,有一个线程不断轮询多个套接字的状态。只有当套接字实际上有读写事件时,实际上才会调用实际的IO读写操作。因为在多路复用IO模型中,只有一个线程可以管理多个套接字,所以系统不需要创建新的进程或线程,也不需要维护这些线程和进程,并且只有存在真正的套接字读写事件时才需要。仅使用IO资源,因此大大减少了资源使用。在Java NIO中,通过selector.select()来查询每个通道是否有到达事件。如果没有事件,它将始终阻塞,因此这种方式将导致用户线程阻塞。多路复用IO模式允许一个线程管理多个套接字。只有当套接字实际具有读写事件时,才会将资源用于实际的读写操作。因此,多路复用IO更适合于有更多连接的情况。

    此外,为什么多路复用IO比非阻塞IO模型更有效,因为在非阻塞IO中,用户线程不断查询套接字状态,并且在多路复用IO中,轮询每个套接字。状态是内核正在运行,这比用户线程更有效。但是,请注意,轮询多路复用IO模型以检测事件是否已到达并逐个响应到达事件。因此,对于多路复用IO模型,一旦事件响应主体很大,后续事件将被延迟并将影响新事件轮询。

    4.信号驱动的IO模型

    在信号驱动的IO模型中,当用户线程启动IO请求操作时,为相应的套接字注册信号函数,然后用户线程继续执行。当内核数据准备就绪时,信号被发送到用户线程,用户线程接收信号。在信号之后,在信号功能中调用IO读写操作以执行实际的IO请求操作。

    5.异步IO模型

    异步IO模型是最理想的IO模型。在异步IO模型中,当用户线程启动读操作时,它可以立即开始执行其他操作。另一方面,从内核的角度来看,当它经历异步读取时,它将立即返回,表明读取请求已成功启动,因此不会为用户线程生成块。然后,内核等待数据准备就绪,然后将数据复制到用户线程。完成所有操作后,内核将为用户提供一个线程

    发送一个信号,告诉它读操作已完成。也就是说,用户线程根本不需要实际的整个IO操作。它只需要首先发起请求。当接收到内核返回的成功信号时,表示IO操作已经完成,可以直接使用数据。也就是说,在异步IO模型中,用户阶段不会在IO操作的两个阶段中被阻止。两个阶段由内核自动完成,然后发送信号以通知用户线程操作已完成。无需在用户线程中调用IO函数进行特定的读写操作。这与信号驱动模型不同。在信号驱动模型中,当用户线程接收到指示数据准备就绪的信号时,则需要用户线程调用IO函数进行实际的读写操作;在异步IO模型中,接收到一个信号,表明IO操作已经完成,并且不需要在用户线程中调用IO功能来进行实际的读写操作。

    请注意,异步IO是需要操作系统的底层支持,而在Java 7中,提供了异步IO。

    ——

    资阳新闻网 版权所有© www.princesdrawingschool.org 技术支持:资阳新闻网 | 网站地图