在linux中,線程(thread)指的是程序內部的一個執行路線,即一個進程內部的控制序列,一切進程至少都有一個執行線程。線程是程序執行的最小單位,線程共享進程數據,但也有自己的一部分數據。
本教程操作環境:linux5.9.8系統、Dell G3電腦。
Linux 線程的概念
什么是線程?
- 在一個程序里的一個執行路線就叫做線程(thread)。更準確的定義是:線程是“一個進程內部的控制序列”。
- 一切進程至少都有一個執行線程。
進程與線程
- 進程是資源分配與競爭的基本單位
- 線程是程序執行的最小單位
- 線程共享進程數據,但也有自己的一部分數據
- 線程ID
- 一組寄存器:IP,PSW,堆棧指針
- 棧
- errno
- 信號狀態
- 優先級
fork和創建新線程的區別
- 當一個進程執行一個fork調用的時候,會創建出進程的一個新拷貝,新進程將擁有它自己的變量和它自己的PID。這個新進程的運行時間是獨立的,它在執行時幾乎完全獨立于創建它的進程。
- 在進程里面創建一個新線程的時候,新的執行進程會擁有自己的堆棧(因此也就有自己的局部變量),但要與他的創建者共享全局變量、文件描述符、信號處理器和當前工作目錄狀態。
線程的優點
- 創建一個新線程的代價要比創建一個新進程小得多
- 與進程之間的切換相比,線程之間的切換需要操作系統做的工作少得多
- 線程占用的資源要比進程少得多
- 能充分利用多處理器的可并行數量
- 在等待慢速I/O操作結束的同時,程序可執行其他的計算任務
- 計算密集型應用,為了能在多處理器系統上運行,將計算分解到多個線程中實現
- I/O密集型應用,為了提高系統,將I/O操作重疊。線程可以同時等待不同的I/O操作
線程的缺點
- 性能損失
- 一個很少被外部事件阻塞的計算密集型線程往往無法與其他線程共享同一個處理器。如果計算密集型線程的數量比可用的處理器多,那么可能會有較大的性能損失,這里的性能損失指的是增加了額外的同步和調度開銷,而可用的資源不變。
- 健壯性降低
- 編寫多線程需要更全面更深入的考慮,在一個多線程程序里,因時間分配上的細微偏差或者因共享了不該共享的變量而造成不良的可能性是很大的,換句話說線程之間是缺乏保護的。
- 缺乏訪問控制
- 進程是訪問控制的基本粒度,在一個線程中調用某些OS函數會對整個進程造成影響。
- 編程難度提高
- 編寫與調試一個多線程比單線程程序困難得多
線程調度競爭范圍
- 操作系統提供了各個模型,用來調度應用程序創建的線程。這些模型時間的主要不同是:在競爭系統資源(特別是CPU時間)時,線程調度競爭范圍(thread-scheduling contention scope)不一樣
- 進程競爭范圍(Process contention scope):各個線程在同一個進程競爭“被調度的CPU時間”(但不直接和其他進程中的線程競爭)。
- 系統競爭范圍(System contention scope):線程直接和”系統范圍“內的其他線程競爭。
相關推薦:《Linux視頻教程》
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦