- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
下载
第1 6章 线程的堆栈
有时系统会在你自己进程的地址空间中保留一些区域。第 3章讲过,对于进程和线程环境
块来说,就会出现这种情况。另外,系统也可以在你自己进程的地址空间中为线程的堆栈保留
一些区域。
每当创建一个线程时,系统就会为线程的堆栈(每个线程有它自己的堆栈)保留一个堆栈
空间区域,并将一些物理存储器提交给这个已保留的区域。按照默认设置,系统保留 1 MB的
地址空间并提交两个页面的内存。但是,这些默认值是可以修改的,方法是在你链接应用程序
时设定M i c r o s o f t 的链接程序的/ S TA C K选项:
当创建一个线程的堆栈时,系统将会保留一个链接程序的 / S TA C K 开关指明的地址空间区
域。但是,当调用C r e a t e T h r e a d或_ b e g i n t h r e a d e x 函数时,可以重载原先提交的内存数量。这两
个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参
数为0 ,那么系统将使用/ S TA C K开关指明的已提交的堆栈大小值。后面将假定我们使用默认的
堆栈大小值,即 1 MB的保留区域,每次提交一个页面的内存。
图16 - 1 显示了在页面大小为 4 KB 的计算机上的一个堆栈区域的样子 (保留的起始地址是
0 x 0 8 0 0 0 0 0 0 ) 。该堆栈区域和提交给它的所有物理存储器均拥有页面保护属性 PA G E _
R E A D W R I T E 。
内存地址 页面状态
0x080FF000 堆栈顶部:已提示的页面
0x080FD000 带有保护属性标志的已提交页面
0x080FD000 保留页面
0 保留页面
0 保留页面
0 保留页面
0 堆栈底部:保留页面
图16-1 线程的堆栈区域刚刚创建时的样子
386计计第三部分 内 存 管 理
下载
当保留了这个区域后,系统将物理存储器提交给区域的顶部的两个页面。在允许线程启动运
行之前,系统将线程的堆栈指针寄存器设置为指向堆栈区域的最高页面的结尾处(一个非常接近
0 x 0 8 1 0 0 0 0 0 的地址)。这个页面就是线程开始使用它的堆栈的位置。从顶部向下的第二个页面称
为保护页面。当线程调用更多的函数来扩展它的调用树状结构时,线程将需要更多的堆栈空间。
每当线程试图访问保护页面中的存储器时,系统就会得到关于这个情况的通知。作为响应,
系统将提交紧靠保护页面下面的另一个存储器页面。然后,系统从当前保护页面中删除保护页
面的保护标志,并将它赋予新提交的存储器页面。这种方法使得堆栈存储器只有在线程需要时
才会增加。最终,如果线程的调用树继续扩展,堆栈区域就会变成图 1 6 - 2所示的样子。
如图 1 6 - 2所示,假定线程的调用树非常深,堆栈指针 C P U 寄存器指向堆栈内存地址
0 x 0 8 0 0 3 0 0 4 。这时,当线程调用另一个函数时,系统必须提交更多的物理存储器。但是,当系
统将物理存储器提交给0 x 0 8 0 0 1 0 0 0地址上的页面时,系统执行的操作与它给堆栈的其他内存区
域提交物理存储器时的操作并不完全一样。图 1 6 - 3显示了堆栈的保留内存区域的样子。
如你预计的那样,从地址0 x 0 8 0 0 2 0 0 0开始的页面的保护属性已经被删除,物理存储器被提
交给从0 x 0 8 0 0 1 0 0 0地址开始的页面。它们的差别是,系统并不
文档评论(0)