進程和線程是兩個緊密相關的概念,它們最主要的區別是線程是進程的一部分,一個進程可以包含多個線程,但是線程不能包含進程。每個可執行的程序都包含兩個基本部分,即進程和線程。它們都是用於執行一系列的指令,都是由程序或系統進行初始化。
進程是可執行程序的一個實例,它包含程序代碼和當前程序中的所有活動。根據不同的操作系統,一個進程可能有多個不同的線程併發的執行各自的指令。程序是一系列指令的集合,而這些指令最終都由進程執行。進程包含了執行程序時所需要的環境,即運行時所需要的系統資源,每個進程都有各自的內存空間。可能很多人以爲進程等同於應用程序,但是實際上,一個應用程序在運行的時候,可能會包括很多個相關的進程。爲了實現進程間通信 IPC(即 Inter Process Communication),很多系統都用 pipes、sockets 等工具來實現。IPC 不僅用於同一系統中的不同進程間的通信,還可用於不同系統的進程間通信。
一個線程可以執行一系列的程序指令,不同系統的進程和線程實現是不一樣的。但是對所有系統來說,線程都是進程的組成部分,一個進程中至少要有一個線程。同一進程中的多個線程可共享這個進程的資源,這樣也有利於實現線程間通信。
在單處理器系統中,處理器通過在不同的時間切換不同的線程來實現多任務併發。線程的切換速度是非常快的,所以會給人一種所有線程都同時在運行的感覺。在多處理器系統中,不同的線程可以在不同的處理器上同時運行,實現真正的並行處理。
綜上,線程可以看作是輕量級的進程 ,它可以在一個進程裏面執行一系列的指令。計算機系統可以併發或並行的運行多個進程和線程。
下表詳細描述了進程和線程的區別
進程 |
線程 |
|
定義 |
一個程序的正在執行的實例叫進程 |
線程是進程的組成部分 |
處理方法 |
它從父進程中拷貝數據,並對這些數據進行操作 |
它可直接訪問所在進程中的數據 |
通信 |
進程間通信只能通過 IPC 實現 |
一個進程中的線程間可直接相互訪問 |
運行開銷 |
通常進程運行的開銷是比較大的 |
線程可當作輕量級進程,運行開銷非常小 |
創建方式 |
新進程只能通過拷貝父進程的方式來創建 |
新線程的創建非常簡單,無需複製,可直接生成 |
控制方式 |
一個進程只能控制它的子進程 |
一個進程中的所有線程間都可相互操作 |
改變影響 |
任何父進程的改變都不會影響到它的子進程 |
主線程的改變會影響到其它子線程的行爲,而子線程的改變通常不會相互影響 |
運行內存 |
每個進程都運行在自己的內存空間中 |
所有子線程都共享同一內存空間 |
文件描述符 |
大多數文件描述符都不能共享 |
子線程可共享文件描述符 |
文件系統 |
文件系統的上下文不可共享 |
子線程間共享文件系統上下文 |
信號 |
信號處理不能共享 |
子線程間共享信息處理 |
控制者 |
進程由操作系統控制 |
通常主線程由進程控制,而子線程可由程序員創建和控制 |
依賴 |
一個進程的運行不需要依賴其它進程 |
線程的運行依賴於進程,即線程無法獨立存在 |