看到一種說法是“一個程序至少有一個進程,一個進程至少有一個線程”,這種把程序與進程,進程與線程的關系混淆的說法是錯誤的。
程序(program)只能有一個進程,一個進程就是一個程序。有人說,我打開一個程序,比如chrome,有十多個進程呢,這是咋回事。那就是十多個程序,操作系統給他們分配了彼此獨立的內存,相互執行不受彼此約束,分配同樣時間的CPU。對於用戶而言,他們是一個整體,我們通常稱之為應用程序(application)。對於計算機而言,一個進程就是一個程序,多個進程(比如一個瀏覽器的多個進程)對計算機而言就是多個不同的程序,它不會把它們理解為一個完整的“程序”。
其實進程之間的關系只有父子關系,沒有主從關系,他們之間是並行獨立的。但是線程之間是有主從關系的,而且他們共享的是同一個內存塊(包括程序、數據和堆棧)。
打個比方,進程之間是父子關系,父進程fork子進程,就好比你養了個兒子。這個子進程會拷貝一份內存塊,把程序和數據都復制過去,你兒子跟你長的也很像。但是一旦出生下來了,你們就是兩個獨立的個體,法律上都是平等的。子進程之后就完全獨立了,父進程與子進程之間的關系,與其他進程的關系都是一樣的,平等的,誰也管不着誰了,他們也只能采用進程間通信才能相互了解。父親死了,兒子還活着;父進程over了,子進程可以照樣活的好好的。(除非程序員認定有一個進程over了,其他進程沒有存在的意義,比如瀏覽器負責渲染的進程如果down掉了,其他進程自動kill掉)。
但是進程的不同線程的關系可不是這樣的。進程可以由多個線程組成,這稱之為多線程程序,他們之間的關系就好比你的大腦與四肢和身體其他部分的關系一樣。大腦就是主線程,其他部分就是子線程。子線程由主線程派生,而依附於主線程。主線程一旦over,進程就over了,其他子線程更是over了。他們的內存和數據都是同一份,沒有進行隔離(既方便,也危險),不需要額外的通信函數。
父親死了,兒子依舊活下去,你頭斷了,人還能活嗎?
了解進程與線程的關系,就要了解他們的區別。一個計算機可以有多個進程,這稱之為多任務,他們共享的是CPU,硬盤,打印機,顯示器,但他們的內存是獨立的,所以需要進程間通信,這是計算機發展的第一步。一個進程可以有多個線程,這稱之為多線程,他們除了共享進程間的共享內容之外,還共享內存,這是計算機發展的第二步,主要是為了滿足並行運算時共享數據,無需額外的通信。
所以正確的結論是:一個程序(program)就是一個正在執行的進程,而每個進程,可以是單線程的,也可以是多線程的。一個應用程序(application)通常由多個程序組成。
還是強調下程序(program)和應用程序(application)的區別。一個程序就是一個進程,永遠不要說一個程序可能有多個進程。你打開一個應用程序(比如chrome),會有十多個進程,對於計算機而言,它們都是獨立的。好比,父親和兒子在外人看來是一家人,但是對於法律上來說,就是獨立的法人。
