contributed by < jwang0306
>
題目的敘述有一段 insert_node
的程式碼:
void insert_node(list **l, int d) {
list *tmp = malloc(sizeof(list));
tmp->data = d;
if (!(*l)) {
tmp->addr = NULL;
} else {
(*l)->addr = XOR(tmp, (*l)->addr);
tmp->addr = *l;
}
*l = tmp;
}
上課時我被問到這個是插在 list 的頭還是尾巴,印象中我只有回答其中一個,但是後來仔細思忖,答案是頭尾都可以,端看參數 list **l
給的是頭還是尾。
已知 XOR 的運算特性:
走訪 list 的方式為當前節點與前一個節點取 XOR ,假設節點 1, 2, 3, 4 ,當前節點在 1 :
1 2 3 4
data HAT CAT EAT BAT
link(1) XOR 0
= (0 XOR 2) XOR 0
= 2
(根據特性二)FAT
到尾巴的話,如果 list 為空,直接 *l = tmp
,前後都沒人因此 addr
為 NULL
link(4) XOR 0
,因此取 XOR(tmp, (*l)->addr);
, 0 XOR link(4)
= link(4)
(根據特性一),然後將其更新為 l
的當前 addr
,這樣就清出了一個新的空間tmp
放進去list *sort(list *start)
{
if (!start || !start->addr)
return start;
/* split the list recursively */
list *left = start, *right = start->addr;
left->addr = NULL;
right->addr = XOR(right->addr, left);
left = sort(left);
right = sort(right);
/* merge the list recursively */
for (list *merge = NULL; left || right;) {
if (!right || (left && left->data < right->data)) {
list *next = left->addr;
if (next)
next->addr = XOR(left, next->addr);
if (!merge) {
start = merge = left;
merge->addr = NULL;
} else {
merge->addr = XOR(merge->addr, left);
left->addr = merge;
merge = left;
}
left = next;
} else {
list *next = right->addr;
if (next)
next->addr = XOR(right, next->addr);
if (!merge) {
start = merge = right;
merge->addr = merge;
} else {
merge->addr = XOR(merge->addr, right);
right->addr = RR2;
merge = right;
}
right = next;
}
}
return start;
}
上述的 XOR linked-list 用了類似 merge sort 的手法,不斷地切割 list ,最後拼裝起來:
next
走向下一個節點merge
為空,因此根據大小設定為 left
或 right
,addr
為 NULL
left
接上(假設為 left
), 與上述走訪的概念一樣, merge->addr = XOR(merge->addr, left);
(merge
就像上方 insert_node
的 l
) ,並將 left->addr
更新為 0 XOR mege
也就是 merge
(根據特性一),最後將 left
放進 merge
contributed by < jwang0306 > 基本上,這是接續 sehttpd 作業的更進一步研究。 效能測量工具 首先選擇一個好的測量工具是必須的。 apache bench 用法: ab -n 100000 -c 500 -k http://127.0.0.1:8081/
Sep 15, 2021contributed by < jwang0306 > 作業要求 GitHub 自我檢查清單 [ ] 在 高效能 Web 伺服器開發 提到 epoll 的兩種工作模式 (level trigger vs. edge trigger),對照 seHTTPd 原始程式碼,解釋 epoll 工作模式的設定和在 web 伺服器實作的考量點 $\to$ 搭配程式碼實驗並說明 提示: 參考實驗程式碼: test_epoll_lt_and_et
May 23, 2020contributed by < jwang0306 > 作業要求 GitHub 自我檢查清單 [ ] 參照 fibdrv 作業說明 裡頭的「Linux 核心模組掛載機制」一節,解釋 $ sudo insmod khttpd.ko port=1999 這命令是如何讓 port=1999 傳遞到核心,作為核心模組初始化的參數呢? [ ] 參照 CS:APP 第 11 章,給定的 kHTTPd 和書中的 web 伺服器有哪些流程是一致?又有什麼是你認為 kHTTPd 可改進的部分? [ ] htstress.c 用到 epoll 系統呼叫,其作用為何?這樣的 HTTP 效能分析工具原理為何?
Apr 12, 2020contributed by < jwang0306 > 作業要求 GitHub 自我檢查清單 [ ] 研讀上述 Linux 效能分析的提示描述,在自己的實體電腦運作 GNU/Linux,做好必要的設定和準備工作 $\rightarrow$ 從中也該理解為何不希望在虛擬機器中進行實驗; [x] 研讀上述費氏數列相關材料 (包含論文),摘錄關鍵手法,並思考 clz / ctz 一類的指令對 Fibonacci 數運算的幫助。請列出關鍵程式碼並解說
Mar 22, 2020or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up