# 2023q1 Homework7 (ktcp) contributed by < `tab0822` > ### 給定的 kecho 已使用 CMWQ,請陳述其優勢和用法,應重現相關實驗 根據[Concurrency Managed Workqueue (cmwq)](https://www.kernel.org/doc/html/v4.15/core-api/workqueue.html), cmwq 是根據 alloc_workqueue(fmt, flags, max_active, args...)來創建的,在kecho/kecho_mod.c當中就有使用到 alloc_workqueue , 如下: ```c= tatic int kecho_init_module(void) { int error = open_listen(&listen_sock); if (error < 0) { printk(KERN_ERR MODULE_NAME ": listen socket open error\n"); return error; } param.listen_sock = listen_sock; kecho_wq = alloc_workqueue(MODULE_NAME, bench ? 0 : WQ_UNBOUND, 0); echo_server = kthread_run(echo_server_daemon, &param, MODULE_NAME); if (IS_ERR(echo_server)) { printk(KERN_ERR MODULE_NAME ": cannot start server daemon\n"); close_listen(listen_sock); } return 0; } ``` 程式碼當中的 kecho_wq = alloc_workqueue(MODULE_NAME, bench ? 0 : WQ_UNBOUND, 0)就是使用cmwq的方法 在最原始的 work queue 當中又可分為 MT 及 ST 兩種版本, MT 看似對於並行處理更加友善,但實際上在當使用者提高對於並行處理的需求時,卻往往無法負荷。相較之下 cmwq 有以下優勢 1. 與原本的 workqueue API 相容 2. 能滿足更多並行處理需求並節省更多資源 3. 自動調節 worker pool ,方便使用者使用 ### 搭配閱讀《Demystifying the Linux CPU Scheduler》第 1 章和第 2 章,描述 CPU 排程器和 workqueue/CMWQ 的互動,應探究相關 Linux 核心原始程式碼 對於 cpu 排程器來說,所有的 task 都會被分配到一種 class,不同的 class 會有不同的優先度,將 class 依照優先度從高到低分別為 stop_sched_class 、dl_sched_class 、rt_sched_class、fair_sched_class、idle_sched_class 因此 cpu 排程器可以為每一種 class 創見 workqueue/CMWQ ,在透過不同的 policy (SCHED_RR,SCHED_FIFO)來決定 task 的實際執行順序