php中的執行緒、程式和併發區別

weixin_34119545發表於2018-11-07

https://mp.weixin.qq.com/s/Ps5w13TTmpnZx-RPWbsl1A

程式

程式是什麼?程式是正在執行的程式;程式是正在計算機上執行的程式例項;程式是能分配給處理器並由處理器執行的實體。程式一般會包括指令集和系統資源集,這裡的指令集是指程式程式碼,這裡的系統資源集是指I/O、CPU、記憶體等。綜合起來,我們也可以理解程式是具有一定獨立功能的程式在關於某個資料集合上的一次執行活動,程式是系統進行資源分配和排程的一個獨立單位。

在程式執行時,程式都可以被唯一的表示,由以下一些元素組成:

  • 程式描述符:程式的唯一識別符號,用來和其它程式區分。在Linux中叫程式ID,在系統呼叫fork期間生成,只是我們通過getpid返回的不是其pid欄位,而是其執行緒組號tgid。

  • 程式狀態:我們常說的掛起、執行等狀態,其表示的是當前的狀態。

  • 優先順序:程式間的執行排程相關,相對於其它程式而言。

  • 程式計數器:程式中即將被執行的下一條指令的地址,該地址是核心術中或使用者記憶體空間中的記憶體地址。

  • 記憶體指標:包括程式程式碼和程式相關資料的指標,還有和其它程式共享記憶體塊的指標。

  • 上下文資料:程式執行時處理器的暫存器的資料。

  • I/O狀態資訊:包括顯式的I/O請求、分配給程式的I/O裝置等

  • 記賬資訊:可能包括處理器時間總和、使用的時鐘數總和、時間限制等

以上的這些元素都會放在一個叫做程式控制塊的資料結構中。程式控制塊是作業系統能夠支援多程式和提供多處理的結構。當作業系統做程式切換時,它會執行兩步操作,一是中斷當前處理器中的程式,二是執行下一個程式。不管是中斷還是執行,程式控制塊中的程式計數器、上下文資料和程式狀態都會發生變化。當程式中斷時,作業系統會把程式計數器和處理器暫存器(對應程式控制塊中的上下文資料)儲存到程式控制塊中的相應位置,程式狀態也會有所變化,可能進入阻塞狀態,也有可能進入就緒態。當執行下一個程式時,作業系統按規則將下一個程式設定為執行態,並載入即將要執行程式的程式上下文資料和程式計數器等。

執行緒

程式有兩個特性部分:資源所有權和排程執行。資源所有權是指程式包括了程式執行所需要的記憶體空間、I/O等資源。排程執行是指程式執行過程中間的執行路徑,或者說程式的指令執行流。這兩個特性部分是可以分開的,分開後,擁有資料所有權的通常稱為程式,擁有執行程式碼的可分派部分的被稱之為執行緒或輕量級程式。

執行緒有“執行的線索”的意思在裡面,而程式在多執行緒環境中被定義為資源所有者,其還是會儲存程式的程式控制塊。執行緒的結構與程式不同,每個執行緒包括:

  • 執行緒狀態: 執行緒當前的狀態。

  • 一個執行棧

  • 私有的資料區: 用於每個執行緒區域性變數的靜態儲存空間

  • 暫存器集: 儲存處理器的一些狀態

     

每個程式都有一個程式控制塊和使用者地址空間,每個執行緒都有一個獨立的棧和獨立的控制塊,都有自己一個獨立執行上下文。其結構如圖8.1所示。

執行緒在執行過程中與程式有一些不同。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在於程式之中,由程式提供多個執行緒執行控制。從邏輯角度來看,多執行緒的意義在於一個程式中,有多個執行部分可以同時執行。此時,程式本身不是基本執行單位,而是執行緒的容器。

執行緒較之程式,其優勢在於一個快,不管是建立新的執行緒還是終止一個執行緒;不管是執行緒間的切換還是執行緒間共享資料或通訊,其速度與程式相比都有較大的優勢。

併發及並行

併發又稱共行,是指能處理多個同時性活動的能力,併發事件之間不一定要同一時刻發生。比如,現代計算機系統可在同一段時間內以程式的形式將多個程式載入到儲存器中,並藉由處理器的分時多工,以在一個處理器上表現出同時執行的感覺。

並行是指同時發生的兩個併發事件,具有併發的含義,而併發則不一定並行。

併發和並行的區別就是一個處理器同時處理多個任務和多個處理器或者是多核的處理器同時處理多個不同的任務。前者是邏輯上的同時發生(simultaneous),而後者是物理上的同時發生。

PHP的各種併發模型

參考資料

《作業系統精髓與設計原理》

相關文章