cpu的線程和操作系統的線程有什麼關係?

操作系統說線程是資源分配的基本單位,而cpu的線程是邏輯單位,他們之間有什麼關係?各自是怎麼調用的?


CPU通常提供了一個framework,讓操作系統利用中斷來實現線程調度,在線程調度里實現鎖。操作系統的線程並不是非要運行在某一個固定的邏輯核上面,而且線程通常綁定了一組寄存器的值(如果像VC++一樣用__await實現coroutine的話,會有若干組)。所以基本的關係就是,CPU有物理核,上面再有邏輯核,操作系統通過把寄存器的值(和一些其他的東西)在不同的時候複製到不同的邏輯核上面來實現線程。


cpu線程是一堆寄存器而已,如當前指令寄存器地址,棧指針,分頁寄存器等,x86 cpu剛開始是支持多線程切換的,既在cpu指令級實現線程切換,比如任務門。但操作系統一般都不用這個功能,而是只使用一個線程,通過修改棧指針來實現線程切換。64位x86就取消任務門了。

因此,cpu的線程跟操作系統說的線程,幾乎沒啥關係。即便cpu不支持線程,操作系統也是可以實現線程功能的。

要說聯繫的話,現在多核cpu,有多個虛擬cpu,每個虛擬cpu有一個cpu線程,為了發揮cpu最大功效,操作系統也得準備相應數量的線程才行。


操作系統的線程是個軟體概念,線程切換的行為與c語言中的函數調用頗為類似,可以粗略的認為線程就是一個函數,概念和實現上差不多。

cpu的線程,簡單來說是一個在硬體層面實現的多條指令執行流或者隊列,在某些多線程的cpu上會設置多個pc,多條流水線,冗餘的功能單元,通過調度可以最大限度的使用功能單元,可以去看一下同時多線程(SMT——Simultaneous Multi-threading)的概念,方便理解。

從粒度上看,操作系統的多線程粒度要比cpu的多線程粒度要粗。一個操作系統線程開始運行的時候,在cpu上會形成多條指令流,即cpu多線程。

操作系統多線程是為了利用多個處理器核心,而cpu多線程是為了利用cpu內部冗餘的功能單元,一般只有多發射的cpu才會有多線程,採用cpu多線程會提高其指令吞吐量。

我自己的理解,水平有限,輕噴???


對於啟用了mmu的操作系統

1. 操作系統內核代碼運行在內核態,沒有「線程」一說。

2. 但是操作系統有中斷(自己可以打斷自己)一說,反過來操作系統內核代碼也有屏蔽中斷的能力,這讓他有「調度一切」和「資源分配」的能力。

3. 利用時鐘中斷,操作系統可以隨時打斷正在執行的用戶態進程代碼,讓他去執行另外一塊進程代碼(系統調用是一種」主動「求被打斷)。

4. 這不同的用戶態進程代碼的執行如果視為調度單元,切換過程中能夠實現savereload上下文,對於操作系統來說 這就是線程。

對於cpu來說

1. 每個核是有些自有的資源,主要是cpu高速緩存之類的,可以多核同時運行而且同時使用這些資源。

2. 某些指令彼此之間所使用的資源(運算單元,地址線)幾乎完全互不包含,經常x86有 lea是一個0耗時的運算指令的說法(至少我知道和算術運算指令同時執行可以視為並行,不知道其它指令的情況)。補一個引用(LEA or ADD instruction?)

3. intel更發展並完善出超線程一說,讓操作系統認為cpu有多個核進行線程調度(依託於一個物理核的兩個邏輯核是不能同時使用不能共享的資源的)。不過線程不被中斷是不能切換到別的核上運行的,所以。。別對超線程有太多期待,畢竟cpu物理資源發生競爭的時候被迫用更慢的手段去等待。

3. 上述各種並行,在cpu層面,都可以視為「多線程式「並行的利用了cpu的資源。換而言之,這就是cpu眼中的線程。

所以:他們是什麼不重要,關鍵是他們能做什麼。


cpu的線程和操作系統的線程不是一個東西。

通俗地講,cpu的"4線程"對於軟體來說,就像4個獨立的cpu核心一樣能用,但這4個線程共享了一部分cpu硬體資源,資源總量比4個獨立的cpu核心要少一些。

操作系統的線程是跑在cpu上的,操作系統可以通過調度的方法讓多個線程在一個cpu上運行。


cpu的線程是真正可以讓程序並發執行的,屬於硬體技術。操作系統的線程可能不是真正並發執行的,操作系統分配給各線程自己的時間片,在屬於自己的時間片內佔用cpu資源,執行程序。操作系統合理的分配了cpu資源,使有限的資源發揮儘可能多的作用。


推薦閱讀:

Linux系統中 進程 、線程 、時間片的關係?
如何實現一個安全的thread.stop的api?
線程崩潰是否會造成進程崩潰?

TAG:操作系統 | 線程 |