sysprog2017
主講人: jserv / 課程討論區: 2017 年系統軟體課程
:mega: 返回「作業系統設計與實作」課程進度表
兩大重點:
取得程式碼並測試:
程式輸出,提示以下用法:
比方說 ./sort 4 8
,執行後會看到 "input unsorted data line-by-line" 提示訊息,請輸入 8 組數字,每個都用 Enter (換行) 分隔。之後即可看到輸出。
在 GNU bash 中,可善用 $RANDOM
環境變數,取得介於 0~32767 之間的亂數,於是我們可透過以下指令來作自動測試:
輸出的 "sorted results" 訊息後方應該有 8 組數值,由小到大排列。
Makefile
中定義了 check
,所以可用 make check
來檢驗程式的正確性。示意圖如下:
為了分配工作,在 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 中。
mutrace 可用來偵測 lock contention,使用很方便,不需要重新編譯程式碼。
搭配前述亂數輸入自動測試,執行以下命令:
mutrace 的輸出:
其中 tqueue_init+0x38
就是實際執行的地址,可用 addr2line
來找出對原始程式碼的對應,注意,要確保編譯時加入 -g
參數,確保包含 debug info 的執行檔正確產生。以這個地址來說,對應的原始程式碼為:
延伸閱讀:
[ source ] Graphviz 是個依據給定指令的製圖軟體,不過說是繪圖軟體,它能繪的圖並不是一般人想像中的漫畫或 logo,而是數學意義上的 "graph",比較通俗的說法就是「關係圖」。
舉例來說,像是下面這種圖,展示 Unix 家族:
用手畫會很痛苦,而 Graphviz 可以替使用者搞定它。Graphviz 提供一套語言,讓您能直接陳述圖片上的節點、邊、方向等性質。之後,由它來為您產生整張圖片。
Graphviz 能畫的圖片有許多種,可在官方網站找到更多範例。
HackMD 已經支援 GraphViz,本頁 mergesort 的圖例就是用該工具繪製。按右上方 之後再按左上方 ,查看 GraphViz 的使用。
dictionary/words.txt
複製出來,然後透過 UNIX 指令打亂順序,之後重新導向到另一個檔案這樣我們就有新的資料輸入。
sort -R
處理過