文章目錄
- 1. 行程
- 行程間同步的方式
- 2. 執行緒
- 3. 行程與執行緒
- 4. 多執行緒與多行程
1. 行程
- 行程是擁有資源的獨立單位(不管系統中是否有執行緒);
- 程式是靜態的,不涉及行程,行程是程式運行時的物體;
- 互斥鎖就是標記資源訪問狀態的一個計數器;為1表示當前沒有行程訪問臨界資源,臨界資源處于可訪問狀態;
- 在一段時間內,只允許一個行程訪問的資源被稱為臨界資源;
- 行程間通信:管道、套接字、共享記憶體、訊息佇列;
- 行程之間具有獨立性,擁有自己的虛擬地址空間,因此無法通過各自的虛擬地址進行通信;
- 行程間通信是通過內核中的緩沖區、檔案以及網路通信實作的,
行程間同步的方式
- 因為使用互斥不僅僅能夠在同一應用程式不同執行緒中實作資源的安全共享,而且可以在不同應用程式的執行緒之間實作對資源的安全共享;
- 任意時刻只允許一個執行緒對共享資源進行訪問,如果有多個執行緒試圖同時訪問臨界區,那么 在有一個執行緒進入后其他所有試圖訪問此臨界區的執行緒將被掛起,并一直持續到進入臨界區的執行緒離開;
- 信號允許多個執行緒同時使用共享資源;
- 如果只為了在行程內部是用的話使用臨界區會帶來速度上的優勢并能夠減少資源占用量,
2. 執行緒
- 在Linux系統中,執行緒是處理器調度的基本單位;
- 作業系統的最小調度單位是執行緒
- 執行緒自己不擁有系統資源;
- 每個執行緒在行程虛擬地址空間中擁有獨立的堆疊空間;
- 執行緒獨有:堆疊,暫存器,信號屏蔽字,errno…等資訊,
- 多個執行緒各自有一個堆疊,共有一個堆;
- 耗時的操作使用執行緒,提高應用程式回應;
- 由于執行緒沒有獨立的地址空間,因此同一個行程的一組執行緒可以訪問該行程資源,這些執行緒之間的通信也很高效;
- 執行緒的通信速度更快,切換更快,因為他們在同一地址空間內;
- 執行緒使用公共變數/記憶體時需要使用同步機制,因為他們在同一地址空間內;
- 執行緒擁有自己的堆疊空間且共享資料,資源消耗更小,且便于行程內執行緒間的資源管理和保護,否則會造成堆疊混亂;
- 執行緒包含CPU現場,但是執行緒只是行程中的一個執行流; 多CPU系統中,使用執行緒提高CPU利用率;
- 系統支持執行緒需要內核支持,用戶態執行緒的切換在用戶態實作,不需要內核支持;
- 一個執行緒可以創建和撤銷另一個執行緒;
- 在有多個執行緒的情況下,主執行緒的退出,并不影響其它執行緒的運行;
- 執行緒安全指的是當前執行緒中對各項操作時安全的,但不表示內部呼叫的函式是安全的,函式可重入只是執行緒安全的一個要素;
- pthread_create是一個庫函式運行在用戶態,創建的是用戶級執行緒,在內核中通過輕量級行程實作調度;
- 可以使用ps -L命令查看輕量級行程資訊, pthread_self用于獲取用戶態執行緒的tid,getpid用于獲取當前行程的id,
3. 行程與執行緒
- 執行緒和行程都可并發執行;
- 行程是資源分配的基本單位,執行緒是調度的基本單位;
- 行程——資源分配的最小單位,執行緒——程式執行的最小單位;
- 行程有獨立的地址空間,執行緒沒有單獨的地址空間(同一行程內的執行緒共享行程的地址空間);
- 執行緒的粒度小于行程,通常多執行緒比多行程并發性更高;
- 行程是程式的一次執行,而執行緒可以理解為程式中運行的一個片段;
- 執行緒之間的通信簡單(共享記憶體即可,但須注意互斥訪問的問題),而不同行程之間的通信更為復雜,通常需要呼叫內核實作;;
- 行程是程式的一次執行,而執行緒可以理解為程式中運行的一個片段;
- 行程比執行緒安全的原因是每個行程由獨立的虛擬地址空間,具有獨立性,
4. 多執行緒與多行程
- 多行程之間的資料共享比多執行緒編程復雜;
- 多執行緒的創建,切換,銷毀速度快于多行程;
- 多執行緒沒有記憶體隔離,單個執行緒崩潰會導致整個應用程式的退出;
- 大量的計算使用多行程和多執行緒都可以實作并行/并發處理,而多執行緒的資源消耗小于多行程;
- 多行程里,子行程可獲得父行程的所有堆和堆疊的資料;而執行緒會與同行程的其他執行緒共享資料,擁有自己的堆疊空間,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281417.html
標籤:其他
