標籤:聯絡 利用 機制 cgi nginx+php web 一個 上下文 重用
最近在學swoole,發現裡面設計好多作業系統裡面的概念,這些基礎知識正是自己欠缺的。根基不牢的高樓大廈,猶如空中樓閣,隨時都要崩塌,早發現早治療哈哈^_^。
一、概念
1) 進程:是指正在啟動並執行一個程式,不僅僅包含這個程式的代碼( code ),資料( data ),檔案,還包括當前的運行狀態,
即指令( Program Counter ),棧,和當前 CPU 寄存器的值(有時還包括堆)。新建立一個進程需要在記憶體中建立以上所有內容。
對於 Web Server 來說,服務不同串連的代碼、資料、檔案都是相同的,只是運行狀態不同。所以對每個串連都重新建立進程會造成資源浪費。
2) 線程:基本上就是對進程的代碼、資料、檔案進行重用,每個線程只是儲存了不同的運行狀態。於是節省了資源。
3)開銷:另一方面,單個 CPU 同一時間只能執行一條指令,即只能運行一個進程。為了讓系統能「看起來」在同時進行多個進程, CPU 需要不斷地在進程之間切換。
這就是 Multiprogramming 的概念。而進行進程切換的時候不但需要把 CPU 的當前指令指標( Program Counter )切換到下一個進程,並且需要儲存當前進程的運行狀態,
載入下一個進程上次被中斷時的運行狀態。這部分時間其實 CPU 是沒有做什麼對程式來說有意義的事情的,稱為進程切換的開銷( Overhead )。
線程之間的切換代價要小於進程之間的切換代價,因此使用線程節省了時間。
二、各概念之間的聯絡
1、線程與進程的關係:
1) 一個進程可以有很多線程。多進程可以很好的利用 CPU 。
2) 多個線程是運行在單一進程的上下文中的,其實對於單一進程中的每一個線程,都有它自己的上下文,但是由於共同存在於同一進程,所以它們也共用這個進程,包括它的代碼、資料等等。
2、 Apache、nginx在處理php請求上的區別:
1) Apache+php_module 是父進程+子進程的模式,每個訪問請求會產生子進程,就不會有阻塞了。
2) Nginx+PHP-FPM 的話感覺 Nginx 和 PHP 相互獨立了, Nginx 遇到自己處理不了的請求就會給 PHP-FPM ( PHP FastCGI進程管理器)處理,
每來一個請求就會交給一個子進程去處理(這雷根據 PHP 的回合組態不同效果也不同,子進程的數量可以是固定的也可以動態產生),然後 Nginx 對交給 PHP-FPM 的請求進行輪訓( epoll 機制)。
這樣處理效能和資源佔用都比 Apache 有優勢。
php、apache、nginx、線程、進程