contribute by <bobsonlin
>
先從main.c作為理解程式的開頭吧!
在讀word.txt前,我們必須將word.txt做對齊,原因是若沒將word.txt裡的每個字串做長度的對齊,在將字串投射至memory時,我們會不知道該如何移動pointer才會指到下一個字串。
file_align(), fsize()是此程式作者自己寫的function,定義在file.c
我們用open()來得到word.txt的file descriptor,是為了將來的mmap()
到此處我們需先停一下,解釋現在的狀況:
此函式的for loop內在做兩件事
當4個thread append完字典檔裡的所有字後,會執行下方的程式
此程式目的是將4個thread所建立的append list串接起來,形成一個大list,以供之後的findname使用
之後的程式碼就沒做太多修改,findname的整體方式也沒有變(還是有小修改,詳見video),就是在entry_pool裡的逐一比對每個entry內的lastname
此程式碼有一個很明顯的錯誤,在main.c的第105行程式裡:
ps.為了完整性,我在此附上整個片斷的程式
此處很明顯看到,pHead被assign給app[0]的第二個entry的位址(跳過了第一個entry),所以之後的findName函式是無法找到word.txt裡的第一個lastname。除此之外,觀察程式中的etmp可以發現,thread 1所建立的append list的尾端式連接到thread 2的append list的第二個entry,同理thread 3, thread 4。所以透過findName是找不到word.txt的第二個lastname。
解決方法為
thread 2:
thread 4:
thread 6:
thread 8:
由上方的結果發現,兩個thread的效果最好
1.修改fgets讓append()執行時間縮短 – 已完成[10/2],記錄在A01: phonebook
記得附上超連結,以利日後追蹤 jserv
已附上! 林伯陞
2.理解phonebook-concurrent的程式 - 已完成 [10/4]
3.程式驗證,附上結果的圖表 - 已完成[10/4]
這樣的圖表沒有比較價值,重新製作!針對 append() 並調整 Y 軸和測試次數,一如 compute-pi 和 clz 的作法 jserv
4.理解thread變多但速度變慢的原因,以及sync/ansyc
拿出 perf 來分析! jserv
bobsonlin