Re: 不相干的程式做multi-thread有幫助嗎?
※ 引述《CharArray (char[])》之銘言:
: ※ 引述《ggg12345 (ggg)》之銘言:
: : 如果有兩個完全不相干的 thread (片段程式)要執行, 沒有相互干擾的
: : overhead 的辦法就是分開在兩部實體完全獨立無關的電腦上跑. 但稱為
: : multi-thread 卻是指在同一部電腦上跑. 這部電腦是多組 register set
: : 的 RISC , 還是多個 functional pipeline unit , 還是多個 program
: : counter 的多核, 甚至是共用 bus 及記憶體的多處理機系統. 在實體上
: : 就有不同程度的共用硬體資源成份. 有了共用資源, 自然就會有互斥使用
: : 的這一類型同步問題. 即使沒有互斥同步也會有共用部份有限的 register
: : 與 cache 問題. 一旦是不考量同步的任意交錯輪換使用, 就會有 save/
: : restore 問題, 不必要的 save/restore 也就是一種 overhead ! 打斷
: : prefetch 與 pipleline buffer 也是另一種 overhead.
: 我最核心的問題是,硬把2個不相干的multi-process轉成multi-thread的overhead
: 但在只有一台實體電腦的狀況下,上述的情形在multi-process也都存在,
: 甚至更多,那為什麼還算overhead呢?
========
Multi-process 的 context switch 就是系統在虛擬出兩個以上的 (processor
+ memory + file system)時, 必須付出的由 OS 制式切換的代價(overhead).
User Level 的 multi-thread 則是配合硬體有兩套以上的 register set 與
functional pipeline unit , 但改由user program 自行由 user 針對使用狀
況自行簡化, 去減少 context switch overhead.
由 compiler 與 library API 支援的 multi-thread 在啟動與切換 thread
時就是讓不同 thread 使用不同的 register set. 在共用 process memory
space 與工作環境的假設下, user program 的 threads 間不會自尋煩惱的相互
干擾, 因此就不必類似 multi-process 般的做此制式 save/restore 動作. 而
使用不同組的 register set, 當然更是不必全做存回 memory 的 save/restore
動作, 此類 overhead 就省了.
Multi-thread program 通常寫成同一份的 program 給 compiler 編譯, 同
時指明要使用 thread 特性, 此時 compiler 就可細查會相互干擾的 register
有那些, 在切換時就可只針對會干擾到的 register 做最有效的暫存與還原.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.4.12
推
11/12 10:24, , 1F
11/12 10:24, 1F
→
11/12 10:24, , 2F
11/12 10:24, 2F
推
11/12 10:39, , 3F
11/12 10:39, 3F
→
11/12 10:39, , 4F
11/12 10:39, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 9 之 15 篇):