1. 程式人生 > 其它 >為群暉NAS的cpolar設定固定域名(2)

為群暉NAS的cpolar設定固定域名(2)

簡介

前面兩篇文章已經介紹了執行緒與程序,我們知道計算機程式是可執行的二進位制程式,它們只有載入到記憶體中,被作業系統呼叫才開始它們的生命週期,程序(有時被稱為重量級程序)是程式的一次執行。每個程序都有自己的地址空間、記憶體、資料棧及其它記錄其執行軌跡的輔助資料,正是因為獨立,程序間只能使用程序間通訊,無法直接使用共享資訊;執行緒是程序中執行運算的最小單位,是程序中的一個實體,不直接擁有系統資源,一個程序可以建立多個執行緒,一個執行緒也可以建立多個執行緒, 同一程序間的執行緒可以併發執行並共享資料。下面我們來對比一下對於python來說,執行緒與程序之間的聯絡與區別

聯絡

  • 一個程式由多個程序組成,一個程序由一個或多個執行緒組成,一個執行緒只能屬於一個程序
  • 系統資源都會分配給程序,執行緒不擁有資源,同一程序的多個執行緒共享程序的資源
  • 不同程序之間的執行緒需要利用訊息通訊實現同步

區別

  • 排程:執行緒是資源排程與分配的基本單位,程序是擁有資源的基本單位,是作業系統排程的最小單位
  • 併發:不同程序之間可以併發執行,同一程序的多個執行緒也可以併發執行
  • 資源:程序擁有獨立的地址、資料棧,系統資源,執行緒不具有資源,但共享訪問同一程序的資源
  • 建立:由於程序建立時需要系統分配地址空間、系統資源等,建立程序會比執行緒系統開銷大

詳細區別

  • 執行緒共享建立它的程序的地址空間;程序有自己的地址空間。
  • 執行緒可以直接訪問其程序的資料段(資源);程序有自己的資源(地址、資料棧等)。
  • 執行緒可以直接通過共享變數的方式與程序中的其他執行緒通訊;程序必須使用程序間通訊來與同級程序通訊。
  • 新執行緒很容易建立;新程序需要複製父程序。
  • 執行緒可以對同一程序的執行緒進行相當大的控制;程序只能對子程序進行控制。
  • 主執行緒的改變(取消,優先順序的改變,等等)可能會影響程序中其他執行緒的行為;對父程序的更改不會影響子程序。

總結

單位:執行緒是資源分配的單位,程序是作業系統排程的單位
資源開銷:程序由於需要系統分配資源,相對於執行緒開銷較大
通訊:同一程序間的不同執行緒可以直接共享程序的資源,程序間只能使用程序間通訊(佇列、Manager等)
資源訪問:同一程序的多個執行緒可以訪問程序的資源,程序間預設無法訪問資源,只能通過程序間通訊

程序與執行緒的使用場景

由於python執行緒的GIL鎖的存在,導致python執行緒只能執行在一個cpu上,因此python的執行緒適用於io密集型程式,由於檔案讀寫需要時間,cpu可以在多個執行緒間快速切換
與此相比,程序則是可以執行在多個cpu上,加快了效率,適用於計算密集型程式,即需要進行邏輯處理、運算的程式。

參考文章

執行緒與程序的區別