天天看點

【基礎知識】線程與程序的差別

整理了網上部分資料,自己也添加了一部分。

1、相同點:

(a)二者都具有ID,一組寄存器,狀态,優先級以及所要遵循的排程政策。

(b) 每個程序都有一個程序控制塊,線程也擁有一個線程控制塊。

(c) 線程和子程序共享父程序中的資源;線程和子程序獨立于它們的父程序,競争使用處理器資源;線程和子程序的建立者可以線上程和子程序上實行某些控制,比如,建立者可以取消、挂起、繼續和修改線程和子程序的優先級;線程和子程序可以改變其屬性并建立新的資源。

2、不同點:

(a) 線程是程序的一部分, 一個沒有線程的程序是可以被看作單線程的,如果一個程序内擁有多個程序,程序的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。

(b) 啟動一個線程所花費的空間遠遠小于啟動一個程序所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于程序間切換所需要的時間。

(c)系統在運作的時候會為每個程序配置設定不同的記憶體區域,但是不會為線程配置設定記憶體(線程所使用的資源是它所屬的程序的資源),線程組隻能共享資源。對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞隻能通過通信的方式進行,這種方式不僅費時,而且很不友善。而一個線程的資料可以直接為其他線程所用,這不僅快捷,而且友善。

(d) 與程序的控制表PCB相似,線程也有自己的控制表TCB,但是TCB中所儲存的線程狀态比PCB表中少多了。

(e) 程序是系統所有資源配置設定時候的一個基本機關,擁有一個完整的虛拟空間位址,并不依賴線程而獨立存在。

另外,補充一下線程共享與獨享資源的情況。

線程共享的環境包括:程序代碼段、程序的公有資料(利用這些共享的資料,線程很容易的實作互相之間的通訊)、程序打開的檔案描述符、信号的處理器、程序的目前目錄和程序使用者ID與程序組ID。

線程的個性包括:

1.線程ID:每個線程都有自己的線程ID,這個ID在本程序中是唯一的。程序用此來辨別線程。

2.寄存器組的值:由于線程間是并發運作的,每個線程有自己不同的運作線索,當從一個線程切換到另一個線程上時,必須将原有的線程的寄存器集合的狀态儲存,以便将來該線程在被重新切換到時能得以恢複。

3.線程的堆棧:堆棧是保證線程獨立運作所必須的。線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,是以線程必須擁有自己的函數堆棧,使得函數調用可以正常執行,不受其他線程的影響。

4.錯誤傳回碼

由于同一個程序中有很多個線程在同時運作,可能某個線程進行系統調用後設定了errno值,而在該線程還沒有處理這個錯誤,另外一個線程就在此時被排程器投入運作,這樣錯誤值就有可能被修改。是以,不同的線程應該擁有自己的錯誤傳回碼變量。

5.線程的信号屏蔽碼

由于每個線程所感興趣的信号不同,是以線程的信号屏蔽碼應該由線程自己管理。但所有的線程都共享同樣的信号處理器。

6.線程的優先級

由于線程需要像程序那樣能夠被排程,那麼就必須要有可供排程使用的參數,這個參數就是線程的優先級。

繼續閱讀