分享到plurk 分享到twitter 分享到facebook

版本 c46c289da859ecfae1649f666f9d14b9861320c6

sysprog/schedule

Changes from c46c289da859ecfae1649f666f9d14b9861320c6 to current

---
title: 系統軟體課程進度與開放資源
categories: system programming, linux, performance, security, compiler, kernel
toc: no
...

- Instructor: [Jim Huang](/User/jserv) (黃敬群) `<jserv.tw@gmail.com>`
    * [Facebook 粉絲專頁](https://www.facebook.com/JservFans) (不要擔心提了笨問題,這專門用來和學生互動,可預約一對一討論)
- 討論區: [https://www.facebook.com/groups/system.software2019/](https://www.facebook.com/groups/system.software2019/)
- 討論區: [https://www.facebook.com/groups/system.software2020/](https://www.facebook.com/groups/system.software2020/)
- 課程信箱: `<embedded.master2015@gmail.com>`, [往年課程進度](/sysprog/schedule-old)
- 注意: 下方課程進度表標註有 `*` 的項目,表示內附錄影的教材

進階電腦系統理論與實作 (Fall 2019)
進階電腦系統理論與實作 (Fall 2020)
------------------------------------------------------
* 第 1 週 (Sep 12): 誠實面對自己
    - [課程簡介和注意須知](https://docs.google.com/presentation/d/1Wo22s5aYuuyry97-z2MMmUmdxhjD0wKTdhxIW5oqjvo/edit?usp=sharing)
        * [完整解說錄影](https://youtu.be/KaQvUumu81c) (3 小時)
* 第 1 週 (Sep 8): 誠實面對自己
    - [課程簡介和注意須知](https://docs.google.com/presentation/d/19rwlCab5Hw-EpG8z9aanFm601TnRz7WKdkId5_dUqKA/edit?usp=sharing) / [課程簡介和作業解說錄影](https://www.youtube.com/watch?v=CbxPOYDWo1E)`*`
        * 每週均安排隨堂測驗,採計其中最高分的 8 次
        * 學期評分方式: 隨堂測驗 (25%) + 個人作業 (25%) + 分組報告及專題 (25%) + 自我評分 (25%)
    - 歷屆修課學生心得: [張家榮](/User/JaredCJR), [陳品睿](/User/ggary9424), [蕭奕凱](/User/Veck)
    - 分組報告示範: [ARM-Linux](/embedded/arm-linux), [Xvisor](/embedded/xvisor)
    - [GNU/Linux 開發工具共筆](https://hackmd.io/c/rJKbX1pFZ): 務必 *自主* 學習 Linux 操作, Git, HackMD, LaTeX 語法 (特別是數學式), GNU make, perf, gnuplot
    - [透過 Computer Systems: A Programmer’s Perspective 學習系統軟體](https://hackmd.io/c/S1vGugaDQ): 本學期教科書 (第 2 週可向助教購書)
    - [軟體缺失導致的危害](https://hackmd.io/@sysprog/B1eo44C1-)
        * 學期評分方式: 隨堂測驗 (20%) + 個人作業+分組報告 (30%) + 自我評分 (50%)
        * 在 Dcard 的[課程問答](https://www.dcard.tw/f/ncku/p/234365647)
    - 歷屆修課學生心得: [張家榮](/User/JaredCJR), [陳品睿](/User/ggary9424), [蕭奕凱](/User/Veck), [方鈺學](/User/JulianATA)
    - 分組報告示範: [ARM-Linux](/embedded/arm-linux)
    - [GNU/Linux 開發工具共筆](https://hackmd.io/@sysprog/gnu-linux-dev/)`*`: 務必 *自主* 學習 Linux 操作, Git, HackMD, LaTeX 語法 (特別是數學式), GNU make, perf, gnuplot
    - [透過 Computer Systems: A Programmer’s Perspective 學習系統軟體](https://hackmd.io/@sysprog/CSAPP)`*`: 本課程指定的教科書 (請及早購買: [天瓏書店](https://www.tenlong.com.tw/products/9787111544937))
    - [軟體缺失導致的危害](https://hackmd.io/@sysprog/software-failure)
        * 1970 年代推出的首款廣體民航客機波音 747 軟體由大約 40 萬行程式碼構成,而 2011 年引進的波音 787 的軟體規模則是波音 747 的 16 倍,約 650 萬行程式碼。換言之,你我的性命緊繫於一系列極為複雜的軟體系統之中,能不花點時間了解嗎?
        * 軟體開發的安全性設計和測試驗證應獲得更高的重視
    - [解讀計算機編碼](https://hackmd.io/@sysprog/rylUqXLsm)
    - [解讀計算機編碼](https://hackmd.io/@sysprog/binary-representation)
        * 人們對數學的加減運算可輕易在腦中辨識符號並理解其結果,但電腦做任何事都受限於實體資料儲存及操作方式,換言之,電腦硬體實際只認得 0 和 1,卻不知道符號 + 和 - 在數學及應用場域的意義,於是工程人員引入「補數」以表達人們認知上的正負數
        * 您有沒有想過,為何「二補數」(2’s complement) 被電腦廣泛採用呢?背後的設計考量是什麼?本文嘗試從數學觀點去解讀編碼背後的原理
    - [圖解傅立葉分析](https://hackmd.io/@sysprog/S1M6kQgiZ)
        * 傅立葉 (Fourier) 分析不僅是個數學工具,更是種徹底顛覆一個人以前世界觀的思維模式
        * 不幸的是,傅立葉分析的公式看起來太復雜,以至於很多人囫圇吞棗,並從此對它深惡痛絕
        * 本文在不需要特別熟悉數學工具的狀況下,讓讀者體會到藉由傅立葉分析看到世界的另一個樣貌
    - [Bit-wise operations](https://hackmd.io/s/By0MltO_m) / [bit-wise 的應用](https://hackmd.io/s/ByzoiggIb)
    - [bit-field](https://hackmd.io/s/SJ8y82ZYQ)
    * [為什麼要深入學習 C 語言?](https://hackmd.io/s/HJFyt37Mx)
    - [linked list 和非連續記憶體操作](https://hackmd.io/s/SkE33UTHf)`*`
        * 安排 linked list 作為第一份作業及隨堂測驗的考量點:
            + 檢驗學員對於 C 語言指標操作的熟悉程度 (附帶思考:對於 Java 程式語言來說,該如何實作 linked list 呢?)
            + linked list 本質上就是對非連續記憶體的操作,乍看僅是一種單純的資料結構,但對應的演算法變化多端,像是「如何偵測 linked list 是否存在環狀結構?」和「如何對 linked list 排序並確保空間複雜度為 O(1) 呢?」
            + linked list 的操作,例如走訪 (traverse) 所有節點,反映出 Locality of reference (cache 用語) 的表現和記憶體階層架構 (memory hierarchy) 高度相關,學員很容易從實驗得知系統的行為,從而思考其衝擊和效能改進方案
            + 無論是作業系統核心、C 語言函式庫內部、應用程式框架,到應用程式,都不難見到 linked list 的身影,包含多種針對效能和安全議題所做的 linked list 變形,又還要考慮到應用程式的泛用性 (generic programming),是很好的進階題材
        * [題目 1 + 分析](https://hackmd.io/@sysprog/linked-list-quiz)`*`
        * [題目2](https://hackmd.io/@sysprog/linux2020-quiz1) (內含作答表單) / [參考題解1](https://hackmd.io/@Ryspon/HJVH8B0XU), [參考題解2](https://hackmd.io/@chses9440611/Sy5gwE37I)
    - [作業](https://hackmd.io/@sysprog/2020-homework1): 9 月 20 日截止繳交
        * [lab0](https://hackmd.io/@sysprog/2020-lab0), [quiz1](https://hackmd.io/@sysprog/rJ7WDWNVv)
    - 第 1 週隨堂測驗: [題目](https://hackmd.io/@sysprog/sysprog2020-quiz1) (內含作答表單)
    - [課堂問答簡記](https://hackmd.io/@sysprog/r1McTjN4P)

* 第 2 週 (Sep 15): C 語言程式設計
    * [系統軟體開發思維](https://hackmd.io/s/B1KnHcwBN)
    - [C 語言: 數值系統](https://hackmd.io/@sysprog/c-numerics)`*`
        - 儘管數值系統並非 C 語言所特有,但在 Linux 核心大量存在 u8/u16/u32/u64 這樣透過 typedef 所定義的型態,伴隨著各式 alignment 存取,若學員對數值系統的認知不夠充分,可能立即就被阻擋在探索 Linux 核心之外 —— 畢竟你完全搞不清楚,為何在 Linux 核心存取特定資料需要繞一大圈。
    - [C 語言: Bitwise 操作](https://hackmd.io/@sysprog/c-bitwise)`*`
        - Linux 核心原始程式碼存在大量 bit(-wise) operations (簡稱 bitops),頗多乍看像是魔法的 C 程式碼就是 bitops 的組合。
    - [類神經網路的 ReLU 及其常數時間複雜度實作](https://hackmd.io/@sysprog/constant-time-relu)
    * [為什麼要深入學習 C 語言?](https://hackmd.io/@sysprog/c-standards)`*`
        - C 語言發明者 Dennis M. Ritchie 說:「C 很彆扭又缺陷重重,卻異常成功。固然有歷史的巧合推波助瀾,可也的確是因為它能滿足於系統軟體實作的程式語言期待:既有相當的效率來取代組合語言,又可充分達到抽象且流暢,能用於描述在多樣環境的演算法。」
    * [C 語言:記憶體管理、對齊及硬體特性](https://hackmd.io/s/BkuMDQ9K7)
        * 搭配閱讀: [The Lost Art of Structure Packing](http://www.catb.org/esr/structure-packing/)
    * [C 語言: 數值系統](https://hackmd.io/s/BkRKhQGae)
        - Linux 核心作為世界上最成功的開放原始碼計畫,也是 C 語言在工程領域的瑰寶,裡頭充斥各式「藝術」,往往會嚇到初次接觸的人們,但總是能夠用 C 語言標準和開發工具提供的擴展 (主要來自 gcc 的 GNU extensions) 來解釋。
    * [基於 C 語言標準研究與系統程式安全議題](https://hackmd.io/s/S15o_K3cQ)
        - 藉由研讀漏洞程式碼及 C 語言標準,討論系統程式的安全議題
        - 透過除錯器追蹤程式碼實際運行的狀況,了解其運作原理;
        - 取材自 dangling pointer, CWE-416 Use After Free, CVE-2017-16943 以及 integer overflow 的議題;
    * [C 語言: 指標](https://hackmd.io/s/HyBPr9WGl)
        - 解讀 C 語言規格書的 “object”
        - 重讀 “type” 的定義,並且理解 incomplete type 的意義
        - 三位一體: Array, function, pointer types: 都歸類於 derived declarator types
        - `void *` 的設計考量
        - C-style string
    - [What comes after Moore’s Law?](https://enterprisersproject.com/article/2018/9/what-comes-after-moores-law): 隨著 Moore’s Law 時代的結束, 通用化硬體效能不再如以往快速進步, 因此軟硬體也必須因應如此的變化, 這篇點出 4 個面向:
        * [Ephemeral](https://www.dictionary.com/browse/ephemeral) applications (短暫的軟體): 這點是以企業軟體來談,許多組織的觀點認為軟體壽命比運作其的硬體來得長久。在許多大企業依然如此,然而後續將大量導入 mobile, web, analytics 與其他軟體,更趨向快速轉變以符合客戶與市場所需;
        * New workloads, such as machine learning: 呼應諸多計算架構大師所說的 Domain-Specific Architecture (DSA);
        * Cloud platforms: 對於雲端應用而言,使用者不會在意它是在哪種處理器與加速器上運作的;
        * Open source software: 主要在於特定的軟體開發商因人力與成本而減少支援硬體的範圍,開放原始碼軟體這時能夠作為考慮方案。儘管無法消弭對硬體的相依性,但不像軟體開發商對硬體平台支援或不支援的要求;
    - [The Era of General Purpose Computers is Ending](https://www.nextplatform.com/2019/02/05/the-era-of-general-purpose-computers-is-ending/): 過往是研究員和從業者就設計瓶頸與發熱問題來說明困境,這篇則由製程發展與已發生的現象,討論以下變遷:
        * 能追上最先進製程的晶圓廠商越來越少
        * [TOP 500](https://www.top500.org/) 中使用特殊晶片比例不斷上升
        * 特殊化處理器各方面變得更為經濟實惠
    - [課程基本資料表單](https://forms.gle/8ix6EpskfjLH4qbR9): **務必填寫,以接收課程資訊**
    - Week1 隨堂測驗: [題目](https://hackmd.io/@sysprog/HksKVpUIr)/[作答表單](https://forms.gle/zJ54J1HLJZRkBN8u9)
    - [作業](https://hackmd.io/@sysprog/HJvjIvDIr)
        * [review](https://hackmd.io/@sysprog/rJM4SPw8S)
    * [C 語言: bit-field](https://hackmd.io/s/SJ8y82ZYQ)
        - bit field 是 C 語言一個很被忽略的特徵,但在 Linux 和 gcc 這類系統軟體很常出現,不僅是精準規範每個 bit 的作用,甚至用來「擴充」C 語言
    - [作業](https://hackmd.io/@sysprog/2020-homework2): 9 月 27 日截止繳交
        * [quiz2](https://hackmd.io/@sysprog/B1zAbkAEP)
    * Week2 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz2) (內含作答表單)

* 第 2 週 (Sep 19): 課堂測驗
    - 測驗時間: 15:10-18:10
    - 可翻閱書籍和 Google 搜尋,但在測驗期間,禁止任何形式的討論。
    - 作答以「紙筆」進行,請同學們記得攜帶文具。 
    - [測驗題目](https://hackmd.io/@sysprog/B1cWzRaLB)
    - [作業](https://hackmd.io/@sysprog/BkZ4h5xPB)
        * [lab0](https://hackmd.io/@sysprog/HyFQpqgPB), [quiz2](https://hackmd.io/@sysprog/rJn1C5xDS)
* 第 3 週 (Sep 22): C 語言程式設計
    * 公告
        - [課程基本資料表單](https://forms.gle/b7NNuzkEJEgvfk7Q6): **務必填寫,以接收課程資訊**
    * [C 語言:記憶體管理、對齊及硬體特性](https://hackmd.io/s/BkuMDQ9K7)`*`
        * 搭配閱讀: [The Lost Art of Structure Packing](http://www.catb.org/esr/structure-packing/)
        * 從虛擬記憶體談起,歸納出現代銀行和虛擬記憶體兩者高度相似: malloc 給出 valid pointer 不要太高興,等你要開始用的時候搞不好作業系統給個 OOM ——簡單來說就是一張支票,能不能拿來開等到兌現才知道。
        * 探討 heap (動態配置產生,系統會存放在另外一塊空間)、data alignment,和 malloc 實作機制等議題。這些都是理解 Linux 核心運作的關鍵概念。
    * [C 語言: 未定義行為](https://hackmd.io/s/Skr9vGiQm)`*`: C 語言最初為了開發 UNIX 和系統軟體而生,本質是低階的程式語言,在語言規範層級存在 undefined behavior,可允許編譯器引入更多最佳化
    * [Greatest Common Divisor 特性和實作考量](https://hackmd.io/@sysprog/gcd-impl): 探討最大公因數 (GCD) 特性,考慮微處理器架構實作帶來的效能衝擊。考慮到 binary GCD 及其最佳化。
    * [C 語言: 前置處理器應用](https://hackmd.io/s/S1maxCXMl)`*`
        - C 語言之所以不需要時常發佈新的語言特徵又可以保持活力,前置處理器 (preprocessor) 是很重要的因素,有心者可逕行「擴充」C 語言
    * [C 語言: 指標](https://hackmd.io/s/HyBPr9WGl)`*`
        - 應可體會為何走訪 linked list 節點的程式碼要這樣寫: `struct list **lpp; for (lpp = &list; *lpp != NULL; lpp = &(*lpp)->next)`
    - [作業](https://hackmd.io/@sysprog/2020-homework3): 10 月 7 日截止繳交
        * [dict](https://hackmd.io/@sysprog/2020-dict), [quiz3](https://hackmd.io/@sysprog/B12ftyoBD)
    * Week3 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz3) (內含作答表單)

* 第 3 週 (Sep 26): C 語言程式設計
    - [以位元駕馭能量](https://hackmd.io/s/rk2RO0cYX)
    - [C 語言: linked list 和非連續記憶體操作](https://hackmd.io/@sysprog/SkE33UTHf) / [對 Linked List 進行氣泡排序](https://hackmd.io/s/BklGm1MhZ)
    - [Count Leading Zero (clz) 的實作](https://hackmd.io/s/Skq6P9bpz)
        * [clz 應用](https://hackmd.io/s/Bk-uxCYxz), [clz 分析](https://hackmd.io/s/Hyl9-PrjW)
    * [C 語言: 函式呼叫](https://hackmd.io/s/SJ6hRj-zg)
    * [C 語言: 遞迴呼叫](https://hackmd.io/s/rJ8BOjGGl)
    * [C 語言: 前置處理器應用](https://hackmd.io/s/S1maxCXMl)
    * [C 語言: goto 和流程控制](https://hackmd.io/s/B1e2AUZeM)
    * [C語言:技巧篇](https://hackmd.io/@sysprog/HyIdoLnjl)
    * Week3 隨堂測驗:
        - [題目(上)](https://hackmd.io/@sysprog/ByEP8muwr) / [作答表單](https://docs.google.com/forms/d/e/1FAIpQLSciAcG9dJwldW_5fFj8O_l0J9vjiu7nsBLt5W5SkknfXPp9kA/viewform?usp=sf_link)
        - [題目(下)](https://hackmd.io/@sysprog/ryu20CKvB) / [作答表單](https://forms.gle/bATLWyPoa6yThs2R9)
    * [作業](https://hackmd.io/@sysprog/BJCG-HGdS)
        - [list](https://hackmd.io/@sysprog/rJMNq4zuH), [quiz3](https://hackmd.io/@sysprog/rkw4SBMuH)
* 第 4 週 (Sep 29): 浮點數 + code review
    * [浮點數運算](https://hackmd.io/@sysprog/c-floating-point)`*`: 工程領域往往是一系列的取捨結果,浮點數更是如此,在軟體發開發有太多失誤案例源自工程人員對浮點數運算的掌握不足,本議程希望藉由探討真實世界的血淋淋案例,帶著學員思考 IEEE 754 規格和相關軟硬體考量點,最後也會探討在深度學習領域為了改善資料處理效率,而引入的 [BFloat16](https://en.wikipedia.org/wiki/Bfloat16_floating-point_format) 這樣的新標準
    * [CS:APP 第 2 章重點提示和練習](https://hackmd.io/@sysprog/CSAPP-ch2)`*`
    * 提升程式可讀性之實務技巧: [(1)](https://blog.niclin.tw/2020/02/29/readable-code-1/), [(2)](https://blog.niclin.tw/2020/02/29/readable-code-2/), [(3)](https://blog.niclin.tw/2020/02/29/readable-code-3/)
    * [作業](https://hackmd.io/@sysprog/2020-homework4): 10 月 13 日截止繳交
        * [quiz4](https://hackmd.io/@sysprog/r1z0WPWLD)
    * Week4 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz4) (內含作答表單)

* 第 4 週 (Oct 3): code review
    * 公告
        - 10 月 10 日 15:10-23:10 安排在家測驗,請留意助教的信件通知以得知進行方式;
        - 10 月 17 日安排課堂 code review,請及早更新 [Homework 3](https://hackmd.io/@sysprog/BJCG-HGdS) / [Homework 4](https://hackmd.io/@sysprog/Bkb5cDMuH) 共筆和程式碼;
    - [回顧 Homework 1 / 2](https://hackmd.io/@sysprog/HJlug8GOS)
    * [CS:APP 第 2 章重點提示和練習](https://hackmd.io/s/rJoxSsiuG)
    * [作業](https://hackmd.io/@sysprog/Bkb5cDMuH)
        - [compute-pi](https://hackmd.io/@sysprog/H1U778MOH), [quiz4](https://hackmd.io/@sysprog/HkiTiPzdr)
    * Week 4 隨堂測驗:
        - [題目](https://hackmd.io/@sysprog/B1keOS-dB) / [作答表單](https://forms.gle/uZP7nPpyNMHhda8d6)
* 第 5 週 (Oct 6): Fixed-Point + Code Review + C 語言
    * [浮點數運算和定點數操作](https://hackmd.io/@NwaynhhKTK6joWHmoUxc7Q/H1SVhbETQ)`*`
    * [C 語言: 函式呼叫](https://hackmd.io/s/SJ6hRj-zg)`*`
        - 著重在計算機架構對應的支援和行為分析
    * [C 語言: 遞迴呼叫](https://hackmd.io/s/rJ8BOjGGl)`*`
        - 或許跟你想像中不同,Linux 核心的原始程式碼裡頭也用到遞迴函式呼叫,特別在較複雜的實作,例如檔案系統,善用遞迴可大幅縮減程式碼,但這也導致追蹤程式運作的難度大增
    * [Linux: 作業系統術語及概念](https://hackmd.io/@sysprog/linux-concepts)`*`
    * [C 語言: goto 和流程控制](https://hackmd.io/s/B1e2AUZeM)`*`
        - goto 在 C 語言被某些人看做是妖魔般的存在,不過實在不用這樣看待,至少在 Linux 核心原始程式碼中,goto 是大量存在 (跟你想像中不同吧)。有時不用 goto 會寫出更可怕的程式碼
    * [C 語言程式設計技巧](https://hackmd.io/s/HyIdoLnjl)`*`
    * [作業](https://hackmd.io/@sysprog/2020-homework5): 11 月 9 日截止繳交
        - [render](https://hackmd.io/@sysprog/2020-render), [quiz5](https://hackmd.io/@sysprog/SJvxlt0vv)
    * Week5 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz5) (內含作答表單)

* 第 5 週 (Oct 10): 停課一次,在家測驗
    * [題目](https://hackmd.io/@sysprog/BJvfgm2_B) / [作答表單](https://forms.gle/hjHiqqYspQZbWY1T7) (測驗時間 15:00 - 23:50 Oct 10)
* 第 6 週 (Oct 13): 編譯器和最佳化概念
    * [Linux-based RTOS Experimental Platform for Constructing Self-driving Vehicles](https://osseu18.sched.com/event/FxWG/linux-based-rtos-experimental-platform-for-constructing-self-driving-vehicles-jim-huang-biilabs-shao-hua-wang-national-cheng-kung-university)
        - [video0](https://youtu.be/1-Ro5QXyIik), [video1](https://youtu.be/GNDWEvK4M8s), [video2](https://youtu.be/0C8th6bjIKg)
    * [C 編譯器原理和案例分析](https://hackmd.io/s/H1ZzeiCIQ)`*`
    * [C 語言: 編譯器和最佳化原理](https://hackmd.io/s/Hy72937Me)`*`
    * [作業](https://hackmd.io/@sysprog/2020-homework6): 11 月 9 日截止繳交
        - [kcalc](https://hackmd.io/@sysprog/2020-kcalc), [quiz6](https://hackmd.io/@sysprog/B1C-WK0DD)
    * Week6 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz6) (內含作答表單)

* 第 6 週 (Oct 17): Code Review
    * [Making C Less Dangerous in the Linux Kernel](https://outflux.net/slides/2019/lca/danger.pdf) / [錄影](https://www.youtube.com/watch?v=FY9SbqTO5GQ)
* 第 7 週 (Oct 20): 效能最佳化、連結器,和執行階段函式庫
    * [CS:APP 第 5 章重點提示和練習](https://hackmd.io/s/SyL8m4Lnm)`*`
    * [CS:APP Assign 5.18](https://hackmd.io/s/rkdzvWJTX)`*`
    * [C 語言: 動態連結器](https://hackmd.io/s/HkK7Uf4Ml)`*`
    * [C 語言: 連結器和執行檔資訊](https://hackmd.io/s/SysiUkgUV)`*`
    * [C 語言: 執行階段程式庫 (CRT)](https://hackmd.io/s/Hkcr5cn97)`*`
    * Week7 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz7) (內含作答表單)

* 第 8 週 (Oct 27): ROS + Dynamic Programming + Code Review
    * [建構在 ROS(Robot Operating System) 之上的自動駕駛技術](https://hackmd.io/@sysprog/ros-autonomous-vehicle)`*`
    * Code Review: [課堂互動](https://hackmd.io/@sysprog/SkYTGNH_D)
    * Week8 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz8) (內含作答表單)

* 第 9 週 (Nov 3): 微處理器 + Code Review
    * [現代處理器設計:原理和關鍵特徵](https://hackmd.io/s/Hk2CscGcl)`*`
    * [Arm 處理器](https://beta.hackfoldr.org/arm/)`*`: 系列講座導論, 架構和指令集, 基礎指令和開發環境, 虛擬化技術和應用
        - 你可曾想過,就算選修了電機資訊相關科系大部份的課程,自己仍對每天用的手機,完全沒概念,是不是很沮喪呢?裡頭運作 ARM 處理器,但你知道裡面的 CPU pipeline 如何運作?裡頭的 cache 如何運作?四核心、八核心到底又如何運作?CPU 和 GPU 之間如何通訊?
        - 系列講座預計涵蓋 ARMv7-A/M, ARMv8-A/M, virtualization extension, 以及對應的系統軟體技術,像是 big.LITTLE, hypervisor, 和 TEE 的概念介紹
    * Week9 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz9) (內含作答表單)

* 第 10 週 (Nov 10): 記憶體階層 + 虛擬記憶體
    * 注意事項: [分組和課程專題](https://hackmd.io/h80aIpi9TFWSQR9Br8MyWQ)
    * [CS:APP 第 6 章重點提示](https://hackmd.io/s/H1vQ3vu2z)`*`
    * [CPU caches](https://lwn.net/Articles/252125/) by Ulrich Drepper
    * [CS:APP 第 9 章重點提示](https://hackmd.io/s/SkCLi8YgN)`*`
    * Week10 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz10) (內含作答表單)

* 第 11 週 (Nov 17): 虛擬記憶體 + 系統呼叫
    * 注意: [分組和課程專題](https://hackmd.io/h80aIpi9TFWSQR9Br8MyWQ) 請在本日 17:10 前更新
    * [CS:APP 第 9 章重點提示](https://hackmd.io/@sysprog/CSAPP-ch9)`*`
    * [Linux: 記憶體管理](https://hackmd.io/@sysprog/linux-memory)`*`: 記憶體管理是 Linux 核心裡頭最複雜的部分,涉及到對計算機結構, slob/slab/slub 記憶體配置器、行程和執行檔樣貌、虛擬記憶體對應的例外處理、記憶體映射, UMA vs. NUMA 等等議題。
    * [C 語言: 物件導向程式設計](https://hackmd.io/@sysprog/c-oop)`*`
    * [Functional Programming 風格的 C 語言實作](https://hackmd.io/@sysprog/c-functional-programming)
    * [C 語言: Stream I/O, EOF 和例外處理](https://hackmd.io/@sysprog/c-stream-io)`*`
    * [高效能 Web 伺服器開發](https://hackmd.io/@sysprog/fast-web-server)
    * Week11 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz11) (內含作答表單)

* 第 12 週 (Nov 24): 共享記憶體
    * 注意事項: [分組和課程專題](https://hackmd.io/h80aIpi9TFWSQR9Br8MyWQ) (第二階段分組)
    * [解析 Linux 共享記憶體機制](https://hackmd.io/@sysprog/linux-shared-memory)
    * [Linux: 檔案系統概念及實作手法](https://hackmd.io/@sysprog/linux-file-system)`*`
    * Week12 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz12) (內含作答表單)

* 第 13 週 (Dec 1): Linux 核心發展回顧
    * 注意: [分組和課程專題](https://hackmd.io/h80aIpi9TFWSQR9Br8MyWQ) 請在本日 17:10 前更新
    * [Linux: 發展動態回顧](https://hackmd.io/@sysprog/linux-dev-review)`*`
    * [Making C Less Dangerous in the Linux Kernel](https://outflux.net/slides/2019/lca/danger.pdf) / [錄影](https://www.youtube.com/watch?v=FY9SbqTO5GQ)`*`
        - Linux 核心中各式 C 語言程式設計的安全和正確議題
        - Variable Length Arrays are bad and slow
        - Explicit switch case fall-through
        - Always-initialized automatic variables
        - Arithmetic overflow detection
        - Hope for bounds checking
        - Control Flow Integrity: forward edges
        - Control Flow Integrity: backward edges
        - 也提供了 gcc/clang 相關的編譯參數
        - [解說1](https://news.ycombinator.com/item?id=19006025), [解說2](https://www.reddit.com/r/linux/comments/ajztr3/making_c_less_dangerous_in_the_linux_kernel_by/)
    - [回顧 Homework 1 / 2](https://hackmd.io/@sysprog/HJlug8GOS)
    * [回顧 Homework 3 / 4](https://hackmd.io/@sysprog/Sy4WU9HFH)

* 第 7 週 (Oct 24): 機器內部表示法
    * [CS:APP 第 2 章重點提示和練習](https://hackmd.io/s/rJoxSsiuG)
    * [CS:APP 第 3 章重點提示和練習](https://hackmd.io/s/HJDRfVCFG)
    * [從餘數運算到 RSA 加密演算](https://hackmd.io/s/SyBXfc8i7)
    * [隱藏在字典裡的數學](https://hackmd.io/@sysprog/BkE3uSvdN)
    * [回顧 Homework 3 / 4](https://hackmd.io/@sysprog/Sy4WU9HFH)
    * [C 語言: 未定義行為](https://hackmd.io/s/Skr9vGiQm): C 語言最初為了開發 UNIX 和系統軟體而生,本質是低階的程式語言,在語言規範層級存在 undefined behavior,可允許編譯器引入更多最佳化
    * [C 語言: 編譯器和最佳化原理](https://hackmd.io/s/Hy72937Me)
    * [C 語言: 連結器與程式行為](https://hackmd.io/s/SysiUkgUV)
    * [C 語言: 動態連結器](https://hackmd.io/s/HkK7Uf4Ml)
    * [C 語言: 執行階段程式庫 (CRT)](https://hackmd.io/s/Hkcr5cn97)
    * [C 編譯器原理和案例分析](https://hackmd.io/s/H1ZzeiCIQ)
    * [C 語言: Stream I/O, EOF 和例外處理](https://hackmd.io/s/Sy8pJ0x9G)
    * [作業](https://hackmd.io/@sysprog/rkw3RV0YS)
        - [dict](https://hackmd.io/@sysprog/S1Nn_ECYS), [quiz5](https://hackmd.io/@sysprog/HkXxerRFS), [quiz7](https://hackmd.io/@sysprog/Hy3zZSAtH)
    * Week 7 隨堂測驗:
        - [題目](https://hackmd.io/@sysprog/BkavHnFFS) / [作答表單](https://forms.gle/6peGUaUcEtT48FD16)

* 第 8 週 (Oct 31): 程式碼最佳化
    * [Snap: a Microkernel Approach to Host Networking](https://ai.google/research/pubs/pub48630/)
        - 來自 Google 的研究成果,發佈於 [SOSP 2019](https://sosp19.rcs.uwaterloo.ca/) / [Hacker News 討論](https://news.ycombinator.com/item?id=21374204)
        - Google's user land networking system achieves "over 3x Gbps/core improvement for RPC workloads, RDMA-like perf of up to 5M IOPS/- core."
        - [淺談 Microkernel 設計和真實世界中的應用](https://hackmd.io/@sysprog/SJ55y7fR)
    * 為何你要掌握數學?即使 Linux 核心內部也大量可見:
        - [從 CPU cache coherence 談 Linux spinlock 可擴展能力議題](https://hackmd.io/@sysprog/BJ8djgdnm)
        - [Linux 核心設計: 淺談同步機制](https://hackmd.io/s/SJpp-bN0m)
        - [Linux 核心設計: 多核處理器和 spinlock](https://hackmd.io/s/rJbXgzz-4)
        - [Linux 核心設計: Scalability 議題](https://hackmd.io/@sysprog/HkfDtLnbH)
        - [Reed-Solomon Library Programming Interface](https://github.com/torvalds/linux/blob/master/Documentation/core-api/librs.rst): Flash ECC
        - [MTD NAND Driver Programming Interface](https://github.com/torvalds/linux/blob/master/Documentation/driver-api/mtdnand.rst): ECC, 參見 [錯誤更正碼簡介](https://w3.math.sinica.edu.tw/math_media/d184/18404.pdf) / [抽象代數的實務應用](http://bit.ly/abstract-algebra)
    * [CS:APP 第 5 章重點提示和練習](https://hackmd.io/s/SyL8m4Lnm)
    * [CS:APP 第 4 章重點提示](https://hackmd.io/s/ByKFm4CFz)
    * [回顧 Homework 3 / 4](https://hackmd.io/@sysprog/Sy4WU9HFH)
    * Week 8 隨堂測驗:
        - [題目](https://hackmd.io/@sysprog/Skz51Kv5B) / [作答表單](https://forms.gle/31iLE35675JDCses5)

* 第 9 週 (Nov 7): Computer Architecture
    * 人工智慧涉及大量運算,和底層計算機結構及數值表示法高度相關: [Making floating point math highly efficient for AI hardware](https://code.fb.com/ai-research/floating-point-math/), [bfloat16 floating-point format](https://en.wikipedia.org/wiki/Bfloat16_floating-point_format)
    * [CS:APP 第 4 章重點提示和練習](https://hackmd.io/s/ByKFm4CFz)
    * [CS:APP 第 5 章重點提示和練習](https://hackmd.io/s/SyL8m4Lnm)
    * Week 9 隨堂測驗:
        - [題目](https://hackmd.io/@sysprog/B10_EnxoS) / [作答表單](https://forms.gle/CkPAiVtcPBc8SDUL6)

* 第 10 週 (Nov 14): Memory Hierarchy
    * [CS:APP 第 6 章重點提示](https://hackmd.io/s/H1vQ3vu2z)
    * [Linux: 賦予應用程式生命的系統呼叫](https://hackmd.io/s/HyNbWoD1V)
    * [Linux: 記憶體管理](https://hackmd.io/s/rJBXOchtE)

* 第 11 週 (Nov 21): Virtual Memory
    * 佳句偶得:「寫程式就可以讓機器做事,當你會使用機器的時候,你就不用把人當機器用。但學校偏偏是個把學生訓練成機器的地方。」([出處](https://twitter.com/zonble/status/1170927028305944576))
    * 最佳化來自對系統的掌握
        - [Clang-format tanks performance](https://travisdowns.github.io/blog/2019/11/19/toupper.html)
            * Slow:
                ```C
                #include <algorithm>
                #include <ctype.h>
                ```
            * Fast:
                ```C
                #include <ctype.h>
                #include <algorithm>
                ```
        - [Performance speed limits](https://travisdowns.github.io/blog/2019/06/11/speed-limits.html)
        - [Beating up on qsort](https://travisdowns.github.io/blog/2019/05/22/sorting.html)
    * [CS:APP 第 9 章重點提示](https://hackmd.io/s/SkCLi8YgN)
    * Week 11 隨堂測驗:
        - [題目](https://hackmd.io/@sysprog/Hymc9MmhS) / [作答表單](https://forms.gle/uf6nTe4VzkLbcVMaA)
    * [分組表](https://hackmd.io/@sysprog/B1sHrRQhr): 請在 12 月 3 日前執行選定的任務

* 第 12 週 (Nov 28): 記憶體管理
    - 確認 [分組表](https://hackmd.io/@sysprog/B1sHrRQhr)
    - [The golden age of ever-changing computer architecture](https://hackaday.com/2019/11/27/the-golden-age-of-ever-changing-computer-architecture/) 
    * 李飛飛教授的 TED 演說 [How we teach computers to understand pictures](https://www.youtube.com/watch?v=40riCqvRoMs)
        - [ImageNet: A Large-Scale Hierarchical Image Database](http://www.image-net.org/papers/imagenet_cvpr09.pdf)
        - [Now anyone can train Imagenet in 18 minutes](https://www.fast.ai/2018/08/10/fastai-diu-imagenet/)
    * [CS:APP 第 9 章重點提示](https://hackmd.io/s/SkCLi8YgN)

* 第 13 週 (Dec 5): 重新探討 Process
    * [5G 晶片大廠新品對決](https://tw.appledaily.com/new/realtime/20191204/1672429)
        - 有好規格就有話語權
        - 「高通推出最新旗艦款處理器 S865 晶片需外掛數據晶片,整套開出 120-150 美元,符合市場價格,但今年特別的是,針對中高階的 5G 單晶片,聯發科天璣 1000採用台積電 7 奈米製程,以無敵貴的 75 美元至 80 美元,硬是比高通 5G S765 70 美元還來的高」
    * [Linux: 不僅是個執行單元的 Process](https://hackmd.io/@sysprog/r1ojuBGgE)
    * [Linux: 不只挑選任務的排程器](https://hackmd.io/@sysprog/rJbcHS5LE)
    * [UNIX 作業系統裡頭 fork/exec 的前世今生](https://hackmd.io/@sysprog/SJMxX4cUB)
        - [Creating new processes with fork()](https://youtu.be/ss1-REMJ9GA)
        - [Bash fork bomb](https://kerneltalks.com/scripts/bash-fork-bomb-how-it-works/)
    * [Malloc Bootcamp](http://www.cs.cmu.edu/~213/activities/mallocbootcamp-f19.pdf)
    * Week 13 隨堂測驗:
        - [題目](https://hackmd.io/@sysprog/B1k4cfU6S) / [作答表單](https://forms.gle/9zcWKa1uaPL6ZPBr7)

* 第 14 週 (Dec 12): 數學基礎 + 分組報告重點提示
    * 2018 年 11 月 16 日新版國際單位制通過,新的公斤定義將改以物理學的普朗克常數為標準 (WTF?!)
        * 世界上所有的測量結果都可以追溯到「國際單位制」(Système International d'Unités;SI Units)
        * 國際單位制以七個基本單位為基礎,並由此推導出各種可相互換算的測量單位。多年來,測量的定義 —— 安培(ampere)、燭光(candela)、克耳文(kelvin)、公斤(kilogram)、公尺(meter)、莫耳(mole)以及秒(second) —— 都已重新定義
        * 質量測量的標準源於存放在法國巴黎近郊國際度量衡局的單一物件 —— 國際公斤原器 (IPK),自 1884 年被鑄造成為公斤的標準以來一直存放在此,[有什麼問題呢?](https://www.eettaiwan.com/news/article/20181123NT01-The-Kilogram-Has-a-New-Definition)
            - 根據近年的量測顯示,IPK 重量已減少約 50 微克
            - 經過全球國家度量機構數十年的討論和研究,決定捨棄實體的 IPK,改以普朗克常數重新定義公斤單位,其定義比 IPK 至少穩定 100 萬倍 
        * video: [公斤是如何重新定義?](https://www.youtube.com/watch?v=E-IBVXNHyKc)
            - 目前的公斤質量是指以地心引力施加特定的力,修訂後的定義改用電磁力取代機械力進行測量
            - 未來改以基布爾秤(Kibble balance)測量,後者以電磁力精準量測物體質量,可測量出多少電流產生的電磁力,才等同於作用在給定質量上的力。
    * [Week9 提過碎形](https://hackmd.io/@sysprog/B10_EnxoS),現在來思考 [希爾伯特曲線與豪斯多夫維度](https://youtu.be/WCZRRw_0Fa0)
    * [分組報告重點提示](https://hackmd.io/@sysprog/B1sHrRQhr)
    * [Linked list comparison](https://github.com/WojciechMula/toys/tree/master/linearsearch)
        ```
        # Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz, 24 cores
        list                          :      0.534s, speedup  1.00
        array list (4)                :      0.293s, speedup  1.82
        array list (8)                :      0.160s, speedup  3.33
        SIMD array list (4)           :      0.263s, speedup  2.03
        SIMD array list (8)           :      0.140s, speedup  3.80
        ```
    * Week13 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz13) (內含作答表單)

* 第 15 週 (Dec 19): I/O 和開發典範
    * CS:APP 第 8 章重點提示: [C 語言: Stream I/O, EOF 和例外處理](https://hackmd.io/s/Sy8pJ0x9G)
    * [CS:APP 第 10 章重點提示](https://hackmd.io/s/H1TtmVTTz)
    * [Linux: 中斷處理和現代架構考量](https://hackmd.io/s/S1WKTCFM4)
    * [C 語言: 物件導向程式設計](https://hackmd.io/s/HJLyQaQMl)
    * [Functional Programming 風格的 C 語言實作](https://hackmd.io/@sysprog/HyS-9S6OE)
        - 是種 programming paradigm (開發典範),不是 design pattern 也不是 framework,更不是 language。簡單來說,FP 是種以數學函數為中心的「思考方式」與「程式風格」;
        - 透過 C 語言程式提供若干案例,如列舉數值、(不需要動態配置記憶體的) 反轉 linked list 元素、對 Linked List 元素進行合併排序;
    * [An Introduction to Cache-Oblivious Data Structures](https://rcoh.me/posts/cache-oblivious-datastructures/)
        - 「自動快取資料結構」,特性是無視硬體特定的快取大小,可能達到接近最優化快取的效能;
        - 在現代 CPU 多層多種大小的快取架構下,它的理論宣稱其能自動優化在所有層的快取的存儲效率。傳統上電腦科學做偏理論的不太重視實作上的效能,而做實作或硬體優化的則不太重視理論分析。這個學門卻是橫跨了相當理論的演算法分析(需要相當多的進階數學工具),以及相當低階的硬體效能理解;
        - 影片: [Memory Hierarchy Models](https://www.youtube.com/watch?v=V3omVLzI0WE)
        - Google Research 強者的心得: [關於變強這檔事(九)](https://medium.com/@fchern/%E9%97%9C%E6%96%BC%E8%AE%8A%E5%BC%B7%E9%80%99%E6%AA%94%E4%BA%8B-%E4%B9%9D-3fd36c986313)
        - [Skip List](http://en.wikipedia.org/wiki/Skip_list): 置放大量數字並進行排序的資料結構。不用樹狀結構,而改用高度不同的 List 來連接資料。資料結構在概念上可以表示成 Left Child-Right Sibling Binary Tree 的模式。是 Cache-oblivious Algorithm 的經典範例,時間複雜度與空間複雜度與 Binary Search Tree 皆相同,但是實際運作效率比 Binary Search Tree 還要好。
* 第 14 週 (Dec 8): 專題討論
    * [分組和課程專題](https://hackmd.io/h80aIpi9TFWSQR9Br8MyWQ)
    * Week14 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz14) (內含作答表單)

* 第 16 週 (Dec 26): Virtual Memory + 傅立葉分析
    * [CS:APP 第 9 章重點提示](https://hackmd.io/s/SkCLi8YgN)
    * [圖解傅立葉分析](https://hackmd.io/s/S1M6kQgiZ)
    * [CS:APP Assign5.18](https://hackmd.io/s/rkdzvWJTX)
* 第 15 週 (Dec 15): 電腦網路 / 專題討論
    * 公告
        - [分組和課程專題](https://hackmd.io/h80aIpi9TFWSQR9Br8MyWQ) 已悉數更新,斟酌同學們的意願和過去開發的狀況
        - 上述專題務必在 2021 年 1 月 19 日有明顯的更新 (人在做,GitHub/HackMD 在看,有空就趕快更新),當周審視後,就會進行期末評分
        - 所有修課的學生應發訊息到[授課教師的粉絲專頁](https://www.facebook.com/JservFans),預約一對一討論 (專題執行和評分期待)
    * [CS:APP 第 11 章: 電腦網路](https://hackmd.io/@sysprog/CSAPP-ch11)
    * Week15 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz15) (內含作答表單)

* 第 17 週 (Jan 2): 
    * [在網頁瀏覽器裡頭執行 MS-DOS 和毀滅戰士遊戲](https://js-dos.com/DOOM/)
        - [HackerNews 討論](https://news.ycombinator.com/item?id=18817278)
        - [其他示範](https://github.com/kripken/emscripten/wiki/Porting-Examples-and-Demos)
    * [CS:APP 第 10 章重點提示](https://hackmd.io/s/H1TtmVTTz)
    * [CS:APP 第 11 章重點提示](https://hackmd.io/s/ByPlLNaTG)
* 第 16 週 (Dec 22): 多核處理器架構
    * [Multi-Core in Linux](https://youtu.be/UNI6Mbqryv0)`*`
    * [What is NUMA?](https://youtu.be/M-Q02b5uvfY)`*`
    * [A tour of the ARM architecture and its Linux support](https://youtu.be/NNol7fRGo2E)`*`
    * [Multiprocessor OS](/11-smp_os.pdf)
    * [Linux 核心設計: 多核處理器和 spinlock](https://hackmd.io/@sysprog/multicore-locks)`*`
    * Week16 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz16) (內含作答表單)
 
* 第 17 週 (Dec 29): Scalability + Regular expression
    * [Linux: Scalability 議題](https://hackmd.io/@sysprog/linux-scalability)
    * [How Do Regular Expressions Really Work?](https://youtu.be/u01jb8YN2Lw)`*`
    * Regex 視覺化: [Regulex](https://jex.im/regulex/)
    * [Implementing a simple regular expression engine](https://developpaper.com/implementing-a-simple-regular-expression-engine/)
    * [How Regular Expression Engines Work w/ C source](http://wstoop.co.za/wregex.php)
    * Week17 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz17) (內含作答表單)

* 第 18 週 (Jan 9): Concurrency + 課程回顧
    * [隱藏的傅立葉分析](https://hackmd.io/s/S1jR0mHfN)
    * [簡單的 FizzBuzz 藏有深度 (Google 面試題)](https://medium.com/@william456821/%E7%B0%A1%E5%96%AE%E7%9A%84-fizzbuzz-%E8%97%8F%E6%9C%89-%E6%B7%B1%E5%BA%A6-google-%E9%9D%A2%E8%A9%A6%E9%A1%8C-f5e66e3a97be)
    * [Toward Concurrency](https://hackmd.io/s/Skh_AaVix)
    * Linux: [多核處理器和 spinlock](https://hackmd.io/s/rJbXgzz-4), [RCU 同步機制](https://hackmd.io/s/H19V4eyfV)
* 第 18 週 (Jan 5): 專案討論
    * Week18 隨堂測驗: [題目](https://hackmd.io/@sysprog/2020-quiz18) (內含作答表單)