1. 程式人生 > >[01] 進程和線程

[01] 進程和線程

實體 阮一峰 wid 不同的 聯系 html 除了 代碼區 多任務


1、進程和線程是什麽

在理解進程和線程之前,必須要知道的一個基本事實就是,單個CPU一次只能運行一個任務。我們所知道的多任務其實是因為CPU太快太快太快了,它不斷在多個任務之間切換執行,以至於在我們看來他就是同時在執行多個任務,實則不然。
那麽進程和線程是什麽?
假設現在有這樣的程序代碼A和B,執行程序代碼所需要的資源如RAM/顯卡/GPS等(除了CPU),也即是程序代碼的運行資源環境,我們暫且稱之為程序的上下文。於是A和B在執行的時候:
  • CPU先加載程序A的上下文,然後執行A,保存程序A的上下文
  • 調入下一個要執行的程序B的上下文,執行B,保存B的上下文
  • ...

A的粒度實際上還顯得太大,因為在其中還有代碼片段a1,a2... 程序代碼B同理。那麽在執行A時,實際上是執行a1,a2,a3等等的過程,這裏的代碼片段a1/a2/a3,粒度更小,它們的上下文資源環境也都是共享的,即A程序代碼的上下文。
於是進程和線程就來了,它們都是CPU工作時間段的利用,不過粒度大小不同
  • 這裏的A/B就是進程
  • a1/a2/a3或b1/b2/b3就是線程

那麽表象看來是什麽呢?打開windows的任務管理器,你就可以看到很多個進程:技術分享圖片 進程就是一個可執行的程序的一次運行過程,它是系統進行資源分配和調度的一個獨立單位。如我們打開QQ(TIM版),就是開了一個進程,在這個進程裏,我們傳輸文字,開了一個線程;傳輸語音,又開了一個線程。線程是程序中的一個執行流,它是屬於進程的, 每個線程都有自己專有的寄存器(棧指針、程序計數器等),但代碼區是共享的,即不同的線程可以執行同樣的函數
技術分享圖片 所以,進程和線程的聯系大概如下:
  • 一個線程只能屬於一個進程,但是一個進程可以擁有多個線程
  • 系統資源分配給進程,同一進程中所有線程共享該進程的所有資源
  • 線程是指進程內的一個執行單元,也是進程內的可調度實體

在參考鏈接中,有一篇文章極其形象和容易理解,是阮一峰老師的《進程與線程的一個簡單解釋》,強烈強烈強烈推薦大家閱讀了。

2、參考鏈接

  • 線程和進程的區別是什麽?
  • 進程與線程的一個簡單解釋
  • 多線程(單個CPU一個時刻只能運行一個線程?)


[01] 進程和線程