1. 程式人生 > >淺談執行緒和程序

淺談執行緒和程序

淺談程序和執行緒

定義

  • 程序定義:一般是對於系統來講,程序(process)是具有一定獨立功能的程式,作業系統利用程序把工作劃分為一些功能單元。程序是進行資源分配和排程的一個獨立單位。它還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的執行緒訪問。
  • 執行緒定義:執行緒(thread)是程序中所包含的一個或多個執行單元。它只能歸屬於一個程序並且只能訪問該程序所擁有的資源。執行緒是CPU排程和分派的基本單位,沒有單獨地址空間,有獨立的棧,區域性變數,暫存器,程式計數器等。

關係

  1. 一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行。
  2. 執行緒屬於程序,不能獨立執行。每個程序至少要有一個執行緒,成為主執行緒。
  3. 一個程序無法直接訪問另一個程序的資源;同一程序內的多個執行緒共享程序的資源。

區別

程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

  1. 執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位。
  2. 不僅程序之間可以併發執行,同一個程序的多個執行緒之間也可併發執行。
  3. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。
  4. 程序是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程序的資源。
  5. 在建立或撤消程序時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於建立或撤消執行緒時的開銷。
  6. 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
  7. 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

補充:粗略談下synchronized關鍵字

synchronized 關鍵字,代表這個方法加鎖,相當於不管哪一個執行緒(例如執行緒A),執行到這個方法時,都要檢查有沒有其它執行緒B(或者C、 D等)正在用這個方法(或者該類的其他同步方法),有的話要等正在使用synchronized方法的執行緒B(或者C 、D)執行完這個方法後再執行此執行緒A,沒有的話,鎖定呼叫者,然後直接執行。它包括兩種用法:synchronized 方法和 synchronized 塊
Java語言的關鍵字,可用來給物件和方法或者程式碼塊加鎖,當它鎖定一個方法或者一個程式碼塊的時候,同一時刻最多隻有一個執行緒執行這段程式碼。當兩個併發執行緒訪問同一個物件object中的這個加鎖同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程式碼塊以後才能執行該程式碼塊。然而,當一個執行緒訪問object的一個加鎖程式碼塊時,另一個執行緒仍可以訪問該object中的非加鎖程式碼塊。