《Windows核心编程》之“线程栈”

本文深入探讨《Windows核心编程》中的线程栈概念,解析线程栈的组成部分,包括线程内核对象和线程栈。线程栈是存放函数参数和局部变量的栈空间,其向下生长,系统默认预订1MB并调拨两个页面。文章讨论了栈溢出和栈下溢现象,阐述了可能导致栈溢出的原因,如局部变量过多、函数调用层次过深,并提供相关示例进行说明。
摘要由CSDN通过智能技术生成

        本文主要记录我学习《Windows核心编程》第16章——“线程栈”的心得。该章篇幅较小,但较深奥,需要细细体会各个概念,在此特记录我细思后对各知识点的领悟。


一、进程与线程

        进程与线程(Process and Thread),是操作系统课程中的一对“纠缠不清”的冤家。通俗来讲,进程是系统进行资源分配和调度的一个独立单元,线程是CPU调度和分派的基本单元,线程是进程内的一个执行单元,是一个可调度实体。(关于他俩的关系,可以参考点击打开链接 )。

        进程由两个部分组成:进程内核对象和进程地址空间。其中,进程内核对象是由操作系统维护的一个与特定进程实体相关的结构体,记录进程相关的信息;进程地址空间是进程所拥有的虚拟内存空间,它是一种内存资源,但请注意,它是虚拟内存。

        同样的,线程也由两部分组成:线程内核对象和线程栈。线程本身几乎不拥有系统资源,但它能与同属一个进程的线程共享进程的全部资源。但请注意这个“几乎”,事实上,线程也拥有一点系统资源,它就是“线程栈”(除线程内核对象外)。

        无论是进程内核对象,还是线程内核对象,都是操作系统用来管理它的一个结构体,其中存放了相关的统计信息。

二、线程栈

        线程栈(Thread Stack)是用来存放线程执行时所需要的所有函数参数和局部变量的栈空间。当系统创建线程时,会为线程栈预订(reserve)一块地址空间区域(region),并给区域调拨(commit)一些物理存储器。需要注意的是,这个地址空间区域(线程栈)是在进程地址空间的用户分区中,而不是内核分区中。默认情况下,系统会预订“1MB”的地址空间并调拨两个页面的存储器。当然,这个默认大小是可以通过修改编译器(/F选项)和链接器(/STACK选项)的编译选项来修改的。

        在构建应用程序的时候,链接器会把想要的栈的大小写入到.exe或.dll的PE文件头中。当系统创建线程栈的时候,会根据PE文件头中的大小来预订地址空间区域。

        如下图,它是在x86机器上的一个线程栈内存模拟图。它的页面大小(Page size)是4KB,分配粒度(Allocation Granularity)是64KB。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值