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

User/gyes00205

gyes00205(許嘉倫)

簡介:

  • 成功大學 資訊工程學系110級

Github: gyes00205

2021 linux 核心設計 春季班 自我評量

(春季班)課堂作業

(春季班)期末專題

(春季班)學期回顧

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

    如果 x 為有號數, y 為無號數,在 x < y 的情況下, x 會轉換為無號數。

    • x = -1, y = 0
      • x - y < 0 為 True
      • x < y 為 False ,因為此時的 x 會視為無號數相當於 \(2^{32} - 1\)
  2. 知道如何寫出時間複雜度和空間複雜度皆為 O(1) 的 abs64 嗎?(沒有分支) 這樣的 abs64 又可用於真實世界哪邊?

#include <stdint.h>
int64_t abs(int64_t x) {
        int64_t mask = (x >> 63);
        return (x + mask) ^ mask;
}

這邊的位移方式採用 Arithmetic shift (算數位移) * 如果 x 為正數 >> 63 會得到 0x0000000000000000 => 0 * (x + mask) ^ mask 會等於 x * 如果 x 為負數 >> 63 會得到 0xFFFFFFFFFFFFFFFF => -1 * (x + mask) ^ mask 相當於 ~(x - 1)

  • 可以應用資訊安全領域(時序攻擊),如果有分支的話會導致執行時間的不一致
    • 像是在輸入密碼時,如果錯誤密碼與正確密碼存在時間差,那麼駭客就可以從這時間差推測是第幾個字輸入錯誤。
  1. 本學期課程內容中,讓你印象最深刻、顛覆過往認知的部分是什麼?請舉例說明

    最讓我印象深刻的部分是第一個禮拜所教的內容 pointer to pointer ,雖然在大一的時候就有學過,但那時聽不太懂,剛好作業的部分也沒有使用到,因此自己就草草帶過,沒想到在大四的時候又遇到這個問題。在 quiz1 有一個 list_free function ,因為當時還不太了解 pointer to pointer 的使用時機,所以一開始寫的版本如下。

    static void list_free(node_t **list) {
         while (*list) {
             node_t *tmp = *list;
             list = &((*list)->next);
             free(tmp);
         }
    }

    之後與老師一對一討論時提出這個問題,才得知原來只有在更改 linked list 的指標時, pointer to pointer 的技巧才有存在的必要,如果要釋放記憶體內容用一個 pointer 就好,解決方法如下

    static void list_free(node_t *list) {
         while (list) {
             node_t *tmp = list;
             list = list->next;
             free(tmp);
         }
    }

(春季班)所見所聞心得

這學期初老師上課有提到,每個禮拜至少花20小時的時間在這門課上,因為前幾個禮拜其他科目都還沒出作業,所以我確實有達到這項要求,但隨著時間的推移,其他科目陸續指派功課花在這門課的時間也越來越少,但最後還是選擇留下來,因為我認為 Linux 核心設計 這門課可以讓我了解到自己的不足,雖然已經讀到大四快畢業,但這時候才了解到 pointer to pointer 的使用方式與技巧。此外大三學過的作業系統概念到了這門課還是會反覆提起,有一次上課時老師走到我旁邊問我生產者消費者問題,但那時的我早已忘光光,因此回答不上來。

如果有人問我說在這門課有學到甚麼?那麼應該是 bitwise operation 的操作吧,像是沒有分支版本的abs以及判斷正數負數的方法,都是在這門課學到的,原本的想法可能就是用if-else來判斷正負數,沒想過可以用bitwise operation來達到沒有分支的版本。

(春季班)自我評量

這堂課我給自己 7 分。