博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 下同步异步,堵塞非堵塞的一些想法
阅读量:6291 次
发布时间:2019-06-22

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

补充:

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

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

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

同步异步 堵塞非堵塞

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

一句话总结差别:
同步异步关注的是事件发生时你的行为。

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

以下看详细的分析


同步异步

同步:

在事件发生前,你的状态是时刻关注此事件,等待此事件给你返回结果。
样例:
烧水,同步就是你时刻关注着它,一段时间后,烧水壶冒烟了,你看见了,你知道水已经烧好。

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


异步:

在事件发生前,你并不关心此事件。而是自己去忙自己的,事件完毕会通知你。
样例:
水烧好时,烧水壶会发出鸣声,你听见了,说明水烧好了
那么在这段时间内你不须要一直看着它。听见声音说明水已烧好。声音就是通知机制。


堵塞非堵塞

堵塞:

堵塞是你等待事件时为挂起状态。此时你什么也不能干。仅仅能在等待事件。
样例:
烧水时,你在烧水壶旁边仅仅等待水开。水开了自己立马知道。


非堵塞:

非堵塞是等待事件。假设事件没发生,不挂起自己
样例:
烧水时,你过来看一眼。水没开。走了,过一会在过来看,没好,这样不断反复,直到水开为止。


同步异步堵塞非堵塞组合

这里写图片描写叙述

网络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支持并不好。网上批评的文章非常多。

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

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


异步堵塞

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

看了一点觉得就有问题。
他异步堵塞I/O指的是epoll。


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

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

你可能感兴趣的文章
(转)Tomcat7+Redis存储Session
查看>>
vs2012建一个空解决方案添加以前老版本的Web项目调试弹出window安全
查看>>
C# 实现抓取网页内容(一)
查看>>
golang中并发sync和channel
查看>>
margin重叠与line-height属性
查看>>
服务器跟PC机的区别(转)
查看>>
Java核心技术之基础知识
查看>>
读书笔记_写给自学者的入门指南 >博客园||知识库
查看>>
iOS应用之间的跳转与数据传递
查看>>
CCleaner使用说明
查看>>
NOIP专题复习3 图论-强连通分量
查看>>
hdu Dragon Balls
查看>>
java代码-----indexOf()方法--从字符串的某个字符的第一次出现的位子开始
查看>>
java代码=====实现修改while()
查看>>
python (11)文件的读写 按行读文件
查看>>
Python 结巴分词(2)关键字提取
查看>>
python异常处理,日志处理
查看>>
MySQL字符集问题
查看>>
node服务器端模块化-commomjs
查看>>
20165330 2017-2018-2 《Java程序设计》第7周学习总结
查看>>