wamcc:将Prolog编译成C (No.7-5)

5. 内存管理

我们只是在这里回顾WAM内存管理,使用三部分组成栈:Local Stack是控制块用于局部变量,Heap用于数据结构,Trail用于存储绑定来回滚和撤销。

wamcc:将Prolog编译成C (No.7-5)_第1张图片

图1:内存分配

它是强制性控制堆栈增长的情况下,提醒用户溢出。这通常是由于软件测试融入在每个内存分配(堆每条几次),或在每个子句项(检查所有栈)或由于新的类似WAM指令。在任何情况下这种控制都是昂贵的,更因为基本上目前机器架构允许硬件测试。事实上,机器使用虚拟内存,这意味着,用户不必理会物理地址和实际内存大小。在逻辑上如果没有物理上的,提供了非常大的线性内存。(如32位架构4G字节)当必须访问一些数据,内存管理器检测是否实际上属于物理存在于内存中或内存页(默认)。在后一种情况下,内存管理器加载在内存中后,如有必要,交换磁盘上的另一个页面。有趣的是,当一个默认页关系到一个未分配页(即无偿的)时,内存管理器引发一个异常信号。因此,我们的想法是有这样的堆栈溢出的情况下发出一个信号。要确保我们只有无偿(即归还的)的每页后跟一个堆栈(见图1)。当试图在此页读/写时,C函数(处理程序)抓到一个信号触发,负责诊断溢出(检查堆栈顶部指针),并产生足够的错误信息。最简单的方法实施这项计划是使用Unix的mmap函数,这使得它可以从一个文件映射到内存的一部分。这部分的所有页都在相应的文件页初始标记为“交换”。然后通过简单的读写内存进行文件的读和写。通常存在一个特殊设备(/dev/zero),返回初始读数零且没有在写数上体现出来。由于是只读内存操作,此设备非常适合我们的栈。归功于munmap功能,每页后跟着内存管理器。一个特定的机器上,在缺少mmap函数时,它有可能使用这些在内存进程之间处理共享内存(shmget等等)。最后,即使是没有这些功能的机器,wamcc使用标准C内存分配器(malloc),并执行软件测试检查溢出。

你可能感兴趣的:(wamcc:将Prolog编译成C (No.7-5))