分享到plurk 分享到twitter 分享到facebook

版本 7ada7d41f44f17a510738ca64be08ea6d294f647

User/XDEv11

XDEv11 (陳舜寧)

個人簡介

  • 國立成功大學資訊工程學系學士班(2018~)

Linux Kernel Internals 2021 春季班

問題選答 (回顧內容)

  • (a. 知道 x - y < 0 敘述為何不能寫為 x < y 嗎? (CS:APP 第 2 章)

    • x - y 有可能會發生整數溢位,前後者結果並不一定相等。
  • (d. 知道 Linux 核心 < include/linux/list.h> 裡頭 #define list_for_each_prev(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev) 這樣的巨集到底在做什麼?以及 head 使用時需要加小括號,為何?

    • Linux list 是一個雙向鏈結串列,給定一個位置當起始點 (head),會從起始點的前一個位置一直繞一圈。

    • head 有可能不只是一個變數,因為 list_for_each_prev 為巨集,為了確保 head 先被計算,所以加上小括號。

  • (h. 知道如何寫出時間複雜度和空間複雜度皆為 O(1) 的 abs64 嗎?(沒有分支) 這樣的 abs64 又可用於真實世界哪邊?

    • x 為負數時,進行算術位移往右 63 位元,得到二進位階為 1 的數字 (-1),透過 bitwise XOR (^),可將 x 反轉,(~x + 1) 即為正數。

    • x 為正數時,沒有任何影響。

    • 沒有分支的實作,可以避免旁路攻擊 (side-channel attack)。

long long abs64(long long x)
{
    long long m = x >> 63;
    return (x ^ m) - m;
}

課程專題

  • sehttpd

  • 共筆

  • 研究內容

    • Socket
    • IO
      • epoll
      • io_uring
    • Timer
      • priority queue (binary heap)
      • timing wheels

自我評量分數

  • 43 / 50