Try   HackMD

2016q3 Homework2(phonebook-concurrent)

contributed by <LitSnow>

開發環境

  • CPU: Intel® Core 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

if (pHead->pNext) free(pHead->pNext); free(pHead);

改成

while (pHead != NULL) { e = pHead; pHead = pHead->pNext; free(e); }

掃描所有 node , 將其 free 掉

  • main.c

第 3 行和第 7 行可以看出迴圈從 head 指向的下一筆資料開始執行 , 故把這兩行的->lastName刪除

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); } ...(省略) }

改成

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

    • thread_num = 2

    • thread_num = 4

    • thread_num = 8

    • thread_num = 16

    • thread_num = 1024

  • 分析
    • thread 太多導致執行時間更慢,研判是過多的 context switch 造成的

不能只有貼圖,要解釋時間變化怎麼來的,以及你接下來要做什麼。工程人員要解決問題! jserv

參考資料