同一進程間的線程共享資源
阿新 • • 發佈:2018-02-23
程序計數器 錯誤 獨立 返回 分派 服務器 容易 需要 信號
1.線程ID
每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。 2.寄存器組的值
由於線程間是並發運行的,每個線程有自己不同的運行線索,當從一個線程切換到另一個線程上 時,必須將原有的線程的寄存器集合的狀態保存,以便 將來該線程在被重新切換到時能得以恢復。 3.線程的堆棧
堆棧是保證線程獨立運行所必須的。
線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,所以線程必須擁有自己的函數堆棧, 使得函數調用可以正常執行,不受其他線程的影響。
4.錯誤返回碼
由於同一個進程中有很多個線程在同時運行,可能某個線程進行系統調用後設置了errno值,而在該 線程還沒有處理這個錯誤,另外一個線程就在此時 被調度器投入運行,這樣錯誤值就有可能被修改。
所以,不同的線程應該擁有自己的錯誤返回碼變量。
5.線程的信號屏蔽碼
由於每個線程所感興趣的信號不同,所以線程的信號屏蔽碼應該由線程自己管理。但所有的線程都 共享同樣的信號處理器。
6.線程的優先級
由於線程需要像進程那樣能夠被調度,那麽就必須要有可供調度使用的參數,這個參數就是線程的 優先級。
線程共享的環境包括:
1.進程代碼段
2.進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)
3.進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。
進程擁有這許多共性的同時,還擁有自己的個性。有了這些個性,線程才能實現並發性。這些個性包括:
1.線程ID
每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標識線程。 2.寄存器組的值
由於線程間是並發運行的,每個線程有自己不同的運行線索,當從一個線程切換到另一個線程上 時,必須將原有的線程的寄存器集合的狀態保存,以便 將來該線程在被重新切換到時能得以恢復。 3.線程的堆棧
堆棧是保證線程獨立運行所必須的。
線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,所以線程必須擁有自己的函數堆棧, 使得函數調用可以正常執行,不受其他線程的影響。
4.錯誤返回碼
由於同一個進程中有很多個線程在同時運行,可能某個線程進行系統調用後設置了errno值,而在該 線程還沒有處理這個錯誤,另外一個線程就在此時 被調度器投入運行,這樣錯誤值就有可能被修改。
所以,不同的線程應該擁有自己的錯誤返回碼變量。
5.線程的信號屏蔽碼
由於每個線程所感興趣的信號不同,所以線程的信號屏蔽碼應該由線程自己管理。但所有的線程都 共享同樣的信號處理器。
6.線程的優先級
由於線程需要像進程那樣能夠被調度,那麽就必須要有可供調度使用的參數,這個參數就是線程的 優先級。
線程與進程的區別
①進程是系統進行資源分配和調度的一個獨立單位。線程是進程的一個實體,是CPU調度和分派的基本單位。線程自己基本上不擁有系統資源,但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。由於線程比進程更小,基本上不擁有系統資源,線程上下文切換比進程上下文切換要快得多,故對它的調度所付出的開銷就會小得多,從而顯著提高系統資源的利用率和吞吐量。
②一個程序至少有一個進程,一個進程至少有一個線程。進程在執行過程中擁有獨立的內存單元地址空間,而多個線程共享內存,從而極大地提高了程序的運行效率。
③進程間通信IPC需要特別的方法,線程間可以直接讀寫進程數據段(如全局變量)來進行通信。
進程調度開銷較大,創建多個進程也降低了系統的響應時間,WEB服務器需要同時響應多個用戶的請求,故引入了線程,進一步提高系統的並發性。
每個線程有自己的堆棧和程序計數器為其執行上下文。
同一進程間的線程共享資源