`

阻塞、非阻塞、同步、异步浅析

    博客分类:
  • Java
阅读更多

在网络编程中,我们经常会遇到阻塞、非阻塞、同步、异步这两组概念,许多人很容易混淆,现在就给大伙儿说说我对着两组概念的理解。

 

先说说阻塞与非阻塞,这主要和程序等待消息时的状态有关

1、阻塞

程序会阻塞在某一个函数,而不往下执行,就如挂在那里一样,所有的其他业务也都不执行,为一直等到消息到来才往下执行。

2、非阻塞

程序不会阻塞在某一个函数,不等待消息到来,立即返回,往下执行。

举个例子,TCP协议中的send,系统会为其分配一块发送缓存区,假设现在总的缓存 区的大小为1000.,而缓存区里已经有了500个数据,这时调用send,发送1000个字节数据,这时如果在阻塞模式下,send的会先最多的数据放入缓存,直到缓存区满,然后程序就会阻塞在那里,一直等到将所有数据全部发出去为止,而如果在非阻塞模式下,send的会先将最多的数据放入缓存之后,就马上返回,剩余数据下回接着发送,不会卡在send函数中。

 

同步和异步这两个概念,其实是与消息通知机制有关的。

1、同步

发送消息,等待消息处理完后,才往下执行。就如MFC里的SendMessage(),

2、异步

发送消息,不等待消息处理完,就往下执行,让后通过特定的接口或者事件,消息通知你事情完成了。如MFC里的PostMessage()

粗略的讲了一下以上的两个概念,估计大家会问,那么阻塞与同步,非阻塞与异步有啥区别,用例说明。

比如我们现在去银行,你可以选择两种方式,取票等待和排队等待,如果你排队等待,你就得等前面所有人都办理完了,才能办理业务,此时如果在等待的过程中,你啥事都不能干,这时你就处于阻塞状态了,如果你还能一边打电话,一边喝饮料,看书,不过你还得时不时的抬头看看,前面的人还有多少,啥时候轮到你,免的错过办理,这时你就是处于同步状态。

也就是说,阻塞就是程序挂在那里,其他一切事情都不能做,直到当前事件返回为止,而同步得再原地等待消息,而与此同时,不影响其他业务的执行,体现在程序里就是其他线程的业务处理。

如果你取票等待,那么你只要坐在椅子上,这时你可以做你想做的事情,比如听听歌,看看书,打打电话,而到你时,窗口会自动叫号通知你,这时你就处于非阻塞状态。

如果此时你还觉得不过瘾,想出去溜达溜达,那么你可以和大厅的工作人员说一下,我去哪里,待会到我了,到某某地方通知我一下,然后你就可以出去做你想做的事情,直到工作人员来叫你为止。这时你就是处于异步状态。两者结合起来就是所谓的异步非阻塞模式,这种由于效率很高,在网络编程里经常被用到。

分享到:
评论

相关推荐

    浅析异步调用的ppt

    Web服务的异步实现主要涉及两种方式:同步调用和异步调用。异步调用在服务器端能够提高资源利用率,避免因为单个请求阻塞其他请求的处理。在客户端,使用异步调用可以保持用户界面的响应性。 【Remoting】是.NET ...

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

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

    JAVA中的IOCP浅析.pdf

    非阻塞调用和阻塞的概念相对应,指在不能立即得到结果之前,该函数或方法不会阻塞当前线程而是立刻返回。 传统的并发模型 在传统的并发模型中,对每个客户都创建了一个线程。其优点在于等待请求的线程只需要做很少...

    node.js的旅游网站设计浅析-网站设计-设计.pdf

    2. 异步非阻塞 I/O:异步是与同步相对应的概念,主要针对 C 端,区别在于数据访问的时候进程是否阻塞;阻塞和非阻塞是针对 S 端的,区别在于应用程序的调用是否立即返回。实际上,异步和非阻塞是一个意思,表示都...

    Socket高性能IO模型浅析

    (2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(NewIO)库。(3)IO多路复用(IOMultiplexing):即经典的Reactor设计...

    高性能IO模型浅析

    同步非阻塞IO是在同步阻塞IO基础上的一种改进。在这种模型中,用户线程在发起IO请求后不会被阻塞,而是可以立即返回。但是,由于数据可能尚未准备好,因此线程需要不断轮询以检查数据是否可用。 **工作原理**: - ...

    Java NIO:浅析I/O模型

    下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,后介绍了两种和高性能IO设计相关的设计模式...

    activeMQ消息发送过程与原理浅析

    【描述】:本文旨在解析activeMQ消息中间件在发送消息过程中的工作原理,包括同步发送和异步发送两种方式。activeMQ的消息发送涉及到客户端与broker之间的交互,对于消息的可靠性和性能有着直接影响。 【标签】:...

    网游服务器设计浅析字数字数

    非阻塞模式允许在一个线程内处理所有Socket IO,简化了多线程同步问题。在处理接收到的数据时,由于网络的异步特性,可能需要多次recv()调用来获取完整消息。为此,使用两个指针跟踪消息缓冲区的头部和尾部,以便...

    EDA/PLD中的浅析C#中异步和多线程的区别

    然而,异步编程的复杂性在于回调和非同步流程控制,这可能导致代码难以理解和调试。 多线程则适合于需要大量CPU计算的任务,如复杂的算法执行和图形处理。尽管线程编程简单,但在处理大量并发I/O操作时,线程的创建...

    浅析c# 线程同步

    7. **async/await**:在异步编程中,`async/await`关键字提供了更高级的线程管理方式,允许非阻塞式的并发执行,但仍然可以通过`await`操作符来同步关键代码段。 在选择合适的同步机制时,需要考虑性能、资源竞争...

    浅析JavaScript回调函数应用_.docx

    这种技术在JavaScript中尤为重要,因为JavaScript是单线程的,使用回调可以处理非阻塞操作,如等待文件加载、网络请求或计时器事件。 一、回调函数的定义 回调函数的核心概念是函数作为参数传递。当函数A被作为...

    浅析PHP Socket技术

    在某些需要提高用户体验或需要后台数据处理的场合,非阻塞式连接提供了更为灵活的处理机制。 PHP Socket编程的另一个关键点是其提供的异步通信能力。这使得客户端能够同时向服务器发起多个请求,而不需要等待每一个...

    浅析Java IO相关知识点

    Java NIO(New IO)是Java 1.4引入的改进版IO库,它提供了非阻塞IO的支持,允许单个线程管理多个通道,极大地提升了IO处理的效率,特别适用于高并发的网络编程场景。NIO包括通道(Channels)、缓冲区(Buffers)和...

    深入浅析python 协程与go协程的区别

    Python侧重于异步I/O和非抢占式调度,而Go则通过CSP模型和通道实现同步,更加强调并发的控制和通信。两者在应用场景上各有优势,Python更适合处理大量I/O密集型任务,Go则更适合构建高并发、低延迟的服务。

    浅析JavaWeb项目架构之Redis分布式日志队列

    此外,消息队列还可以实现异步处理,提高系统的响应速度,例如将非实时需求的邮件或短信发送任务放入队列,避免阻塞主线程。 在众多的消息队列中间件中,为何选择Redis呢?Redis是一个内存数据库,具备高速读写能力...

    多线程机制

    - **Lock接口**:提供了一种更灵活的方式来管理锁,允许尝试锁定、非阻塞地锁定以及定时锁定。 #### 五、死锁 - **定义**:两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。 - **预防**...

Global site tag (gtag.js) - Google Analytics