原文鏈接:程序、進程、線程和任務之間關系
關系總覽
程序(靜態)
簡單來說,程序可以描述為任何可執行文件。它包含一組完成特定的操作指令集合。它駐留在內存。它是一個被動的實體,不會因操作系統重新重啟而消失。
進程(動態)
程序的任何運行實例都稱為進程,也可以將其描述為正在執行的程序。一個程序可以有多個進程。進程駐留在主內存中,因此進程會隨機器重啟而消失。多個進程可以在多處理器系統上並行運行。
線程
線程通常被描述為輕量級進程。一個進程可以有多個線程。同一進程中的線程與該進程共享內存。線程和進程之間的本質區別是每個線程用於完成的工作。線程用於小而緊湊的任務,而進程用於更重的任務。
線程 vs. 進程
線程和進程之間的一個主要區別是,同一進程中的線程使用相同的地址空間,而不同的進程則不會。這允許線程讀寫公共共享和數據結構和變量,也增加了線程之間的通信。然而,進程間通信(即IPC)是非常困難的,並且需要耗費大量資源。
任務(抽象)
任務與線程非常相似,不同之處在於,它們通常不直接與操作系統交互。與線程池一樣,任務不創建自己的OS線程。一個任務內部可能有也可能沒有多個線程。
什么時候用任務?
任務比創建自己的線程更簡單、更有效。
什么時候用線程?
你需要比任務提供的更多的控制,直接使用線程更有意義。
最重要的是,任務幾乎總是最好的選擇;它提供了一個更強大的API,並且避免了操作系統線程的浪費。在現代代碼中顯式創建自己的線程的唯一原因是設置每個線程選項,或者維護一個需要維護自己標識的持久線程。