面試筆記:操作系統相關

線程共享的環境包括:進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。

進程擁有這許多共性的同時,還擁有自己的個性。有了這些個性,線程才能實現併發性。這些個性包括:

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

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

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

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

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

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

涉及多線程程序涉及的時候經常會出現一些令人難以思議的事情,用堆和棧分配一個變量可能在以後的執行中產生意想不到的結果,而這個結果的表現就是內存的非法被訪問,導致內存的內容被更改。

理解這個現象的兩個基本概念是:在一個進程的線程共享堆區,而進程中的線程各自維持自己堆棧。

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