阻塞非阻塞与同步异步的区别?

ChipCamp探索系列 -- 7A. 开源CPU之BOOM的来龙去脉 本文梳理一下Berkeley的乱序超标量CPU项目----Berkeley Out of Order Machine (BOOM),作为探索7系的首篇(7A)。 阅读详情

之前一直对阻塞非阻塞与同步异步这两对概念理解不深,总是把它们搞混。看了网上一些相关的解释之后,发现大家站在不同的角度得出了不同的理解,这个问题没有确切的答案,只能根据场景不同做出解释。

进程间的通信

进程间的通信时通过 send() 和 receive() 两种基本操作完成的。具体如何实现这两种基础操作,存在着不同的设计。
消息的传递有可能是阻塞的或非阻塞的,也被称为同步或异步的:

  1. 阻塞式发送(blocking send):发送方进程会被一直阻塞, 直到消息被接受方进程收到;
  2. 非阻塞式发送(nonblocking send): 发送方进程调用 send() 后, 立即就可以其他操作;
  3. 阻塞式接收(blocking receive):接收方调用 receive() 后一直阻塞, 直到消息到达可用;
  4. 非阻塞式接受(nonblocking receive):接收方调用 receive() 函数后, 要么得到一个有效的结果, 要么得到一个空值, 即不会被阻塞。

上述不同类型的发送方式和不同类型的接收方式,可以自由组合。

也就是说, 从进程级通信的维度讨论时, 阻塞和同步(非阻塞和异步)就是一对同义词, 且需要针对发送方和接收方作区分对待。

UNIX环境下的网络IO

《UNIX网络编程:卷一》第六章——I/O复用。书中向我们提及了5种类UNIX下可用的I/O模型

  1. 阻塞式I/O
  2. 非阻塞式I/O
  3. I/O复用(select,poll,epoll...)
  4. 信号驱动式I/O(SIGIO)
  5. 异步I/O(POSIX的aio_系列函数)

阻塞式I/O模型

对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的进程(或者线程),另一个就是系统内核。当一个read操作发生时,它会经历两个阶段:

(1)等待数据准备好;
(2)将数据从内核拷贝到进程中。

在UNIX中,默认情况下所有套接字都是阻塞的,一个典型的读操作流程如下图所示:

 

当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除阻塞的状态,重新运行起来。

所以,阻塞式 IO的特点就是在IO执行的两个阶段都被block了。
 

非阻塞式I/O

UNIX 下,可以通过设置socket使其变为非阻塞式。当对一个非阻塞式socket执行读操作时,流程如下图所示:

 

从图中可以看出,当用户进程发出read操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个错误。从用户进程角度讲 ,它发起一个 read 操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个错误时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。所以,用户进程其实是需要不断的主动询问内核数据好了没有。

I/O多路复用

IO 多路复用这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了。有些地方也称这种IO方式为event driven IO。我们都知道,select/epoll 的好处就在于单个进程就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个函数会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如下图所示:

当用户进程调用了select,那么整个进程会被阻塞,而同时,内核会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
这个图和阻塞IO的图其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection。(所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。)
在IO multiplexing Model中,实际中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的进程其实是一直被block的。只不过进程是被select这个函数block,而不是被socket IO给block。

信号驱动式I/O

用的很少,流程如下图所示:

 

异步I/O

这类函数的工作机制是告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到用户空间)完成后通知我们。如图:

 

用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

对比

现在回过头来回答最初的那几个问题:阻塞 vs 非阻塞的区别在哪,同步 vs 异步的区别在哪?
阻塞 vs 非阻塞。前面的介绍中其实已经很明确的说明了这两者的区别。调用阻塞IO会一直block住对应的进程直到操作完成,而非阻塞 IO在内核还准备数据的情况下会立刻返回。

再看POSIX对这两个术语的定义:

  • 同步I/O操作:导致请求进程阻塞,直到I/O操作完成;

  • 异步I/O操作:不导致请求进程阻塞。

同步 vs 异步的区别就在于同步 做”IO operation”的时候会将进程阻塞。按照这个定义,之前所述的b阻塞,非阻塞 IO,IO 多路服用都属于同步 IO。有人可能会说,non-blocking IO并没有被block啊。这里有个非常“狡猾”的地方,定义中所指的”IO operation”是指真实的IO操作,就是例子中的recvfrom这个system call。非阻塞 IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被阻塞了,在这段时间内,进程是被阻塞的。

而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

 

进程间合作

阻塞非阻塞: 请求不能立即得到应答,需要等待,那就是阻塞;否则可以理解为非阻塞。

同步异步: 某业务需要甲乙甚至多方合作的时候,

  1. 总是按照“甲方请求一次,乙方应答一次”这样的有序序列处理业务,只有当“一次请求一次应答”的过程结束才可以发生下一次的“一次请求一次应答”,那么就说他们采用的是同步。(同步IO中,对同一个描述符的操作必须是有序的)
  2. 如果甲方只要有需要,就会发送请求,不管上次请求有没有得到乙方应答。而乙方只要甲方有请求就会接受,不是等这次请求处理完毕再接受甲方新请求。这样请求应答分开的序列,就可以认为是异步。异步情况下,请求和应答不需要一致进行,可能甲方后请求的业务,却先得到乙方的应答。同步是线性的,而异步可以认为是并发的。(异步IO中,异步IO可以允许多方同时对同一个描述符发送IO请求,或者一次发多个请求,当然有机制保证如何区分这些请求,)


参考整理自:

  1. https://www.zhihu.com/question/19732473/answer/26101328
  2. https://blog.youkuaiyun.com/historyasamirror/article/details/5778378 
  3. https://www.zhihu.com/question/19732473/answer/14413599
2025数学建模国赛A题1-4问详解(论文+完整代码) 本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。 阅读详情

相关推荐

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点

实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。异常是一种处理错误的方式,

weixin_51692487的博客 1524

正确理解同步/异步和阻塞/非阻塞的区别:

之前一直把异步和非阻塞混为一谈,在 了解BIO和NIO的区别时才发现了两者的差异,看了网上很多文章觉得说的总是差点意思,下面是个人理解: 1.同步 非同步 阻塞 非阻塞 概念 https://www.zhihu.com/question/19732473 2.同步/非同步和阻塞/非阻塞的区别: https://blog.youkuaiyun.com/qq_35503998/article/details/82835517 这篇将的比较中肯 3.BIO和NIO的区别: https://zhuanlan.zh

zyz的博客 3088

(超全面,超基础)Kriging插值推导理论笔记,算法,普通克里金

最近老师让我再重新推导一下克里金插值的方法如何求出预测结果,于是我又无数次地打开了大神的推导原理过程链接????:克里金(Kriging)插值的原理与公式推导 作者:xg1990,但是不可避免地在推导过程中,数学知识基础薄弱的我卡住在一些公式推导的步骤中。 所以就想基于上面大神的推导过程,将里面的推导写得更具体些,当然觉得毫不吃力可以进行推导的大神们可以不看我的注释,直接点开链接看就好。 我看到csdn中很多关于克里金推导的博客里面的内容直接截屏或者复制了上面链接里大神发表的内容,也不注

Olivel1997的博客 1万+

理解 I/O-- 阻塞、非阻塞,同步、异步的概念及其区别

概念介绍 阻塞(blocking)、非阻塞(non-blocking):可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待, 那就阻塞了(进程或线程就阻塞在那了,不能做其它事情),否则就可以理解为非阻塞(在等待的过程中可以做其它事情)。 同步(synchronous)、异步(asynchronous): 你总是做完一件再去做另一件,不管是否需要时间等待,这就

Daniel 的技术笔记 不积跬步无以至千里,不积小流无以成江海。 4711

从OSGB到3DTiles:倾斜摄影数据高效转换实战指南

本文提供了将倾斜摄影OSGB数据高效转换为Web友好的3DTiles格式的完整实战指南。详细介绍了使用开源工具进行转换的步骤,包括环境搭建、核心命令、参数调优及在Cesium中加载与问题排查,旨在帮助GIS开发者和三维应用工程师打通数据到Web展示的最后一公里,实现大规模三维模型的流畅网络发布。

u0v1w2x3的博客 570

SRS(简单实时视频服务) 笔记(5)- 视频录制

在SRS使用中实现视频录制功能。

irainsa的博客 1698

同步,异步,阻塞,非阻塞的区别

1.阻塞:一个线程执行一个方法,在这个方法执行结束之前。线程挂起 2.非阻塞:一个线程执行一个方法,在这个方法执行结束之前。线程可以做其他的事情。 3.同步:获取最终结果的时候是主动去获取 4.异步:最终结果是对方执行好了,推送过来 5.同步阻塞:发起请求,一直等待出结果 6.同步非阻塞:发起请求,无结果返回,执行其他任务,不断轮询结果 7.异步阻塞:发起请求 ,等待通知。有结果后通知请求方 8.异步非阻塞:发起请求,执行其他任务,有结果后通知请求方 五种io通讯模型 1.阻塞io(bio

qq_39459099的博客 305

Qt插件之Qt Designer插件实现

相比于通过控件提升来使用自定义控件,在Qt Designer中直接使用自定义控件更加方便和直观。这里就介绍一下如编写和注册Qt Designer插件。Qt Designer插件本质上来说就是一个动态库,和普通的动态库的区别是插件中导出了Qt Designer能识别的接口。...

yang1fei2的博客 3100

同步异步阻塞和非阻塞的区别理解

一、同步和异步 同步和异步是一种 消息通知机制 同步:发出一次请求后必须等到该请求有返回结果,才能继续下一步工作;请求者需主动询问是否有返回结果; 异步:发出一次请求后无需等到该请求有返回结果,即可进行下一步工作;请求有结果后,会以某种方式通知请求者; 同步和异步是相对于操作结果来说,会不会等待结果返回 异步一般通过状态、通知和回调来通知调用者。 状态:即监听被调用者的状态(轮询),调用者需...

钟灵毓秀的博客 1247

把收款差异从扯皮变成闭环:SAP S/4HANA Dispute Resolution 模块到底解决什么问题?

本文摘要: SAP S/4HANA的争议解决模块(Dispute Resolution)通过标准化流程管理企业应收争议,解决发票与收款差异问题。核心是创建可追踪的Dispute Case工单,明确处理角色(Processor和Manager),并与财务系统联动实现自动清账。系统支持手工/自动创建争议工单,通过动态默认值减少错误,并最终实现争议金额归零的闭环管理。文中给出制造业客户扣款的完整处理案例,并强调组织落地需统一权限与目录。最后提供ABAP代码示例展示如何通过BAPI创建争议工单。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 163

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4494

三分钟理解同步|异步,阻塞|非阻塞的区别

一、同步与异步 概念:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。解释:涉及到IO通知机制;所谓同步,就是发起调用后,被调用者处理消息,必须等处理完才直接返回结果,没处理完之前是不返回的,调用者主动等待结果;所谓异步,就是发起调用后,被调用者直接返回,但是并没有返回结果,等处理完消息后,通过状态...

huangzhin的博客 278

​​光流结合深度学习实现物体运动方向判断

光流计算:提取每一帧视频中像素的运动信息,生成光流图。光流特征提取:通过特定的预处理,将光流图转换为深度学习模型可用的输入格式。深度学习模型设计:构建一个卷积神经网络(CNN)或其他适合的深度学习架构,利用光流特征进行运动方向分类。模型训练与推理:对网络进行训练并使用训练好的模型判断运动方向。光流与深度学习结合的运动方向判断技术在多个领域具有广泛的应用前景。通过光流提取像素级动态信息,并利用深度学习模型学习高层次特征,可以实现高精度的运动检测与方向判断。

matlab_python22的博客 321

深入理解阻塞/非阻塞IO、同步/异步IO的区别

文章目录【1】同步、异步、阻塞和非阻塞的概念【2】阻塞IO模型【3】非阻塞IO模型【4】IO复用模型【5】信号驱动IO【6】异步IO模型【7】各种IO模型的比较 【1】同步、异步、阻塞和非阻塞的概念 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 例如:当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去。 异步:异步的概念和同步相...

Lebron 4458

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

同步、异步、阻塞、非阻塞的I/O的区别?

在Java中,同步/异步与阻塞/非阻塞是描述I/O操作特性的两组核心概念,它们从不同维度定义了I/O的行为模式。理解这四者的区别,是设计高性能网络程序的基础。

weixin_43521001的博客 738

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

同步、异步、阻塞和非阻塞之间的区别

同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。 1. 同步和异步 同步和异步描述的是消息通信的机制。 同步 当一个request发送出去以后,会得到一个response,这整个过程就是一个同步调用的过程。哪怕response为空,或者response的返回特别快,但是针对这一次请求而言就是一个同步的调用。 异步 当一个request发送出去以后,没有得到想要的response,而是通过后面的callback、状态或者通知的方式获得结果。可以这么理解,

weixin_49794051的博客 2903

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

同步阻塞、同步非阻塞、异步区别

对于发生一次网络IO,可以分为两部分: 1、等待数据: 阻塞:线程一直阻塞等待数据。 非阻塞:线程发送请求后,不等待数据,通过轮询/信号量等方式去获取数据是否准备好。 2、将数据从内核复制到用户空间: 同步:线程自己把数据从内核复制到用户空间,期间不能做其它事情,一直等待数据复制完毕。 异步:系统内核把数据从内核复制到用户空间,然后再通知相应线程进行数据处理。 总结:阻塞/非阻塞:发生请求后,是否等待接收方处理好数据(是否等待数据处理好)...

ambious1的博客 5510

同步、异步、阻塞、非阻塞的区别

要理解这两对概念,首先要明确描述对象同步/异步:描述的是被调用者的执行逻辑(“做事的方式”);阻塞/非阻塞:描述的是调用者的等待状态(“等结果的方式”)。用“A调用B完成任务”的场景具象化:概念对描述主体核心问题同步/异步被调用者BB接到调用后,是否“主动通知”A结果?阻塞/非阻塞调用者AA发出调用后,是否“原地等待”结果?核心区别:被调用者完成任务后,是否会主动通知调用者。分主体记定义:同步/异步看“被调用者是否主动通知”,阻塞/非阻塞看“调用者是否原地等待”;无必然绑定关系。

埃泽漫笔 790

阻塞非阻塞与同步异步的区别

阻塞非阻塞与同步异步的区别 原文地址:https://www.zhihu.com/question/19732473/answer/241673170 IO 概念区分 四个相关概念: 同步(Synchronous) 异步( Asynchronous) 阻塞( Blocking ) 非阻塞( Nonblocking) 这四个概念的含义以及相互之间的区别与联系,并不如很多网络博客所写的那么简单, 通过举一些什么商店购物, 买书买报的例子就能讲清楚。 进程间通信的同步/异步, 阻塞/非阻塞 首先强调一点, 网

junbaba_的博客 233

同步和异步,阻塞和非阻塞的区别和联系

在网上搜了搜相关概念,发现很多人好像把同步/异步和阻塞/非阻塞的概念给混淆了。原因可能是因为同步/异步和阻塞/非阻塞是分不开的,而常见的情况是 同步阻塞 和 异步非阻塞 ,所以容易把同步和阻塞混淆,把异步和非阻塞混淆。 其实,同步包括了 同步阻塞 和 同步非阻塞 ,异步也包括了 异步阻塞 和 异步非阻塞 。在这里我先介绍阻塞/非阻塞的概念,然后把它们分别融入到同步/异步的情况中去讲解。 阻塞/非阻塞: 阻塞和非阻塞关注的是程序(线程)在执行过程中调用了另一个程序,在等待调用结果(...

PanYHHH的博客 671

同步异步、阻塞非阻塞的区别

米 锅 例子 下载 例子 个人理解: 同步和异步的区别:是否有消息通知 同步:无消息通知,需要不定时地去观看状态 异步:有消息通知,会利用回调返回线程调用一开始没有返回的值 阻塞和非阻塞的区别:等待消息通知的过程中能否做其他的事(也等价于是否是同一个时期只能进行单任务)这里的时期即是当前线程运行的时期内 阻塞:不可以做其他的事,即堵在一个隘口,一次只能一个人过 非阻塞:可以做其他的事,即有很多通道,都可以过 同步阻塞:无消息通知,需要不定时地去观看状态,并且只能单任务 同步非阻塞:无消息通知,需要不定时地去

weixin_44736049的博客 198

同步和异步,阻塞和非阻塞的区别

同步和异步,阻塞和非阻塞的区别

weixin_50838394的博客 2250

怎样理解阻塞非阻塞与同步异步的区别?

怎样理解阻塞非阻塞与同步异步的区别? - 知乎 作者:卢毅luis 链接:https://www.zhihu.com/question/19732473/answer/20851256 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous comm.

一步一步往上爬 182

同步、异步与阻塞、非阻塞的区别与联系

同步与异步同步与异步机制是描述通信模式的概念。同步机制同步机制是指发送方发送请求后,需要等待接收到接收方返回的响应后才继续发送新的请求。在同步机制中,所有的请求都是同步的,接收方和发送方对请求的处理步调是已知的。异步机制异步机制是指发送方发送请求后,不需要等待接收方返回的相应,就可以继续发送新的请求。在异步机制中,来自发送方的请求需要队列进行保存,接收方处理完成后发送响应通知发送方。阻塞与非阻塞阻塞

u013201628的博客 687

同步异步、阻塞非阻塞、并发并行的区别

同步异步、阻塞非阻塞、并发并行的区别 1、IO操作 1、IO分两个阶段 数据准备阶段(内核) 内核空间的数据复制到用户进程缓冲区阶段(用户空间) 在操作系统中,程序运行的空间分为内核空间和用户空间, 应用程序都是运行在用户空间中。 2、阻塞IO非阻塞IO和同步IO异步IO的区别: 如果阻塞知道完成就是传统的阻塞IO, 如果不阻塞, 则是非阻塞IO。 一般来讲, 阻塞IO模型、非阻塞IO模型, IO复用模型, 都属于同步IO, 因为阶段2是阻塞的, 异步IO模型, 则属于异步IO。 同步IO和异步IO的

weixin_41869700的博客 429

同步 异步 阻塞 非阻塞的区别

1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由调用者主动等待这个调用的结果。 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数

qq_43215592的博客 273
上一篇: 不可不说的Java“锁”事
下一篇: Java 常量池总结
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值