4.1 Y86指令集體系結構html
•有8個程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebpjava
•處理器的每一個程序寄存器存儲一個字,寄存器%esp被入棧、出棧、調用和返回指令做爲棧指針數組
•有3個一位的條件碼:ZF、OF、SF架構
•Y86指令集 •movl指令分紅了4個不一樣的指令:irmovl、rrmovl、mrmovl、rmmovl •源和目的:源能夠是當即數(i)、寄存器(r)、存儲器(m)。目的能夠是寄存器(r)、存儲器(m)。框架
•四個整數操做指令,OPI: •addl、subl、andl、xorl函數
•它們只對寄存器數據進行操做學習
•這些指令會設置3個條件碼:ZF、OF、SF編碼
•7個跳轉指令(jXX): •jmp、jle、jl、je、jne、jge、jg線程
•根據分支指令的類型和條件碼的設置來選擇分支設計
•6個條件傳送指令(cmovXX):cmovle、cmovl、cmove、cmovne、cmovge、cmovg
•這些指令的格式與rrmovl同樣,可是隻有當條件碼知足所須要的約束時,纔會更新目的寄存器的值
•call指令將返回地址入棧,而後跳到目的地址。ret指令從這樣的過程調用中返回
•pushl和popl指令實現了入棧和出棧
•halt指令中止指令的執行
•指令編碼 •每條指令須要1-6個字節不等
•每條指令的第一個字節代表指令的類型:這個字節分爲兩個部分:高4位是代碼部分、低四位是功能部分
•Y86異常 •AOK:正常操做
•HLT:處理器執行halt指令
•ADR:遇到非法地址
•INS:遇到非法指令
•Y86程序
•這個程序中,以「.」開頭的詞是彙編器命令
4.2 邏輯設計和硬件控制語言HCL
•HCL語言只表達硬件設計的控制部分,只有有限的操做集合。
•邏輯門
•AND:&&
•OR:||
•NOT:!
•簡單組合電路
•多路複用器{MUX)
•多路複用器根據輸入控制信號的值,從一組不一樣的數據信號中選出一個
•在這個簡單的多路複用器中,兩個數據信號是輸入位a和b,控制信號是輸入位s
•bool out=(s&&a)||(!s&&b)
•字級的組合電路和HCL整數表達式
•位級實現
•字級抽象
•bool Eq=(A==B)
•HCL中,多路複用函數是用狀況表達式來描述的
•這個表達式包含一系列狀況,每種狀況i都有一個布爾表達式selecti和一個整數表達式expri,前者代表何時該選擇這種狀況,後者指明的是獲得的值
•組合邏輯電路 •算數/邏輯單元(ALU)是一種很重要的組合電路
•集合關係:存儲器和時鐘 •時鐘寄存器(寄存器):存儲單個位或字。時鐘信號控制寄存器加載輸入值。
•隨機訪問存儲器(存儲器):存儲多個字,用地址來選擇該讀或該寫哪一個字。
•程序計數器(PC)
•條件代碼(CC)
•程序狀態(Stat)
4.3 Y86的順序實現
•將處理組織成階段
•取指:取指階段從存儲器讀取指令字節,地址爲程序計數器(PC)的值。
•icode:指令代碼,ifun:指令功能
•譯碼:譯碼階段從寄存器文件讀入最多兩個操做數,獲得值valA/valB
•執行:在執行階段,算數/邏輯單元(ALU)要麼執行指令指明的操做 ,計算存儲器引用的有效地址,要麼增長或減小指針。 •獲得的值稱爲valE
•訪存:訪存階段能夠將數據寫入存儲器,或者從存儲器讀出數據。
•讀出的值爲valM
•寫會:寫會階段最多能夠寫入存儲器。
•更新PC:將PC設置成下一條指令的地址。
•SEQ硬件結構 •取指:將程序計數器寄存器做爲地址,指令存儲器讀取指令的字節。
•譯碼:寄存器文件有兩個讀端口A和B,從這兩個端口同時讀取寄存器值valA、valB
•執行:根據指令類型將ALU用於不一樣目的。
•訪存:數據存儲器讀入或寫入一個存儲器字。
•寫回:寄存器文件有兩個端口
•SEQ的時序
•串流設計的概念
(1)Java將輸入/輸出抽象化爲串流,數據有來源及目的地,銜接二者的是串流對象。
(2)從應用程序角度來看,若是要將數據歷來源取出,可使用輸入串流,若是要將數據寫入目的地,可使用輸出串流。在Java中,輸入串流表明對象爲java.io.Inputstream實例,輸出串流表明對象爲java.io.OutputStream實例。
(3)取得InputStream或OutStream實例後,接下來操做輸入/輸出的方式都是同樣的,無須理會來源或目的地的真正形式。
(4)在不使用InputStream與OutStream時,必須使用close()方法關閉串流。
InputStream的read()方法,每次會嘗試讀入byte數組長度的數據,並返回實際讀入的字節,只要不是-1,就表示讀取到數據。
(5)OutputStream的write(指定要寫出的byte數組,初始索引,數據長度)方法
(6)FileInputStream是InputStream的子類,用於銜接文檔以讀入數據,FileOutputStream是OutputStream的子類,用於銜接文檔以寫出數據。
•Reader與Writer繼承架構
(1)針對字符數據的讀取,Java SE提供了java.io.Reader類,其抽象化了字符數據讀入的來源。針對字符數據的寫入,則提供了java.io.Writer類。其抽象化了數據寫出的目的地。
(2)每次從Reader讀入的數據,都會先置入char數組中。Reader中的read()方法,每次都會嘗試讀入char數組長度的數據,並返回實際讀入的字符數,只要不是-1,就表示讀取到字符。
•字符處理裝飾器
(1)Reader、Writer也有一些裝飾器類可供使用。若是串流處理的字節數據,實際上表明某些字符的編碼數據,而你想要將這些字節數據轉換爲對應的編碼字符,可使用InputStreamReader、OutputStreamWriter對串流數據打包。
(2)BufferedReader、BufferedWriter可對Reader、Writer提供緩衝區做用,在處理字符輸入/輸出時,對效率也會有所幫助。PrintReader、PrintStream使用上極爲相似,不過除了能夠對OutputStream打包以外,PrintWriter還能夠對Writer進行打包,提供print()、println()、format()等方法。
•Lock、ReadWriteLock與Condition
(1)lock接口主要操做類之一爲ReentrantLock,能夠達到synchronized的做用。
爲了不調用Lock()後,在後續執行流程中拋出異常而沒法解除鎖定,必定要在finally中調用Lock對象的unlock()方法。
(2)Lock接口還定義了tryLock()方法,若是線程調用tryLock()能夠取得鎖定會返回true,若沒法取得鎖定並不會發生阻斷,而是返回false。
(3)ReadWriteLock接口定義了讀取鎖定與寫入鎖定行爲,可使用readLock()、writeLock()方法返回Lock操做對象。ReentrantReadWriteLock是ReadWriteLock接口的主要操做類,readLock()方法會返回ReentrantReadWriteLock.ReadLock實例,writeLock()犯法會返回ReentrantReadWriteLock.WriteLock實例。
(4)StampedLock類可支持了樂觀讀取操做。也就是若讀取線程不少,寫入線程不多的狀況下,你能夠樂觀地認爲,寫入與讀取同時發生的機會不多,所以不悲觀的使用哇暖的讀取鎖定,程序能夠查看數據讀取以後,是否遭到寫入線程的變動,再採起後續的措施。
(5)Condition接口用來搭配Lock,最基本用法就是達到Object的wait()、notify()、notifyAll()方法的做用。Condition的await()、signal()、signalAll()方法,可視爲Object的wait()、notify()、notifyAll()方法的對應。
•使用Executor
(1)Runnable用來定義可執行流程與可以使用數據,Thread用來執行Runnable。二者結合的基本作法是將Runnable指定給Thread建立之用,並調用start()開始執行。
定義了java.util.concurrent.Executor接口,目的是將Runnable指定與實際執行分離。
(2)線程池這類服務的行爲其實是定義在Executor的子接口java.util.concurrent.ExecutorService中,一般會使用java.util.concurrent.Executor的newCacheThreadPool()、newFixedThreadPool()靜態方法來建立ThreadPoolExecutor實例,程序看起來較爲清楚且方便。
(3)ScheduledExecutorService爲ExecutorService的子接口,顧名思義,可讓你進行工做排程:schedule()方法用來排定Runnable或Callable實例延遲多久後執行一次,並返回Future子接口ScheduledFuture的實例,對於重複性的執行,可以使用scheduleWithFixedDelay()和scheduleAtFixedRate()方法。
(4)所謂分而治之的問題,是指這些問題的解決,能夠分解爲性質相同的子問題,子問題還能夠再分解爲更小的子問題,將性質相同的子問題解決並收集運算結果,總體問題也就解決了。
ForkJoinPool與其餘的ExecutorService操做不一樣的地方在於,它是閒聊了工做竊取演算,其創建的線程若是完成手邊任務,會嘗試尋找並執行其餘任務創建的資額任務,讓線程保持忙碌狀態,有效利用處理器的能力。
(5)ForkJoin框架適用於計算密集式的任務,較不適合用於容易形成線程阻斷的場合。
•並行Collection簡介
(1)CopyOnWriteArrayList操做了List接口,這個類的實例在寫入操做是,內部會創建新數組,並複製原有數組索引的參考,而後在新數組上進行寫入操做,寫入完成後,再將內部原參考舊數組的變量參考至新數組。
(2)CopyOnWriteArraySet操做了Set接口,與CopyOnWriteArrayList類似。
BlockedQueue是Queue的子接口,新定義了put()、take()方法。
ConcurrentMap是Map的子接口,其定義了putIfAbsent()、remove()、replace()等方法。這些方法都是原子操做。
(3)ConcurrentHashMap是ConcurrentMap的操做類,ConcurrentNavigableMap是ConcurrentMap的子接口,其操做類爲ConcurrentSkipListMap,可視爲支持並行操做的TreeMap版本。
A .ArrayList
B .ArrayList
C .ArrayList al=new ArrayList
D .ArrayList
A .Map c= new SortedMap();
B .HashMap c= new HashMap();
C .HashMap c= new Hashtable();
D .SortedMap c= new TreeMap();
E .ArrayList c= new ArrayList();
F .Map c = new LinkedHashMap();
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 200/200 | 2/2 | 20/20 | |
第二週 | 300/500 | 2/4 | 18/38 | |
第三週 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:10小時
實際學習時間:5小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)