簡體   English   中英

Java線程和核心數

[英]Java threads and number of cores

我剛才有一個關於處理器和線程如何工作的快速問題。 根據我目前的理解,核心一次只能執行1個進程。 但是我們能夠生成一個線程池(比方說30),其數量大於我們擁有的核心數量(假設為4)並讓它們同時運行。 如果我們只有4個核心,這怎么可能? 我也可以在我的本地計算機上運行我的30線程程序,並繼續在我的計算機上執行其他活動,如觀看電影或瀏覽互聯網。

我已經讀過某個地方發生了線程調度,並且這種錯誤表明這30個線程由4個內核同時運行。 這是真的,如果是這樣,有人可以解釋這是如何工作的,並建議一些好的閱讀嗎?

提前感謝您的幫助。

進程與線程

在過去的幾天里,每個進程只有一個執行線程 ,因此進程被直接安排到核心上(在過去,幾乎只有一個核心可以安排到)。 但是,在支持線程的操作系統中(幾乎都是現代操作系統),它是線程 ,而不是計划的進程。 因此,對於本討論的其余部分,我們將專門討論線程,您應該了解每個正在運行的進程都有一個或多個執行線程。

並行與並發

當兩個線程並行運行,它們都在同一時間運行。 例如,如果我們有兩個線程A和B,那么它們的並行執行將如下所示:

CPU 1:A ------------------------->

CPU 2:B ------------------------->

當兩個線程同時運行,它們的執行重疊 重疊可以通過以下兩種方式之一發生:線程正在同時執行(即並行,如上所述),或者它們的執行在處理器上交錯,如下所示:

CPU 1:A -----------> B ----------> A -----------> B -------- - >

因此, 出於我們的目的 ,並行性可以被認為是並發的一個特例*

調度

但是我們能夠生成一個線程池(比方說30),其數量大於我們擁有的核心數量(假設為4)並讓它們同時運行。 如果我們只有4個核心,這怎么可能?

在這種情況下,它們可以並發運行,因為CPU調度程序正在為這30個線程中的每一個分配一些CPU時間。 一些線程並行運行(如果你有4個內核,那么任何時候都會有4個線程並行運行),但所有30個線程將同時運行。 之后您可以去玩游戲或瀏覽網頁的原因是這些新線程被添加到線程池/隊列中,並且還分配了CPU時間。

邏輯與物理核心

根據我目前的理解,核心一次只能執行1個進程

這是不完全正確。 由於非常聰明的硬件設計和流水線操作太長而無法進入(加上我不理解),一個物理內核實際上可能同時執行兩個完全不同的執行線程 如果你需要,可以稍微咀嚼那句話 - 它仍然讓我大吃一驚。

這個驚人的壯舉被稱為同時多線程(或普遍的超線程,雖然這是這種技術的特定實例的專有名稱)。 因此,我們有物理內核 ,它們是實際的硬件CPU內核和邏輯內核 ,這是操作系統告訴軟件可以使用的內核數。 邏輯核心本質上是一種抽象。 在典型的現代Intel CPU中,每個物理核心充當兩個邏輯核心。

有誰可以解釋這是如何工作的,並建議一些良好的閱讀?

如果您真的想了解進程,線程和調度如何協同工作,我會推薦操作系統概念

簡而言之,您對核心的理解是正確的。 核心可以一次執行1個線程(也稱為進程)。

但是,您的程序並不是真的一次運行30個線程。 在這30個線程中,一次只運行4個,另外26個正在等待。 CPU將調度線程並為每個線程分配一段時間在核心上運行。 因此CPU將使所有線程輪流運行。

一個常見的誤解:

擁有更多線程將使我的程序運行得更快。

FALSE:擁有更多線程並不總能讓您的程序運行得更快。 它只是意味着CPU必須進行更多的切換,事實上,由於切換所有不同進程所產生的開銷,擁有太多線程會使程序運行速度變慢

Java不執行線程調度 ,它將此保留在操作系統上以執行線程調度。

對於計算密集型任務,建議使線程池大小等於可用核心數。 但對於I / O綁定任務,我們應該有更多的線程。 如果兩種類型的任務都可用且需要CPU時間片,則還有許多其他變體。

核心一次只能執行1個進程

是的,但是他們可以進行多任務處理並產生一種錯覺 ,即他們一次只能處理多個進程

如果我們只有4個核心,這怎么可能? 我也可以在我的本地計算機上運行我的30線程程序,並繼續在我的計算機上執行其他活動

由於多任務 (即並發 ),這是可能的。 假設您啟動了30個線程,OS也運行了50個線程,所有80個線程將通過逐個獲取CPU時間片(每個核心一次一個線程)共享4個CPU核心。 這意味着平均每個核心將同時運行80/4 = 20個線程。 您會感覺所有線程/進程同時運行。

有誰可以解釋這是如何工作的

所有這些都發生在操作系統級別 如果您是程序員,那么您不必擔心這一點。 但是,如果您是操作系統的學生,那么請選擇任何操作系統手冊並詳細了解操作系統級別的多線程,或者深入了解一些優秀的研究論文。 有一件事你應該知道每個操作系統以不同的方式處理這些事情(但通常概念是相同的)

有一些語言,如Erlang ,它使用綠色線程(或進程),因此他們能夠自己映射和調度線程,從而消除操作系統。 因此,如果您有興趣,也可以對綠色線程進行一些研究。

注意:您還可以研究actor ,它是線程的另一種抽象 Erlang,Scala等語言使用actor來完成任務。 一個線程可以擁有數百個演員; 每個actor都可以執行不同的任務(類似於java中的線程)。

這是一個非常廣泛和活躍的研究課題 ,有很多東西需要學習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM