看了很多这方面的博客,发现说的都云里雾里,有些甚至矛盾了起来,自己理了一下这些文章,结合自己的理解说一说其到底是什么。
首先我们都知道阻塞与非阻塞,同步与异步是两个概念。而且是不是有一种它们本质上不是一组概念吗,为什么分开了?
如果想真的弄懂它们并不容易。这里我们从一个真正的使用这四个概念的场景和一个生活中模拟的场景来体会它们。

首先我们以网络通信中数据传输来看一下这四个概念:

当网络中一个进程向另一个进程发送数据时,接收数据的进程会将数据放置在内核的缓冲区中,如果之后我们的程序中需要读取数据,其实是读取内核中缓冲区里的数据。而读取数据则一般会分为两个过程:内核数据是否准备好数据从内核态拷贝到用户态

PS: 我们使用数据是在用户态,但数据真正存储的地方是在内核态。

阻塞和非阻塞

阻塞和非阻塞是指内核数据是否准备好这个过程,假设我们读取数据时,当内核数据还没准备好,我们程序就会一直停在那个地方,不会往下执行。直到内核数据准备好时,我们的程序才会继续完成数据从内核态拷贝到用户态这个过程,最后再从用户态返回。这个过程就产生了阻塞即等待内核数据准备这个过程。
而当我们读取数据时,如果此时内核数据没有准备好,那么就先去加载别的数据,别的数据加载完成后再看看看这个数据是否准备完毕,准备后了就返回,这样就不会产生阻塞即非阻塞

所以阻塞和非阻塞这个概念这里指的是:内核数据是否准备好,也就是数据是否到达内核这个过程。当数据还没到达内核时,我们要一直去等它到达,就叫做阻塞。 而当数据未到达内核时,我们等待数据的准备,就叫做非阻塞。

同步和异步

首先我们要知道,上述的阻塞和非阻塞的概念全都是属于同步!这一点很关键,因为阻塞对于异步来说没有任何意义

同步和异步讨论的是数据从内核态拷贝到用户态这个过程。具体是指:当内核数据准备好时,我们需不需要主动地调用函数去读取这个数据。

对于同步:当内核数据准备好时,我们需要主动去从内核里读取这个数据,也就是需要等待数据从内核态拷贝到用户态这个过程。因此无论是阻塞 I/O,还是非阻塞 I/O 都是同步调用。因为内核将数据从内核空间拷贝到用户空间的过程都是需要等待的,也就是说这个过程是同步的,如果内核实现的拷贝效率不高,那么读取数据时就会在这个同步过程中等待比较长的时间。

对于异步:异步没有阻塞和非阻塞的概念,因为它内核数据是否准备好和数据从内核态拷贝到用户态这两个过程都不用等待。我们只需要一开始先注册好一个回调事件,此后当内核数据到来时,操作系统就会自动帮我们完成数据从内核态拷贝到用户态这个过程,我们不需要主动去等待这个过程,可以去做别的任何事情! 然后当数据从内核态拷贝到用户态这个过程完成之后,操作系统就会以一个信号或者回调函数的方式通知用户数据已经准备好了。

下面我们再通过一个生活中的一个场景来体会一下这四个概念:

同步阻塞: 你打电话告诉老板你要买某书,老板拿起电话听你说完告诉你他不知道有没有这本书,需要去查一下,然后你在得到老板的结果之前,你一直拿着电话干等,什么也不干。一段时间后老板告诉你了结果,这时你才挂断电话。每次电话你都要得到有没有书的结果后你才挂断电话,这是同步。你一直拿着电话等结果这个过程是阻塞。

同步非阻塞: 你打电话告诉老板你要买某书,老板拿起电话后说“我不知道有没有货,现在去查”便挂了电话,又过了10分种你第二次打电话说你要买某书,老板拿起电话说完“还没有查到,你再等会儿”便挂断电话。挂断电话5分钟后老板查到有书,但并没有主动打电话告诉你。你再次等待10分钟后第三次电话老板问结果,老板才告诉你有书。每次电话你都要得到结果后你才挂断电话,这是同步。你每隔10分钟打电话询问结果而这十分钟你不会等待结果而是去做别的事,这是非阻塞。

异步阻塞: 你打电话过去问老板有没有某书,老板说“我不知道有没有货,现在去查,先挂了电话,有结果告诉你,你等我电话”就挂掉电话。等电话期间你什么也不干,老板主动给你打电话告诉你这本书还有货。老板主动给你打电话就是异步,因为你不需要一直等着结果。等待老板的短信期间你什么也没干,这是阻塞。但这是毫无意义的,所以说对于异步来说没有阻塞这个概念。如果不理解的话就像一下同步阻塞,你需要拿着电话等结果是不是等价于你挂下电话等老板给你回电话,这两个结果都是你什么也没干。

异步非阻塞: 你打电话过去后问老板有没有某书,老板说“我去查一下,有了给你回电话”然后挂掉电话。之后你想干嘛干嘛,等老板主动给你打电话,这是异步。挂了电话后你想干嘛干嘛,这是非阻塞。

所以说同步异步与阻塞非阻塞其实概念是相似的,只是针对的对象不一样。用在一起时我们只要可以区分出他们分别针对的对象就可以了,不必过度的分析每一个例子,因为场景不同,它们的意义可能就不同。


感谢耐心看到这里的同学,觉得文章对您有帮助的话希望同学们不要吝啬您手中的赞,动动您智慧的小手,您的认可就是我创作的动力!
之后还会勤更自己的学习笔记,感兴趣的朋友点点关注哦。

可以真正带你理清同步阻塞与同步非阻塞与异步阻塞与异步非阻塞的文章相关推荐

  1. python复制文件夹不阻塞_python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步...

    1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...

  2. 【C/C++服务器开发】同步与异步、阻塞与非阻塞、同步调用和异步调用的概念

    同步与异步 首先我们要明确的是,同步和异步都是针对两个或者两个以上的事物来说的.比如当我们在网上购物看中一件物品,然后去浏览该商品详情的时候,首先页面会先发送一个请求,后台服务器查询对应商品的相关数据 ...

  3. 怎样理解阻塞非阻塞与同步异步的区别

    怎样理解阻塞非阻塞与同步异步的区别? 发现很多人对这两个概念往往混为一谈 6 条评论 分享 按投票排序 按时间排序 47 个回答 605赞同 反对,不会显示你的姓名 卢毅 ,Lyft full-sta ...

  4. 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步

    看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门口,我的大姨 ...

  5. linux socket 阻塞与非阻塞,同步与异步

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步:       所谓同步,就是在c端发出 ...

  6. 阻塞/非阻塞与同步/异步的区别

    阻塞,非阻塞 同步,异步 阻塞与非阻塞最大的区别是调用方一直等待还是先去处理别的事情. 同步与异步最大的区别就是被调用方返回结果之前的这段时间内,调用方是否一直等待. 那么阻塞和同步,非阻塞和异步是一 ...

  7. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

  8. 阻塞(block)/非阻塞(unblock) 同步(synchronization)/异步(asynchronization) 的区别

    阻塞和非阻塞,同步和异步[转载][经典] 转载于:https://www.cnblogs.com/wjc920/p/9256143.html

  9. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

最新文章

  1. 修改Kali Linux终端历史记录大小
  2. Linux桌面需要强制访问控制,RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...
  3. 基于 Kubernetes 实践弹性的 CI/CD 系统
  4. 作者:陈卫, 男, 微软亚洲研究院高级研究员, 清华大学客座教授。
  5. MongoDB数据库的介绍和连接(非常详细、易懂)
  6. npm中强制关闭node.js
  7. easyui-combobox实现placeholder提示效果
  8. Java线程间通信方式
  9. D8 NOTES 2018-10-17
  10. 免费的虚幻3引擎其实不好用啊
  11. 计算机管理 网络连接服务,WZC服务未开启无法连接网络 解决方法及步骤
  12. java 图片转换 gif转jpg
  13. 计算机硬盘使用寿命,怎么看电脑硬盘的寿命
  14. 永洪科技何春涛:中国企业正在建立大数据洞察系统
  15. BIND9手册【转】
  16. 美的美少年暑期实习面经
  17. 关于开展我市2012年度专业技术资格评审工作的通知
  18. access汇总含义_如何用access进行分类汇总?
  19. 卡尔曼实时检测跟踪算法(论文总结)
  20. 【Android基础】四种基本布局

热门文章

  1. 视频(mp4文件)批量转换成动图(gif文件)
  2. uniaccess安全助手卸载
  3. C语言--正弦、余弦函数
  4. 老马 Markov 其人
  5. Unity 抛物线,直线,Sine曲线等
  6. Unity Shader 扇形进度条
  7. 第十章、epub文件处理 -- 样式处理
  8. mac 不显示 外接屏幕_教大家Mac外接显示器设置教程
  9. 【094】统计大写字母个数
  10. 地网导通测试仪_江西地网接地导通测试仪特点