contributed by <liangchingyun
>
注意書寫規範!
ksort
: 處理並行排序的 Linux 核心模組ksort
核心模組內部xoro
核心模組注意用語!
編譯
載入 kxo module
執行
卸載模組
查看核心訊息
使用了 raw_mode_enable()
,則不用另外再執行 $ stty start '^-' stop '^-'
,即可直接接收 Ctrl-P,Ctrl-Q 等控制字元
Commit 22a2477
給 display_buf
中的字串正確結尾('\0'
)便可解決
xo-user
Commit db786e8
原程式在執行完 Ctrl-Q 後,直接跑 sudo ./xo-user
的結果會卡在第一個棋盤,需要重新載入 kxo module 才會正常。
查看核心訊息後發現使用 Ctrl-Q 會使 attr_obj.end
被設成 '1'
(ASCII 49
)。解決辦法是在 kxo_release()
程式中將 attr_obj.end
重設為 '0'
(ASCII 48
),就不用一直重新載入 kxo module。
Commit 43dc5ba
原本 draw_board()
函式在核心層級中進行,每次棋盤狀態改變,核心就要透過 copy_to_user()
把整個畫面樣板傳給使用者空間。
參考 a2985ba,將核心層級(main.c
)中的draw_board
改寫成只把 16 格棋盤資料存入 draw_buffer
,只需傳送字元,無需畫出畫面。
另外,使用者層級(xo-user.c
)中新增 draw_board()
函數,將核心傳來的 16 格資料轉換為棋盤畫面(含換行與橫線)。
效能分析
在 kxo_release
最後加入下面這一行:
可得到:
原本讀取 DRAWBUFFER_SIZE
(66 個字元)→ 現在只讀 N_GRIDS
(16 個字元)。也就是減少了了 66 - 16 = 50 bytes 的傳輸成本。
提供更多數學分析
亂碼問題
先前所提到使用 Ctrl + Q 使對弈終止時產生亂碼,是因為 ASCII 畫面含有空格、|
、-
、換行等特殊字元,在傳輸中斷或解碼錯誤所造成。因此將畫棋盤的動作改在使用者層級進行也能解決此問題。
Commit 00a2c58
使用 time(NULL)
來取得現在的時間,再用 localtime_r()
轉換成當地時間的結構,同時保證 thread-safe。
thread-safe:當多個執行緒(threads)同時使用同一段程式碼時,不會發生資料衝突或錯誤。
輸出結果如下: