線程與進程&&線程私有資源


今天討論一個問題,一同事說一個進程內線程的所有資源都能被彼此共享,我說線程私有堆棧空間不可以,為此爭論了幾句。今天加班用網上資源重新學習了下,以備以后查看
 
在多線程環境下,每個線程擁有一個棧和一個程序計數器。棧和程序計數器用來保存線程的執行歷史和線程的執行狀態,是線程私有的資源。其他的資源(比如堆、地址空間、全局變量)是由同一個進程內的多個線程共享。
線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。在Unix  System V及SunOS中也被稱為輕量進程(lightweight processes),但輕量進程更多指內核線程(kernel thread),而把用戶線程(user thread)稱為線程。
 
對於多數合作性任務,多線程比多個獨立的進程更優越
   線程共享相同的內存空間。不同的線程可以存取內存中的同一個變量。所以,程序中的所有線程都可以讀或寫聲明過的全局變量。如果曾用fork()編寫過重要代碼,就會認識到這個工具的重要性。為什么呢?雖然fork()允許創建多個進程,但它還會帶來以下通信問題,如何讓多個進程相互通信,這里每個進程都有自己獨立的內存空間。對這個問題沒有一個簡單的答案。雖然有許多不同種類的本地IPC(進程間通信),但他們都遇到兩個重要的障礙:
 
1.加強了某種形式的額外內核開銷,從而降低性能。
2.對於大多數情形,IPC不是對於代碼的“自然”擴展,通常極大地增加了程序的復雜性。
 

線程共享資源包括:

  1.進程代碼段 

  2.進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊) 

  3.進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。

線程獨立資源包括:

1.線程ID

每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。

2.寄存器組的值

由於線程間是並發運行的,每個線程有自己不同的運行線索,當從一個線程切換到另一個線程上 時,必須將原有的線程的寄存器集合的狀態保存,以便將來該線程在被重新切換到時能得以恢復。

3.線程的堆棧

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

4.錯誤返回碼

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

5.線程的信號屏蔽碼

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

6.線程的優先級

由於線程需要像進程那樣能夠被調度,那么就必須要有可供調度使用的參數,這個參數就是線程的優先級。

 

線程與進程區別:

1,進程是系統進行資源分配和調度的一個獨立單位。線程是進程的一個實體,是CPU調度和分派的基本單位。線程自己基本上不擁有系統資源,但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

由於線程比進程更小,基本上不擁有系統資源,線程上下文切換比進程上下文切換要快得多,故對它的調度所付出的開銷就會小得多,從而顯著提高系統資源的利用率和吞吐量。

2,一個程序至少有一個進程,一個進程至少有一個線程。進程在執行過程中擁有獨立的內存單元地址空間,而多個線程共享內存,從而極大地提高了程序的運行效率。

3,進程間通信IPC需要特別的方法,線程間可以直接讀寫進程數據段(如全局變量)來進行通信。

 

進程的實現只能由操作系統內核來實現,而不存在用戶態實現的情況。而線程可以分為內核態和用戶態。

內核態創建線程比較浪費系統空間資源,因為系統需要維護線程列表,而線程的數量要遠遠大於進程的數量,過多的線程創建會使系統資源耗盡而癱瘓。其次內核態實現會修改操作系統。

使用用戶態創建線程就不必太擔心系統資源耗盡的問題,內核不需要知道有多少線程創建。用戶創建方便。缺點:

如果在執行過程中一個線程受阻,它將無法將控制權交出來,這樣整個進程都無法推進。操作系統隨即把CPU控制權交給另外一個進程。

這樣,一個線程受阻造成整個進程受阻,我們期望的通過線程對進程實施分身的計划就失敗了。這是用戶態線程致命的缺點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM