線程的概念
那麼什麼是線程呢?
百度百科是這樣介紹的:
線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態是指線程佔有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
我們可以總結出來以下幾個要點:
- 在一個程序裏的一個執行路線叫做一個線程(thread)。更準確的說,線程“是一個進程內部的控制序列”
- 一切進程至少有一個執行線程
值得注意的是我們不要講進程與線程的概念混淆,線程和進程具體有一下幾點不同:
- 進程是資源競爭的基本單位
- 線程是程序執行的最小單位
- 線程共享進程數據但也擁有自己的一部分必不可少的資源:
1.線程ID 2.一組寄存器 3.棧 4.errno 5.信號屏蔽字 6.調度優先級
換句話說線程具有獨立的上下文和私有的棧結構。
前面我們說多個線程可以共享進程的數據,具體有哪些呢?
- Text Segment 和 Data Segment都是共享的,如果定義一個函數在各線程中都可以調用。如果定義一個全局變量,在各線程中都可以訪問到。
- 文件描述符
- 信號的處理方式
- 當前工作目錄
- 用戶id和組id
至此,我們可以總結出線程的優缺點:
優點:
- 創建一個新線程的代價要比創建一個新進程小的多
- 與進程之間的切換相比,線程之間的切換操作系統的負擔小的多
- 線程佔用的而資源少的多
- 充分利用多處理器的可並行數量
- 在等待慢速I/O操作時,程序可以執行其他的計算任務
- 計算密集型應用,爲了能在多處理器系統上運行,將計算分解到多個線程中實現
- I/O密集型應用,爲了提高性能,將I/O操作重疊。線程可以同時等待不同的I/O操作。
缺點:
- 性能損失:如果計算密集型線程數量比可用處理器數量多,那麼可能會有較大的性能損失。這裏的性能損失指的是增加了額外的同步和調度開銷,而可用的資源不變。
- 健壯性降低:線程是缺乏保護的。
- 缺乏訪問控制:進程是訪問控制的基本粒度,在一個線程中調用某些OS函數會對整個進程造成影響。
- 編程難度高
以上是關於線程的基本介紹,關於線程控制的問題可以參考我的博客: