zeddyuu

@zeddyuu

Joined on Feb 18, 2023

  • contributed by < zeddyuu > 開發環境 $ neofetch --stdout zhenyu@zhenyu-HP-Laptop-15s-du2xxx OS: Kubuntu 22.04.1 LTS x86_64 Host: HP Laptop 15s-du2xxx Kernel: 5.15.0-43-generic Uptime: 53 mins Packages: 1993 (dpkg), 7 (snap)
     Like  Bookmark
  • contributed by < zeddyuu > Workqueue 我想在了解 CMWQ 前應該要先了解 Workqueue。 Workqueue 是 Linux kernel 的一種任務執行機制,顧名思義就是由任務所組成的佇列,當需要執行任務的時候會構造一個 work,塞進相應的 workqueue,再由 workqueue 所綁定的 worker (執行緒) 去執行 work。 使用者可以透過 create_workqueue 對 workqueue 進行初始化,核心會分配與 CPU 個數相同的 cpu_workqueue_struct,並為每個 cpu_workqueue_struct 分配一個 kernel thread (worker thread)。 Concurrency Managed Workqueue (CMWQ)
     Like  Bookmark
  • contributed by < zeddyuu > 實驗環境 $ neofetch --stdout zhenyu@zhenyu-HP-Laptop-15s-du2xxx OS: Kubuntu 22.04.1 LTS x86_64 Host: HP Laptop 15s-du2xxx Kernel: 5.15.0-43-generic Uptime: 53 mins Packages: 1993 (dpkg), 7 (snap)
     Like  Bookmark
  • contributed by < zeddyuu > 測驗 1 解釋程式碼運作原理,指出其設計和實作缺失,並予以改進。 程式一開始宣告了名為 block 的結構體來存放 metadata,有 size 代表實際存放的資料大小以及 prev 和 next 指標指向前一個和下一個 block,並且根據硬體架構是 32 bit 或是 64 bit 定義了 word_size 為多少 bytes。 /* The basic data structure describing a free space arena element */ typedef struct block { int size; /**< Size of the data payload */ struct block *prev, *next; /**< Pointer to the previous/next block */
     Like  Bookmark
  • contributed by < zeddyuu > 作業檢討和疑問 TODO 因為自動飲料機而延畢的那一年讀後心得 最近覺得做事情都心不在焉,課程一開始還算認真,放了個連假回來罪惡感很重,感覺都沒有在弄作業,人的惰性真的很恐怖,今天看完〈因為自動飲料機而延畢的那一年〉,感觸很深,覺得能力不夠或是遇到困難沒關係但要保持熱情。 該文作者碰到困難,除了朋友貴人的幫助以外,最重要的是沒有選擇放棄而是堅持到底,如果是我肯定沒辦法為了一個專案而延畢一年,因為害怕失敗帶來的影響,但文中 Jserv 老師有對作者說了一句話 :「你該學習的不是看到事情要完蛋了就去避免失敗,而是應該學習如何處理與承受失敗,你才能變得比以前更強大」,失敗並不可怕,可怕的是沒有勇氣面對失敗並從中學習。 :::warning
     Like  Bookmark
  • contributed by < zeddyuu > 測驗 1 程式碼運作原理 測驗 2 程式碼運作原理 在看 incomplete timsort 時發現程式碼有錯誤,在 151 行通過 if-else 條件篩過後應該要是 cmp(cur, next) == 0 的情況,代表 cur 所指向的值大於 next 所指向的值,接著會用 while 迴圈去找出已經由大到小排序好的區段,但這邊 while 迴圈的條件卻是 next < last && cmp(cur, next) ,代表永遠不會進入迴圈執行。 故應該將此段程式碼改為
     Like  Bookmark
  • contributed by < zeddyuu > 測驗 1 解釋程式碼運作原理 給定一個值,要找下一個 2 的冪,要關注的只有最高位元的 1 在哪個位置,而他的下一高位位元就是答案,所以我們要把低於最高位元的 1 之後的位元都做 set 後加 1,會造成連續進位,最後將二進位轉為十進位即得到答案。 例如 $9_2$ 為 $0..01001$,要關注的位置就是最高位元的 1 出現在哪裡,即右邊數來第四位,而它的下一位元即是答案,對最高位元的 1 以下的位元做 set 操作得到 $0..01111$,再累加 1,得到 $0..10000$,轉成十進位即為答案 16。 所以將最高位元 1 以後的位元做 set 就是此題的重點,現在已知最高位元的 1,那將此值依序右移,最高位元的 1 就會跑到下個位元去,和右移前的值做 OR 就會將下個位元設為 1,直到之後的每個位元都跑過一次即完成操作,此題為 64 位元的 unsigned long long int,所以共要做最多 63 次位移能保證操作完成(最高位 1 在第 64 位元的時候)。
     Like  Bookmark
  • contributed by < zeddyuu > 測驗 1 測驗 2 測驗 3 LFSR 的原理以及 Linux kernel 中的應用案例 LFSR 指的是給定前一狀態的輸出,再將此輸出通過一個線性函數當作下次輸入的移位暫存器,且由於暫存器的狀態是有限的,最終會是一個重複的循環。 在 bash 中下以下指令可以用 commit 訊息關鍵字去搜尋 commit histroy
     Like  Bookmark
  • contributed by < zeddyuu > 測驗 1 static inline int cmpint(const void *p1, const void *p2) { const uint16_t *i1 = (const uint16_t *) p1; const uint16_t *i2 = (const uint16_t *) p2; return *i1 - *i2; } 用以對節點內含值比較的函式,這裡比較特別的是參數的 void * 型態 ,在 你所不知道的C語言:指標篇 內有提到,是為了要讓程式設計者透過顯式轉型避免危險的指標操作。
     Like  Bookmark