什麼是流程?
正在運行的程式有哪些資源?
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
可執行檔是儲存在磁碟上的程式碼和資料。 作業系統將這個可執行檔載入到記憶體中並附加執行所需資源的狀態稱為進程。
換句話說,程式是一個文件,進程是正在運行的程式的一個實例。
一個進程有什麼
流程不僅僅包含程式碼。
- 獨立的虛擬位址空間
- 可執行程式碼和全域數據
- 動態分配堆
- 執行緒使用的堆疊
- 開啟文件和套接字訊息
- 安全權限和進程身份
高地址
┌──────────────┐
│ 堆疊 │ 執行緒的函數呼叫和局部變數
├──────────────┤
│ │
│ 堆 │ 動態分配如new、malloc等
├──────────────┤
│ 資料/BSS │ 全域變數、靜態變數
├──────────────┤
│ 程式碼 │ 執行指令
└──────────────┘
低地址
實際的安排和詳細區域可能會根據作業系統和可執行檔案類型的不同而有所不同,但是具有不同用途的記憶體區域的流程是相同的。
進程之間是相互隔離的
即使進程 B 取得了進程 A 使用的指針,它也無法存取相同的資料。 這是因為每個進程都有自己的虛擬位址空間,核心透過頁表將其與真實記憶體連接起來。
這種隔離意味著如果一個瀏覽器出錯,它不會立即破壞其他程式的記憶體。
進程需要一種相互溝通的方式
由於記憶體是獨立的,進程之間必須使用IPC(進程間通訊)來交換資料。
- Pipe
- Shared Memory
- Socket
- Message Queue
共享記憶體速度很快,但同時存取時需要同步。 套接字和訊息方法有明確的界限,但可能會產生資料複製和通訊成本。
進程不僅僅是一段執行程式碼。 作業系統更接近一個管理記憶體、檔案、權限和一個或多個執行緒的資源容器。