2012-03-05 107 views
1

我一直在閱讀操作系統這些天,我越來越困惑..上下文切換多線程

Q1:假設我們有一個進程的多個線程。所以在物理內存中,會爲堆,代碼和數據段分配內存。除此之外,每個線程都會有一個單獨的堆棧內存。堆棧如何安排?我們如何確定線程需要的空間?如果一個線程過度使用它分配的堆棧空間會怎麼樣? Q2:在上下文切換的情況下,同一進程的另一個線程被激活,我們保存PC,寄存器,堆棧指針和中斷線程的返回地址。這個返回地址到底是什麼? PC足以告訴我們接下來會執行哪條指令,那麼這個返回地址的用途是什麼?請幫助我:(

回答

3

'堆棧是如何安排的?' - 由'CreateThread()'(或任何它被稱爲)動態分配的API,從主線程的OS加載器調用,然後由主線程和其他線程創建更多線程

'我們如何確定線程將需要的空間' - 在具有大型虛擬內存空間的桌面systesm/OS上,編譯器/連接器通常指定較大的最大尺寸,(例如1MB),這個值存儲在可執行文件頭中,當OS被加載時,操作系統使用這個值來保留虛擬地址空間的1MB或任何空間,OS承諾物理當主線程或其他線程啓動時,RAM /分頁的最小堆棧要小得多

'如果一個線程超出了它被分配的堆棧空間會怎麼樣?' - 如果一個線程過度使用其提交的堆棧,則會生成一個頁面錯誤中斷,並且如果未達到保留的堆棧限制,擴展堆棧。如果達到了上限,則一個或兩個頁面中的一小部分「透支」被提交,並且在違規線程中引發異常。

'中斷線程的返回地址。這個返回地址到底是什麼? PC足以告訴我們接下來會執行哪條指令,那麼這個返回地址的用途是什麼?通常情況下,PC沒有明確保存。返回地址通過硬件/軟件中斷機制保存在堆棧中,該機制從用戶應用程序代碼生成操作系統代碼的條目。因此,在切換到OS堆棧以實現中斷/系統調用之前,保存堆棧指針可以有效地保存PC(並且通常還有一堆寄存器等)。

+0

好的非常感謝你的回答。只是一個解釋,你的意思是說,每當一個線程被創建時,操作系統創建一個1MB的虛擬內存(例如),而實際分配RAM中的幾個字節?如果線程需要更多空間,則會分配更多RAM(最多1 MB),之後會引發異常。我說得對嗎?請澄清。 – letsc 2012-03-06 15:20:01

+0

操作系統保留1MB(例如)的虛擬內存,同時提交一些虛擬內存頁面(通常是4頁,每頁4K)。這些提交的頁面可用於加載/交換到RAM中。如果線程用盡了提交的堆棧空間,需要更多的虛擬內存用於堆棧並且未達到其1MB的限制,則會提交更多的虛擬內存,其中一些被分頁到RAM中,並且導致頁面錯誤的指令被重新啓動。 – 2012-03-09 23:00:31