程序與執行緒
mirs_bo發表於2024-08-16
程序和執行緒的區別
1. 定義
- 程序(Process):是作業系統中資源分配的基本單位。每個程序有自己的獨立記憶體空間、檔案描述符、程式計數器等資源。程序之間是相互獨立的。
- 執行緒(Thread):是作業系統排程的基本單位,一個程序可以包含多個執行緒,執行緒共享程序的記憶體空間和其他資源,但每個執行緒有自己的棧空間和程式計數器。
2. 記憶體空間
- 程序:程序有自己獨立的記憶體空間,一個程序不能直接訪問另一個程序的記憶體。
- 執行緒:執行緒共享程序的記憶體空間,可以直接訪問其他執行緒的資料。執行緒之間的通訊更快,但也更容易引起同步問題。
3. 資源開銷
- 程序:由於程序之間的獨立性,建立、銷燬程序的開銷較大,程序切換也需要更高的開銷(如上下文切換)。
- 執行緒:執行緒的建立、銷燬和切換的開銷相對較小,執行緒間的通訊速度也比程序間通訊快。
4. 排程
- 程序:作業系統透過程序排程器管理程序的執行。程序排程涉及較多的上下文切換。
- 執行緒:執行緒排程比程序排程更頻繁,尤其在多執行緒應用中,作業系統需要在各個執行緒之間快速切換。
5. 同步
- 程序:程序間通常透過IPC(如管道、訊號、訊息佇列、共享記憶體等)進行通訊和同步。
- 執行緒:執行緒間透過鎖(如互斥鎖、讀寫鎖)和條件變數等機制進行同步,防止競爭條件。
舉例:Linux中的程序和執行緒
1. 程序的例子
sshd
程序:在Linux系統中,sshd
是Secure Shell Daemon的程序,負責管理遠端登入會話。每個使用者連線到伺服器時,sshd
會為每個會話啟動一個新的程序。這些程序彼此獨立,互不干擾。
init
或systemd
程序:這是Linux系統啟動後的第一個程序,負責啟動系統中所有其他的服務程序。init
或systemd
是整個系統的根程序,所有其他程序都是它的子程序。
2. 執行緒的例子
Apache
或Nginx
中的執行緒:這些Web伺服器在處理HTTP請求時,會為每個請求建立一個新的執行緒。這些執行緒在同一個程序中執行,共享程序的資源,但獨立處理各自的請求。
MySQL
資料庫中的執行緒:MySQL資料庫在處理查詢時,會為每個客戶端連線建立一個新的執行緒。所有的查詢執行緒共享資料庫的快取和表結構資訊,但每個執行緒獨立執行SQL查詢。
Linux中的程序和執行緒管理
- 檢視程序:使用命令
ps aux
、top
或htop
可以檢視系統中執行的程序及其相關資訊。
- 檢視執行緒:可以使用
ps -eLf
來檢視執行緒。-L
選項表示顯示執行緒,f
表示顯示完整格式。
- 建立程序:使用
fork()
系統呼叫來建立一個新的程序。
- 建立執行緒:使用
pthread_create()
函式來建立一個新的執行緒。