有了程序為什麼要有執行緒?
1.前言
在計算機中,CPU是最核心的一個硬體資源,相當於我們人類的大腦一樣,用來處理所有複雜的計算任務。而在執行程式時,我們處理某些執行時的資料,需要臨時儲存,這時候就需要用到記憶體來儲存這些。但是存在記憶體中的資料畢竟是臨時的,這時候我們需要把一些關鍵性的資料儲存到外存(磁碟)中,這樣以後可以隨時檢視了,而這些計算任務的排程,資源的分配,是由作業系統來統領的,我們開啟的每一個應用程式,都是以程序的形式,執行於作業系統之上。
2.提升程式的執行速度
從前言中我們瞭解到一個程式簡單的排程過程,我們發現,影響一個程式的速度主要有這三大方面:
1.CPU(計算能力強不強)
2.記憶體(足夠大的記憶體能夠儲存臨時計算資料)
3.IO (能快速把資料持久化到磁碟上)
但是這三者之間的處理速度上,卻有著十分大的差異,總體來說 CPU > 記憶體 >> IO,我們可以看出,IO的處理速度是最慢的,這也是影響一段程式速度的最主要的一塊,在無數代先輩的努力下,這三者都在不斷的發展:
1.CPU增加了快取記憶體,平衡了和記憶體之間的速度差異,從早期的單核升級到如今的多核,極大提升了CPU的計算能力
2.記憶體容量不斷擴大,能夠讓計算機執行更多的程式
3.作業系統從程序中,又誕生了更輕量級的執行緒,(乃止後面的超執行緒)為了能夠分時複用CPU,平衡了CPU與IO之間的速度差異,硬體上儲存裝置誕生了固態硬碟等,讓IO的效能有了明顯的提升。
在這裡我們主要來介紹程序到執行緒這段的發展
3.從程序到執行緒
由於早期的CPU是單核的,但是使用者卻也能執行多個程式,這是怎麼實現的?原來是因為早期的作業系統以“多程序”的形式執行程式。作業系統讓每個程序佔用一段時間CPU的使用權,當這段時間消耗完後,作業系統會重新選擇一個程序,讓它獲取CPU的執行權,而這個切換過程通常為毫秒級別,對於使用者來說完全感知不到這個任務切換,從而實現了同時執行多個程式。程序佔用CPU處理任務的這段時間,我們稱之為時間片。 但當某個程序在佔用CPU時間片內,需要進行耗時很長的IO操作,為了提高CPU的利用率,這時候程序會讓出CPU的時間片,讓其他程序獲取CPU時間片來執行任務,等自己完成IO操作,將資料讀取到記憶體後,就可以重新獲取CPU的時間片。 每個程序都有自己獨立的記憶體空間,多個程序之間不共享彼此的資料,但是多個程序之間的任務切換存在比較大的開銷,為了進一步的提高併發效能和CPU的利用率,程序內部誕生了執行緒,執行緒是程序內的一個執行單元,一個程序可以包含多個執行緒。相比於程序,執行緒之間的切換和通訊成本更低。執行緒共享程序的記憶體空間和系統資源,這使得執行緒之間的資料交換更加容易。 執行緒是指“程序程式碼段”的一次順序執行流程。執行緒是CPU排程的最小單位。一個程序可以有一個或多個執行緒,各個執行緒之間共享程序的記憶體空間、系統資源,程序仍然是作業系統資源分配的最小單位。 對於Java來說,Java程式碼都執行在JVM(Java虛擬機器)之中,每當執行一個Java程式,就會啟動一個JVM程序,在JVM內部,所有程式碼以執行緒來執行,在這個JVM程序中,起碼會存在兩個執行緒,一個是main執行緒,而另一個是GC垃圾回收執行緒。當程式執行完後,JVM程序也就結束了。
4.程序與執行緒的區別
一個程序由一個或多個執行緒組成執行緒是CPU排程的最小單位,程序是作業系統分配資源的最小單位。執行緒的劃分尺度小於程序。 建立和終止程序的開銷通常較大,因為作業系統需要為程序分配獨立的記憶體空間和系統資源。相比之下,建立和終止執行緒的開銷較小,因為執行緒共享程序的資源。 作業系統在進行任務排程時,會為每個程序分配時間片。而執行緒作為程序內的執行單元,由程序來進行排程。在多核處理器系統中,多執行緒技術可以實現真正的並行執行,進一步提高系統效能。