圖解分析Javaweb進程與線程

一、認識進程

1,線程初識

一個可執行程序運行起來,就可以看作是一個進程

進程也是操作系統分配資源的最小單元

一個進程在內核中都會對應一個PCB對象

一個線程就是一個 "執行流". 每個線程之間都可以按照順訊執行自己的代碼. 多個線程之間 "同時" 執行 著多份代碼.

2,進程屬性

進程id:身份表示

一組內存指針:指向進程運行時依賴的指令和數據在內存的哪個位置

進程狀態:是正在運行,還是正在休眠

進程優先級:這個進程是優先上CPU執行還是放在後面上

進程的上下文:保存瞭上次進程在CPU上執行的進度,以便下次進程上CPU的時候能夠繼續執行

進程的記賬信息:記錄瞭進程在CPU上一共執行瞭多長時間,通過這個時間來限制不要讓某個進程霸占CPU太久,導致其他進程無法執行

從微觀上看,一個CPU同一個時刻隻能執行一個線程命令

進程太多,CPU太少

通過“並發”的方式,讓CPU快速調度,微觀上仍然是串行,但調度上極快,宏觀上就感覺是多個進程齊頭並進

二、為什麼要有線程

首先, "並發編程" 成為 "剛需".

單核 CPU 的發展遇到瞭瓶頸. 要想提高算力, 就需要多核 CPU. 而並發編程能更充分利用多核 CPU 資源. 有些任務場景需要 "等待 IO", 為瞭讓等待 IO 的時間能夠去做一些其他的工作, 也需要用到並發編程.

其次, 雖然多進程也能實現 並發編程, 但是線程比進程更輕量.

創建線程比創建進程更快.

銷毀線程比銷毀進程更快.

調度線程比調度進程更快.

三、認識線程與進程的區別

如果把一個進程看作是一個工廠,線程就是工廠中的若幹流水線

線程其實包含在進程中

一個進程可能有多個線程

每一個線程都有一段自己要執行的邏輯(命令),每一個線程都是一個獨立的“執行流”

同一個進程中的很多線程之間,是共享一些資源

四、Linux中的線程

1,內核態與用戶態

假如你去銀行存款,得在窗口和櫃員交互

存款的過程:

1、先和櫃員溝通,要存多少錢,存在那個賬戶上

2、把卡和錢交給櫃員

以上都是能感知的到動作,相當於代碼在用戶態執行

3、櫃員拿到東西在電腦上操作

以上是用戶感知不到的,相當於代碼在內核態執行

用戶態:權限相對比較小,隻能進行一些低風險的操作

內核態:比用戶態高很多

2,PCB描述線程

 內核隻認識PCB

一個線程和一個PCB對應

一個進程可能有多個PCB

這三個PCB就對應瞭java.exe這個進程的三個線程,內核中也把這若幹從屬同一個進程稱為“線程組”,類似於MySql中的多對一

五、多種類型

以一個比較形象的例子,吃蘋果,100蘋果分著吃

線程:分配資源,房間+桌子

進程:調度讓小朋友去吃蘋果

1,單進程單線程

2,多進程單線程

3,單進程多線程

4,多進程多線程

5,進程中線程分析

一個線程中最多有多少個線程

1,CPU的個數有關

2,和線程執行的任務的類型也有關

        CPU密集型:程序一直在執行計算任務

        IO密集型:主要進行輸入輸出的操作

多個線程去搶奪一個資源可能造成線程不安全

一個線程如果出現拋出異常,並且沒有很好的處理這個異常,整個進程就會被終止,其他線程無法工作

到此這篇關於圖解分析Javaweb進程與線程的文章就介紹到這瞭,更多相關Javaweb 進程 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: