首先先看如下几个问题,或者说我们经常会遇到的问题。

阻塞是否等于同步?
非阻塞是否等于异步?
同步一定是阻塞的么?
异步一定是非阻塞的么?
要把这四个概念讲明白,先从一顿简餐说起。假设你要做一顿便饭:烧土豆;烧茄子和米饭。CPU代表你,如下事件代表操作:

A1、切土豆、A2、烧土豆

B1、切茄子、B2、烧茄子

C1、淘米、C2、煮饭;

情况1:你做完A1再做B1再做C1,即:切完土豆、切茄子最后淘米;

情况2:你干一会A1再干一会B1,再干一会C1,即:一会切土豆、一会切茄子、一会淘米,直到三者做完;

情况1相当于开一个线程按顺序做,情况2相当于开三个线程分别作A1、B1、C1;

对于你来说:情况1显然要比情况2好,因为减少了切换时间,也就是说减少了不必要的拿起土豆,放下土豆,拿起茄子放下茄子的时间,这个时间就是CPU线程切换时所带来的额外开销,想象一下你要做100个菜。你的时间将大量耗在拿起某个菜放下某个菜的过程中,而不是干正事切菜配菜上。

A1、B1、C1对你来说是纯体力活,要全程参与,相当于CPU的纯运算操作。此时开多个线程分别做,还不如开一个线程一个一个按顺序做。

情况真是如此么?

如果你能像周伯通那样双手互搏,左手削土豆,右手削茄子,那么你就是双核CPU。如果你还能把双脚利用起来,左脚切冬瓜,右脚淘米,那么你就是四核CPU。你的工作效率将会大幅提升,还能给自己加一个菜:烧冬瓜。

那么真的会有提升么?

假设你已打通任督二脉,练到了4核的境地,你也愉快的开启了4个线程,不幸的是4个线程都开在了左手上,那你的左手效率将大幅提升:削土豆、削茄子、切冬瓜和淘米,不停的在左手切换。但右手和双脚会闲的蛋疼。虽然你是个4核,但低调的像个单核,甚至还不如单核。因此你要尽可能的将这4个线程分配到不同的手脚上去干不同的事。

上述三个操作完成只是做一顿饭的前戏,你还要把他们烧熟。

此时你还要完成 A2(烧土豆)、B2(烧茄子)、C2煮饭。 相对于A1B1C1,这三个操作你不需要全程参与,大部分时间是交给煤气灶、电饭煲完成。你只需要把土豆扔锅里,加点水和调料等待煮熟即可(这里将就一下,不讲究口味,要啥自行车)。A2、B2、C2相当于IO操作,你参与的时间很少,大部分是等待结果。

情况3:你做完A2再做B2再做C2,即:烧完土豆、烧茄子、最后煮饭,此时你就在厨房啥事不干就是干等;

情况4:你做A2的同时,又开了一个煤气灶烧了茄子,同时又将米放入电饭煲中开煮,然后你去客厅看乡爱N部曲。

对你而言显然情况4要优于情况3,做一顿饭的时间将大幅缩短,你不用一直呆在厨房,你还有时间去看电视。情况3就是阻塞同步。

你真的能安心看好电视么?

显然不能,你要确保土豆、茄子是否烧熟或者是否烧糊,就要不停从客厅到厨房去查看一下,这就是非阻塞轮询。虽然比情况3好一点,但也好不到哪去,因为你要往返跑,还能让人愉快的看东北F4么?在你忙着从厨房到客厅,客厅到厨房的时候,电饭煲发出了“biu”的一声,此时你知道饭烧好了。

A2、B2的操作对你而言就是非阻塞轮询,虽然不阻塞了(在厨房傻等)可惜累成狗。C2操作对你而言就是异步,电饭煲把饭做好后通知你结果,这样你就无需像烧土豆、茄子那样跑断腿。

此时你的女朋友来了!!

你很激动,需要临时加几个菜。这时候你可以在等A2、B2、C2结果的同时,处理其它菜品,比如切西红柿、清洗小龙虾、做个狮子头、拌个凉菜,甚至出去买瓶酒。土豆烧好后,你就烧西红柿;米饭煮好后你就烧龙虾,烧龙虾时你又可以剁肉做狮子头。这样你可以一直烧下去,烧很多很多菜。

这时候你的利用率是最高的,几乎没有等待时间,因为你的女朋友来了你很开心,开心的想一直烧下去。。。。。。
这时候你必然会发挥自己的多核性能,把你四肢的主观能动性都调动起来,而且会调度的很均衡,让电视里的尼古拉斯赵四见鬼去吧。。。。。。
这时候你会发现自己已经从一个纯粹的CPU进化为一个懂业务的高性能服务器:高并发、高吞吐量和低延迟。你的女朋友对你的性能相当满意,并对你的这一系列骚操作起了一个名字:非阻塞异步!
因为有了IO操作才会有阻塞,才会出现同步和异步。因为有大量IO操作,才会有高并发的设计,如果只是纯CPU运算,不涉及到CPU对外围IO设备的读写,那么就不存在高并发设计。也就是说无论切土豆还是切茄子,都是纯体力工作,纯CPU运算工作。那么对CPU而言,开一个线程计算和开100个线程计算,只会徒增CPU切换时间,当然这种情况下也不存在所谓的阻塞、非阻塞、同步和异步。所谓的高性能就是如何在处理大量IO的情况下,让CPU去干更多的正事(切菜配菜烧菜),而不是去等待或者去看电视。

虽然你的女朋友对你很满意,但你并不能骄傲,你还有提升的空间,就是如何提升自己洗菜、配菜的速度,就业务而言就是如何设计高效的内存池、缓存、Hash表。。。。,这样你就可以在等待IO结果的同时,处理更多的业务了。

回到本文开头的四个问题

就CPU而言IO阻塞是绝对的,因为所有设备都不会快过CPU。只是有的设备快有的慢,有的稳定有的不稳定,比如磁盘IO相对于网络IO就比较快速和稳定。阻塞和非阻塞的意义在于内核在这种绝对阻塞上呈现给应用层的形式。换句话说,就是内核给应用层提供访问这些IO的函数是阻塞的还是非阻塞的,这两者的差别就导致了后面的同步和异步。

——————————————最后收尾总结一下————————————————

阻塞和非阻塞是指内核提供给应用层的IO访问函数是等待IO结果返回还是立即返回,等待结果的就是阻塞函数,立即返回的就是非阻塞函数,是针对函数而言;
同步和异步是指应用层在调用内核的阻塞函数或非阻塞函数后所才取的处理方式,是针对操作而言。
如果内核只提供阻塞IO函数,你的应用层操作必然是同步;
如果内核也提供了非阻塞IO函数,你的应用层操作可能是同步,也可能是异步;
如果内核没有提供IO完成通知机制,你的应用层也无法实现完全的异步。
这些函数和操作的组合就产生了不同的IO模型,或者说阻塞函数、非阻塞函数、同步操作、异步操作之间的组合就是IO模型。通常有四种组合:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。

编写服务器时,我们大部分使用的是异步阻塞IO模型。就是既调用了阻塞函数,也调用了非阻塞函数。比如读写操作是非阻塞的,但select/wait却是阻塞的。这种模型在windows下衍生出了事件(Event)和重叠(Overlapped)模型。在linux下衍生出了poll和epoll模型。不同的IO模型适用于不同业务场景,需要根据你的具体业务而定。如果只是客户端程序,阻塞同步就很好,代码简洁清晰。

什么是阻塞、非阻塞、同步和异步以及IO模型相关推荐

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

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

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

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

  3. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  4. 同步 异步 阻塞 非阻塞概念区分

    老张爱喝茶,废话不说,煮开水. 提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的. 出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶:会响的水壶,简称响 ...

  5. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 在网上看了很多答案,也没找到合适的,也许本文也不是合适答案:) 同步和异步关注的是消息通信机制,而阻塞非阻塞关注的是程序在等待 ...

  7. 异步同步、阻塞非阻塞、异步回调、线程队列和协程

    今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作  代码卡住  无法执行下一行  CPU会切换到 ...

  8. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞

    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一.阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例.(对操作系统而言,所有的输入 ...

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

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

  10. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

最新文章

  1. python工程师薪资-不止 20K,Python 工程师的薪资再度飙升!
  2. 各种边缘检测算法效果对比-差分运算法、Sobel、Scharr、Laplace(拉普拉斯)、Roberts、Canny
  3. 类属性的存储和this指针
  4. 如何在前端进行短信接口和语音验证接口的使用
  5. 哈工大计算机学院庞,奋斗在知足与知不足之间――我与我的导师计算机学院马培军教授二三事...
  6. html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
  7. 1748. The Most Complex Number/LG的数学计划~~~持续更新ing(反素数求解)
  8. tab切换webuploader失效的解决方法
  9. yum install php72w,yum 安装 php72w-pecl-imagick 报错
  10. 微服务之间最佳调用方式是什么?
  11. 10-ret/retf+call+mul
  12. 【设计模式】享元模式(Flyweight)
  13. Unity制作简单动画效果
  14. js绘制3D正多面体(正六面体,正四面体,正八面体,正十二面体,正二十面体)
  15. Linux部署单体架构,从单体式架构迁移到微服务架构:三个策略叙述
  16. 底层文件I/O和ANSI标准I/O的区别
  17. 蓄水池算法的设计和实现
  18. 智慧交通产品解决方案-交通地理信息平台
  19. 免费个人数据备份软件介绍:FreeFileSync、Syncthing
  20. 质量体系建设——环境治理

热门文章

  1. display的contents属性
  2. mysql表文件被删除,MySQL数据表InnoDB引擎表文件误删恢复
  3. [微信]微信小程序开发--用户昵称中带有emoji表情的处理方法
  4. IE8浏览器访问百度首页,输入关键字,点击“百度一下”,搜索内容出现在一个自动打开的新窗口的问题的一个原因
  5. Error 遇到错误:请求通道在等待 00:01:00 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能已经是更长超时的一部分
  6. Unity3D坦克大战游戏开发——学习笔记(中)
  7. php 模态框效果,评论:超酷的模态框效果 - Nifty
  8. Oracle AutoVue 21.0.2.4 支持的文件格式
  9. Android MotionLayout As a Dancer
  10. 第一个TensorFlow程序