精华内容
下载资源
问答
  • 同步异常与异步异常

    2020-08-03 13:36:05
    参考:...大概可以理解为异步异常是指由当前程序之外的因素引起的异常,如来自I/O设备的信号。 同步异常是指由当前程序本身引起的异常,如系统调用、page fault、segmetation fault。 ...

    参考:https://blog.csdn.net/shuiliusheng/article/details/82227189

    大概可以理解为异步异常是指由当前程序之外的因素引起的异常,如来自I/O设备的信号。
    同步异常是指由当前程序本身引起的异常,如系统调用、page fault、segmetation fault。

    展开全文
  • ——————————————————————异常 背景—————————————————————— 上面说了一大篇,对主题的意义就是表述清楚一件事:异常,使指令流直接在CPU上执行而不会劫持CPU。 而我...

    ——————————————————————异常 背景——————————————————————

     

    上面说了一大篇,对主题的意义就是表述清楚一件事:异常,使指令流直接在CPU上执行而不会劫持CPU。

    而我认为这是所谓CPU支持虚拟化的关键点,同样是系统调用的关键点(内核保护自己的保障,MMU也应该算在内,另说)。

    另外:

    Aarch64将异常划分了等级,我就不絮叨了,然后aarch32/aarch64的执行状态也被我扔掉了aarch32的部分。

    两阶段MMU的问题已经絮叨的非常完备,同样被我作为默认已知条件了。

    EL3并没有太复杂的设计(其实是我没去搞清楚),我也作为已知条件来说了。

     

     

    ——————————————————————异常之同步与异步——————————————————————

    在说异常之前,还要给出两个定义,同步异常和异步异常。

    或许我们能想到同步异常和异步异常分别是什么东西,但是从阅读指令集得到的结果看,这里面有更深入的东西在。

    先说同步异常,同步异常是精确异常(precise exception),何为同步异常?又何为精确异常呢?

    首先,当同步异常产生后,指令流会立刻进入异常处理流程,

    是的,是立刻,立刻到什么程度?

    立刻到指令执行完,甚至是尝试执行指令,产生了异常就去处理异常了。

    这是同步异常。

    啥要叫精确异常呢?

    精确,意味着此异常发生时(注意,大招要来了):乱序且并发执行的指令们会被整理好,就好像没有乱序并行的执行一样(这回引出另外一个超标量体系架构的问题,请自行搜索了)。

    在此,我就不写more than one single-copy atomic memory access的细节(主要没搞明白),

    需要指出的一点就是,LDP/STP等指令会不止一次访存;

    如果load/store指令指定会写新基址时抛出异常后,基址会被改回原值;

    如果指令要加载到基址/偏移寄存器时抛出异常,基址/偏移寄存器会被改回原值,并且所有目标寄存器都变为未知; 

    如果指令不是加载基址/偏移寄存器,但抛出了异常,仅目标寄存器变未知)。

    如果所生成的异常是more than one single-copy atomic memory access的一部分产生的,

    那么,精确定义允许寄存器中的值或受指令影响的内存可以是未知的

    (这段我是原文译过来的,我的理解是为了能够做崩溃转存或是打印崩溃信息,

    这些位置的数据虽然是不对的,但是打印的时候必然会访问它们,

    如果访问的时候抛出异常,那就死循环或打不出来了,

    于是虽然数据不对,但是允许访问,但是我不是非常确定我的理解正确性)。

     

    对于同步异常,还有一个问题,哪些异常是同步异常?

    首先,在前言中提到的SVC,即发生syscall的指令的执行(EL0->EL1),即为同步异常;

    从EL1向EL2发出的hypercall同样是同步异常,

    同步异常超级强大的响应速度(立刻!)为基于大量系统调用的宏内核结构提供了效率上的支持,

    微内核一直想做的都是用用户态进程来提供服务,以替代内核提供syscall,

    我只能表示虽然长得美,但是想的更美

    (当然,我并非认为微内核不会取代宏内核,

    相反,我非常坚定地认为微内核会取代宏内核,

    我有多个关键且合理的理由以及能解决两个问题方法,但我没有解决所有我看到的问题的方法

    所有我就不说了(等有人提出解决方法,我就说我也想到了,奸笑))。

    HVC即hypercall与syscall一样是同步异常,飞快飞快的。

    其他还有很多同步异常,如指令中止、数据中止(这些都是MMU搞得事情),

    还有一些错误产生的异常,

    如执行未定义指令、PSTATE.IL置1时还想执行指令、SP未对齐、PC未对齐、

    低异常等级下执行了高异常等级的指令、调适异常、浮点异常、外部中止等等。

     

    然后对于异步异常:

    异步异常比较好说,主要是从外部发送给PE的信号们,SError、IRQ、FIQ等。

    在EL1中还有vSError、vIRQ、vFIQ等,这些都是在EL2下可以触发的,

    也可以在EL2直接映射到物理中断,当然SError对应vSError,IRQ对应vIRQ,FIQ对应vFIQ。

    EL1被ARM定义为内核应该在的异常等级,内核的虚拟CPU肯定是会被调度到等待状态的,当

    虚拟CPU正在CPU上执行的时候,这些vXXX中断发生后,会直接给到虚拟CPU,

    当然,这中间还有vGIC的事儿,

    但如果内核的虚拟CPU不在执行中,当其被投入运行的时候就会给入vXXX中断。

     

    在本文之前版本中有一个隐式的错误:

    我虽没有明确的指出同步异常即为精确异常,异步异常为非精确异常,但行文上下给出了这一错误暗示;

    因此给出明确的澄清:

    同步异常是精确地,这没问题;但是异步异常并不是非精确异常,在仔细的再次查阅指令集后,

    指令集中非精确异常仅在SError中断IMPLEMENTATION DEFINEED(厂商实现决定)的时候才存在。

    但有一点是明确的,异步异常可以是非精确的,但我认为异步异常大多是精确地。

    另外,本文中如有任何错误,请立刻毫不犹豫的迅速的联系我。我收到消息后会立刻给出回复,并修正或给出解释。

     

    展开全文
  • 同步调用与异步调用

    千次阅读 2017-02-22 17:53:19
    但是一般而言,我们在说同步异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理

    同步
            所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。按照这个定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的
    LRESULT值返回给调用者。

    异步
            异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例,当一个客户端通过调用Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。

    同步函数

            当一个线程调用一个同步函数时,如果该函数没有立即完成规定的操作,则该操作会导致该调用线程的挂起(将CPU的使用权交给系统,让系统分配给其他线程使用),直到该同步函数规定的操作完成才返回,最终才能导致该调用线程被重新调度。

    异步函数
            当一个线程调用的是一个异步函数,该函数会立即返回尽管其规定的任务还没有完成,这样线程就会执行异步函数的下一条语句,而不会被挂起。那么该异步函数所规定的工作是如何被完成的呢?当然是通过另外一个线程完成的了啊;那么新的线程是哪里来的呢?可能是在异步函数中新创建的一个线程也可能是系统中已经准备好的线程。

    如何同步获取异步调用的结果

    一个调用了异步函数的线程如何与异步函数的执行结果同步呢?
            为了解决该问题,调用线程需要使用“等待函数”来确定该异步函数何时完成了规定的任务。因此在线程调用异步函数之后立即调用一个“等待函数”挂起调用线程,一直等到异步函数执行完其所有的操作之后,再执行线程中的下一条指令。

    如何异步获取异步调用的结果

    异步调用时,调用方不等被调方返回结果就转身离去,因此必须有一种机制让被调方有了结果时能通知调用方,常用的手段是回调。
            回调方式很简单:调用异步函数时在参数中放入一个函数地址,异步函数保存此地址,待有了结果后回调此函数便可以向调用方发出通知。如果把异步函数包装进一个对象中,可以用事件取代回调函数地址,通过事件处理例程向调用方发通知。

    同步调用如何转换成异步调用

           其实同步调用与异步调用很容易进行转换:如果想要把一个同步调用转换成异步调用,只需要一个线程或一组线程加上消息队列即可。根据异步调用处理工作完成的方式,可以将其细分成三类:1)甩手掌柜,不管;2)做个标记,让调用者需要时询问。“帮我买个馒头”-“馒头买好了没有?”-“馒头买好了没有?”3)直接回调,如“帮我买个馒头,买好后放在我包里”。


           在以前的文章中,我曾多次强调应用程序中异步化的重要性。尤其对于IO密集型操作来说,异步执行对于应用程序的响应能力和伸缩性有非常关键的影响。 正确使用异步编程能够使用尽可能少的线程来执行大量的IO密集型操作。可惜的是,即使异步编程有避免线程阻塞等诸多好处,但是这种编程方式至今没有被大量 采用。其原因有很多,其中最主要的一点可能就是异步模型在编程上较为困难,导致许多开发人员不愿意去做。

           异步,则意味着一个任务至少要被拆分为“二段式”的调用方式:一个方法用于发起异步请求,另一个方法用于异步任务完成后的回调。与传统方法的调用方 式相比,异步调用时的中间数据不能存放在线程栈上,方法之间的也不能简单地通过参数传递的方式来共享数据。此外,传统方法调用中可使用的 try…catch…finally,using等关键字都无法跨越方法边界,因此异步编程在处理异常,保护资源等方面也需要花更大的精力才行。如果一不 小心,轻则造成资源泄露,重则使整个应用程序崩溃。

    展开全文
  • 同步中断与异步中断

    千次阅读 2017-08-16 22:44:09
    中断是指强制改变了cpu指令执行...同步中断是由cpu内部的电信号产生的中断,其特点为当前执行的指令结束后才转而产生中断,由于有cpu主动产生,其执行点必然是可控的。 异步中断是由cpu的外设产生的电信号引起的中断,

    中断是指强制改变了cpu指令执行顺序的一些事件,所谓改变指令执行顺序,首先可以理解为没有到进程调度点就暂停了下一条指令的执行转而执行中断的指令,其次可以理解为

    同一进程内原本相邻的两条指令间穿插了其它指令的执行。

    同步中断是由cpu内部的电信号产生的中断,其特点为当前执行的指令结束后才转而产生中断,由于有cpu主动产生,其执行点必然是可控的。

    异步中断是由cpu的外设产生的电信号引起的中断,其发生的时间点不可预期。


    同步中断也称为异常,要么是代码错误引起的,此时cpu通过发送相关的信号来处理异常(通常可能是杀死进程的信号);要么是cpu必须处理的一些异常条件,此事cpu执行异常处理函数来恢复异常。


    由当前进程切换到中断执行实际上并不是进程切换,中断的执行只是一个内核执行的路径,这个执行路径实际上仍然代表着当前进程在执行,当前进程的时间片在增长,看上去进程执行的花费变长了。


    虽然没有执行进程切换,但是因为要突然跳转到别处执行,所以也要切换硬件上下文,保存好现场而去装载新的cs和eip。

    展开全文
  • 这样,您可以确保调用该函数(例如catchAny )仍将响应另一个线程(具有throwTo )引发的ThreadKilled或Timeout事件,同时捕获由执行该线程导致的所有同步异步异常封闭式计算。 一种特定的用例是允许安全地执行...
  • 对于“中断是异步的,异常同步的“的理解 首先弄懂一个概念,那就是如果CPU检测到多个中断请求的话,会选择中断优先级高的中断来处理。将中断处理完之后,接下来再执行调度程序。 中断的引入,是为了支持CPU和...
  • console.log同步与异步

    千次阅读 2019-05-14 18:15:17
    最近帮助一个后端同事调试时,console.log()他说结果不正确,因为会出现同步或者异步输出的情况。查阅资料,自己整理后,发现确实存在这个问题。 问题现象 异常出现原因分析 在分析之前,我们得知道一点,JS中对象...
  • 为什么要封装全局同步异常处理和异步异常处理呢? 原因简单:在整个项目中,很多地方都要用到异常处理,总不能随处都是try-catch吧 在JavaScript中处理异常无外乎两种方式【try-catch】和【Promise-catch】但是两...
  • 异常处理方法,同步VS异步

    千次阅读 2013-03-29 16:19:59
    VC默认情况下是同步异常捕捉,所以只有throw才算是正式异常,而 对内存访问出错和除零则不保证正能正确解栈(可能导致栈上的对象 未被析构) 1. Windows SEH  C++ Exception  1)
  • scrapy同步与异步储存数据

    千次阅读 2018-04-13 16:42:54
    1.同步class MysqlPipeline(object): """ 采用同步的机制写入mysql """ def __init__(self): self.conn = pymysql.connect(host="127.0.0.1", user="root"...
  • 【Unity】Socket 同步与异步

    千次阅读 2016-05-27 19:52:00
    同步Socket 异步 Socket: 1.同步就是阻塞的,比如 接受数据 如果没有回应 就一直等待。 2.异步就是不用等待; 同步Socket using System; using System.Collections.Generic; using System.Linq; using System....
  • 同步刷盘、异步刷盘  RocketMQ的消息是存储到磁盘上的,这样既能保证断电后恢复,又可以让存储的消息量超出内存的限制。 RocketMQ为了提高性能,会尽可能地保证磁盘的顺序写。消息在通过Producer写入RocketMQ的...
  • zookeeper学习心得二:同步与异步

    千次阅读 2017-04-23 14:45:25
    zookeeper学习心得二:同步与异步上一节中,我们看到很多操作zk节点的方式有同步异步两种方式,那么问题来了: (1)两种方式有什么区别? (2)哪种方式更好?应该用那种方式来写代码? (3)最好的方式有哪些...
  • Linux下的同步与异步

    千次阅读 2014-04-02 09:07:41
    同步与异步。因此,暂且先讨论一下进程的同步与异步。    如前面总结所述,进程的概念,一定存在于多任务分时操作系统中。当然这也不是非常准确。因为如果多个CPU上同时运行不同的进程,则似乎不存在分时的问题。...
  • 同步代码和异步代码_告别异步代码

    千次阅读 2020-06-21 05:25:52
    同步代码和异步代码 Quasar是一个将真正的轻量级线程(纤维)添加到JVM的库。 它们非常便宜且非常快-实际上,光纤的行为就像Erlang进程或Go goroutines-并允许您编写简单的阻塞代码,同时享受复杂异步代码相同的...
  • 同步请求和异步请求的区别

    千次阅读 2018-08-31 14:40:38
    同步请求和异步请求的区别  先解释一下同步异步的概念 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。...同步通信方式与异步通信的概念 同步通信方式要求通信双方以相...
  • WCF在同步异常调用情况下... 今天我就讲解一下,在同步异步调用WCF服务的时候,客户端如何捕获服务端抛出来的异常。捕获之后,如何处理,那就是根据项目的要求了。是提示呢?还是记录日志呢?还是其他什么的。。。
  • Android中同步与异步的问题

    万次阅读 2016-04-02 23:29:55
    android 只有UI线程可以刷新界面,其他副线程不行...android提供的简单用于异步通讯的线程 主要四个实现接口:   onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在
  • spring kafka消息同步发送、异步发送、异步回调和分区路由发送同步发送异步发送异步发送失败回调分区路由发送 我们在使用spring kafka发送消息的时候是调用send方法点进send方法发现有很多重载方法,下面我们介绍下...
  • 对常见三种复位方式(同步复位、异步复位、异步复位同步释放)进行介绍分析,详细介绍了各种复位方式的优缺点,并进一步分析了异步复位同步释放的工作机理优势所在。
  • scrapy 同步与异步储存MySQL数据

    千次阅读 2019-07-22 11:06:52
    1.同步class MysqlPipeline(object): """ 采用同步的机制写入mysql """ def __init__(self): self.conn = pymysql.connect(host="127.0.0.1", user="root", ...
  • 同步异步与Promise的原理

    千次阅读 2018-09-06 14:12:20
    什么是异步同步(synchronous)指的是任务从上往下依次执行的模式。比如: A(); B(); C(); 在这段代码中,A、B、C是三个不同的函数,每个函数都是一个不相关的任务。在同步模式下,计算机会先执行 A 任务,...
  • Express.js异步中间件包装器,用于处理被拒绝的承诺和同步异常。 该库相似,但是是用TypeScript编写的,其类型处理的情况比express-async-handler (例如,它可以处理引入的更改)。 用法 import { Request , ...
  • ARMv8 64bits相对于之前的 32bits 有较大变动,所有中断及异常的处理总入口都在entry.S 源文件中。 1.1. 异常介绍(中断即称为 异步异常) ...Synchronous(同步异常) 异常类型 描述 Undefined Instruction
  • Activiti中的同步节点和异步节点

    千次阅读 2020-04-04 19:45:31
    同步节点和异步节点 service task和 user task中都会有一个Asynchronous的复选框,这个Async有什么区别呢? 参考Synchronous vs. Asynchronous Service Invocations - BPMN Service Task,可以理解为, 同步节点:...
  • 串口 同步异步 理解

    万次阅读 多人点赞 2015-09-14 14:29:02
    本文主要三大块:一,串口同步异步在地产通行上的区别(这部分点到为止,不是主要探讨内容,有个基本理解即可)。  二,串口同步异步编程实例及详解(主要部分)。  三,串口同步异步的作用(着眼当下,理解...
  • 采用async是一场激动人心的旅程,虽然最终的风景美丽宜人,但需要爬过的小山还是比较多的,现在就来看看怎么把现有的项目改造为支持async和await的异步方法吧… 简短精悍第一式:Task.FromResult 此方法创建一个 ...
  • 同步异步的好处

    2012-01-06 21:28:50
    3、同步流程可以很容易捕获、处理异常。 4、同步流程是最天然的控制过程顺序执行的方式。   异步的好处: 1、异步流程可以立即给调用方返回初步的结果。 2、异步流程可以延迟给调用方最终的结果数据,在此期间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,632
精华内容 63,452
关键字:

同步异常与异步异常