進程是什么?
進程(Process)?是操作系統進行?資源分配和調度的基本單位,代表一個正在執行的程序實例。每個進程擁有獨立的虛擬地址空間、代碼、數據和系統資源(如文件句柄、網絡端口等)。進程之間通過 IPC(進程間通信)機制(如管道、信號、共享內存等)進行交互。
進程的特點:
-
獨立性:進程間內存隔離,一個進程崩潰不會直接影響其他進程。
-
資源開銷大:創建、切換或銷毀進程需要較高的 CPU 和內存成本。
-
由操作系統調度:進程的執行由操作系統內核調度,搶占式分配 CPU 時間片。
協程是什么?
協程(Coroutine)?是一種用戶態的輕量級線程(非操作系統線程),由程序員主動控制調度,在單個線程內實現協作式多任務。協程共享所屬進程的內存空間,切換時無需內核介入,效率極高。
協程的特點:
-
輕量級:協程的創建和切換成本極低(通常是納秒級)。
-
協作式調度:協程主動讓出執行權(如?
yield
),而非被強制搶占。 -
適合高并發 I/O:在 I/O 密集型任務中,協程能高效處理大量并發操作(如網絡請求)。
進程 vs 協程的核心區別
特性 | 進程 | 協程 |
---|---|---|
資源分配 | 獨立內存空間,資源隔離 | 共享進程內存,資源由程序員管理 |
調度方式 | 由操作系統內核調度(搶占式) | 用戶態主動協作調度(非搶占式) |
切換成本 | 高(涉及內核態切換、內存隔離等) | 極低(僅需保存寄存器等少量狀態) |
并發規模 | 通常支持數十到數百并發 | 輕松支持數萬甚至百萬級并發(如 Go goroutine) |
適用場景 | CPU 密集型任務、需強隔離的環境(如安全沙箱) | I/O 密集型任務、高并發服務(如 Web 服務器) |
通信復雜度 | 需 IPC 機制(復雜) | 直接共享內存(簡單,但需注意線程安全) |
舉例說明
-
進程:瀏覽器中每個標簽頁可能是一個獨立進程(如 Chrome),避免單個頁面崩潰導致整個瀏覽器退出。
-
協程:一個網絡服務器用協程處理 10 萬并發連接(如 Python 的?
asyncio
?或 Go 的?goroutine
),通過非阻塞 I/O 和協作調度實現高性能。
補充:線程與協程的關系
-
線程:內核態線程,由操作系統調度,是進程內的執行單元。協程通常運行在線程之上,一個線程可包含多個協程。
-
協程與線程對比:協程更輕量、無鎖編程更簡單,但無法利用多核 CPU(需結合多線程/多進程)。
總結
-
選擇進程:需要強隔離性、多核 CPU 并行計算時。
-
選擇協程:追求高并發、低延遲、資源高效利用時(尤其是 I/O 密集型任務)。