20145209 2016-2017-2 《Java程序設計》第6周學習總結

20145209 2016-2017-2 《Java程序設計》第6周學習總結

教材學習內容總結

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版本。

上週考試錯題總結

  • 問題1:建立一個只能存放String的泛型ArrayList的語句是哪項?(B)

A .ArrayList

B .ArrayList

C .ArrayList al=new ArrayList

D .ArrayList

  • 問題2:分別插入到第5行,哪幾行容許代碼編譯?(BDF)

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. 正確使用Markdown語法(加1分):
    • 不使用Markdown不加分
    • 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
    • 排版混亂的不加分
  2. 模板中的要素齊全(加1分)
    • 缺乏「教材學習中的問題和解決過程」的不加分
    • 缺乏「代碼調試中的問題和解決過程」的不加分
    • 代碼託管不能打開的不加分
    • 缺乏「結對及互評」的不能打開的不加分
    • 缺乏「上週考試錯題總結」的不能加分
    • 缺乏「進度條」的不能加分
    • 缺乏「參考資料」的不能加分
  3. 教材學習中的問題和解決過程, 一個問題加1分

  4. 代碼調試中的問題和解決過程, 一個問題加1分

  5. 本週有效代碼超過300分行的(加2分)
    • 一週提交次數少於20次的不加分
  6. 其餘加分:
    • 週五前發博客的加1分
    • 感想,體會不假大空的加1分
    • 排版精美的加一分
    • 進度條中記錄學習時間與改進狀況的加1分
    • 有動手寫新代碼的加1分
    • 課後選擇題有驗證的加1分
    • 代碼Commit Message規範的加1分
    • 錯題學習深刻的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 結對學習狀況真實可信的加1分
  7. 扣分:
    • 有抄襲的扣至0分
    • 代碼做弊的扣至0分
    • 遲交做業的扣至0分

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本博客打分: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小時

  • 改進狀況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索