网络通信之同步异步阻塞非阻塞

先看下面例子

同步阻塞:

令狐冲泡妹纸 ,打电话给妹纸 , 妹纸没有回应,令狐冲想我现在还不会独孤九剑,还不够NB,就老实点,令狐冲就一直等下去

同步非阻塞

令狐冲拍妹纸 , 打电话给妹纸 , 妹纸没有回应 , 令狐冲想老子猪脚光环,等会妹纸肯定会再打给我的,然后令狐冲就每隔10分钟瞅一眼电话。

异步阻塞

令狐冲泡妹纸 , 打电话给妹纸 , 妹纸没回应 , 然后令狐冲让林平之去等电话,妹纸打过来了 , 就让自己来接,然后令狐冲一直等林平之

异步非阻塞

令狐冲泡妹纸 ,  打电话给妹纸 , 妹纸没回应 , 然后令狐冲让林平之去等电话,妹纸打过来了 , 就让自己来接,然后令狐冲去泡别的妹纸去了

这样看来   同步/异步  是电话的通知方式    阻塞和非阻塞是令狐冲这个逗逼的等待方式

同步和异步  是指API被调用者的通知方式

阻塞和非阻塞 是指API调用者的等待方式

而在不同场景下  同步/异步 阻塞/非阻塞 四种组合都有应用

同步阻塞     简单列子就如我们在C中调用某个库函数并等待返回

同步非阻塞  就是 “每隔一会瞄一眼电话”的轮询(polling)方式

同步非阻塞方式比同步阻塞方式对比:

优点是能够在等待任务完成的时间里干其他活。

缺点是任务完成的相应延迟增大了,因为每过一段时间才去轮询一次,而任务可能在两次轮询之间的任意时间完成

由于同步非阻塞方式需要不断轮询,而“后台”可能有多个任务在同时进行,我们就想到了循环查询多个任务的完成状态,只要有一个任务完成,就去处理它。

这就是所谓的“I/O多路复用”。

UNIX/LINUX下的select、poll、epoll就是基于“I/O多路复用”机制的。windows下则有WaitForMultipleObjects和IO Completion Ports API  (IOCP)

高并发的程序一般使用同步非阻塞方式 而非 多线程+同步阻塞方式

说到这里,就要谈到并发和并行的区别。比如春节期间的抢票大战,买票人数就是并发数,而售票窗口就是并行数。也就是说并发数是指同事进行的任务数(如同时服务的HTTP请求),而并行数是可以同时工作的物理资源数量(如CPU核数)

通过合理调度任务的不同阶段,并发数可以远远大于并行数,这就是为什么单机上多核CPU能够同事支持上W个请求的原因。在这种高并发的情况下,每个任务创建一个进程或者线程的开销非常大。而同步非阻塞的方式可以把多个I/O的请求丢到后台去,这就可以在一个进程里服务大量的并发I/O请求。

时间: 2024-10-12 22:03:56

网络通信之同步异步阻塞非阻塞的相关文章

异步/同步、阻塞/非阻塞的理解

[同步和异步] 通俗的讲:同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式.同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 概念从现实中来:同步:打电话,你拨通电话后必须等在那里,直到对方有人接了,你们才能通信或者说你才能继续打下一个电话.异步:发短信,你可以发

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

Python番外之 阻塞非阻塞,同步与异步,i/o模型

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

同步异步、阻塞非阻塞 总结

同步/异步(描述网络通信模式,适用于请求-响应模型) 同步:发送方发送请求后,需要等待接收响应,结果占用并浪费了CPU资源 异步:发送方发送请求后,不需要响应,可以继续发送下一个请求,或者主动挂起线程并释放CPU资源 阻塞/非阻塞(描述进程的函数方法调用方式) 阻塞:IO 调用会一直阻塞,直至调用结果返回后,才能继续执行 非阻塞:IO 调用可以立即返回,并执行下一个 IO 调用 总结,同步异步和阻塞非阻塞是两个不同的概念,用最简单的数据库查询来举一个例子: 如果发送一个请求,需要等待数据库响应,

理解同步异步与阻塞非阻塞

本篇文章我准本从三个大方面来解释下同步异步.阻塞非阻塞的知识,第一个方面主要是说下,到底什么是同步异步.阻塞非阻塞:第二个方面主要是解释下在I/O场景下,同步异步阻塞非阻塞又是怎么定义的,第三个方面介绍下在unix下同步异步又有哪些阻塞非阻塞IO. 1.同步异步与阻塞非阻塞 首先从大的方面来说,"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1).同步与异步 同步和异步关注的是消

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.

讲一讲什么叫阻塞非阻塞同步异步

1.讲一讲什么叫阻塞非阻塞同步异步全是用来形容方法的,形容一个方法返回值状态的. 2.io读取,网络读取,jdbc读取,这些流的操作都是bio的,都是阻塞的. 3.所以沃恩一般在处理io操作时,都采用多线程来提高bio的效率. 4.io操作,就是本地文件,网络,数据嘛嘛.所以在这三种读取数据时,都要采用多线程提高效率. 5.多线程处理阻塞方法时,只不过是避免了主线程的阻塞,但是让子线程,也就是处理每个http request的线程去发生阻塞了. 6.传统的古老的开发方式: 单线程执行阻塞方法->

基础入门_Python-网络编程.分分钟掌握阻塞/非阻塞/同步/异步IO模型?

概念梳理: 故事独白: 满满爱喝茶,废话不多说,开始煮开水. 出场人物: 满满, 普通水壶, 高级水壶(水开会响) 1. 满满把水壶放在火上, 站在那里等水开(同步阻塞) 满满觉得自己有点儿傻逼~ 2. 满满把水壶放在火上,去客厅看电视,时不时的去厨房瞅瞅水开木有(同步非阻塞) 满满觉得自己还是有点傻~,于是买了个高级水壶, 水开后会响~ 3. 满满把高级水壶放在火上, 站在那里等水开(异步阻塞) 满满想高级水壶水开会自己叫~为毛不去看个电视哪? 4. 满满把高级水壶放在火上, 去客厅看电视,

同步/异步-阻塞/非阻塞

(A)同步和异步,是针对 调用结果是如何返回给调用者来说的,即调用的结果是调用者主动去获取的(比如一直等待recvfrom或者设置超时等待select),则为同步,而调用结果是被调用者在完成之后通知调用者的,则为异步(比如windows的IOCP).(B)阻塞和非阻塞,是针对调用者所在线程是否在调用之后主动挂起来说的,即如果在线程中调用者发出调用之后,再被调用这返回之前,该线程主动挂起,则为阻塞,若线程不主动挂起,而继续向下执行,则为非阻塞. 这样,在网络IO中,同步异步,阻塞非阻塞,就可以形成