sysprog2016
主講人: jserv / 課程討論區: 2016 年系統軟體課程
兩大重點:
取得程式碼並測試:
程式輸出,提示以下用法:
比方說 ./sort 4 8
,執行後會看到 "input unsorted data line-by-line" 提示訊息,請輸入 8 組數字,每個都用 Enter (換行) 分隔。之後即可看到輸出。
在 GNU bash 中,可善用 $RANDOM
環境變數,取得介於 0~32767 之間的亂數,於是我們可透過以下指令來作自動測試:
輸出的 "sorted results" 訊息後方應該有 8 組數值,由小到大排列。
示意圖如下:
為了分配工作,在 worker thread 實作 Task 的機制。每個主要的操作會先被放進 task queue 裡頭,空閒的 thread 再從 task queue 裡頭提取 task 執行,如下面的步驟:
只要把我們的操作寫成 task,就能順利執行。
Linked list 是由各個 node,透過指標串聯而成。先定義 node_t 型別
node 建立後,就可繼續定義 llist_t:
定義完型別,接著是各種操作:
定義 task_t 來封裝 task:
定義Task的free操作
再來是 thread pool 所需的 queue 結構:
接著把 queue 和 thread 包裝成 thread pool:
之後實做task_run
作為稍早提到流程圖的主迴圈 (main-loop)
有了這樣的基礎建設,我們的 mergesort 就很容易透過 task 這樣的包裝,加入 thread pool 中。前述程式碼已經用到物件導向的設計模式,可見 你所不知道的C語言:物件導向程式設計篇。
mutrace 可用來偵測 lock contention,使用很方便,不需要重新編譯程式碼。
搭配前述亂數輸入自動測試,執行以下命令:
mutrace 的輸出:
其中 tqueue_init+0x38
就是實際執行的地址,可用 addr2line
來找出對原始程式碼的對應,注意,要確保編譯時加入 -g
參數,確保包含 debug info 的執行檔正確產生。以這個地址來說,對應的原始程式碼為:
延伸閱讀:
[ source ] Graphviz 是個依據給定指令的製圖軟體,不過說是繪圖軟體,它能繪的圖並不是一般人想像中的漫畫或 logo,而是數學意義上的 "graph",比較通俗的說法就是「關係圖」。
舉例來說,像是下面這種圖,展示 Unix 家族:
用手畫會很痛苦,而 Graphviz 可以替使用者搞定它。Graphviz 提供一套語言,讓您能直接陳述圖片上的節點、邊、方向等性質。之後,由它來為您產生整張圖片。
Graphviz 能畫的圖片有許多種,可在官方網站找到更多範例。
HackMD 已經支援 GraphViz,本頁 mergesort 的圖例就是用該工具繪製。按右上方 之後再按左上方 ,查看 GraphViz 的使用。
[ source ] Git 和其他版本控制系統一樣,可在某些重要事件發生時,自動觸發自訂腳本。Git hook 可分客戶端和伺服器端,這邊我們只解說客戶端 hooks 如何自動化工作流程。
每個 Git repository 中都有一個 .git/hooks
目錄,裡面的內容如下:
這是 Git 提供給我們的 sample script,讓我們參考用的,script 的檔名就是對應的事件,這邊有一份完整可以使用的事件 list。
如果我們想要安裝一個 hook,在每次 commit 前讓他自動執行某個腳本,就在這個目錄中,新增一個名為 pre-commit
的 script file(注意沒有副檔名,檔案要設為可執行),這樣在 commit 前就會自動執行這個腳本。
pre-commit
大概是最多人使用的 hook,他可以讓我們在 commit 前對我們的修正做些檢查,例如用靜態分析工具 (如jshint)先行掃描,以便確保程式的品質。
mergesort-concurrent 提供一份特製的 Git pre-commit
hook,可在每次提交修改時,自動檢查程式排版風格是否一致,並且檢驗 C 語言程式是否存在潛在的錯誤。使用前,記得先安裝 astyle 和 cppcheck 套件:
之後只要在 mergesort-concurrent 所在的目錄執行以下指令即可安裝特製的 Git hooks:
接著我們來測試。在 thread.c
中有一段程式碼:
如果我們在 free(the_task);
後面追加一行一樣的敘述,也就是重複呼叫 free()
,這就會導致 double free。當我們貿然將這樣的程式碼提交給 Git 時,特製的 Git pre-commit hook 就會偵測並回報給我們:
關於指標的注意須知,可參考 你所不知道的C語言:指標篇。類似 cppcheck 的靜態分析工具很多,像是 Clang Static Analyzer。
dictionary/words.txt
複製出來,然後透過 UNIX 指令打亂順序,之後重新導向到另一個檔案這樣我們就有新的資料輸入。
sort -R
處理過_Atomic
改寫。參考資料: