博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Chapter16— A thread's Stack
阅读量:5045 次
发布时间:2019-06-12

本文共 922 字,大约阅读时间需要 3 分钟。

概述:

     当创建一个线程的时候,系统会为它预留一定的地址空间去运行(每个线程都有自己的stack)。在默认情况下,每个线程的 Stack 为 1M。

     当然,你还可以在编辑器中进行手动设置。在编译程序时,linker 会将 stack 大小的值嵌入到文件的 PE 头中,这样当程序加载运行时,系统会读取该值并为它设置相应大小的 stack。

     除此之外,在调用 CreateThread 函数和 CreateProcess 函数时,还可以用参数去指定 Stack 的大小。

示例:

     说明:在下图中, “committed page” 表示线程实际使用的页面;"Reserved page" 表示系统为线程事先预留但还未使用的页面。

     线程运行真正运行之前,系统首先会为其预留对应的 stack,然后占用顶部的两个page。

  • stack pointer 指向 stack 的顶部位置(在下面左图中,就指向 0x08100000 - 1)
  • 第二个page 被称为 guard page。
     每当线程用完现在的 committed page ,要占用 guard page 的地址空间时,系统就
会收到通知,然后将下面事先预留的 page 拿出来(committed),将guard page的内容挪到新的page,线程继续使用先前的guard page。 
     随着线程的运行,就会占用更多的page。最后可能会如下面的右图所示。
     值得注意的是:这个过程中,gurad page 始终都是在最后一个 commited page 的下面(guard page 中记录的是一些访存保护标识符)。当guard page移到了最后一个page时(即Bottom of stack), 线程还尝试去占用了新page时,系统就会抛出 EXCEPTION_STACK_OVERFLOW 异常。

             

系列文章是本人看《windows核心编程》时的一些学习笔记,有疏忽之处,欢迎各位网友指正。QQ邮箱:job.zhanghui@qq.com

转载于:https://www.cnblogs.com/java20130722/archive/2013/01/31/3207097.html

你可能感兴趣的文章
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
面向对象1
查看>>
在ns2.35中添加myevalvid框架
查看>>
【贪心+DFS】D. Field expansion
查看>>
为什么要使用href=”javascript:void(0);”
查看>>
二进制文件的查看和编辑
查看>>
oracle正则表达式
查看>>
twitter——数据连接
查看>>
Maven创建项目时出现Generating project in Interactive mode就一直卡住的解决方案
查看>>
angular框架的面试题集锦
查看>>
JAVA泛型使用方法总结
查看>>
HTML_记录2
查看>>
ECSHOP中ajax的调用原理
查看>>
新浪微博API OAuth1 Python3客户端
查看>>
MongoDB—— 写操作 Core MongoDB Operations (CRUD)
查看>>
18_simpleadapter和ArrayAdapter总结
查看>>
盒子模型的弹性盒
查看>>
嫁给程序员1314的好处
查看>>
【高精度&想法题】Count the Even Integers @ICPC2017HongKong/upcexam5563#Java
查看>>
蓝桥杯-猜年龄-java
查看>>