線程共享資源包括:
1.進程代碼段
2.進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)
3.進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。
線程獨立資源包括:
1.線程ID
每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。
2.寄存器組的值
由於線程間是並發運行的,每個線程有自己不同的運行線索,當從一個線程切換到另一個線程上 時,必須將原有的線程的寄存器集合的狀態保存,以便將來該線程在被重新切換到時能得以恢復。
3.線程的堆棧
堆棧是保證線程獨立運行所必須的。線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,所以線程必須擁有自己的函數堆棧, 使得函數調用可以正常執行,不受其他線程的影響。
4.錯誤返回碼
由於同一個進程中有很多個線程在同時運行,可能某個線程進行系統調用后設置了errno值,而在該 線程還沒有處理這個錯誤,另外一個線程就在此時被調度器投入運行,這樣錯誤值就有可能被修改。所以,不同的線程應該擁有自己的錯誤返回碼變量。
5.線程的信號屏蔽碼
由於每個線程所感興趣的信號不同,所以線程的信號屏蔽碼應該由線程自己管理。但所有的線程都 共享同樣的信號處理器。
6.線程的優先級
由於線程需要像進程那樣能夠被調度,那么就必須要有可供調度使用的參數,這個參數就是線程的優先級。
線程與進程區別:
1,進程是系統進行資源分配和調度的一個獨立單位。線程是進程的一個實體,是CPU調度和分派的基本單位。線程自己基本上不擁有系統資源,但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
由於線程比進程更小,基本上不擁有系統資源,線程上下文切換比進程上下文切換要快得多,故對它的調度所付出的開銷就會小得多,從而顯著提高系統資源的利用率和吞吐量。
2,一個程序至少有一個進程,一個進程至少有一個線程。進程在執行過程中擁有獨立的內存單元地址空間,而多個線程共享內存,從而極大地提高了程序的運行效率。
3,進程間通信IPC需要特別的方法,線程間可以直接讀寫進程數據段(如全局變量)來進行通信。
進程的實現只能由操作系統內核來實現,而不存在用戶態實現的情況。而線程可以分為內核態和用戶態。
內核態創建線程比較浪費系統空間資源,因為系統需要維護線程列表,而線程的數量要遠遠大於進程的數量,過多的線程創建會使系統資源耗盡而癱瘓。其次內核態實現會修改操作系統。
使用用戶態創建線程就不必太擔心系統資源耗盡的問題,內核不需要知道有多少線程創建。用戶創建方便。缺點:
如果在執行過程中一個線程受阻,它將無法將控制權交出來,這樣整個進程都無法推進。操作系統隨即把CPU控制權交給另外一個進程。
這樣,一個線程受阻造成整個進程受阻,我們期望的通過線程對進程實施分身的計划就失敗了。這是用戶態線程致命的缺點。