程序與執行緒

mirs_bo發表於2024-08-16

程序和執行緒的區別

1. 定義

  • 程序(Process):是作業系統中資源分配的基本單位。每個程序有自己的獨立記憶體空間、檔案描述符、程式計數器等資源。程序之間是相互獨立的。
  • 執行緒(Thread):是作業系統排程的基本單位,一個程序可以包含多個執行緒,執行緒共享程序的記憶體空間和其他資源,但每個執行緒有自己的棧空間和程式計數器。

2. 記憶體空間

  • 程序:程序有自己獨立的記憶體空間,一個程序不能直接訪問另一個程序的記憶體。
  • 執行緒:執行緒共享程序的記憶體空間,可以直接訪問其他執行緒的資料。執行緒之間的通訊更快,但也更容易引起同步問題。

3. 資源開銷

  • 程序:由於程序之間的獨立性,建立、銷燬程序的開銷較大,程序切換也需要更高的開銷(如上下文切換)。
  • 執行緒:執行緒的建立、銷燬和切換的開銷相對較小,執行緒間的通訊速度也比程序間通訊快。

4. 排程

  • 程序:作業系統透過程序排程器管理程序的執行。程序排程涉及較多的上下文切換。
  • 執行緒:執行緒排程比程序排程更頻繁,尤其在多執行緒應用中,作業系統需要在各個執行緒之間快速切換。

5. 同步

  • 程序:程序間通常透過IPC(如管道、訊號、訊息佇列、共享記憶體等)進行通訊和同步。
  • 執行緒:執行緒間透過鎖(如互斥鎖、讀寫鎖)和條件變數等機制進行同步,防止競爭條件。

舉例:Linux中的程序和執行緒

1. 程序的例子

  • sshd程序:在Linux系統中,sshd是Secure Shell Daemon的程序,負責管理遠端登入會話。每個使用者連線到伺服器時,sshd會為每個會話啟動一個新的程序。這些程序彼此獨立,互不干擾。
  • initsystemd程序:這是Linux系統啟動後的第一個程序,負責啟動系統中所有其他的服務程序。initsystemd是整個系統的根程序,所有其他程序都是它的子程序。

2. 執行緒的例子

  • ApacheNginx中的執行緒:這些Web伺服器在處理HTTP請求時,會為每個請求建立一個新的執行緒。這些執行緒在同一個程序中執行,共享程序的資源,但獨立處理各自的請求。
  • MySQL資料庫中的執行緒:MySQL資料庫在處理查詢時,會為每個客戶端連線建立一個新的執行緒。所有的查詢執行緒共享資料庫的快取和表結構資訊,但每個執行緒獨立執行SQL查詢。

Linux中的程序和執行緒管理

  • 檢視程序:使用命令ps auxtophtop可以檢視系統中執行的程序及其相關資訊。
  • 檢視執行緒:可以使用ps -eLf來檢視執行緒。-L選項表示顯示執行緒,f表示顯示完整格式。
  • 建立程序:使用fork()系統呼叫來建立一個新的程序。
  • 建立執行緒:使用pthread_create()函式來建立一個新的執行緒。

相關文章