## 進程[]()
進程是什么?進程是正在執行的程序;進程是正在計算機上執行的程序實例;進程是能分配給處理器并由處理器執行的實體。進程一般會包括指令集和系統資源集,這里的指令集是指程序代碼,這里的系統資源集是指I/O、CPU、內存等。綜合起來,我們也可以理解進程是具有一定獨立功能的程序在關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
在進程執行時,進程都可以被唯一的表示,由以下一些元素組成:
- 進程描述符:進程的唯一標識符,用來和其它進程區分。在Linux中叫進程ID,在系統調用fork期間生成,只是我們通過getpid返回的不是其pid字段,而是其線程組號tgid。
- 進程狀態:我們常說的掛起、運行等狀態,其表示的是當前的狀態。
- 優先級:進程間的執行調度相關,相對于其它進程而言。
- 程序計數器:程序中即將被執行的下一條指令的地址,該地址是內核術中或用戶內存空間中的內存地址。
- 內存指針:包括程序代碼和進程相關數據的指針,還有和其它進程共享內存塊的指針。
- 上下文數據:進程執行時處理器的寄存器的數據。
- I/O狀態信息:包括顯式的I/O請求、分配給進程的I/O設備等
- 記賬信息:可能包括處理器時間總和、使用的時鐘數總和、時間限制等
以上的這些元素都會放在一個叫做進程控制塊的數據結構中。進程控制塊是操作系統能夠支持多進程和提供多處理的結構。當操作系統做進程切換時,它會執行兩步操作,一是中斷當前處理器中的進程,二是執行下一個進程。不管是中斷還是執行,進程控制塊中的程序計數器、上下文數據和進程狀態都會發生變化。當進程中斷時,操作系統會把程序計數器和處理器寄存器(對應進程控制塊中的上下文數據)保存到進程控制塊中的相應位置,進程狀態也會有所變化,可能進入阻塞狀態,也有可能進入就緒態。當執行下一個進程時,操作系統按規則將下一個進程設置為運行態,并加載即將要執行進程的程序上下文數據和程序計數器等。
## 線程[]()
進程有兩個特性部分:資源所有權和調度執行。資源所有權是指進程包括了進程運行所需要的內存空間、I/O等資源。調度執行是指進程執行過程中間的執行路徑,或者說程序的指令執行流。這兩個特性部分是可以分開的,分開后,擁有資料所有權的通常稱為進程,擁有執行代碼的可分派部分的被稱之為線程或輕量級進程。
線程有“執行的線索”的意思在里面,而進程在多線程環境中被定義為資源所有者,其還是會存儲進程的進程控制塊。線程的結構與進程不同,每個線程包括:
- 線程狀態: 線程當前的狀態。
- 一個執行棧
- 私有的數據區: 用于每個線程局部變量的靜態存儲空間
- 寄存器集: 存儲處理器的一些狀態
每個進程都有一個進程控制塊和用戶地址空間,每個線程都有一個獨立的棧和獨立的控制塊,都有自己一個獨立執行上下文。其結構如圖8.1所示。

圖8.1 進程模型圖
線程在執行過程中與進程有一些不同。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在于進程之中,由進程提供多個線程執行控制。從邏輯角度來看,多線程的意義在于一個進程中,有多個執行部分可以同時執行。此時,進程本身不是基本運行單位,而是線程的容器。
線程較之進程,其優勢在于一個快,不管是創建新的線程還是終止一個線程;不管是線程間的切換還是線程間共享數據或通信,其速度與進程相比都有較大的優勢。
## 并發及并行[]()
并發又稱共行,是指能處理多個同時性活動的能力,并發事件之間不一定要同一時刻發生。比如,現代計算機系統可在同一段時間內以進程的形式將多個程序加載到存儲器中,并借由處理器的時分復用,以在一個處理器上表現出同時運行的感覺。
并行是指同時發生的兩個并發事件,具有并發的含義,而并發則不一定并行。
并發和并行的區別就是一個處理器同時處理多個任務和多個處理器或者是多核的處理器同時處理多個不同的任務。前者是邏輯上的同時發生(simultaneous),而后者是物理上的同時發生。
### PHP的各種并發模型[]()
## 參考資料[]()
《操作系統精髓與設計原理》
- 第一章 準備工作和背景知識
- 第一節 環境搭建
- 第二節 源碼結構、閱讀代碼方法
- 第三節 常用代碼
- 第四節 小結
- 第二章 用戶代碼的執行
- 第一節 生命周期和Zend引擎
- 第二節 SAPI概述
- Apache模塊
- 嵌入式
- FastCGI
- 第三節 PHP腳本的執行
- 詞法分析和語法分析
- opcode
- opcode處理函數查找
- 第四節 小結
- 第三章 變量及數據類型
- 第一節 變量的結構和類型
- 哈希表(HashTable)
- PHP的哈希表實現
- 鏈表簡介
- 第二節 常量
- 第三節 預定義變量
- 第四節 靜態變量
- 第五節 類型提示的實現
- 第六節 變量的生命周期
- 變量的賦值和銷毀
- 變量的作用域
- global語句
- 第七節 數據類型轉換
- 第八節 小結
- 第四章 函數的實現
- 第一節 函數的內部結構
- 函數的內部結構
- 函數間的轉換
- 第二節 函數的定義,傳參及返回值
- 函數的定義
- 函數的參數
- 函數的返回值
- 第三節 函數的調用和執行
- 第四節 匿名函數及閉包
- 第五節 小結
- 第五章 類和面向對象
- 第一節 類的結構和實現
- 第二節 類的成員變量及方法
- 第三節 訪問控制的實現
- 第四節 類的繼承,多態及抽象類
- 第五節 魔術方法,延遲綁定及靜態成員
- 第六節 PHP保留類及特殊類
- 第七節 對象
- 第八節 命名空間
- 第九節 標準類
- 第十節 小結
- 第六章 內存管理
- 第一節 內存管理概述
- 第二節 PHP中的內存管理
- 第三節 內存使用:申請和銷毀
- 第四節 垃圾回收
- 新的垃圾回收
- 第五節 內存管理中的緩存
- 第六節 寫時復制(Copy On Write)
- 第七節 內存泄漏
- 第八節 小結
- 第七章 Zend虛擬機
- 第一節 Zend虛擬機概述
- 第二節 語法的實現
- 詞法解析
- 語法分析
- 實現自己的語法
- 第三節 中間代碼的執行
- 第四節 PHP代碼的加密解密
- 第五節 小結
- 第八章 線程安全
- 第二節 線程,進程和并發
- 第三節 PHP中的線程安全
- 第九章 錯誤和異常處理
- 第十章 輸出緩沖
- 第十六章 PHP語言特性的實現
- 第一節 循環語句
- foreach的實現
- 第二十章 怎么樣系列(how to)
- 附錄
- 附錄A PHP及Zend API
- 附錄B PHP的歷史
- 附錄C VLD擴展使用指南
- 附錄D 怎樣為PHP貢獻
- 附錄E phpt測試文件說明
- 附錄F PHP5.4新功能升級解析
- 附錄G:re2c中文手冊