CPU核數跟多線程的關係

一直以來有這樣的疑惑,單核CPU適合多線程嗎?是不是幾個核的CPU開幾個線程是最合適的?

今天就這一問題查了一些資料,現整理如下:

    要說多線程就離不開進程,進程和線程的區別在這裏就不詳細說了,只將關鍵的幾點:

a)進程之間是相互獨立的,不共享內存和數據,線程之間的內存和數據是公用的,每個線程只有自己的一組CPU指令、寄存器和堆棧,對於線程來說只有CPU裏的東西是自己獨享的,程序中的其他東西都是跟同一個進程裏的其他線程共享的。

b)操作系統創建進程時要分配好多外部資源,所以開銷大。(這個跟操作系統有關,有人做過實驗,window創建進程的開銷大,linux創建進程的開銷就很小。)

    再來說一下CPU,在過去單CPU時代,單任務在一個時間點只能執行單一程序。之後發展到多任務階段,計算機能在同一時間點並行執行多任務或多進程。雖然並不是真正意義上的“同一時間點”,而是多個任務或進程共享一個CPU,並交由操作系統來完成多任務間對CPU的運行切換,以使得每個任務都有機會獲得一定的時間片運行。而現在多核CPU的情況下,同一時間點可以執行多個任務,具體到這個任務在CPU哪個核上運行,這個就跟操作系統和CPU本身的設計相關了。

    我們假設一個極端的情況:在一臺單核計算機上只運行2個程序,一個是我們的程序A,另一個是操作系統的程序B,每個程序是一個進程。單核CPU的時候,A和B在CPU上交替運行,具體的分配方式由操作系統來判斷,我這裏猜測應該跟A和B的線程數有關,因爲線程是CPU級別的,如果A有5個線程,B也有5個線程,那麼CPU分配給A和B的時間應該是1:1的;如果A增加到15個線程,CPU分配給A和B的時間應該是3:1的比例。所以此時如果A的線程數多,那麼獲得的CPU執行次數就多,處理的速度也就快了。以上假設的前提是:①A和B的優先級相同,②A和B都是隻消耗CPU資源的程序。

如果相同的情況用一個雙核的計算機來處理又會是什麼結果呢?假設這個雙核的計算機和操作系統比較傻,把A進程分配到核1上,B進程分配到核2上,那不管A有幾個線程,都是用核1來處理,那麼時間肯定是一樣的。不過現實中應該不會有這麼傻的CPU和操作系統吧。偷笑所以趕緊還是會根據線程來進行處理,當A的線程比B多時,會佔用核2來處理A的線程。

    剛纔說的是隻消耗CPU資源的程序,但這樣的程序在實際應用中基本上是沒有的,總會有跟資源打交道的。比如讀個文件,查個數據庫,訪問一個網絡連接等等。這個時候多線程才真正體現出優勢,在一個進程中,線程a去讀文件,線程b去查數據庫,線程c去訪問網絡,a先用一下CPU,然後去讀文件,此時CPU空閒,b就用一下,然後去查數據庫,……,相對於讀文件、查數據庫、訪問網絡來說CPU計算的時間幾乎可以忽略不計,所以多線程實際上是計算機多種資源的並行運用,跟CPU有幾個核心是沒什麼關係的。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章