contributed by < void110916
>
queue.[ch]
和連帶的檔案,測試後用 Git 管理各項修改,要能滿足 $ make test
自動評分系統的所有項目。
queue.c
實做lab0-c
專案,比較你自己實作的 merge sort 和 Linux 核心程式碼之間效能落差qtest
提供新的命令 shuffle
,允許藉由 Fisher–Yates shuffle 演算法,對佇列中所有節點進行洗牌 (shuffle) 操作qtest
提供新的命令 web
,提供 web 伺服器功能,注意: web 伺服器運作過程中,qtest
仍可接受其他命令
qtest
執行過程中的錯誤
qtest
再於命令提示列輸入 help
命令,會使 開啟 Address Sanitizer 觸發錯誤,應予以排除qtest
實作的記憶體錯誤,並透過 Massif 視覺化 "simulation" 過程中的記憶體使用量,需要設計對應的實驗Linux 核心原始程式碼巨集: container_of: 如何取得該子結構的父結構
問題連結:記憶體釋放錯誤
修正後程式:
問題連結:記憶體釋放錯誤
修正後程式:
問題連結:記憶體釋放錯誤
由 man strlen
的敘述:
The strlen() function calculates the length of the string pointed to by
s, excluding the terminating null byte ('\0').
strlen 回傳的值不包含'\0',因此要先將長度值加一再動作。
修正後程式:
問題連結:記憶體釋放錯誤
修正後程式:
程式內使用到的遞迴幾乎等效於 list_for_each_entry_safe ,但是因為 list_for_each_entry_safe 的條件判斷是判斷 entry 而非 safe ,以至於最後會對 head 取 entry 並造成 segement fault。
該位置為 q_insert_tail 及 q_insert_head 的 return 位置,不知道為何導致 git 無法 commit 成功。
這裡指的 memory leak 是記憶體洩漏那個 memory leak 嗎?
是的,你應該追蹤「完整」的程式碼,而非只注視單一函式。
此處有兩個問題:
確定能從該位置取得字串,但不確定為何無法釋放。
測試後得知,在 harness.h
中, malloc 、 free 、 strdup 被重新撰寫以追蹤記憶體配置,因此此作業在動態記憶體配置上只能用此三個函式,無法使用像 calloc 、 strndup 等函式。
q_remove_head 及 q_remove_tail函式幾乎一樣,差別只在移除 head 前面的還是後面的 list ,但是在跑 trace-17 的測試時 q_remove_tail 有機率無法通過。
並且,不管字串複製是使用 memcpy 還是 strncpy ,在轉譯後的組語是完全一樣的。
目前觀測到在測量 q_remove_tail 時會發生執行核心交換的情況( ex. 原本在 cpu0 執行,但是跑到一半變成 cpu12 執行 ),當發生時,便會發生測量時間非常數的錯誤。