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

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

一、同步、异步与阻塞、非阻塞

同步和异步都是基于应用程序所在操作系统处理IO事件所采用的方式,同步是应用程序要直接参与IO读写的操作。异步所有的IO读写交给搡作系统去处理,应用程序只需要等待通知。

网上有许多I/O模型的相关文章,主要涉及四个概念,同步,异步,阻塞,非阻塞。有些文章将这四个作了两两组合,于是就有了:异步阻塞和异步非阻塞,可以明确的说,这完全是牵强之理解,无论<Unix网络编程>一书中所列的I/O模式,还是POSIX标准,都没有提这两个概念。异步就是异步!只有同步才有阻塞和非阻塞之分。

1、同步(Synchronization)和异步(Asynchronous)

同步与异步关注的是消息通信机制,所谓同步,就是由“调用者”主动等待这个“调用”的结果。

异步则相反:“调用”在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立即得到结果。而是在“发出后”,“被调用者“通过状态,来通知调用者,或通过回调函数处理这个调用。

2、阻塞(Block)和非租塞(NonBlock)

阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

阻塞:当数据没有准备的时候阻塞,往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否則一直等待在那里。

非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。

阻塞调用:是指调用结果返回之前,当前线程被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用:是指在不能立即得到结果之前,该调用不会阻塞当前线程。

总结:

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

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

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

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

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

 

转自:

参考文章:

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

转载地址:http://egdgn.baihongyu.com/

你可能感兴趣的文章
GNN在文本分类上的应用 | (1) TextGCN
查看>>
图神经网络 | (7) 如何理解Graph Convolutional Network(GCN)
查看>>
GNN在文本分类上的应用 | (2) Text Level Graph Neural Network for Text Classification
查看>>
GNN在文本分类上的应用 | (3) TensorGCN
查看>>
SemEval2019Task3_ERC | (1) Affect Classification in Dialogue using Attentive BiLSTMs
查看>>
SemEval2019Task3_ERC | (2) Attentive Conversation Modeling for Emotion Detection and Classification
查看>>
SemEval2019Task3_ERC | (3) Using Deep Sentiment Analysis Models and Transfer Learning for ERC
查看>>
SemEval2019Task3_ERC | (4) Emotion detection in conversations through Tweets,CNN and LSTM DNN
查看>>
Python杂谈 | (15) 使用Pycharm执行带命令行参数的脚本
查看>>
数学杂谈 | (2) Min-Max Scale vs. Z-score Scale
查看>>
freopen的使用
查看>>
源码阅读(14):Java中主要的Queue、Deque结构——PriorityQueue集合(下)
查看>>
从源码分析:Java中的Map(二)Java中HashMap的内部类
查看>>
从源码分析:Java中的Map(一)Map接口与AbstractMap抽象类
查看>>
从源码分析:Java中的SPI是怎样工作的
查看>>
Java中的SPI的使用例子
查看>>
IDEA中实现接口时注解@Override报错的解决方法
查看>>
从源码分析:分析Java中的StringBuilder
查看>>
从源码分析:Java中的split()方法
查看>>
Linux(Ubuntu18)中启动ssh时的报错
查看>>