您好,登錄后才能下訂單哦!
從本課開始學習并發編程的內容。主要介紹并發編程的基礎知識、鎖、內存模型、線程池、各種并發容器的使用。
并發編程
并發基礎
進程
線程
線程通信
系統、包括操作系統的運行是以CPU為核心的,各種數據操作都是在CPU中進行的。所以要學習并發編程,必須要搞清楚和CPU的關系。
經常說CPU是4核8線程的,這個的意思是4個物理核心
,每個物理核心虛擬出2個虛擬核心,也就是8個虛擬核心
。每個虛擬核心在一個時刻只能運行一個線程。
進程的定義:程序被載入內存并開始準備執行,它就是一個進程,也就是說進程是執行中的程序代碼。進程是資源分配和程序調度運行的基本單位。
線程的定義:單個進程中執行每個任務就是一個線程。線程是進程中執行運算的最小單位。
一個線程只能屬于一個進程,一個進程可以擁有多個線程。多線程處理就是允許一個進程中在同一時刻執行多個任務(線程)。
對比 | 進程 | 線程 |
---|---|---|
定義 | 進程是程序實體的運行過程,是系統資源分配和調度運行的基本單位 | 線程是進程執行任務的最小調度單位 |
系統開銷 | 創建切換開銷大,資源要重新分配和回收 | 僅保存少量寄存器的內容,開銷小,并且在進程的地址空間執行代碼 |
占有資源 | 擁有分配的所有資源 | 基本不占資源,僅有其運行不可少的資源(程序計數器、一組寄存器和棧) |
安全性 | 進程間相互獨立 | 線程間共享進程的資源,可以互相通信和影響 |
大多數的應用程序為了提高其執行效率,而采用多線程模式。充分利用CPU的核心來實現高效率運行。那是不是最大只能同時開啟8個線程呢?如果想開啟更多線程,可以嗎?CPU內部該如何處理呢?
對于4核8線程的CPU來說,如果只起8個線程,每個虛擬內核都各自執行一個線程,這是最簡單的高效率利用方式。但是在實際使用時這是不可能的。首先,計算機硬件必須有操作才能運行,而操作系統啟動后在運行過程中必不可少的要執行各種任務;其次,個人運行的程序也是要啟動線程來執行各種各樣的任務調度。所以,對于一臺電腦,不管是個人PC還是服務器,其真正運行的線程肯定是多于CPU的內核數的,那它是如何保證各個任務流暢運行的呢?
這就是CPU的線程調度。采用一定的算法把CPU的使用權合理的分配給線程,使得任務執行。
有兩種調度模型,分時調度
和搶占式調度
。
分時調度模型是指讓所有的線程輪流獲得CPU的使用權,并且平均分配每個線程占用的CPU時間片。
搶占式調度模型是指優先讓運行池中優先級最高的線程占用CPU,如果優先級相同,則隨機選擇一個線程來占用CPU。處于運行中狀態的線程會一直運行,直到它不得不放棄CPU。
JVM采用搶占式調度。
一個線程會因為以下原因而放棄CPU:
串行:是指多個任務,一個執行完接著一個
并行:每個核心執行一個任務,同一時刻多個任務同時執行
并發:多個任務在單核心上執行,同一時刻只有一個任務,系統不停的切換任務,看起來像是同時執行,實際上是不停的切換
對于計算密集型任務,線程數量不宜過多,因為本身任務就是高CPU利用率,線程多的話,會因為上下文切換而浪費資源。對于IO密集型任務,比如磁盤IO和網絡IO,因為任務是低CPU利用率,所以可以適當多開線程。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。