線程學習(一) 什麼是線程?線程的使用場景

1、什麼是進程? 
進程是程序的而一次動態執行過程。 
2、什麼是線程? 
個進程內部的控制序列, 是進程的一個實體,是進程的一條執行路徑。程也就是一個輕量級進程(僅僅是在linux系統中。在windows系統中,進程就是經常進程,線程就是線程),每個線程都有自己的線程控制塊,即一個進程至少有一個輕量級進程。 
在線程組裏面,所有的線程都是對等的關係,沒有父線程的概念。 
3、什麼是主線程? 
主線程就是創建進程中產生的第一個線程,也就是main函數對應的線程。 
4、線程ID 
線程是一個輕量級進程,每一個用戶態的線程 ,在內核中都對應這一個調度實體,也擁有着自己 的進程描述符。 
tgid:線程組ID,線程組中的每一個線程的tgid都是相同的,在外表現爲進程ID,它等於主線程的ID 。 
tid:每一個線程在自己的用戶層面上都有一個私有的pid,可以通過tid找到自己的虛擬地址,再通過頁表映射到物理地址空間。在用戶層面上展現的是線程的ID(tid),但在內核中它實際上是一個輕量級進程(pid)。

 
5、線程資源? 
進程可以擁有資源,並且是系統擁有資源的基本單位 。線程本身並不擁有系統資源,僅有一些 能保證獨立運行 的資源,這塊資源的各個線程私有的。 
1)線程各自獨立擁有的部分:

線程ID
一組寄存器

errno(錯誤編碼)
信號屏蔽字(一個進程中pending(未決)信號只有一個,但是任意一個線程都可以處理這個信號)
調度優先級

2)共享區域

同一個地址空間(代碼、全局數據、堆都是共享的。如果定義一個函數,在每個線程中都可以共享到,如果定義一個全局變量,在任何一個線程中都可以訪問到
文件描述符表
每種信號的處理方式
當前工作目錄
用戶ID和組ID
6、線程的優點

創建一個新線程的代價要比創建一個新進程小的多
線程之間的切換相較於進程之間的切換需要操作系統做的工作很少
線程佔用的資源要比進程少很多
能充分利用多處理器的可並行數量
等待慢速 IO操作結束以後,程序可以執行其他的計算任務
計算(CPU)密集型應用,爲了能在多處理器系統上運行,將計算分解到多個線程中實現
IO密集型應用,爲了提高性能,將IO操作重疊,線程可以等待不同的IO操作。
7、線程的缺點?

性能損失( 一個計算密集型線程是很少被外部事件阻塞的,無法和其他線程共享同一個處理器,當計算密集型的線程的數量比可用的處理器多,那麼就有可能有很大的性能損失,這裏的性能損失是指增加了額外的同步和調度開銷,二可用資源不變。)
健壯性降低(線程之間是缺乏保護性的。在一個多線程程序裏,因爲時間上分配的細微差距或者是共享了一些不應該共享的變量而造成不良影響的可能影響是很大的。)
缺乏訪問控制( 因爲進程是訪問控制的基本粒度,在一個線程中調用某些OS函數會對整個進程造成影響 。)
編程難度提高(編寫和 調試一個多線程程序比單線程困難的多。)
8、進程和線程的區別?

調度 :進程是操作系統分配資源的一個基本單位。線程是 CPU調度的基本單位。
併發性:引入線程之後,不僅進程之間是可以併發執行的,而且在一個進程之中的多個線程也是 可以併發執行的,甚至是允許一個進程中 的全部進程併發執行。同樣,不同的進程中的線程也是可以併發執行的。使得OS有 更好的併發性,提高了資源的利用率和系統吞吐量。
擁有資源:進程可以擁有資源,並且是系統擁有資源的基本單位 。線程本身並不擁有系統資源,僅有一些 能保證獨立運行 的資源,這塊資源的各個線程私有的。例如,線程ID、一組寄存器、棧、errno、信號屏蔽字(一個進程中pending信號只有一個,但是任意一個線程都可以處理這個信號)、調度優先級。
獨立性:在同一進程中線程的獨立性要比在不同的進程中獨立性要低很多 。
系統開銷:線程切換的開銷低於進程切換的開銷,
支持多處理機系統:對於傳統的進程,也就是單線程進程 ,不管有多少個處理機,進程只能運行在同一個 處理機上面,但對於多線程進程,就可以將一個進程中的多個線程分配到多個處理機上面,使其併發執行,加速了進程的完成。
9、進程和線程的應用場景? 


 
總而言之:

需要頻繁創建銷燬優先使用線程。
需要大量計算的優先使用線程。
相關性較強的使用線程,相關性較弱使用進程。
可能要擴展到多機分佈使用進程,多核分佈使用線程
 

ps:本文章採納其他博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章