异步/同步、阻塞/非阻塞的理解
[同步和异步]
通俗的讲:
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
概念从现实中来:
同步:打电话,你拨通电话后必须等在那里,直到对方有人接了,你们才能通信或者说你才能继续打下一个电话。
异步:发短信,你可以发短信,只要你发出去,你就可以继续发给下一个人,而不需要等到第一个人回你,你才可以继续。
同步服务器
异步服务器
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。
但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。
该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。
异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,
调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:
状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。
如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低
(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。
如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。
[阻塞和非阻塞]
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。
对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。
而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。
socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
通俗地说,你拿着饭碗在排队等饭是阻塞的,你不能跑出去干其他事情;你拿着一张取饭的号码等饭是非阻塞的,你可以出去抽根烟在回来。
比如在epoll模型wait之后,将新连接设置成一个非阻塞的连接(见epoll模型)
setnonblocking(client); // 将新连接置于非阻塞模式
这样客户端在得到结果之前,立刻返回,而不是出于等待中。
在网络通信与服务器编程过程中,我们必须首先了解这两组蛋疼的概念!但是,当你模糊时候,请想到
“打电话和发短信”,“拿饭碗等和拿号码等饭”,那么你就清楚了!
转载于:https://www.cnblogs.com/ruiy/p/4021062.html
异步/同步、阻塞/非阻塞的理解相关推荐
- 聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)
一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...
- 一篇文章理解 同步异步、阻塞非阻塞
前述 同步异步,阻塞非阻塞是一些非常常见的概念,但是对于开发者来说往往是用到了很难说清楚. 笔者专门整理了下这方面的概念,作此文以记之. 这部分内容可能存在一些争议,如有不同意见欢迎评论交流. 概念 ...
- 正确理解同步/异步和阻塞/非阻塞的区别:
之前一直把异步和非阻塞混为一谈,在 了解BIO和NIO的区别时才发现了两者的差异,看了网上很多文章觉得说的总是差点意思,下面是个人理解: 1.同步 非同步 阻塞 非阻塞 概念 怎样理解阻塞非阻塞与同步 ...
- 同步 异步 阻塞 非阻塞深入理解
同步:执行一个操作之后,等待结果,然后才继续执行后续的操作. 异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作.生活中的同步便是异步 阻塞:进程给CPU传达一个任务 ...
- 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...
常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...
- 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...
网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...
- 面试必会系列 - 5.1 网络BIO、NIO、epoll,同步/异步模型、阻塞/非阻塞模型,你能分清吗?
本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...
最新文章
- C语言,分解质因数一个解法!_只愿与一人十指紧扣_新浪博客
- Mozilla两款火狐插件包含恶意代码被紧急喊停
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
- 是否有一个不区分大小写的string.Replace的替代方法?
- 《乐高EV3机器人搭建与编程》——2.2 颜色设计
- iptables 过滤条件(Matches)
- Modelsim do文件的自动化仿真及模板
- Spring(二)——IoC
- 【转】.NET内存管理、垃圾回收
- C语言文本操作以及C语言小技巧
- cleanlab(解决图像标记错误)
- 改变你一生的五句话 (转)
- 苹果测试网速软件,Mac 网速测试工具 SpeedTest by Ookla
- 关于微PE的那些事和重装系统
- 使用jeDate日期控件
- 电脑html5播放黑屏,电脑看视频黑屏,教您电脑看视频黑屏有声音怎么办
- Ubuntu16.04 安装NVIDIA英伟达驱动教程
- C++ 引用与引用作为函数的参数
- keras 使用WGAN-div进行图像生成
- 为什么说裁员18000只是微软计划的一部分
热门文章
- html 监听input输入框的值,利用原生JS实时监听input框输入值
- 动态规划——入门(1)
- pyharm虚拟环境_手把手教你如何在Pycharm中加载和使用虚拟环境
- 使用tab键分割的文章能快速转换成表格。( )_word排版技巧:活用Enter键提高工作效率...
- c语言用正数的形式求最大值最小值,C语言-进制 - 盘盘的灰灰的个人空间 - OSCHINA - 中文开源技术交流社区...
- 字体渲染 mac linux,Mac下通过命令来渲染字体
- python文件分发_python 写一个文件分发小程序
- 步进电机红外遥控C语言程序,单片机红外遥控+步进电机+1602液晶显示c语言源程序...
- Linux系统root密码重置教程
- 可逆加密算法 php,php可逆加密的方法及原理