contributed by <vtim9907
>
觀賞 課程影片 和研讀 Toward Concurrency
其中上面 lock-free 連結的文章也提到,一般並不會期望整個程式都應用 lock-free 技術,而是應該仔細洞察眼前的案例,針對案例的特性去找出可以應用的地方下手改進。
pthread_join : 因為每個 thread 的執行時間不一,有的快有的慢,所以整體時間還是以最慢的為準,快的還是要等慢的。
根據作業提供的分析,最後結論在於不知道為什麼 thread 的數量在超過 4 之後,執行時間就會增長不少。
感覺作業系統要重念了…
在 Operating Systems 裡看到了 kernel thread 和 processor 數量的關係:
這樣來看就稍微清楚一點,而 kernel thread 也是有 one-to-one, one-to-many, many-to-many 這些關係,一個 kernel thread 也是掌控一個或是多個 user thread ,若是多個,則多個 user thread 輪流執行。
由於實在無法確定 thread 運作情況,以本案例來說,我也不確定 thread 更多的時候,效能到底移動多少,因為數據都是單筆資料,在每次執行都會浮動的數字來說,還是用大數來看比較好判斷!
改變 THREAD_NUM 的值,每個做 4200 次,然後看結果
THREAD_NUM = 4
THREAD_NUM = 8
append 的時間整體來看,其實與 THREAD_NUM = 4 的時候差不多,但 findName 的時間卻提昇了兩倍!?
這次 append 的時間就提昇的比較明顯了,大約比上面兩種效能都差了 1/3 左右, 但是 findName 的時間卻又掉回來 0.002s 左右? 我原本預期是當 thread 開到超過某個閥值之後,開越多效能就越慢,但是 findName 變慢又變快的狀況是怎樣還要思考一下…
在上面的過程中,我另外看了 System Monitor ,觀察 CPU 運作情形,不過其實每次跑的情況都差不多,每顆 CPU 資源消耗的差不多,但 THREAD_NUM = 8 的時後,某次跑出現了滿特殊的情況:
第一次跑
難道是 kernel thread 有可能都對應到同一顆 CPU!?
必須確定 pthread_create 出來的 thread 是什麼東西!?
這樣來看,上面詭異的例子有可能真的是因為 kernel thread 都對應到同一顆 cpu 嘛!? 但是應該是全部的 CPU 去 swap in/out 全部的 kernel thread 吧? 那怎麼會出現只有一顆 CPU 特別忙碌的狀況? 目前還不確定原因,實驗作法錯誤有可能,但是因為什麼都沒改跑了好幾次,就只有特定那次發生這樣的狀況,雖然說跑出來的數據正常,但是跑得過程為何怪異就要再想想…