讓我們想到了用分割的操作系統。
我的問題是:操作系統intrecepts
或者使用一個特定聰明的策略分配更多的內存比你需要的時候,你的堆棧指針
和instanly(或相當instanly)分配/解除分配空間物理性存儲器中的每一個變化遞減sp,僅在釋放內存達到一定數量時釋放內存?
我希望我的劇集足夠清晰。
讓我們想到了用分割的操作系統。
我的問題是:操作系統intrecepts
或者使用一個特定聰明的策略分配更多的內存比你需要的時候,你的堆棧指針
和instanly(或相當instanly)分配/解除分配空間物理性存儲器中的每一個變化遞減sp,僅在釋放內存達到一定數量時釋放內存?
我希望我的劇集足夠清晰。
如果我理解你的要求正確,答案是:
操作系統分配一定的空間,堆在過程中創造的開始。當堆棧操作發生時,處理器自動遞增和遞減堆棧指針,軟件和遞減堆棧指針爲臨時數據分配空間(如在函數調用中)。它會減少,因爲堆棧實際上增長下來,並且如果指針超過了給定的分配空間,將發生堆棧溢出。分配的空間量因系統而異。操作系統可以做的唯一可能的「技巧」是分頁,它可以將內存標記爲已分配,但在軟件使用之前不會真正分配物理內存。這被稱爲請求分頁,並且在堆中有更多的應用,而不是堆棧。
同樣添加到上面的答案..
一個進程的堆棧增長到堆,操作系統必須確保這些區域不重疊。
當堆棧需要更多空間(即堆棧指針指向非法/未分配的內存)時,會導致頁面錯誤。
PS:上述步驟是基於pintos OS,實際步驟可能不同(在Linux這樣OS S爲複雜)我的UG OS當然OS分配.Heres堆棧增長的link向部分見4.3.3節。
感謝您的答案,你們都在談論分頁,但在我的理解中,分段與分頁不同。看看這個鏈接:http://pages.cs.wisc.edu/~remzi/OSFEP/vm-segmentation.pdf – GionJh 2012-07-21 09:27:26
很好的分割和分頁是2種不同的方式爲進程提供虛擬內存,事實上它們都可以共同 - 存在。在Linux分頁上優先分段。 – Deepthought 2012-07-21 10:05:23
可能存在一個系統,其中一個進程的地址空間被分段,然後每個分段都由頁面組成。因此,虛擬到物理地址轉換必須經過1個更多級別的間接方向,在此處檢查段基址:偏移和限制,檢查我提到的想法保持不變。在linux中,用戶代碼和數據指向1段,內核代碼和數據指向1段,根據當前模式(用戶/ kerenl)將該段的基地址加載到cs:segmentation寄存器中,所有段的地址存儲在GDT(全局描述符表)中。 – Deepthought 2012-07-21 10:05:37
也要添加..每個進程都有自己的地址空間,其中包括一個堆棧。解釋系統中進程的屬性具有堆棧指針。 – Deepthought 2012-07-21 08:14:16