首頁  >  文章  >  後端開發  >  php面試題一之線程和進程的差別(順帶提下協程)

php面試題一之線程和進程的差別(順帶提下協程)

不言
不言原創
2018-04-18 09:28:095796瀏覽

這篇文章介紹的內容是關於php面試題一之線程和進程的區別(順帶提下協程),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一、什麼是行程


程式是程式執行是的一個實例,程式能夠指派給cpu與記憶體等資源。流程一般包含指令集和系統資源,其中指令集就是你的程式碼,系統資源就是指cpu、記憶體以及I/O等。

進程是一個程式在一個資料集中的一次動態執行過程,可以簡單地理解為「正在執行的程式」,它是CPU資源分配和調度的獨立單位。 
進程一般由程式、資料集、進程控制區塊三部分組成。我們所寫的程式用來描述行程要完成哪些功能以及如何完成;資料集則是程式在執行過程中所需要使用的資源;行程控制區塊用來記錄行程的外部特徵,描述行程的執行變更過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標誌。 
進程的限制是創建、撤銷和切換的開銷比較大。

二、什麼是執行緒

執行緒是一個行程的執行流,執行緒不能分配系統資源,它是行程的一部分,比行程更小的獨立運行的單位。
解釋一下:行程有兩個特性:一是資源的所有權,一個是調度執行(指令集),執行緒是調度執行中的一部分,是指行程執行過程的路徑,也叫程式執行流。線程有時候也叫輕量級進程。

執行緒是在行程之後發展出來的概念。執行緒也叫輕量級進程,它是一個基本的CPU執行單元,也是程式執行過程中的最小單元,由執行緒ID、程式計數器、暫存器集合和堆疊共同組成。一個行程可以包含多個執行緒。
線程的優點是減少了程式並發執行時的開銷,提高了操作系統的並發性能,缺點是線程沒有自己的系統資源,只擁有在運行時必不可少的資源,但同一進程的各執行緒可以共享行程所擁有的系統資源,如果把行程比喻成車間,那麼執行緒就好比是車間裡面的工人。不過對於某些獨佔性資源存在鎖定機制,處理不當可能會產生「死鎖」。

三、什麼是協程

協程是一種用戶態的輕量級線程,又稱微線程,英文名Coroutine,協程的調度完全由使用者控制。人們通常將協程和子程式(函數)比較著理解。 
子程序呼叫總是一個入口,一次返回,一旦退出即完成了子程序的執行。 
協程的起始處是第一個入口點,在協程裡,回程點之後是接下來的入口點。在python中,協程可以透過yield來呼叫其它協程。透過yield方式轉移執行權的協程之間不是呼叫者與被呼叫者的關係,而是彼此對稱、平等的,透過相互協作共同完成任務。其運作的大致流程如下:
第一步,協程A開始執行。
第二步,協程A執行到一半,進入暫停,透過yield指令將執行權轉移到協程B。
第三步,(一段時間後)協程B交還執行權。
第四步,協程A恢復執行。

協程的特色在於是一個執行緒執行,與多執行緒相比,其優點體現在:
*       協程的執行效率非常高。因為子程式切換不是執行緒切換,而是由程式本身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。
*       協程不需要多執行緒的鎖定機制。在協程中控制共享資源不加鎖,只要判斷狀態就好了。
Tips:利用多核心CPU最簡單的方法是多進程 協程,既充分利用多核心,又充分發揮協程的高效率,可獲得極高的效能。

四、進程和執行緒的關係

進程就像地主,有土地(系統資源),執行緒就像佃戶(執行緒,執行種地流程)。每個地主(進程)只要有一個工作的佃戶(線程)。
進程-資源分配的最小單位,相對健壯,崩潰一般不影響其他進程,但是切換進程時耗費資源,效率差些。
執行緒-程式執行的最小單位,沒有獨立的位址空間,一個執行緒死掉可能整個行程就死掉,但是節省資源,切換效率高。

五、php程式設計常見的進程和執行緒

1、在web應用程式中,我們每次造訪php,就建立一個PHP進程,當然也會建立至少一個PHP線程。
2、PHP使用pcntl來進行多進程編程
3、PHP中使用pthreads來進行多執行緒程式設計
4、nginx的每個行程只有一個執行緒,每個執行緒可以處理多個客戶端的存取
5、php-fpm使用多行程模型,每個行程只有一個線程,每個線程只能處理一個客戶端存取
6、apache可能使用多進程模型,也可能使用多執行緒模型,取決於使用哪種SAPI.
7、進程是cpu資源分配的最小單位,執行緒是cpu調度的最小單位

一、什麼是行程

行程是程式執行是的一個實例,程式能夠指派給cpu和記憶體等資源。流程一般包含指令集和系統資源,其中指令集就是你的程式碼,系統資源就是指cpu、記憶體以及I/O等。

進程是一個程式在一個資料集中的一次動態執行過程,可以簡單地理解為「正在執行的程式」,它是CPU資源分配和調度的獨立單位。 
進程一般由程式、資料集、進程控制區塊三部分組成。我們所寫的程式用來描述行程要完成哪些功能以及如何完成;資料集則是程式在執行過程中所需要使用的資源;行程控制區塊用來記錄行程的外部特徵,描述行程的執行變更過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標誌。 
進程的限制是創建、撤銷和切換的開銷比較大。

二、什麼是執行緒

執行緒是一個行程的執行流,執行緒不能分配系統資源,它是行程的一部分,比行程更小的獨立運行的單位。
解釋一下:行程有兩個特性:一是資源的所有權,一個是調度執行(指令集),執行緒是調度執行中的一部分,是指行程執行過程的路徑,也叫程式執行流。線程有時候也叫輕量級進程。

執行緒是在行程之後發展出來的概念。執行緒也叫輕量級進程,它是一個基本的CPU執行單元,也是程式執行過程中的最小單元,由執行緒ID、程式計數器、暫存器集合和堆疊共同組成。一個行程可以包含多個執行緒。
線程的優點是減少了程式並發執行時的開銷,提高了操作系統的並發性能,缺點是線程沒有自己的系統資源,只擁有在運行時必不可少的資源,但同一進程的各執行緒可以共享行程所擁有的系統資源,如果把行程比喻成車間,那麼執行緒就好比是車間裡面的工人。不過對於某些獨佔性資源存在鎖定機制,處理不當可能會產生「死鎖」。

三、什麼是協程

協程是一種用戶態的輕量級線程,又稱微線程,英文名Coroutine,協程的調度完全由使用者控制。人們通常將協程和子程式(函數)比較著理解。 
子程序呼叫總是一個入口,一次返回,一旦退出即完成了子程序的執行。 
協程的起始處是第一個入口點,在協程裡,回程點之後是接下來的入口點。在python中,協程可以透過yield來呼叫其它協程。透過yield方式轉移執行權的協程之間不是呼叫者與被呼叫者的關係,而是彼此對稱、平等的,透過相互協作共同完成任務。其運作的大致流程如下:
第一步,協程A開始執行。
第二步,協程A執行到一半,進入暫停,透過yield指令將執行權轉移到協程B。
第三步,(一段時間後)協程B交還執行權。
第四步,協程A恢復執行。

協程的特色在於是一個執行緒執行,與多執行緒相比,其優點體現在:
*       協程的執行效率非常高。因為子程式切換不是執行緒切換,而是由程式本身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。
*       協程不需要多執行緒的鎖定機制。在協程中控制共享資源不加鎖,只要判斷狀態就好了。
Tips:利用多核心CPU最簡單的方法是多進程 協程,既充分利用多核心,又充分發揮協程的高效率,可獲得極高的效能。

四、進程和線程的關係

進程就像地主,有土地(系統資源),線程就像佃戶(線程,執行種地流程)。每個地主(進程)只要有一個工作的佃戶(線程)。
進程-資源分配的最小單位,相對健壯,崩潰一般不影響其他進程,但是切換進程時耗費資源,效率差些。
執行緒-程式執行的最小單位,沒有獨立的位址空間,一個執行緒死掉可能整個行程就死掉,但是節省資源,切換效率高。

五、php程式設計常見的進程和執行緒

1、在web應用程式中,我們每次造訪php,就建立一個PHP進程,當然也會建立至少一個PHP線程。
2、PHP使用pcntl來進行多進程編程
3、PHP中使用pthreads來進行多執行緒程式設計
4、nginx的每個行程只有一個執行緒,每個執行緒可以處理多個客戶端的存取
5、php-fpm使用多行程模型,每個行程只有一個線程,每個線程只能處理一個客戶端存取
6、apache可能使用多進程模型,也可能使用多執行緒模型,取決於使用哪種SAPI.
7、進程是cpu資源分配的最小單位,執行緒是cpu調度的最小單位

相關推薦:

php面試可能會被問的技術題總結


以上是php面試題一之線程和進程的差別(順帶提下協程)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn