补充:

发现一个更好的解释样例:同步是一件事我们从头到尾尾随着完毕。异步是别人完毕我们仅仅看结果。

堵塞是完毕一件事的过程中可能会遇到一些情况让我们等待(挂起)。非堵塞就是发生这些情况时我们跨过。

比方我和小明并排跑步,这就是一个同步的过程,异步就是他跑他的。我仅仅关心他跑完没。跑步的过程中假设小明鞋带开了,我能够堵塞等待他也能够非堵塞的继续跑。

同步异步 堵塞非堵塞

今天和小伙伴讨论了这个问题,网上的说法有非常多种,我依照自己的思路总结一边。

一句话总结差别:

同步异步关注的是事件发生时你的行为。

堵塞非堵塞关注的是的等待事件的状态。

以下看详细的分析


同步异步

同步:

在事件发生前,你的状态是时刻关注此事件,等待此事件给你返回结果。

样例:

烧水,同步就是你时刻关注着它,一段时间后,烧水壶冒烟了,你看见了,你知道水已经烧好。

那么在这段时间内你须要一直看着它是否冒烟。


异步:

在事件发生前,你并不关心此事件。而是自己去忙自己的,事件完毕会通知你。

样例:

水烧好时,烧水壶会发出鸣声,你听见了,说明水烧好了

那么在这段时间内你不须要一直看着它。听见声音说明水已烧好。声音就是通知机制。


堵塞非堵塞

堵塞:

堵塞是你等待事件时为挂起状态。此时你什么也不能干。仅仅能在等待事件。

样例:

烧水时,你在烧水壶旁边仅仅等待水开。水开了自己立马知道。


非堵塞:

非堵塞是等待事件。假设事件没发生,不挂起自己

样例:

烧水时,你过来看一眼。水没开。走了,过一会在过来看,没好,这样不断反复,直到水开为止。


同步异步堵塞非堵塞组合

网络IO事实上简单分为以下步骤:

在网卡上等待数据–>从内核态复制到用户态(拷贝数据)

5种IO模型

同步堵塞:

在我们最開始学习网络编程一定写过同步堵塞IO模型。时刻关注着对方事件,假设对方没有消息则堵塞在read系统调用上。

如上图1部分,网络IO两个步骤一直在blocking。


同步非堵塞:

我们能够将套接字socket设置为非堵塞的,那么就会出现为上图另外一种情况,不断的check直到事件发生。它在拷贝数据阶段依然是堵塞的。没有数据来会堵塞在那里。

第三中情况,I/O multiplexing,select会堵塞在select函数,poll堵塞在poll函数,epoll堵塞在epoll_wait函数,他们第二阶段都是堵塞的。

单独说下I/O multiplexing

网上非常多人将epoll归为异步非堵塞的,我觉得这是不正确的,从概念上来讲,异步,从事件開始前我就不关注此事件了,你完毕了告诉我。而epoll不是。假设没有数据它会堵塞在epoll_wait,我想可能有些人从epoll的长处来看感觉epoll的确是异步的,由于epoll_wait每次返回的是就绪的事件,让大家以为“我不用管了,它返回给我的就是就绪事件呀!

”,事实上是不正确的,网络IO前面说了是分为两个步骤的,epoll_wait会堵塞在第二个步骤拷贝数据,那么它还是堵塞的。当中不论什么一个步骤堵塞都会堵塞。


异步非堵塞:

linux下应当是aio_*一套API了,但linux异步IO支持并不好。网上批评的文章非常多。

可參考这篇文章

Linux kernel AIO这个奇葩

异步非堵塞说明我们全然不用关心事件运行过程,事件完毕后发消息给我们,我们接受就可以。不会堵塞在网卡上。不会堵塞在拷贝数据上。

(注意:堵塞在拷贝数据上也是堵塞啊)。


异步堵塞

没听说过。个人觉得也没有异步堵塞这一说,异步不可能堵塞。查了资料有人反对贴上了IBM的一篇文章

使用异步 I/O 大大提高应用程序的性能

看了一点觉得就有问题。

他异步堵塞I/O指的是epoll。


最后,上面仅仅是个人的一些看法和观点,我们学习还是要带着审视的眼光,须要有自己推断知识好坏的能力。

假设文章内容有问题,还请指出^_^

linux 下同步异步,堵塞非堵塞的一些想法的更多相关文章

  1. Linux IO 同步/异步 阻塞/非阻塞

    同步IO:导致请求进程阻塞,直到IO操作完成: 是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成: 包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型 ...

  2. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  3. 操作系统介绍-操作系统历史,IO,进程的三态,同步异步阻塞非阻塞

    1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操 ...

  4. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  5. (转)同步异步,阻塞非阻塞 和nginx的IO模型

    同步异步,阻塞非阻塞 和nginx的IO模型  原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...

  6. Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...

  7. 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!

    系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...

  8. GIL 线程池 进程池 同步 异步 阻塞 非阻塞

    1.GIL 是一个全局解释器锁,是一种互斥锁 为什么需要GIL锁:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现 ...

  9. python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于I ...

随机推荐

  1. js基础——事件绑定(事件监听)

    JavaScript事件一共有三种监听方法分别如下: 1.事件监听一夹杂在html标签内 <div id="box" onClick="alert('HELLO W ...

  2. 【codeforces 746E】Numbers Exchange

    [题目链接]:http://codeforces.com/problemset/problem/746/E [题意] 你有n张卡片,上面写着不同的数字; 然后另外一个人有m张上面写着不同的数字的卡片: ...

  3. Java Web学习总结(26)——Servlet不同版本之间的区别

    1.   2.3版本 2.3版本 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2. ...

  4. 51 nod 1693 水群

    1693 水群 基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160  难度:6级算法题  收藏  关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有 ...

  5. 极路由4pro安装java(Jamvm 2.0.0 + gnu classpath 0.9.8)

    首先试了gnu classpath 0.9.9,编译不过后来改成0.9.8 编译环境 OS: 64位 Ubuntu 16.04 LTS(vmware虚拟机) SDK: 用之前讲过的官方SDKmtmip ...

  6. C++函数的导出与导入

    DLL使用 (1)隐式链接到 DLL 的可运行文件在生成时链接到导入库(.lib文件). (2)採用显式连接(LoadLibrary和GetProcAddress)时,不须要.lib文件. 函数导出方 ...

  7. Webserver管理系列:4、WinPE

    WinPE能够识别NTFS分区,使用WinPE能够备份/还原系统.能够重置用户password. 首先给大家看下怎样用WinPE重置password: 放入WinPE光盘-〉启动后-〉点開始菜单-〉程 ...

  8. CoreData的介绍和使用

    一.CoreData是什么? CoreData是iOS SDK里的一个很强大的框架,允许程序员以面向对象的方式存储和管理数据.使用CoreData框架,程序员可以轻松有效地通过面向对象的接口管理数据 ...

  9. [原创]微信小程序 实现 圆环 百分百效果

    1.最终效果 2.技术点:a. css3 clip-path , b.根据角度和直边计算另一个直边的长度 3.实现思路: a.3个层(灰色圆形层, 红色圆形层,白色圆形层)  ,其中灰色和红色层大小一 ...

  10. Codeforces 986A. Fair(对物品bfs暴力求解)

    解题思路: 1.对物品i bfs,更新每个小镇j获得每个物品i的最短距离. 2.时间复杂度o(n*k),满足2s的要求. 代码: #include <iostream> #include ...