`
xuyuanshuaaa
  • 浏览: 393828 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

java 同步阻塞io和异步非阻塞io

 
阅读更多
NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。

反应器(Reactor):用于事件多路分离和分派的体系结构模式

通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。

一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。

另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。

传统的阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。

非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。

为什么会这样,下面就对他们做进一步细致具体的分析:

首先,我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下,传统IO编写容易方便使用。但是随着连接数的增多,问题传统IO就不行了。因为前面说过,传统IO处理每个连接都要消耗一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。这里我们得出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接。

然后,非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理 10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
      
对于线程池的理解

原创  关于线程池 收藏

偶目前对于线程池的理解
在多线程程序中,如c/s模式中的server端最好用线程池来提高程序性能,
在程序起动时创建一定数量的线程以备使用,
socket侦听到连接后把连接放入一个全局client socket列表中,
使用 socket.select把有可读数据的client socket存入一个临时列表中,
循环client socket取出每个连接放入(向线程传参数,还是其它方法?还没研究过)事先建立好的空闲的线程中处理。处理完线程设回空闲等待下一个任务。

这样做的好处是可以使用非阻塞的socket
以前为每个客户端建立一个线程,在维护客户端连接的有效性方面很麻烦,使用了很多线程,但其实线程在很多时候都是处于阻塞等待客户端数据状态,浪费系统资源。
使用非阻塞socket在Receive到0数据时应该可以认为socket连接以断开(未证实)
使用线程池,在需要处理数据时把处理任务交到挂起中的线程中,处理完成后在挂起等待下个任务。这种方式更加能有效的使用系统资源。
分享到:
评论

相关推荐

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    这里我们将深入探讨同步IO、异步IO、阻塞IO和非阻塞IO的概念,理解它们的工作原理以及在实际应用中的差异。 1. 同步IO与异步IO: - **同步IO**:在同步模式下,应用程序执行I/O操作时会等待操作完成。这意味着程序...

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO.pdf

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...

    JAVA IO同步,异步

    在本文中,我们讨论了基于系统底层通信技术Socket 的JAVA IO同步和异步操作,包括阻塞和非阻塞IO 操作。同步IO 是指应用程序在执行IO 操作时,需要等待IO 操作完成后才能继续执行其他操作,而异步IO 则是指应用程序...

    同步异步阻塞非阻塞

    同步异步阻塞非阻塞 IO 模型 在 Linux 环境下的网络 IO 中,有五种基本的 IO 模型:阻塞 IO、非阻塞 IO、IO 多路复用、信号驱动 IO 和异步 IO。其中,信号驱动 IO 不常用,因此主要介绍其余四种 IO 模型。 1. 阻塞...

    IO中同步、异步与阻塞、非阻塞的区别

    在IO多路复用机制如select和poll中,通过fd(文件描述符)来监控多个IO事件,它们在处理异步IO时显得尤为重要。无论是在传统的网络编程还是在现代的云服务架构中,这些IO处理模型都是不可或缺的一部分。

    同步与异步--阻塞与非阻塞型IO

    根据I/O操作的不同特性,可以将其分为四大类:同步阻塞IO、同步非阻塞IO、异步阻塞IO以及异步非阻塞IO。本文将详细介绍这四种不同的I/O模型,帮助读者理解它们之间的差异及应用场景。 #### 二、同步阻塞IO 同步阻塞...

    同步、异步、阻塞、非阻塞的区别

    ### 同步、异步、阻塞、非阻塞的区别详解 #### 一、同步与异步 **同步**和**异步**是计算机编程中非常重要的概念,尤其是在多线程编程、网络通信以及操作系统中有着广泛的应用。这两个概念主要涉及的是**消息的...

    简述JAVA同步、异步、阻塞和非阻塞之间的区别

    在IO操作中,我们可以将同步、异步、阻塞和非阻塞四种模式组合起来,形成四种不同的IO模式:同步阻塞IO、异步阻塞IO、同步非阻塞IO和异步非阻塞IO。同步阻塞IO是指Sender在发送请求后,等待Receiver的响应,直到...

    详解socket阻塞与非阻塞,同步与异步、I/O模型

    同步和异步只关注客户端的调用机制,而阻塞和非阻塞则关乎服务端的处理方式。同步与异步的区分并不依赖于阻塞或非阻塞,它们可以结合使用。例如,客户端可以发起异步请求,然后服务端处理请求时可能采用阻塞或非阻塞...

    基于Python的gtornado异步IO设计源码,实现阻塞IO调用非阻塞化及协程风格使用

    本项目为基于Python的gtornado异步IO设计...该源码旨在实现tornado框架中阻塞IO调用的非阻塞化处理,并通过greenify技术将C语言编写的库IO操作异步化,支持直接使用协程风格的代码编写,以提升程序执行效率和响应能力。

    java 中同步、异步、阻塞和非阻塞区别详解

    在Java编程中,同步、异步、阻塞和非阻塞是四...同步和阻塞适合处理简单的任务,而异步和非阻塞更适合需要高并发和低延迟的场景。理解这些概念,并结合Java提供的并发工具,能够帮助开发者编写出更加高效和可靠的程序。

    linux设备驱动中的阻塞与非阻塞IO.pdf

    阻塞与非阻塞IO的选择取决于具体的应用场景和性能需求。阻塞IO虽然可能导致进程暂时停滞,但在资源密集型操作中能更高效地利用CPU资源;而非阻塞IO更适合于资源有限、响应时间敏感的场合,尽管它可能引入额外的CPU...

    Java IO应届生培训讲义

    IO模型是操作系统提供的不同IO处理方式,包括阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO(AIO)。 - 阻塞IO:应用程序在进行IO操作时会被阻塞,直到操作完成。 - 非阻塞IO:在等待数据阶段不会阻塞,但需要...

    基于Java非阻塞IO技术实现石头剪刀布游戏设计。.zip

    在这个“基于Java非阻塞IO技术实现石头剪刀布游戏设计”的项目中,开发者利用了Java NIO(New IO)库来创建一个高效、低延迟的网络通信环境,用于玩家之间的游戏交互。以下将详细介绍Java非阻塞I/O以及如何将其应用...

    9.阻塞IO1

    在Linux操作系统中,IO操作是系统与外部设备交互的关键环节,包括读取和写入数据。本文主要探讨了阻塞IO模型,这是Linux中...因此,非阻塞IO和异步IO模型常用于提高系统效率,特别是在需要高效处理大量IO请求的场景。

    java 同步、异步、阻塞和非阻塞分析

    在Java中,非阻塞IO(NIO)就是一种实现方式,它允许程序在等待数据到达时执行其他任务,而不是直接阻塞等待。非阻塞IO在处理大量并发连接时尤其有用,因为它可以显著提高系统资源的利用率。 结合同步和异步,阻塞...

    Java NIO:浅析IO模型_动力节点Java学院整理

    本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO设计相关的设计模式(Reactor和Proactor)。 一、同步和异步 同步和异步是IO模型...

    Java IO 模型常见面试题总结 · .pdf

    在 Java 中,IO 模型主要有五种:同步阻塞 IO、同步非阻塞 IO、I/O 多路复用、信号驱动 IO 和异步 IO。其中,BIO 属于同步阻塞 IO 模型,NIO 属于 I/O 多路复用模型。 同步阻塞 IO 模型中,当应用程序发起 read ...

    2-Socket阻塞与非阻塞,同步与异步、IO模型-120412发布1

    同步和异步的区别在于数据访问时是否使进程阻塞,而阻塞和非阻塞的区别在于调用是否立即返回,无论数据是否准备好。 需要注意的是,同步和异步是客户端的视角,而阻塞和非阻塞是服务器的视角。同步和异步主要由...

    同步、异步IO

    在Java中,可以查看NIO相关的类,如java.nio.channels.Selector、java.nio.channels.SocketChannel等,研究它们如何实现非阻塞IO。在Node.js中,可以研究libuv库,它是Node.js实现异步IO的基石,提供了对多种平台的...

Global site tag (gtag.js) - Google Analytics