wamcc:將Prolog編譯成C (No.7-5)

5. 內存管理

我們只是在這裏回顧WAM內存管理,使用三部分組成棧:Local Stack是控制塊用於局部變量,Heap用於數據結構,Trail用於存儲綁定來回滾和撤銷。

圖1:內存分配

它是強制性控制堆棧增長的情況下,提醒用戶溢出。這通常是由於軟件測試融入在每個內存分配(堆每條几次),或在每個子句項(檢查所有棧)或由於新的類似WAM指令。在任何情況下這種控制都是昂貴的,更因爲基本上目前機器架構允許硬件測試。事實上,機器使用虛擬內存,這意味着,用戶不必理會物理地址和實際內存大小。在邏輯上如果沒有物理上的,提供了非常大的線性內存。(如32位架構4G字節)當必須訪問一些數據,內存管理器檢測是否實際上屬於物理存在於內存中或內存頁(默認)。在後一種情況下,內存管理器加載在內存中後,如有必要,交換磁盤上的另一個頁面。有趣的是,當一個默認頁關係到一個未分配頁(即無償的)時,內存管理器引發一個異常信號。因此,我們的想法是有這樣的堆棧溢出的情況下發出一個信號。要確保我們只有無償(即歸還的)的每頁後跟一個堆棧(見圖1)。當試圖在此頁讀/寫時,C函數(處理程序)抓到一個信號觸發,負責診斷溢出(檢查堆棧頂部指針),併產生足夠的錯誤信息。最簡單的方法實施這項計劃是使用Unix的mmap函數,這使得它可以從一個文件映射到內存的一部分。這部分的所有頁都在相應的文件頁初始標記爲“交換”。然後通過簡單的讀寫內存進行文件的讀和寫。通常存在一個特殊設備(/dev/zero),返回初始讀數零且沒有在寫數上體現出來。由於是隻讀內存操作,此設備非常適合我們的棧。歸功於munmap功能,每頁後跟着內存管理器。一個特定的機器上,在缺少mmap函數時,它有可能使用這些在內存進程之間處理共享內存(shmget等等)。最後,即使是沒有這些功能的機器,wamcc使用標準C內存分配器(malloc),並執行軟件測試檢查溢出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章