# 2025q1 Homework1 (lab0) contributed by < `eastWillow` > {%hackmd NrmQUGbRQWemgwPfhzXj6g %} ## 開發環境 ```shell $ uname -a Linux jens 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux $ gcc --version gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 48 bits physical, 48 bits virtual Byte Order: Little Endian CPU(s): 16 On-line CPU(s) list: 0-15 Vendor ID: AuthenticAMD Model name: AMD Ryzen 7 7800X3D 8-Core Processor CPU family: 25 Model: 97 Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 1 Stepping: 2 CPU max MHz: 5050.0000 CPU min MHz: 545.0000 BogoMIPS: 8399.99 ``` ## 閱讀 driver.py 了解成績標準 針對執行順序與檢查的項目來寫作業,要把時間花在刀口上,卡超過2 天就參考同學的寫法 單獨執行檢查分數的指令`scripts/driver.py -c` ## trace-01-ops.cmd ### q_new > commit [1acccae](https://github.com/eastWillow/lab0-c/commit/1acccae7ac89fb753e764ffec1da813e2e139d38) 參考第一周作業 ### q_insert_head > commit [c01a625](https://github.com/eastWillow/lab0-c/commit/c01a62591e079ea581720af9273f4154a0448072) 發現 string.h 當中原來有 strdup 可以直接使用 練習都使用 `$ man strdup` 當記憶體無法成功配置的時候會回傳 NULL 根據前面的作業練習,要考慮這些fail 的情境 因為還有發現malloc 失敗的比例是可以設定的,代表這件事情很重要,先放在心上 ### q_remove_head > commit [96d8835](https://github.com/eastWillow/lab0-c/commit/96d8835b9206c13538e8c16d03782db81fb2cea7) 想了一陣子發現一個關鍵第一個節點當作head ,必須是第二個節點以後才能使用`list_entry` 附上Debug 用的表達式 `(element_t*)((char*)head->next - (sizeof(element_t) - sizeof(struct list_head)))` ### q_free 隱藏關卡,這一題沒有寫qtest 會跳錯誤 ERROR: Freed queue, but 1 blocks are still allocated ### q_insert_tail (do_it) 參考 q_insert_head ### q_size ## trace-02-ops.cmd ### q_remove_tail (do_rt) 參考 q_remove_head, 因為是circular linkage list, 直接使用 head->prev ### q_delete_mid (do_dm) [n / 2]th node from the start using 0-based indexing 驗算一下公式 $$ \begin{split} i_middle &= \frac{n_{size}}{2} \\ [0, 1] ,\ n_{size} = 2,\ i &= 1, \text{result is} [1] \\ [0, 1, 2, 3, 4],\ n_{size} = 5,\ i &= 2, \text{result is} [2] \\ [0, 1, 2, 3],\ n_{size} = 4,\ i &= 2, \text{result is} [2] \\ \end{split} $$ ## trace-03-ops.cmd ### q_sort (do_sort) `$ man strcmp` > strcmp, strncmp - compare two strings > `int strcmp(const char *s1, const char *s2);` > • 0, if the s1 and s2 are equal; > • a negative value if s1 is less than s2; > • a positive value if s1 is greater than s2. descending order is : 5, 4, 3, 2, 1 排列演算法先直接使用第一周作業 [2025 年春季「Linux 核心設計」第 1 週測驗題](/wOuZnVe6Q9ejvhXWGDfJ0Q) 附上當時寫隨堂測驗的心得 [第一週: 誠實面對自己](/Qf67pg3IRUKWPX5QQWKEGg) ### q_merge (do_merge) 這裡傳入的`list_head *head` 是 `&chain.head`,所以看物件的角度要換成chain `(queue_contex_t*)((char*)head->next - (sizeof(queue_contex_t) - sizeof(struct queue_chain_t)))` queue_contex_t *node = list_entry(head->next, queue_contex_t, chain); 拿到第一個queue list_is_singular(&node->chain) 才是代表第一個queue 的head_list *head > 參考 [2025 年 Linux 核心設計課程作業 —— lab0 (E)](/age56DtJQ_uwupRMOt1c5Q) > [你所不知道的 C 語言: linked list 和非連續記憶體](/YA7RMqd6RE2UL8OmmjU9PQ#案例探討-LeetCode-21-Merge-Two-Sorted-Lists) > 參考 Linux 核心原始程式碼的 lib/list_sort.c 當中的Merge 需要注意 sort stability [排序的穩定與不穩定](/qnzUlNwOS-uf4MFWIAkYLQ) 因為卡住超過三天,研究一下其他同學的寫法 > https://hackmd.io/@Charlie1123/linux2025-homework1 merge 的寫法最接近教材 取得第一個 a list `(element_t*)((char*)a->next - (sizeof(element_t) - sizeof(struct list_head)))` 取得第二個 b list `(element_t*)((char*)b->next - (sizeof(element_t) - sizeof(struct list_head)))` #### (gdb) lanuch trace-03-ops.cmd 如果有人想要使用vscode + gdb 可以參考以下這一部的設定,剩下使用vscode 的預設就可以了 ``` "program": "${workspaceFolder}/qtest", "args": [ "-v", "3", "-f", "traces/trace-03-ops.cmd" ], "cwd": "${workspaceFolder}", ``` ### q_reverse (do_reverse) ## trace-04-ops.cmd ### q_swap ## trace-05-ops.cmd ## trace-06-ops.cmd ### q_delete_dup ### q_descend ### q_reverseK ## 代辦 ### Malloc failure probability percent ### 重購 改用 list_is_singular ### sort stability ### 研讀 Linux 核心原始程式碼的 [lib/list_sort.c](https://github.com/torvalds/linux/blob/master/lib/list_sort.c) ### 研讀論文〈Dude, is my code constant time?〉 ### 指出lab0的缺陷或者可改進之處 ### 開啟 Address Sanitizer,修正 qtest 執行過程中的錯誤 ### 運用 Valgrind 排除 qtest 實作的記憶體錯誤 ### 研讀 [2025 年 Linux 核心設計課程作業 —— lab0 (E)](/age56DtJQ_uwupRMOt1c5Q)