# 進程、線程、協程的區別
### 關系

<center>圖:1.5-1</center>
為了更簡單的理解它們之間的關系,我們依然舉個“栗子”幫助大家理解進程、線程、協程。
原型|比喻
-|-|
CPU|工廠
進程|車間
線程|生產線
協程|工人
一個工廠里面會有多個車間,每個車間有自己獨立的物料、電力供應,這就好比是進程,有自己的獨立內存地址和數據棧,開一個車間的成本非常高,我們需要有足夠的大小的廠房。在工廠物料和電力都有限的情況下,一個車間開工其他車間就要停下來,這就類似上下文切換,所以這個切換是很浪費時間的。
一個車間場地允許的話可以直接多開幾條生產線,這樣成本就會比開一間車間要低得多,當我們一條生產線不夠用的時候可以多開幾條生產線,就好比我們在程序開線程一樣防止一條生產線中工作不過來堵在那里。
生產線上的每一個工人都在協助完成一個產品的生成組裝,前一個人把一個零件處理好了,然后交由下一個人進行處理。如果有一個人處理不過來,很多零件都堆積在某一個人那的時候,流水線后面的工人等不到上一個零件過來就沒有辦法繼續返貨,比如我們遇到了IO阻塞;當然狠心的老板不會讓后面的工人閑下來,老板就讓后面的工人去做別的事情,反正就是不讓你偷懶。
### 上下文切換對比
- |進程|線程|協程
-|-|-|-|
切換者|操作系統|操作系統|開發者
切換時機|操作系統策略|操作系統策略|開發者程序指定
上下文|頁全局目錄、內核棧、硬件上下文|內核棧、硬件上下文|硬件上下文
切換內容保存|內存棧|內存棧|保存到用戶的變量(用戶棧或者用戶堆)
切換過程|用戶態->內核態->用戶態|用戶態->內核態->用戶態|純用戶態
切換效率|低|中|高
切換開銷|高|中|低
- 第一章:基礎知識
- 課程簡介
- PHP-FPM過渡常駐內存
- 進程
- 實戰:實現Master-Worker
- 線程
- 實戰:CC攻擊器
- 協程
- 實戰:實現waitGroup功能
- 進程、線程、協程的區別
- 第二章:初識Swoft2.0
- Swoft介紹
- Swoft環境安裝
- gcc升級
- 安裝Swoft框架
- 目錄結構介紹
- SwoftCli工具
- Swoft配置
- 第三章:Swoft2.0核心
- 上下文
- 常駐內存沒有上下文隔離
- 實戰:手寫swoole框架上下文管理
- Bean容器
- 實戰:根據容器原理實現容器
- 實戰:通過容器實現依賴注入
- Bean容器定義與使用
- 配置文件定義Bean
- 容器類型
- 面向接口的容器
- 注解
- 實戰:實現注解
- 自定義Swoft注解類
- 事件
- 連接池
- 實戰:Swoole實現連接池
- 第四章:Http服務器
- Http Server生命周期
- Http Server配置
- 控制器
- 路由
- 請求對象Request
- 響應對象Response
- Http異常處理
- 中間件
- 實戰:中間件實現JWT登陸授權
- 第五章:驗證器
- 內置驗證類型
- 驗證器的使用
- 自定義驗證器
- 第六章:數據庫操作
- 連接數據庫
- 實體模型
- 模型事件
- 查詢器
- 事務處理
- 連接池配置
- 讀寫分離
- 多數據庫切換
- Models分層結構
- 實戰:實現用戶CURD API
- 第七章:Redis
- 連接redis和使用
- Redis連接池
- Redis集群配置(單機版)
- Redis集群配置(多服務器)
- Redis連接集群
- Redis實戰:實現延時任務
- 第八章:AOP編程
- AOP概念
- AOP實現原理
- 實戰實現AOP:靜態代理
- 實戰實現AOP:動態代理
- 切面注解介紹
- PointExecution切面
- PointBean切面
- PointAnnotation切面
- 實戰:使用AOP實現日志記錄
- 第九章:任務處理
- 進程使用
- 進程池使用
- 實戰:進程消費隊列
- 實戰:進程實現RabbitMQ延時隊列
- 異步任務
- 協程任務
- 定時任務