線程和進程區別
1. 什么是線程和進程?
1.1 進程
一個在內存中運行的應用程序。每個進程都有自己獨立的一塊內存空間,一個進程可以有多個線程,比如在Windows系統中,一個運行的xx.exe就是一個進程。
1.2 線程
進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程可以運行多個線程,多個線程可共享數據。
2. 進程與線程的區別
線程具有許多傳統進程所具有的特征,故又稱為輕型進程(Light—Weight Process)或進程元;而把傳統的進程稱為重型進程(Heavy—Weight Process),它相當于只有一個線程的任務。在引入了線程的操作系統中,通常一個進程都有若干個線程,至少包含一個線程。
根本區別:進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位。
資源開銷:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。
包含關系:如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。
內存分配:同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的
影響關系:一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。
執行過程:每個獨立的進程有程序運行的入口、順序執行序列和程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,兩者均可并發執行
3. 什么是上下文切換?
多線程編程中一般線程的個數都大于 CPU 核心的個數,而一個 CPU 核心在任意時刻只能被一個線程使用,為了讓這些線程都能得到有效執行,CPU 采取的策略是為每個線程分配時間片并輪轉的形式。當一個線程的時間片用完的時候就會重新處于就緒狀態讓給其他線程使用,這個過程就屬于一次上下文切換。
3.1 概括來說就是
當前任務在執行完 CPU 時間片切換到另一個任務之前會先保存自己的狀態,以便下次再切換回這個任務時,可以再加載這個任務的狀態。任務從保存到再加載的過程就是一次上下文切換。
上下文切換通常是計算密集型的。也就是說,它需要相當可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間。所以,上下文切換對系統來說意味著消耗大量的 CPU 時間,事實上,可能是操作系統中時間消耗最大的操作。
Linux 相比與其他操作系統(包括其他類 Unix 系統)有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。
4. 守護線程和用戶線程有什么區別呢?
4.1 守護線程和用戶線程
用戶 (User) 線程:運行在前臺,執行具體的任務,如程序的主線程、連接網絡的子線程等都是用戶線程。
守護 (Daemon) 線程:運行在后臺,為其他前臺線程服務。也可以說守護線程是 JVM 中非守護線程的 “傭人”。一旦所有用戶線程都結束運行,守護線程會隨 JVM 一起結束工作。
main 函數所在的線程就是一個用戶線程啊,main 函數啟動的同時在 JVM 內部同時還啟動了好多守護線程,比如垃圾回收線程。
比較明顯的區別之一是用戶線程結束,JVM 退出,不管這個時候有沒有守護線程運行。而守護線程不會影響 JVM 的退出。
4.2 注意事項
setDaemon(true)必須在start()方法前執行,否則會拋出 IllegalThreadStateException 異常
在守護線程中產生的新線程也是守護線程
不是所有的任務都可以分配給守護線程來執行,比如讀寫操作或者計算邏輯
守護 (Daemon) 線程中不能依靠 finally 塊的內容來確保執行關閉或清理資源的邏輯。因為我們上面也說過了一旦所有用戶線程都結束運行,守護線程會隨 JVM 一起結束工作,所以守護 (Daemon) 線程中的 finally 語句塊可能無法被執行。
5. 如何在 Windows 和 Linux 上查找哪個線程cpu利用率最高?
windows上面用任務管理器看,linux下可以用 top 這個工具看。
找出cpu耗用厲害的進程pid, 終端執行top命令,然后按下shift+p 查找出cpu利用最厲害的pid號
根據上面第一步拿到的pid號,top -H -p pid 。然后按下shift+p,查找出cpu利用率最厲害的線程號,比如top -H -p 1328
將獲取到的線程號轉換成16進制,去百度轉換一下就行
使用jstack工具將進程信息打印輸出,jstack pid號 > /tmp/t.dat,比如jstack 31365 > /tmp/t.dat
編輯/tmp/t.dat文件,查找線程號對應的信息。
更多關于“Java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓經驗,課程大綱更科學更專業,有針對零基礎的就業班,有針對想提升技術的好程序員班,高品質課程助力你實現java程序員夢想。