下载此文档

全面介绍Windows内存管理机制及C 内存分配....doc


文档分类:IT计算机 | 页数:约7页 举报非法文档有奖
1/7
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/7 下载此文档
文档列表 文档介绍
本文背景: 在编程中,很多 Windows 或 C++ 的内存函数不知道有什么区别,更别谈有效使用;根本的原因是, 没有清楚的理解操作系统的内存管理机制, 本文企图通过简单的总结描述, 结合实例来阐明这个机制。本文目的: 对 Windows 内存管理机制了解清楚,有效的利用 C++ 内存函数管理和使用内存。本文内容: 本文一共有六节,由于篇幅较多,故按节发表。其他章节请看本人博客的 Windows 内存管理及 C++ 内存分配实例(一) (二) (三) (四)和(五)。 6. 内存管理机制-- 堆栈(Stack) · 使用场合操作系统为每个线程都建立一个默认堆栈,大小为 1M 。这个堆栈是供函数调用时使用,线程内函数里的各种静态变量都是从这个默认堆栈里分配的。· 堆栈结构默认 1M 的线程堆栈空间的结构举例如下,其中,基地址为 0x0004 0000 ,刚开始时, CP U 的堆栈指针寄存器保存的是栈顶的第一个页面地址 0x0013 F000 。第二页面为保护页面。这两页是已经分配物理存储器的可用页面。随着函数的调用, 系统将需要更多的页面, 假设需要另外 5页, 则给这 5 页提交内存, 删除原来页面的保护页面属性,最后一页赋予保护页面属性。当分配倒数第二页 0x0004 1000 时, 系统不再将保护属性赋予它, 相反, 它会产生堆栈溢出异常 STATUS_STACK_OVERFLOW , 如果程序没有处理它, 则线程将退出。最后一页始终处于保留状态, 也就是说可用堆栈数是没有 1M 的, 之所以不用, 是防止线程破坏栈底下面的内存(通过违规访问异常达到目的)。当程序的函数里分配了临时变量时, 编译器把堆栈指针递减相应的页数目, 堆栈指针始终都是一个页面的整数倍。所以, 当编译器发现堆栈指针位于保护页面之下时, 会插入堆栈检查函数, 改变堆栈指针及保护页面。这样, 当程序运行时, 就会分配物理内存, 而不会出现访问违规。· 使用例子改变堆栈默认大小: 有两个方法,一是在 CreateThread() 时传一个参数进去改变; 二是通过链接命令: #ment(linker,"/STACK:102400000,1024000") 第一个值是堆栈的保留空间, 第二个值是堆栈开始时提交的物理内存大小。本文将堆栈改变为 100M 。堆栈溢出处理: 如果出现堆栈异常不处理,则导致线程终止;如果你只做了一般处理,内存结构已经处于破坏状态,因为已经没有保护页面,系统没有办法再抛出堆栈溢出异常,这样的话,当再次出现溢出时,会出现访问违规操作 ESS_VIOLATION ,这是线程将被系统终止。解决办法是,恢复堆栈的保护页面。请看以下例子: C++ 程序如下: bool handle=true; static MEMORY_BASIC_INFORMATION mi; LPBYTE lpPage; // 得到堆栈指针寄存器里的值_asm mov lpPage, esp; // 得到当前堆栈的一些信息 VirtualQuery(lpPage, &mi, sizeof(mi)); // 输出堆栈指针 printf(" 堆栈指针=%x\n",lpPage); // 这里是堆栈的提交大小 printf(" 已用堆栈大小=%d\n",); printf(

全面介绍Windows内存管理机制及C 内存分配... 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数7
  • 收藏数0 收藏
  • 顶次数0
  • 上传人63229029
  • 文件大小45 KB
  • 时间2017-01-20