linux2020
主講人: jserv / 課程討論區: 2020 年系統軟體課程
返回「Linux 核心設計」課程進度表Image Not Showing Possible ReasonsLearn More →
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
預習 CS:APP 第 11 章: Network Programming,搭配閱讀:
取得 kHTTPd 原始程式碼並編譯:
預期會見到執行檔 htstress
和核心模組 khttpd.ko
。接著可進行測試:
參考輸出:
這台電腦的實驗結果顯示,我們的 kHTTPd 每秒可處理超過 20K 個 HTTP 請求。上述實驗透過修改過的 htstress 工具得到,我們可拿來對 http://www.google.com
網址進行測試:
參考輸出:
kHTTPd 掛載時可指定 port 號碼: (預設是 port=8081
)
除了用網頁瀏覽器開啟,也可用 wget
工具:
參考 wget
執行輸出:
得到的 index.html
內容就是 Hello World!
字串。
下方命令可追蹤 kHTTPd 傾聽的 port 狀況:
注意,在多次透過網頁瀏覽器存取 kHTTPd 所建立的連線後,可能在 module unload 時,看到 dmesg
輸出以下:
許多 Linux 裝置驅動程式或子系統會透過 kernel threads(簡稱kthread
),在背景執行提供特定服務,然後等待特定 events 的發生。等待的過程中,kthread 會進入 sleep 狀態,當 events 發生時,kthread 會被喚醒執行一些耗時的工作,如此一來,可防止 main thread 被 blocked。
使用示範: kernel-threads.c
kthread_run
巨集在 Linux v5.5 的定義 include/linux/kthread.h :
可見到 kthread_create
成功時直接 wake_up_process
,回傳值為 task_struct
。
下方命令可查閱系統上的 kthread:
預期可見:
PPID 為 2
的都屬於 kthread,而 $ ps auxf
可見樹狀結構。
參考輸出結果:
尋找剛才載入的 khttpd 核心模組:
預期可見以下:
kthread_stop()
通知 kthread 準備關閉(將 kernel_should_stop
旗標設為 true),並等待直到 threadfn
結束(由此可知 threadfn
中需要有一直驗證停止旗標的實做)。其中會把 kthread->kthread_should_stop
設為 true。此函式也用於喚醒 kthread。
schedule()
運作方式
首先使用 set_current_state()
將 kthread 的 state 改成 TASK_INTERRUPTIBLE
,使得稍後可被移出 run queue (排程器排程時會從 run queue 挑出任務),接著呼叫 schedule()
,告知排程器可切換到其他任務,即讓出 CPU 資源,至此該 kthread 即開始睡眠。假如要喚醒這個 kthread,我們可用 wake_up_process()
(帶入參數為目標 kthread 的 task_struct *
),這個函式會將 kthread 的 state 切換回 TASK_RUNNING
,並將其放回 run queue,接著就等待排程器下一次排程。
TCP backlog
在 accept()
成功前 queue 中最大能存放的連線要求。
sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock)
kernel_setsockopt(sock, SOL_TCP, TCP_NODELAY, (char *) &opt, sizeof(opt))
kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr))
kernel_listen(sock, DEFAULT_BACKLOG)
kthread_run(echo_server_daemon, ¶m, MODULE_NAME)
kernel_accept(param->listen_sock, &sock, 0)
出處: CS:APP 第 11 章
$ sudo insmod khttpd.ko port=1999
這命令是如何讓 port=1999
傳遞到核心,作為核心模組初始化的參數呢?htstress.c
用到 epoll 系統呼叫,其作用為何?這樣的 HTTP 效能分析工具原理為何?/fib/N
時 ( 是自然數,最大可到 ),例如 $ wget http://localhost:8081/fib/10
應該要讓 web 客戶端得到 即 55
這個字串,這個實作需要考慮到大數運算 不要小看這個需求,由於大數運算無可避免會用到更大的記憶體空間和更長的執行時間,你要考慮手動安插 reschedule()
, preempt_enable()
, preempt_disable()
;編輯 Homework4 作業區共筆,將你的觀察、上述要求的解說、應用場合探討,以及各式效能改善過程,善用 gnuplot 製圖,紀錄於新建立的共筆
越早在 GitHub 上有動態、越早接受 code review,評分越高