1、CPU時間分片、多線程?
如果線程數不多於CPU核心數,會把各個線程都分配一個核心,不需分片,而當線程數多於CPU核心數時才會分片。
2、並發和並行的區別
並發:當有多個線程在操作時,如果系統只有一個CPU,把CPU運行時間划分成若干個時間片,分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀態。這種方式我們稱之為並發(Concurrent)。並發=間隔發生
並行:當系統有一個以上CPU時,則線程的操作有可能非並發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。 並行=同時進行
區別:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔內發生。
並行是同時做多件事情。
並發表示同時發生了多件事情,通過時間片切換,哪怕只有單一的核心,也可以實現“同時做多件事情”這個效果。
根據底層是否有多處理器,並發與並行是可以等效的,這並不是兩個互斥的概念。
舉個我們開發中會遇到的例子,我們說資源請求並發數達到了1萬。這里的意思是有1萬個請求同時過來了。但是這里很明顯不可能真正的同時去處理這1萬個請求的吧!
如果這台機器的處理器有4個核心,不考慮超線程,那么我們認為同時會有4個線程在跑。也就是說,並發訪問數是1萬,而底層真實的並行處理的請求數是4。
如果並發數小一些只有4的話,又或者你的機器牛逼有1萬個核心,那並發在這里和並行一個效果。
也就是說,並發可以是虛擬的同時執行,也可以是真的同時執行。而並行的意思是真的同時執行。
結論是:並行是我們物理時空觀下的同時執行,而並發則是操作系統用線程這個模型抽象之后站在線程的視角上看到的“同時”執行。