# 2017q1 Homework4 (phonebook-concurrent)
###### tags:`zhanyangch` `sysprog2017` `week4`
## 執行環境
```
Architecture: x86_64
CPU 作業模式: 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
每核心執行緒數: 2
每通訊端核心數: 2
Socket(s): 1
NUMA 節點: 1
供應商識別號: GenuineIntel
CPU 家族: 6
型號: 42
Model name: Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
製程: 7
CPU MHz: 855.421
CPU max MHz: 3500.0000
CPU min MHz: 800.0000
BogoMIPS: 5587.06
虛擬: VT-x
L1d 快取: 32K
L1i 快取: 32K
L2 快取: 256K
L3 快取: 4096K
NUMA node0 CPU(s): 0-3
```
## 執行

* 可以發現 append 的時間大幅度的縮短
* THREAD_NUM 為 4 但加速不只 4 倍,除了concurrent 還用了其他優化手段,測試不同 THREAD_NUM 下的時間。
## 分析
* text_align 將每一行的長度調整為相同大小,長度不足的部份填入 '\0',長度超過的部份則去除並出現警告。
> append 所花費的時間沒有算入 text_align,是否造成實際執行跟測量有時間的差異
>> execution time of align : 0.090644 sec,平均 align 一行需要 0.090644/349900=0.000000259 sec,幾乎可以忽略。
* O_NONBLOCK 以 nonblock 的方式開起檔案
* mmap 將檔案內容映射到記憶體上,用記憶體的讀寫取代較緩慢的I/O
* entry_pool 先配置一大塊記憶體減少重複呼叫 malloc 所需要的時間
* append 每個 thread 先建立部份的 list 最後合併為一個
## 不同 THREAD_NUM 對 append 的影響
* 1 到 4 個 thread 對於 append 差異不大,超過 4 個 thread 反而會提高執行時間。
* 影響執行時間的主因不是 thread 數目,memory pool 和 mmap 的影響比較大。
* 彥寬的實驗中提到可以改為async

## 加入 thread pool
* 如果是因為每個 thread 完成的時間不同,造成要等慢的 thread,可以將工作切分的更細,提早做完的 thread 可以拿到新的工作。
* 使用 [mergesort-concurrent](https://hackmd.io/s/B1xV_p_jl#) 的 thread pool 實做
* 在 THREAD_NUM=4 下調整不同的 TASK_NUM

* 用 thread pool,不論在切割多少 task 下,皆比不用thread pool 表現差,可能的原因為 task quene 的 push 和 pop 比想像中的花時間
* findName 的有趣現象:在不同的 TASK_NUM 下呈現震盪,後來發現在原本的版本中修改 THREAD_NUM,也會發生類似情形
> 用 memory pool 的影響?需在仔細探討
