作者:知乎用户
链接:https://www.zhihu.com/question/19732473/answer/51734090
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以linux下 tcp socket编程为例:

阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走。(当然如果你通过setsockopt设置了读写超时,超时时间到了还是会返回-1和EAGAIN,不再睡觉等待)
非阻塞就是recv/read的时候,要是接收缓冲区有数据我就读完,没有数据我直接带着返回的-1和EGAIN走人,绝不睡觉等待耽误时间。write/send的时候, 要是发送缓冲区有足够的空间,就立刻把数据塞到发送缓冲区去,然后走人,如果发送缓存区满了,空间不足,那直接带着返回的-1和EAGAIN走人。

至于IO多路复用,首先要理解的是,操作系统为你提供了一个功能,当你的某个socket接收缓存区有数据可读,或者发送缓冲区有空间可写的时候,它可以给你一个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGAIN的无用功。写操作类似。操作系统的这个功能通过select/poll/epoll之类的系统调用函数来使用,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。

至于事件驱动,其实是I/O多路复用的一个另外的称呼。

至于异步同步,我们常见的linux下的网络编程模型大部分都是同步io,以读操作为例,本质上都是需要用户调用read/recv去从内核缓冲区把数据读完再处理业务逻辑。异步io则是内核已经把数据读好了,用户直接处理逻辑。异步IO在linux下一般是用aio库。

一个理解同步异步阻塞非阻塞非常好的解释相关推荐

  1. 理解同步异步、阻塞与非阻塞

    "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...

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

    异步/同步.阻塞/非阻塞的理解 [同步和异步] 通俗的讲: 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式.  异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个 ...

  3. 深入理解并发/并行,阻塞/非阻塞,同步/异步

    北京 | 深度学习与人工智能 12月23-24日 再设经典课程 重温深度学习阅读全文> 正文共3359个字,11张图,预计阅读时间:9分钟. 1.阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程 ...

  4. 深入理解非阻塞同步IO和非阻塞异步IO

    这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...

  5. 聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

    一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...

  6. 一篇文章理解 同步异步、阻塞非阻塞

    前述 同步异步,阻塞非阻塞是一些非常常见的概念,但是对于开发者来说往往是用到了很难说清楚. 笔者专门整理了下这方面的概念,作此文以记之. 这部分内容可能存在一些争议,如有不同意见欢迎评论交流. 概念 ...

  7. 正确理解同步/异步和阻塞/非阻塞的区别:

    之前一直把异步和非阻塞混为一谈,在 了解BIO和NIO的区别时才发现了两者的差异,看了网上很多文章觉得说的总是差点意思,下面是个人理解: 1.同步 非同步 阻塞 非阻塞 概念 怎样理解阻塞非阻塞与同步 ...

  8. 彻底理解同步异步阻塞与非阻塞

    彻底理解同步异步阻塞与非阻塞 前言 用户空间 内核空间 系统调用 用户态 内核态 系统IO 阻塞非阻塞 同步异步 前言 最近有同事问我同步异步与阻塞非阻塞有什么区别,后来发现很多同事不能区分这些概念. ...

  9. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

最新文章

  1. 联想输入快捷键_UG软件F8快捷键和笔记本电脑F8快捷键冲突的解决方法
  2. android ijkplayer使用_Ijkplayer、ExoPlayer、VLC播放器综合比较
  3. hdu 1872(看病要排队)(优先队列)
  4. 分数化成有限小数的方法_人教版六年级数学上册6.2百分数的换算微课视频辅导|课后练习...
  5. 鸟哥的Linux私房菜(基础篇)- 简易且较小安装Red Hat 7.2
  6. CVPR 2019 | PoolNet:基于池化技术的显著性目标检测
  7. boost::stacktrace::detail::void_ptr_cast相关的测试程序
  8. x265与SVT-HEVC现已合二为一
  9. java中的多态与继承_【Java学习笔记之十六】浅谈Java中的继承与多态
  10. 拉普拉斯算子属于卷积方法吗_论文笔记 - 图卷积神经网络综述
  11. 10.卷1(套接字联网API)---SCTP 客户/服务器程序例子
  12. keil5兼容keil4操作
  13. itunes备份电脑C盘内存不够怎么办?
  14. kiv8测量方法_特殊的长度测量方法-初二物理长度的测量
  15. snapchat忘记账户_如何恢复忘记的Snapchat密码
  16. iphone导出视频 无法连接到设备_iPhone内存不足?深度清理方法了解一下
  17. 综合案例——手写数字图像处理算法比较
  18. Maven-3.maven知识点
  19. 爬取豆瓣电影前十页的好评一般差评
  20. 【LTE】LTE基础知识要点(二)信道物理资源定义(RG/RB/RE/REG)

热门文章

  1. 苹果uwb_苹果电子追踪器即将发布,我们扒了扒产品背后的 UWB 超宽频技术
  2. 敲开bp神经网络之门(二,mfcc中使用,c#)
  3. Android中Callable、Future、FutureTask的概念以及几种线程池的使用
  4. 智能搬运机器人系列之使用旭日X3派实现机器人防脱轨功能
  5. 新版openwrt配置vlan 拨号-局域网-iptv
  6. error c2678解决方法
  7. 如何解决eclipse官网下载速度超慢的问题
  8. c++ tuling123_现代编译原理-图灵计算机科学丛书.pdf
  9. 李宏毅机器学习 Regression
  10. MacBook使用与应用推荐