對進程和線程的一些總結

對進程和線程的一些總結

來自專欄慢慢學編程

前言

進程(Process)和線程(Thread)都是操作系統中的基本概念,它們之間有一些優劣和差異。

進程基本介紹

進程是程序執行時的一個實例,是系統進行資源分配和調度的基本單位。所有與該進程有關的資源,都被記錄在進程式控制制塊(PCB)中。以表示該進程擁有這些資源或正在使用它們。另外,進程也是搶佔處理機的調度單位,它擁有一個完整的虛擬地址空間。當進程發生調度時,不同的進程擁有不同的虛擬地址空間,而同一進程內的不同線程共享同一地址空間。

線程基本介紹

線程,有時也被稱為輕量級進程,是程序執行流的最小單元,是進程中的一個實體,是被系統獨立調度和分派的基本單位。與進程不同,線程與資源分配無關,線程自己不擁有系統資源,它屬於某一個進程,並與進程內的其他線程一起共享進程的資源。線程只由相關堆棧(系統棧或用戶棧)寄存器和線程式控制製表TCB組成。

進程和線程的關係

通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。但是,一個線程只屬於一個進程。進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。而且需要注意的是,線程不是一個可執行的實體。

進程和線程的比較

進行和線程之間的差異可以從下面幾個方面來闡述:

  • 調度 :在引入線程的操作系統中,線程是調度和分配的基本單位 ,進程是資源擁有的基本單位 。把傳統進程的兩個屬性分開,線程便能輕裝運行,從而可 ** 顯著地提高系統的並發程度 ** 。 在同一進程中,線程的切換不會引起進程的切換;在由一個進程中的線程切換到另一個進程中的線程時,才會引起進程的切換。
  • 並發性 :在引入線程的操作系統中,不僅進程之間可以並發執行,而且在一個進程中的多個線程之間亦可並發執行,因而使操作系統具有更好的並發性,從而能 ** 更有效地使用系統資源和提高系統吞吐量 **。
  • 擁有資源 :不論是傳統的操作系統,還是設有線程的操作系統,進程都是擁有資源的一個獨立 單位,它可以擁有自己的資源。 一般地說,** 線程自己不擁有系統資源(只有一些必不可少的資源)**,但它可以訪問其隸屬進程的資源。
  • 系統開銷: 由於在創建或撤消進程時,系統都要為之分配或回收資源,因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。 ** 進程切換的開銷也遠大於線程切換的開銷。**
  • 通信:進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變數)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性,因此共享簡單。但是線程的數據同步要比進程略複雜。

最後

從上面的分析可以看到,似乎線程有很多優勢,比如,數據共享效率高,可應對並發操作,有效利用等待時間等等,但是多線程的編程要比多進程要簡單,同時,多進程的可靠性較好,因為進程間不會相互影響。實際情況還是需要自己分析拿捏的。但是一般來說,實際應用中都是採用「進程+線程」結合的方式,而不是非此即彼。

原文地址:對進程和線程的一些總結

推薦閱讀:

ThreadSanitizer——跟data race說再見
Python線程之---_thread.start_new_thread()
多線程(1): 亂序和屏障
多線程效率測試
進程,線程

TAG:編程 | 多線程 | 計算機 |