知識圖譜https://naotu.baidu.com/file/b8a70ff9e7f3af1437594b2d0fb4ebfd?token=11150672c00909cb
線程、進程
基本概念
進程是程序的真正運行的實例,是資源分配的基本單位
線程是CPU的基本調度單位,每個線程執行的進程代碼的某個片段
線程、進程關係與區別
關係
操作系統中可以包含多個進程,每個進程可以包含多個線程
區別
- 起源:先有線程後有進程
- 概念:
- 內存共享方式:默認情況下,內存無法與其他進程共享。線程共享 由系統分配給父進程的內存塊
- 擁有資源:
- 進程擁有獨立的內存,而線程只擁有在運行中必不可少的資源,但他可以與同進程下的線程分享進程擁有的全部資源
- 線程共享的內容:比如進程的代碼塊
- 線程獨立的內容:比如線程的堆棧
- 數量:一個程序至少有一個進程,一個進程至少有一個線程
- 開銷
- 線程的創建時間比進程短
- 同一進程內的線程切換時間比進程短
- 同一進程內的線程共享內存和文件資源,可以不通過內核進行通信
相同點
運行狀態:就緒、等待、運行等
Java 與 多線程的關係
- Java 天生支持多線程
- Java 線程會一對一映射到操作系統
- JVM自動啓動線程
多線程
什麼是多線程
多線程指單個進程中運行多個線程,如果一個程序允許運行多個線程,那麼他就是多線程程序
爲什麼使用多線程
- 提高CPU利用率
- 提高處理速度
- 避免無效等待
- 提高用戶體驗:避免卡頓,縮短等待時間:比如
tomact
,同時接收多個請求
- 便於編程建模
- 計算機性能定律:阿姆達爾定律
一般情況下,處理器越多,程序的執行速度就越快,但是會有一個上限,上限取決於程序中串行的比例。並行越多,多處理器效果越明顯。
什麼場景會使用到多線程
- 什麼時候開啓:通常在需要進行耗時任務時開始,比如IO讀寫,或從網絡獲取信息
- 爲了同時做多種不同的事情:
- 爲了提高工作效率:
tomact
、NIO
- 獲取高併發量:壓測
多線程的侷限
- 上下文切換帶來的損耗
- 異構化任務很難高效並行
- 線程安全問題:死鎖
串行、並行、併發
- **串行:**單線程,多個任務,順序執行
- **並行:**多線程,多個任務,同時執行
- **併發:**可單線程,也可多線程。只要保證一段時間內只有一個任務執行即可。
- **併發性:**程序的不同部分可以無序的同時執行,且不影響最終結果
- 並行必定可以併發,
多線程、高併發
- **高併發:**高併發是用戶訪問量劇增導致的一種狀態
- 多線程是高併發的一種解決方案。
- 高併發不一定需要多線程處理,Redis 底層單核也可以處理
同步異步、阻塞非阻塞
- 以 訪問者爲客戶端,被訪問者爲服務器爲例
- 同步異步是服務器的行爲
- 阻塞非阻塞是客戶端的行爲
- **同步:**客戶端發出一個請求後,在沒有得到結果之前,服務端不返回任何結果。但一旦返回就是客戶端想要的結果
- **異步:**請求發出後,服務器立即返回信息表示接收到請求,然後服務器會處理請求,得到結果後再返回。在此期間,客戶端可以進行其他操作。
- **阻塞/非阻塞:**客戶端發出請求,在請求結果返回前,客戶端是否進行其他操作