JavaEE—線程
一、進程與線程
1.包含管理
2.資源布局
2.1公共資源
2.2私有資源
二、并發編程
1.多線程優勢
1.1創建
1.1.1多線程
1.1.2多進程
1.2通信
1.2.1多線程
1.2.2多進程
1.3調度
1.3.1多線程
1.3.2多進程
1.4銷毀
1.4.1多線程
1.4.2多進程
2.多進程優勢
2.1安全性
2.1.1多進程
2.1.2多線程
2.2穩定性
2.2.1多進程
2.2.2多線程
三、線程數量
1.調度理想數量?
1.1調度提升效率
1.2黃金法則
2.數量過多
2.1調度占比上升
2.2CPU緩存失效
2.3線程爭鎖阻塞
一、進程與線程
進程:每個進程 對應一個PCB,是操作系統 資源分配的基本單位
線程:每個線程 對應一個TCB,是CPU?調度執行的基本單位
1.包含管理
PCB 包含管理 TCB,線程在進程里面創建,每一個進程中 至少創建有一個主線程
2.資源布局
鏈接:進程的內存管理
2.1公共資源
同進程的線程TCB 指針指向對應 同一個PCB,共用PCB的 內存指針、文件描述符表 指向的進程的公共資源,屬于PCB的內核空間
2.2私有資源
每個線程各自不同的?狀態、上下文、記賬信息?都存儲在 進程劃分管理的 私有資源中,屬于PCB的用戶進程空間
二、并發編程
多進程與多線程 是實現并發編程的兩種方式
1.多線程優勢
同進程的多線程 互相共用配合,資源共享,輕量高效:
1.1創建
1.1.1多線程
進程額外新建線程時,復用進程的 已申請的資源 來創建,創建輕便迅速,資源利用率高
1.1.2多進程
- 創建主線程時的進程,需要向操作系統 申請尋找分配資源,相對耗時
- 每個進程中 只有一個主線程 單獨使用資源,資源利用率低
1.2通信
1.2.1多線程
同進程的線程 共享進程資源:
- 使用相同虛擬地址指針?互訪共用?內存
- 使用相同fd 互訪共用?文件
共用著資源訪問 即可完成通信,通信效率高
1.2.2多進程
異進程的線程 需要跨進程 保持獨立地通信,通信效率低
鏈接:進程間通信
1.3調度
1.3.1多線程
同進程的線程 調度時 只需要切換寄存器上下文,調度切換快
1.3.2多進程
異進程的線程 調度時 還需切換虛擬地址空間,調度切換慢
鏈接:CPU的調度?
1.4銷毀
1.4.1多線程
銷毀進程的 普通線程時,只需釋放 線程的少量私有資源,銷毀迅速
1.4.2多進程
銷毀主線程時的進程,需要釋放 進程所有的資源,銷毀緩慢
2.多進程優勢
多進程間的線程 互相獨立,資源安全隔離,穩定性高:
2.1安全性
2.1.1多進程
異進程的線程?資源獨立,不會出現 爭用同塊資源,線程安全
2.1.2多線程
同進程的線程 會出現 同時去訪問同塊資源 造成線程不安全,需要引入同步機制
2.2穩定性
2.2.1多進程
異進程的線程 互相獨立,某個線程異常崩潰 銷毀所屬進程 不會到影響彼此,線程穩定性高
2.2.2多線程
同進程的線程 拋出異常,沒有得到處理 會使整個進程崩潰,從而銷毀進程里 所有其它的線程,線程穩定性低
三、線程數量
1.調度理想數量?
CPU執行指令 | 1納秒/條 |
線程I/O讀取來執行指令 | 10毫秒/次(比cpu指令執行慢1000萬倍) |
CPU調度切換 | 1微秒/次 |
1.1調度提升效率
CPU快速執行完 當前線程的任務指令 還未等到 該線程下次的I/O讀取來指令時,調度切換到另一個已I/O好的線程 不停息地 繼續執行指令
1.2黃金法則
當調度的線程總量 使CPU剛好執行完每個線程的任務指令時 就調度切換,CPU達到 最高效的持續執行:
線程數 ≈ CPU核心數 * (1 + 等待時間/計算時間)
- CPU密集型任務(計算)?: 線程數 ≈ 核心數
- I/O密集型任務(網絡) : 線程數可多于核心數
2.數量過多
調度的線程數量過多 會導致CPU?執行效率降低:
2.1調度占比上升
在調度理想線程數量的基礎上?再增加線程數量時,會使得CPU?未執行完當前線程任務指令時 就調度切換走,CPU仍然不停息地 持續執行指令 但單位時間中 無用的調度切換 開始占比增大地 減少CPU有效執行指令的占比,使得CPU執行效率 開始下降
2.2CPU緩存失效
CPU緩存是為 連續計算優化的,要調度的線程過多 導致過于頻繁切換線程時,緩存被沖刷,緩存命中率大幅下降,CPU緩存失效
2.3線程爭鎖阻塞
當線程任務過多時,會出現 很多線程同時爭用同一塊資源 而等鎖 阻塞等待