# 2016q3 Homework2(phonebook-concurrent) contributed by <`LitSnow`> ## 開發環境 * CPU: Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz * MEM : 8GB * cache: * L1d cache:32K * L1i cache:32K * L2 cache:256K * L3 cache:3072K * Linux version 4.4.0-21-generic ## Concurrency 資料閱讀 * Concurrency v.s Parallelism * Concurrency:2 個任務分配到 1 個CPU核心,在各自取得的時間片段中交互執行 ,這兩個任務可以完全不相關 * Parallelism:2 個任務分配到 2 個CPU核心,同時執行。或是 1 個任務用 2 個CPU核心去執行 * Concurrency必須著重 thread 之間的互動與溝通 ## Code Refactoring * main.c 只 free 了兩個 node ```clike= if (pHead->pNext) free(pHead->pNext); free(pHead); ``` 改成 ```clike= while (pHead != NULL) { e = pHead; pHead = pHead->pNext; free(e); } ``` 掃描所有 node , 將其 free 掉 * main.c 第 3 行和第 7 行可以看出迴圈從 head 指向的下一筆資料開始執行 , 故把這兩行的`->lastName`刪除 ```clike= for (int i = 0; i < THREAD_NUM; i++) { if (i == 0) { pHead = app[i]->pHead->pNext; dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr); } else { etmp->pNext = app[i]->pHead->pNext; dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr); } ...(省略) } ``` 改成 ```clike= for (int i = 0; i < THREAD_NUM; i++) { if (i == 0) { pHead = app[i]->pHead; dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr); } else { etmp->pNext = app[i]->pHead; dprintf("Connect %d head string %s %p\n", i, app[i]->pHead->pNext->lastName, app[i]->ptr); } ...(省略) } ``` ## 範例程式碼 * 測試結果 * thread_num = 1 ![](https://i.imgur.com/XjkygeW.png) * thread_num = 2 ![](https://i.imgur.com/dlf6a58.png) * thread_num = 4 ![](https://i.imgur.com/ReI12Sp.png) * thread_num = 8 ![](https://i.imgur.com/PPIR8tE.png) * thread_num = 16 ![](https://i.imgur.com/tTmpFHB.png) * thread_num = 1024 ![](https://i.imgur.com/IiNRSZo.png) * 分析 * thread 太多導致執行時間更慢,研判是過多的 context switch 造成的 >> 不能只有貼圖,要解釋時間變化怎麼來的,以及你接下來要做什麼。工程人員要解決問題! [name=jserv] ## 參考資料 * [A06: phonebook-concurrent作業說明](https://hackmd.io/s/rJsgh0na) * [Lim Wen Sheng同學共筆](https://hackmd.io/s/rk5IVI0a) * [林哲亙同學共筆](https://hackmd.io/s/rJPYFYRa)