並發編程基礎底層原理學習(二)
進程
進程就是應用程式在記憶體中分配的空間,也就是正在運行的程式,各個進程之間互不干擾。同時進程保存著程式每一個時刻運行的狀態。進程的兩個基本元素是程式程式碼和與程式碼關聯的數據集。進程執行的任意時刻包含了以下元素:
- 標識符:與進程相關的唯一標識符,用來區分其他執行緒
- 狀態:若進程正在執行,則進程處於運行態
- 優先順序:相對於其他進程的優先順序
- 程式計數器:程式中即將執行下一條指令的地址
- 記憶體指針:包括程式程式碼和進程相關數據的指針
- 上下文數據:進程執行時處理器的暫存器中的數據
執行緒
現代作業系統調度的最小單元是執行緒,也叫輕量級進程,在一個執行緒里可以創建多個執行緒。進程中擁有一個或多個執行緒,在執行緒中有一個程式計數器,用來記錄接著要執行哪一條指令。執行緒擁有暫存器,用來保存執行緒當前的工作變數,執行緒還擁有一個堆棧,用來記錄執行歷史,其中每一幀保存了已調用但是還沒有從中返回的過程。
上圖展示了執行緒在運行的生命周期中6種不同的狀態,在給定的一個時刻,執行緒只能處於其中的一個狀態。
進程和執行緒的區別
進程是一個獨立的運行環境,而執行緒是在進程中執行的一個任務。他們兩個本質的區別是是否單獨佔有記憶體地址空間及其它系統資源(比如I/O):
- 進程單獨佔有一定的記憶體地址空間,所以進程間存在記憶體隔離,數據是分開的,數據共享複雜但是同步簡單,各個進程之間互不干擾;而執行緒共享所屬進程佔有的記憶體地址空間和資源,數據共享簡單,但是同步複雜。
- 進程單獨佔有一定的記憶體地址空間,一個進程出現問題不會影響其他進程,不影響主程式的穩定性,可靠性高;一個執行緒崩潰可能影響整個程式的穩定性,可靠性較低。
- 進程單獨佔有一定的記憶體地址空間,進程的創建和銷毀不僅需要保存暫存器和棧資訊,還需要資源的分配回收以及頁調度,開銷較大;執行緒只需要保存暫存器和棧資訊,開銷較小。