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