程式:為了完成某一功能, (用某種語言撰寫的一組指令的集合),是一段靜態的代碼塊
行程:程式的一次執行程序,是正在運行的程式,有著完整的生命周期,是資源分配的基本單位,由程式控制塊(PCB)、程式段、資料段組成
執行緒:行程可以進一步細化為執行緒,是程式內部的一條執行路徑,執行緒是獨立調度和執行的最小單位 ,執行緒可以顯著提高程式運行效率但也會帶來安全隱患;具有以下優點:①提高cpu的利用率(不讓CPU閑著)②提高用戶回應(多執行緒可以使用戶每一次操作都會立刻得到回應,單執行緒就要一個個來)③改善程式結,將長而復雜的代碼劃分成多個執行緒,獨立運行,利于理解和修改,
并發:宏觀上看是同時發生的但微觀上看還是有先后順序的,如老渣上午和女1約會下午和女2約會
并行;多個事物同時進行,如小渣同時和多個女生約會
單核與多核概念:代表計算機有幾個處理器,其中這兩種都可以實作并發但是單核CPU其實是一種假的多執行緒當然也無法真正實作多執行緒,但是如果速度足夠快快到任何事物都是一瞬間完成那么給人一種多執行緒的錯覺,只有多核cpu才能更好的發揮多執行緒的效率;
擴展:一個java應用程式java.exe至少有3個執行緒,main()主執行緒,GC()垃圾回收執行緒,例外處理執行緒exception,因為main主執行緒執行的程序中例外和垃圾處理是要伴隨執行的,即三者之間必須是并發執行的;main是用戶執行緒,GC和例外處理是守護執行緒,守護行程是不能單獨存在的,用戶執行緒執行完畢守護執行緒也會隨之結束;
行程與執行緒的關系
①一個行程可以創建或撤銷一個執行緒,而一個行程的多個執行緒可以并發執行②相比于行程,執行緒接近于執行體的概念,同一個行程的執行緒可以共享該行程的資源,且執行緒擁有獨立的堆疊空間和執行序列,總之行程是資源分配的單位,而執行緒是執行的基本單位
③一個程式至少一個行程,一個行程至少一個執行緒
④行程與執行緒主要的差別是不同的OS級的資源管理方式,由于行程有獨立的地址空間,一個行程出現問題基本不會影響其它行程,執行緒沒有自己獨立的空間,執行緒相關的東西都在它所在的行程中,正是這一特征極大提高了程式和cpu的運行效率,但一個執行緒出現問題也會導致整個行程都會死亡,同時一個行程內的多個執行緒同時操作一類資源(共享資源),就會產生死鎖,重復讀,錯讀等安全隱患,執行緒的安全問題本質上都是由共享資源時引起的
⑤行程切換的資源和時間耗費遠大與行程的切換
以下情況只能用多執行緒:
①當需要同時執行并且共享某些變數是就只能用多執行緒而不能用多行程,其中最典型的是java程式的運行必備三個執行緒mian.gc.excptionHandler(執行緒分為用戶行程與守護執行緒,main是典型的用戶執行緒,而gc是典型的守護執行緒,用戶執行緒執行完畢后守護執行緒也會消失,即兔死狗烹)三個執行緒
②程式需要實作一些需要等待的任務時,如等待用戶輸入,如果不用多執行緒那么此時程式會進入阻塞狀態,別的用戶請求就無法顧及,此時只能使用多執行緒
③一個程式需要運行多個任務時(非常常見,如360同時進行電腦體檢,開機優化,木馬查殺…)
④需要運行一些后臺的程式,
總之:多行程的程式比多執行緒的程式安全性更高當然與之相應的是性能差,執行緒不是開啟的越多越好,當cpu與執行緒一對多時同時執行反而不如單個執行執行多次速度快,因為此時cpu的處理能力是一定的但是需要在多執行緒間來回切換,需要一些后臺運行的程式,如java.exe后臺運行的gc執行緒;
從JVM的角度分析執行緒的優缺點
JVM以行程為單位進行分配,被分配的記憶體結構如下圖所示;

1 提高運行效率 一個行程中多個執行緒共享相同的記憶體空間(執行緒本身就在行程的空間中),這樣使執行緒之間的互動變得簡潔高效,而不同的行程需要不斷的進行地址切換程序很繁瑣,多執行緒效率遠高于多行程
2 獨立的調度與執行的最小單位雖然多個執行緒共享一個行程的地址空間,但是每個執行緒有各自獨立的虛擬機堆疊與程式計數器(PC)與暫存器,多執行緒的程式效率是非常高的,我們還可以使用執行緒池進一步優化程式性能
3 執行緒容易產生安全問題 執行緒在行程的地址空間中并沒有獨立的方法區和堆.即多執行緒之間共享一個方法區和堆,這樣對于一個共享資料被多個執行緒操作且當前操作未完成時就進來一個執行緒,就會產生執行緒安全問題;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254886.html
標籤:其他
