2013-04-17 62 views
0

我是一位正在學習操作系統課程的計算機本科生。對於我的任務,我需要實現一個簡單的線程管理系統。操作系統的TCB的一些說明

我正在爲TCB創建一個結構。根據我的講義,我可以在我的TCB是:

寄存器, 程序計數器, 堆棧指針, 線程ID和 進程ID

現在按照我的講義,每個線程應有自己的堆棧。而我的問題是這樣的:

只需通過存儲堆棧指針,我可以保持每個線程獨特的堆棧?如果我這樣做了,不會有一個線程堆棧寫入其他堆棧嗎?

我該如何預防?限制每個線程的堆棧?請告訴我這通常是在一個正常的操作系統中完成的。

請幫忙。提前致謝。

回答

0

OS可以通過監視位於地址空間堆棧部分周圍的不可訪問頁面的頁面錯誤來控制堆棧增長。這可以幫助小量檢測堆棧溢出。但是如果你將棧指針移動到地址空間的棧區域之外並使用它來訪問內存,那麼你可能會進入全局變量或堆棧或代碼或另一個線程的堆棧並破壞其中的任何內容。

線程運行在相同的地址空間是有原因的,以最小的開銷在彼此之間共享代碼和數據,並且它們的堆棧通常不會被共享和訪問所限制。

操作系統通常無法做任何事情防止程序從堆棧溢出和損壞,並幫助他們從這些恢復。操作系統根本不知道一個任意程序是如何工作的以及它應該做什麼,因此它不知道什麼時候出現錯誤以及如何處理它們。操作系統唯一能做的就是終止一個程序,它正在做一些非常錯誤的事情,比如嘗試訪問不可訪問的資源(內存,系統寄存器等)或執行無效或無法訪問的指令。

+0

明白了你的觀點,謝謝。我真正問的是,由於操作系統無法幫助我,我該怎麼辦才能阻止線程彼此堆棧?據我所知,編譯器(在我的情況下是C)只使用一個堆棧。所以保持不同的棧指針不會阻止它們彼此增長。 – user2290802

+0

創建線程時,無論是主線程還是輔助線程,它都會獲得自己的單獨堆棧,而不會與其他任何重疊。無論如何,你只能做很多事情來防止壞事發生。 –

+0

猜測除了在線程堆棧之間留下大量空間外,沒有其他選擇。 – user2290802