contributed by < YiChiChao >
1
2
2
在當前的程式中,hhead[] 的大小和快取的最大存量等大。我修改 lRUCacheCreate
的參數,將 hhead
的大小和 capacity
作區隔,去測試觀察看縮減 hash table 的大小對搜尋時間的影響。
單就 cache capacity = 1000 的情形來觀察,hlist 的大小在500之後趨於平緩,可認 hlist 的大小設定宜做調整。
參考 Linux 核心的 hash table 實作 將 hash function 改以 Multiplication Method 計算,從搜尋時間來看並無太大的差異。
4
internal
是紀錄當前時間之計算出的factor
的定義我不清楚作用,按照老師給的註解,是用於對 internal
數值的縮放weight
為 EWMA 中的衰變率,從後面的程式碼回推weight
和 公式中 的關係為 將函式拆解會變成這樣
為了在程式碼中用shift來實現除法運算,程式碼加了對 factor
以及 weight
必須是2的冪的限制。將 用 替代。
再將 提出,以 >> weight
表示。
在 drivers/net/virtio_net.c 透過 DECLARE_EWMA(pkt_len, 0, 64)
來定義一個結構體 struct ewma_pkt_len
來利用 EWMA 調整 mergeable receive buffer 的封包大小。
執行時,透過 gdb 觀察:
POSIX.1-2017, "References to unmapped addresses shall result in a SIGSEGV signal."
不要參照中文 Wikipedia,其資訊通常過時,參照 IEEE / Open Group 的 POSIX 規範文件。
了解YiChi Chao
當在使用遮罩取最後兩位以外的位元後,由於取得的指標未初始化,在此情況下對指標取值 (*(uint32_t*)
),為無效的記憶體訪問 。
即使此強置轉型沒有 SIGSEGV
報錯,這個取值在此程式中也不合理。
改進方式是直接將 csrc & 0xfffffffc
強置轉型為 (uint32_t)
中文和英文字元之間要有空白字元 (對排版和文字搜尋有利)
IEEE 754, Assume float is 32-bit
TODO: 實作程式碼並解釋
實作程式碼:445afd8
按照 IEEE-754 對浮點數的表示方法:
在不使用除法和乘法的前提下,透過位元操作將 exponent
的數值減一便能完成浮點數除以二的運算。
首先透過位元遮罩將 exponent
的部份單獨取出,
並且將 calculate
中的 exponent 部份先清零:
再來將 exponent
部份減一,也就是對此浮點數表示方式減 0x800000
:
最後將 calculate
和計算好之 exponent
OR 在一起。
值得注意的部份,在 IEEE-754 對特定數值有特例的表示方法,像是 INF
的表示為 exponent
全為一,mantissa
全為 0 。在測試我寫的函式是否正確時,發現當輸入值為 0 時,運算出的結果為 INF
。
所以在函式中單獨對 0 作判斷。
參考資料:IEEE-754 與浮點數運算
TODO: quiz3+quiz4