# 2017q1 Homework4 (phonebook-concurrent) contributed by < `etc276` > ###### tags: `嵌入式` ## 開發環境 - Ubuntu 16.10 ( 64 bit ) ``` Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 61 Model name: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz Stepping: 4 CPU MHz: 2400.878 CPU max MHz: 3000.0000 CPU min MHz: 500.0000 BogoMIPS: 4788.90 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 4096K NUMA node0 CPU(s): 0-3 ``` ## 作業要求 - 在 GitHub 上 fork [phonebook-concurrent](https://github.com/sysprog21/phonebook-concurrent),然後適度修改 phonebook_opt.c 和相關的檔案 - 閱讀 [concurrency](https://hackmd.io/s/Skh_AaVix) 、驗證程式正確性、分析並說明如何改善效能(需有圖表) - 延續 B01: phonebook 的開發方向,本作業著重於透過 POSIX Thread 來縮減 alloc() 的時間成本 - 詳細閱讀[實驗](https://hackmd.io/s/BkN1JNQp),指出缺失並提出改進縮減 append() 時間的可行提案 - 需要一併實作出刪除 (remove) 特定資料的功能 - 延續 B05: introspect,嘗試重構 (refactor) 給定的程式碼,使得程式更容易閱讀和維護 ## 開發紀錄 ### 閱讀程式架構 - 一樣,先看 makefile,可以發現多了 `text_align` ``` phonebook_opt: $(SRCS_common) phonebook_opt.c phonebook_opt.h text_align.c $(CC) $(CFLAGS_common) $(CFLAGS_opt) \ -DIMPL="\"$@.h\"" -o $@ \ $(SRCS_common) $@.c text_align.c ``` - 閱讀 `text_align.c` 和實驗之後,有了以下了解 - 為了避免 I/O Bound,所以修改原本讀取資料的方法 - 方法是不逐一"讀取"資料,而是將資料**對齊**並**對映**到虛擬記憶體上 - 這樣的好處是,當有多條 thread 的情況就可以真的分別"拿到"資料 - 目前對這次作業的理解 (並行) - 改善 input 方式以實現 CPU Bound - 避免 system call 等無法有效利用 thread 的原因 (wait) - 將所有任務分配給多條 thread (從 init 到 append 結束) ### 重構 (Refactor) - 重構的用意是:在不改變軟體外部行為的前提下,改變其內部結構,使其更容易理解且易於修改 - 目標是讓程式碼的可讀性提升,以及易於維護 - 先來看本次的 `main.c` - 搜尋 `ifndef` 有 5 個結果 - 搜尋 `if defined` 有 3 個結果 - 搜尋 `clock_gettime` 有 7 個結果 - 整個 `main.c` 多達 201 行,大部分都是"分別"實作 orig 和 opt - 目前的想法利用 API 包裝兩者的不同,使得 `main.c` 更為簡潔 ### 並行 (Concurrency) - Concurrency 對軟體設計的影響 - 想要充分使用到 CPU 的資源 - 程式越來越有機會造成 CPU-bound。 - 軟體效能優化將會越來越重要 - 程式語言必須好好處理 concurrency - 要把工作真的拆開,且盡量避免互相卡住 (lock) - 並行是一種程式架構,平行是一種執行方式 ![](https://i.imgur.com/S5KxeFD.png) ![](https://i.imgur.com/eHjjIN3.png) - 生活化的例子如下 - 並行:邊看書,邊滑臉書 (不同時) - 平行:邊走路,邊呼吸 - 平行迷思 2 * 3GHz < 6GHz - 總有東西要等 - 例如 thread 互相連接的方式 (接 n 次還是 log n 次) - 非 CPU Bound (例如在等 IO 就沒辦法分工) - 哪個 thread 先執行 (類似 i = i++ ) - 應該只有效能上的提升,結果不該改變