windows核心编程16
来源:互联网 发布:out of the woods 知乎 编辑:程序博客网 时间:2024/06/05 14:10
有时系统会在你自己进程的地址空间中保留一些区域。第3章讲过,对于进程和线程环境块来说,就会出现这种情况。另外,系统也可以在你自己进程的地址空间中为线程的堆栈保留一些区域。
每当创建一个线程时,系统就会为线程的堆栈(每个线程有它自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个已保留的区域。按照默认设置,系统保留1 MB的地址空间并提交两个页面的内存。但是,这些默认值是可以修改的,方法是在你链接应用程序时设定Microsoft的链接程序的/SACK选项。
当创建一个线程的堆栈时,系统将会保留一个链接程序的/ 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 Windows 98下的线程堆栈
16.2 C/C++运行期库的堆栈检查函数
C / C + +运行期库包含一个堆栈检查函数。当编译源代码时,编译器将在必要时自动生成对该函数的调用。堆栈检查函数的作用是确保页面被适当地提交给线程的堆栈。
void func()
{
int nValues[4000];
//do some processing with the array
nValues[0]=0;
}
该函数至少需要16 000个字节(4000 x sizeof(int),每个整数是4个字节)的堆栈空间,以便放置整数数组。通常情况下,编译器生成的用于分配该堆栈空间的代码只是将C P U的堆栈指针递减16 000个字节。但是,在程序试图访问内存地址之前,系统并不将物理存储器分配给堆栈区域的这个较低区域。
在使用4 KB或8 KB页面的系统上,这个局限性可能导致一个问题出现。如果初次访问堆栈是在低于保护页面的一个地址上进行的(如上面这个代码中的赋值行所示),那么线程将访问已经保留的内存并且引发访问违规。为了确保能够成功地编写上面所示的函数,编译器将插入对C运行期库的堆栈检查函数的调用。
当编译程序时,编译器知道你针对的C P U系统的页面大小。x 8 6编译器知道页面大小是4K B,A l p h a编译器知道页面大小是8 KB。当编译器遇到程序中的每个函数时,它能确定该函数需要的堆栈空间的数量。如果该函数需要的堆栈空间大于目标系统的页面大小,编译器将自动插入对堆栈检查函数的调用。
- windows核心编程16
- 【Windows 核心编程】Windows 核心编程 -- 进程
- 【Windows核心编程】Windows核心编程 -- 作业
- WINDOWS核心编程笔记(16-21)
- windows核心编程13-16 18
- Windows核心编程(三)
- windows核心编程--字符集
- windows核心编程--进程
- windows核心编程--作业
- windows核心编程--线程
- windows核心编程--纤程
- windows核心编程--精华
- windows核心编程--纤程
- windows核心编程 十年磨剑
- windows 核心编程 线程
- WINDOWS核心编程--虚拟内存
- WINDOWS核心编程--堆栈
- windows核心编程学习
- 手把手教你玩转SOCKET模型之重叠I/O篇(上)
- oracle sql 优化(摘一)
- 运行时库
- 手把手教你玩转SOCKET模型之重叠I/O篇(下)
- The differences of Circuit Maintenance Messages between BICC & ISUP
- windows核心编程16
- 同步串口类
- windows核心编程18
- ASP 三十二条精华代码
- windows核心编程19
- 如何手工在 SQL Server 2005 中为安装程序增加计数器注册表项值
- 改变浏览器窗口的大小和位置
- window对象属性
- PetShop的系统架构设计