![多個子進程是否使用多個核心?](https://rvso.com/image/1609692/%E5%A4%9A%E5%80%8B%E5%AD%90%E9%80%B2%E7%A8%8B%E6%98%AF%E5%90%A6%E4%BD%BF%E7%94%A8%E5%A4%9A%E5%80%8B%E6%A0%B8%E5%BF%83%EF%BC%9F.png)
我有一個問題,它基本上是在探索一些利用機器上所有核心的懶惰方法。
假設我有一個程式“./theprogram”,它作用於資料集 D,是“令人尷尬的並行”,並採用命令列參數 j,該參數在由 j 確定的資料集子集上執行該程式。
然後假設在我的終端機中運行命令
./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &
現在我已經為 j1、j2、... jfinal 產生了子進程
我的問題:假設我有現代的unix系統(例如在多核心晶片上運行的最新Mac OS X)
那麼進程會分別分佈在所有核心上嗎?即我正在利用我所有的核心?
答案1
理論上是的。
作業系統將任務調度到未使用的 CPU 核心。它知道核心何時未使用,因為它只是取消了其中的任務安排。
您的進程在其結構中將有一個標誌,表示它是否正在等待輸入(磁碟、鍵盤、滑鼠等),因此如果它不等待任何這些事情,那麼它是可調度的。
對於每個核心,作業系統基本上都會運行其可調度任務清單並安排它們。這些任務將在核心上獲得一段時間,然後再次掛起,以便作業系統可以查看是否其他需要運行進程。
如果不需要運行其他進程,那麼您的進程仍將位於列表頂部並再次運行。
自然的效果是,只要管理開銷很小,您的 CPU 將得到充分利用,假設您的進程沒有互相阻塞或花費大量時間等待磁碟存取。
您可以使用任何具有可並行資料的多執行緒應用程式對此進行測試。視訊編碼和資料壓縮是這種並行性能夠發揮作用的兩種情況。
Handbrake 是一種基於 CPU 的視訊編碼器(最近也支援 GPU),可以使用任意數量的 CPU 核心,並透過這樣做實現高水準的速度提升。許多視訊編碼器可以充分利用多核心。 x.264 和其他編碼器也支援多執行緒。
7-Zip 是一個壓縮程序,它還可以在其 LZMA2 演算法中利用多執行緒來加速壓縮。壓縮字典的建構是一個合理的共享過程,一旦你有了字典,實際的壓縮就「簡單」地可以並行化。
答案2
為了進行多處理,您必須選擇遵循以下原則的程式碼部分:
- 不能依賴以前的結果
- 不需要以特定順序執行
- 不會返回程式碼中稍後需要存取的任何內容
因此,據我所知,您應該能夠使用多核心。