linux 下同步异步,阻塞非阻塞的一些想法

同步异步 阻塞非阻塞

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

一句话总结区别:

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

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

下面看具体的分析


同步异步

同步:

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

例子:

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

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


异步:

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

例子:

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

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


阻塞非阻塞

阻塞:

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

例子:

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


非阻塞:

非阻塞是等待事件,如果事件没发生,不挂起自己

例子:

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


同步异步阻塞非阻塞组合

网络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。


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

如果文章内容有问题,还请指出^_^

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 06:47:53

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

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

[Z] linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO

原文链接:http://blog.csdn.net/colzer/article/details/8169075 IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据

linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据区,等一些属性).那么我们的应用程序对文件的读写就通过对描述符的读写完成. linux将内存分为内核区,用户区.l

基础入门_Python-网络编程.分分钟掌握阻塞/非阻塞/同步/异步IO模型?

概念梳理: 故事独白: 满满爱喝茶,废话不多说,开始煮开水. 出场人物: 满满, 普通水壶, 高级水壶(水开会响) 1. 满满把水壶放在火上, 站在那里等水开(同步阻塞) 满满觉得自己有点儿傻逼~ 2. 满满把水壶放在火上,去客厅看电视,时不时的去厨房瞅瞅水开木有(同步非阻塞) 满满觉得自己还是有点傻~,于是买了个高级水壶, 水开后会响~ 3. 满满把高级水壶放在火上, 站在那里等水开(异步阻塞) 满满想高级水壶水开会自己叫~为毛不去看个电视哪? 4. 满满把高级水壶放在火上, 去客厅看电视,

Python番外之 阻塞非阻塞,同步与异步,i/o模型

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

网络通信之同步异步阻塞非阻塞

先看下面例子 同步阻塞: 令狐冲泡妹纸 ,打电话给妹纸 , 妹纸没有回应,令狐冲想我现在还不会独孤九剑,还不够NB,就老实点,令狐冲就一直等下去 同步非阻塞 令狐冲拍妹纸 , 打电话给妹纸 , 妹纸没有回应 , 令狐冲想老子猪脚光环,等会妹纸肯定会再打给我的,然后令狐冲就每隔10分钟瞅一眼电话. 异步阻塞 令狐冲泡妹纸 , 打电话给妹纸 , 妹纸没回应 , 然后令狐冲让林平之去等电话,妹纸打过来了 , 就让自己来接,然后令狐冲一直等林平之 异步非阻塞 令狐冲泡妹纸 ,  打电话给妹纸 , 妹纸没

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

1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操作方式两个特点: (1)用户独占全机.不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低. (2)CPU 等待手工操作.CPU的利用不充分. 批处理-磁带操作: 主机与输入机之间增加一个存储设备--磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:成批地把输入机上的用户作业读入

Python并发编程之同步\异步and阻塞\非阻塞

一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播郭德纲,一个可以播高晓松. 二.并行和并发 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务 (一)并发:是伪并行,即

异步/同步,阻塞/非阻塞,单线程/多线程概念梳理

最近看了一文说到异步是单线程的,顿时就傻眼了,对相关概念和同事进行了一些讨论和总结. 文中的描述是以我的理解来说的,可能不一定准确甚至正确,有错欢迎指正. 这三个概念我认为是描述不同的维度的,概念正交. 异步 同步 异步和同步是不同的流程设计风格. 但存在依赖关系的操作之间是同步的,也就是如果操作B依赖操作A的返回,那么B必须要在A结束后才能执行. 比如你要读取文件然后对文件内容进行处理,那么读取内容和处理内容就是同步的. 而异步这是操作间没有依赖关系,或者先后顺序并不重要. 比如用户登陆要给登