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的各種並發模型
參考資料
《操作系統精髓與設計原理》