博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于同步、异步与阻塞、非阻塞的理解
阅读量:7077 次
发布时间:2019-06-28

本文共 1032 字,大约阅读时间需要 3 分钟。

1、前言

  前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要多次请求服务端,才能加载完整个页面的内容。同步的操作如下:浏览器首先发送第一个请求,等待服务器回复后,再发送第二个请求,依次类推,直到所有请求完成。异步的操作如下:浏览器发送第一个请求,可以不用等待服务器返回,可以继续发送第二个请求。阻塞与非阻塞属于进程的API执行动作的方式,例如进行需要read数据,阻塞方式操作流程是:如果没有数据,则read会一直等着数据到来,才能进行后续的动作;而非阻塞则是read没有到数据后,则可以进行后续的动作,当有数据的时候再回来读取。通常linux网络API默认都是阻塞的,例如connect、send、recv等。回答后感觉自己心里没有底,底层的关系到底是什么样的,比较虚,没能深入理解。

2、深入理解分析  

  回来以后,赶紧上网好好查查,加深学习一下。这两个概念在工作中经常用到这些,例如在linux网络IO中涉及到如下模型:

(1)阻塞式IO

(2)非阻塞式IO

(3)IO多路复用

(4)信号驱动IO

(5)异步IO

在知乎上面看到一些解释如下:

截图如下:

3、总结

  

  同步和异步针对应用程序来,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。

同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。

异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。

阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。

非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

   阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

参考网址:

转载于:https://www.cnblogs.com/Anker/p/5965654.html

你可能感兴趣的文章
Confluence 6 示例 - https://confluence.atlassian.com/
查看>>
django第一个app,3
查看>>
大数据教程(2.5):Linux系统搭建本地YUM源服务器
查看>>
postgreSQL中如何实现group_concat
查看>>
招聘网工:内推性质
查看>>
wxPython,线程中修改UI的方法
查看>>
我的友情链接
查看>>
kvm虚拟化
查看>>
jsp中文显示乱码的解决办法
查看>>
Cmakelists.txt中间部分模板
查看>>
eclipse中java工程转web工程
查看>>
linux中的僵尸进程
查看>>
clustershell批量执行shell命令
查看>>
fedora 19 安装mp3 解析
查看>>
redhat7.2配置yum源
查看>>
iOS开发之左右抖动效果
查看>>
血的教训---工作中注意的事项(未完)
查看>>
php转义之gpc
查看>>
IE中用JS让页面全屏的方式(达到F11的 效果)
查看>>
exec-timeout
查看>>