1. 程式人生 > 其它 >程式語言與程序執行緒

程式語言與程序執行緒

一種程式語言是多程序還是多執行緒,其根本由作業系統本身來決定,並不由語言實現來決定,因為程序與執行緒的這種機制本身就只取決於作業系統,而不取決於高階語言語言,對於記憶體分配以及cpu時間片段的分配利用,是由更低階的比作業系統低的語言來實現

Java的多執行緒

Java實現的是一種多執行緒的機制,就java本身概念而言(虛擬機器規範),執行緒級別的

就程序與執行緒的概念,並不是java本身一個概念,它們是作業系統級別的概念,java只是將作業系統的這種方式進行了包裝,而並非自己去實現一套cpu時鐘與記憶體訪問機制,java本身是跳不出作業系統層面的

對於一些老式的unix作業系統,它是沒有執行緒概念存在的,它的非同步協作方式就是多程序共享記憶體的方式來完成的,因此,在這種作業系統上,根本就不存線上程,java也沒法實現執行緒,因此java就是多程序的應用程式,由多個java程序來完成協作,和PHP貌似就沒啥區別了

在windows上面,程序間的記憶體空間是互相獨立的,資料不能直接共享,它的非同步協作方式由程序中的執行緒來完成,這些執行緒共享程序所屬記憶體來完成非同步協作,所以java在這種作業系統上,表現的就是單程序多執行緒的方式

PHP的單執行緒

PHP是一種解釋型的web指令碼語言,每個PHP檔案的執行都是單執行緒的,有些時候讀寫資料庫、檔案、session等會加鎖,會導致後面的請求掛起等待前面的請求執行完才繼續,但是伺服器是多執行緒的,每次對某個PHP檔案的訪問,伺服器都會建立一個新的程序/執行緒,即,對於每次請求來說,PHP是單執行緒的,但是多個請求間是併發的

PHP使用多執行緒,需要使用多執行緒需要安裝 pthread 擴充套件,而要安裝 pthread 擴充套件,必須使用 --enable-maintainer-zts 引數重新編譯 PHP,這個引數是指定編譯 PHP 時使用執行緒安全方式
Web上面,PHP-FPM是一個多程序的FastCGI服務,master程序epoll非同步接受請求並分發給worker程序處理。不建議在Web執行模式下使用pthreads多執行緒擴充套件,因為稍有不慎,就有可能讓PHP-FPM的worker程序崩潰或發生錯誤

多程序其實是一種非常高效的伺服器架構,比如20個核心的伺服器開40個PHP-FPM worker程序就好,避免CPU過多的上下文切換開銷,佔用過多的記憶體,但是在高併發場景下並不適用

理解

多執行緒程式的多個執行緒可以在多核 CPU 的多個核心同時執行,可以完全發揮機器多核的優勢,所以多執行緒程式一般會比單執行緒程式更高效,多執行緒被作業系統呼叫的概率也更大