1. 程式人生 > >精確異常與非精確異常

精確異常與非精確異常

這裡的異常是指同步的 (Synchronous),非非同步的中斷。

非精確異常 (Imprecise Exception)

在多發射亂序執行的流水線 CPU 上,從指令進入流水線到異常事件的發生,期間要經過若干流水級,此時 PC 的值已指向其後的某條指令,在實現非精確異常的 CPU 上就把此時的 PC 值作為引起異常指令的所在(為了表達的方便,記為 eptr)。

簡單地說就是 eptr 的指向,並非真正的引起異常的指令之所在,而是其後面的某條指令所在。


精確異常 (Precise Exception)

簡單地說就是 eptr 的指向就是真正引起異常的指令之所在

而實現精確異常的 CPU,則在最後指令提交時 (commit) 按指令流的順序提交,異常的丟擲也在該指令提交時,這樣就能精確計算出引起異常的指令相對於當前 PC 的偏移,從而保證精確異常。


不管是何類異常,eptr 之前的所有指令都會被執行完成 (commit),eptr 之後的指令不會被執行。

關於 eptr 的值,在 MIPS 上用 EPC 置之,在 PowerPC 上用 SRR0/CSRR0 置之,SPARC 上用 TPC[TL] 置之,x86 上當前 CS:EIP 即是,但 x86 將 CS:EIP 保存於棧上。

題外話:

關於 eptr 的指向,還有一些情形值得考慮:

A. 位於延遲槽中的指令 (MIPS, SPARC)
B. 由分支指令引起 (x86)
C. 上下文切換時 (x86)

相關推薦

精確異常精確異常

這裡的異常是指同步的 (Synchronous),非非同步的中斷。非精確異常 (Imprecise Exception) 在多發射亂序執行的流水線 CPU 上,從指令進入流水線到異常事件的發生,期間要經過若干流水級,此時 PC 的值已指向其後的某條指令,在實現非精確異常的

java異常-受檢異常受檢異常

1.受檢異常 package com.cap3; public class Test1 { public static void main(String[] args) { //sql exception throw ne

JAVA檢查異常檢查異常

看spring in action時看到非檢查型別概念,google. 檢查型異常(CheckedException) 在Java中所有不是RuntimeException派生的Exception都是檢查型異常。當函式中存在丟擲檢查型異常的操作時該函式的函式宣告中必須包含t

java 強制性異常強制性異常

java的異常處理機制是一項相當靈活的技術。也是java的特色。專案做的夠不夠出色,很大一部分取決於異常的處理。如何自定義異常,是該try catch還是該throws,這些都是我們該注意的方面。 java中的異常分為兩大類,強制性異常(CheckedException)

執行時異常執行時異常的區別

java執行時異常是可能在java虛擬機器正常工作時丟擲的異常。 java提供了兩種異常機制。一種是執行時異常(RuntimeExepction),一種是檢查式異常(checked execption)(非執行時異常)。 檢查式異常:我們經常遇到的IO異常及sql異常就屬於

Java 進階 之 檢查型異常檢查型異常

使用Spring難免要用到Spring的事務管理,要用事務管理又會很自然的選擇宣告式的事務管理, 在spring的文件中說道,spring宣告式事務管理預設對非檢查型異常和執行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。 那麼什麼是檢查型異常什麼又是非檢查型異常

Python中自定義異常丟擲異常

# class ShortInputException(Exception): # def __init__(self,length,atleast): # super().__init__() # self.length = length #

檢查異常檢查異常

在講檢查異常(checked exception)和非檢查異常(unchecked exception)之前,我們通過一張圖來簡單瞭解一下JAVA的異常結構圖。(圖片來自loren-Yang的CSDN部落格)。 java中的異常和錯誤都繼承自java.lang.Throwable。

Java檢查異常檢查異常、執行時異常執行時異常的區別

Java把所有的非正常情況分為兩種:異常(Exception)和錯誤(Error),它們都繼承Throwable父類。  Java的異常(Exception和Error)分為檢查異常和非檢查的異常。 其中根據Exception異常進行分類,可分為執行時異常和非執行時異常。   檢查

編譯時異常執行時異常的區別

Java異常類層次結構圖 Java異常類層次結構圖 執行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指標異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以

Java受檢異常受檢異常

所有異常,都繼承自java.lang.Throwable類。 Throwable有兩個直接子類,Error類和Exception類。 Exception Exception則可使從任何標準Java庫的類方法,自己的方法以及執行時任何異常中丟擲來的基型別。 異常可分為執行異常(

Java之執行時異常編譯時異常區別

Java中用2種方法處理異常: 1.在發生異常的地方直接處理; 2.將異常拋給呼叫者,讓呼叫者處理。 Java異常可分為3種:   (1)編譯時異常:Java.lang.Exception   (2)執行期異常:Java.lang.RuntimeException   (3)

java異常-父類異常子類異常之間的捕獲關係

class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static void main(String[] arg

可捕獲異常不可捕獲異常的區別?

1、先明確概念:丟擲指的是不處理,捕獲則處理 捕獲異常是指發生異常時,最相應處理,避免程式崩潰 丟擲異常大概就是讓程式知道哪裡可能會存在異常,發生異常後,回滾處理 2、執行順序 丟擲異常異常後— 意味著catch程式碼塊後面就不再執行了; 不丟擲直接捕

_014_java_Java受檢異常受檢異常

Java中異常的分類所有異常,都繼承自java.lang.Throwable類。Throwable有兩個直接子類,Error類和Exception類。ExceptionException則可使從任何標準Java庫的類方法,自己的方法以及執行時任何異常中丟擲來的基型別。異常可分

常見的執行時異常編譯時異常舉例

一、區別看一個異常是執行時還是編譯時異常,最簡單的方法是看他的父類或者看他的爺爺、太爺爺...(開個玩笑)是不是RuntimeException。比較通俗易懂的方法是,你把程式碼寫出來之後,有紅色波浪線提示你丟擲或捕獲異常,這個時候正處於編譯階段,所以是編譯時異常,如下圖所示

執行時異常受檢查異常有何異同(runtime exception 和 checked exception)

Throwable是所有Java程式中錯誤處理的父類 ,有兩種資類:Error和Exception。Error:表示由JVM所偵測到的無法預期的錯誤,由於這是屬於JVM層次的嚴重錯誤 ,導致JVM無法繼續執行,因此,這是不可捕捉到的,無法採取任何恢復的操作,頂多只能顯示錯誤

java 受檢異常受檢異常

總是記不住什麼是受檢異常,什麼是非受檢異常,有時甚至弄混淆,特此簡單記錄以便複習之用。 異常的分類: java.lang.Throwable 1.Error錯誤:JVM內部的嚴重問題。無法恢復。程式人員不用處理。 2.Exception異常:普通的問題。通過合理的處理,程

java受檢異常執行時異常

正確運用異常處理機制,有助於提高程式的健壯性。 所謂程式的健壯性,就是指程式在多數情況下能夠正常執行,返回預期的正確結果;如果偶爾遇到異常情況,程式也能採取周到的解決措施。 受檢查異常表示程式可以處理的異常,如果丟擲異常的方法本身不能處理它,那麼方法呼叫者

Java檢查異常檢查異常區別

public class ExceptionTypeTest { public void doSomething() throws ArithmeticException{ System.out.println(); } public static void main(){ ExceptionTypeTe