深入讨论阻塞与非阻塞、同步与异步的区别

一、概念

异步:某个事情需要10s完成。而我只需要调用某个函数告诉xxx来帮我做(然后我再干其他的事情)

同步:某个事情需要10s完成,我需要一直等它完成(等10s),再能继续后面的工作。

阻塞:做某件事情,直到完成,除非超时

非阻塞:尝试做,如果不能做,就不做(直接返回),如果能做,就做。

前两者和后两者不容易区分,不过前两者更多的有涉及到多线程交互(消息)的场景。

二、举个例子

小李喝了想喝水,于是去煮开水。

1、小李把水壶放到炉子上,等待水烧开。(同步阻塞)

小李感觉这样太费时间。

2、小李把水壶放到炉子上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)

小李还是觉得自己这样太累,于是买了把会响笛的那种水壶。水开之后,能发出声音。

3、小李把响水壶放到炉子上,等待水壶发出声音。(异步阻塞)

觉得这样傻等意义不大

5、小李把响水壶放到炉子上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

这样真好。

三、深入理解

阻塞就是 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多路复用的一个另外的称呼。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mwangblog

虚拟机软件ORACLE VM VIRTUALBOX的安装并安装WINDOWS 7 图文版

13340
来自专栏草根专栏

使用 Moq 测试.NET Core - Why Moq?

在一个项目里, 我们经常需要把某一部分程序独立出来以便我们可以对这部分进行测试. 这就要求我们不要考虑项目其余部分的复杂性, 我们只想关注需要被测试的那部分. ...

16130
来自专栏chenssy

【追光者系列】Hikari连接池配多大合适?

首先声明一下观点:How big should HikariCP be? Not how big but rather how small!连接池的大小不是设置...

20610
来自专栏腾讯移动品质中心TMQ的专栏

糖大夫--测量流程性能监控自动化方案设计

糖大夫(简称)是一款血糖仪(想了解更多的同学请看这里http://tdf.qq.com/),但不止血糖仪。血糖仪终端具备触屏、联网、高准度血糖检测单元。除了终端...

23360
来自专栏mwangblog

虚拟机软件ORACLE VM VIRTUALBOX的安装并安装WINDOWS 7 文字版

13120
来自专栏FreeBuf

老式后门之美:五种复古远程控制工具

目前,高级的rootkit技术可以帮助你在渗透中拿到一个shell后进行持久性控制。此外,还有供应商故意提供了一些植入后门,但那就是截然不同的故事了。尽管各式花...

27090
来自专栏影子

给Ionic写一个cordova(PhoneGap)插件

496100
来自专栏黑白安全

iOS安全基础之钥匙串与哈希

本文最初是由Chris Lowe编写的,后来经过Ryan Ackermann(ios系统开发者)的修改,已经可以针对最新的Xcode 9.2,Swift 4,i...

11720
来自专栏听雨堂

微信小程序自定义数据分析试水

昨晚收到小程序自定义分析的内测邀请,简单试用了一下。说明挺长的,大概是这个意思: 一、定义一系列事件,对其进行统计 事件可以对页面中的这些事件进行追踪 clic...

30070
来自专栏安智客

TrustZone的硬件框架和安全扩展

对外部资源和内存资源的硬件隔离就是trustzone的核心。这些硬件隔离包括:中断隔离,片上RAM和ROM的隔离,片外RAM和ROM的隔离,外围设备的硬件隔离,...

25030

扫码关注云+社区

领取腾讯云代金券