1. 程式人生 > >多執行緒與IO密集/CPU密集

多執行緒與IO密集/CPU密集

IO是一個通用的概念,即資料從一個地方移動到另一個地方,對一個實體來說,可以看成資料從外部進入,以及從實體輸出到外部。
具體來說,常見的IO請求有網路IO,磁碟IO。
那麼因為CPU的工作頻率遠遠快過和其連線的外部硬體,例如磁碟,所以CPU在IO的時候經常會需要等待外部硬體完成當前任務,完成之後,才能進行下一個任務,這種情況常常稱為IO阻塞,即CPU直到等待IO操作返回前,不能繼續執行。IO阻塞對於CPU強大的運算能力是一個巨大的浪費。

所以有了多執行緒,多執行緒是同步執行的多個任務。不過由於CPU核數的問題,許多執行緒實際上並不是真正並行而只是通過快速切分時間片來模擬的。簡單來說就是你執行一點,我執行一點,來回切換,創造出一種同時執行任務的假象。

多執行緒的底層機制是由作業系統實現的,當一個執行緒遇到IO阻塞時,例如讀寫檔案,作業系統可能會暫時掛起該執行緒,從而讓其他執行緒優先執行,也就是將多出來的時間片切分給其他的執行緒,直到等待該執行緒的IO操作返回,再重新排程該執行緒執行。

CPU密集

CPU密集的意思是該任務需要大量的運算,而沒有阻塞,CPU一直全速執行。
CPU密集任務只有在真正的多核CPU上才可能得到加速(通過多執行緒),而在單核CPU上,無論你開幾個模擬的多執行緒,該任務都不可能得到加速,因為CPU總的運算能力就那些。

IO密集

IO密集型,即該任務需要大量的IO,即大量的阻塞。在單執行緒上執行IO密集型的任務會導致浪費大量的CPU運算能力浪費在等待。所以在IO密集型任務中使用多執行緒可以大大的加速程式執行,即時在單核CPU上,這種加速主要就是利用了被浪費掉的阻塞時間。
除了同步IO之外,系統可能還支援非同步IO,即IO不阻塞,對IO裝置發出讀寫命令之後立即返回執行下一條命令,而IO裝置的返回結果則在將來未知的某個時間點通過訊號來回調。這也是nodeJS底層的實現機制。