对于CreateThread
Windows API函数,reserve参数和提交参数有什么区别?
我无法理解以下几行。
reserve参数设置系统应为线程堆栈保留的地址空间量。默认值为1 MB。 commit参数指定应该最初提交到堆栈的保留区域的物理存储量。
您将在本段中找到这两行,它解释了c ++中CreateThread
函数的一个参数
cbStackSize
cbStackSize
参数指定线程可以为其自己的堆栈使用多少地址空间。每个线程都拥有自己的 堆。当CreateProcess
启动进程时,它会在内部调用CreateThread
来初始化进程的主线程。为了cbStackSize
参数CreateProcess
使用存储在可执行文件中的值。您可以使用。来控制此值 链接器的/STACK
开关:
/STACK:[ reserve][, commit]
reserveargument设置系统应为线程堆栈保留的地址空间量。默认值为1 MB。 commitargument指定应该最初提交到堆栈的保留区域的物理存储量。
答案 0 :(得分:4)
区别在于虚拟和物理内存之间的区别。
在任何名副其实的操作系统(包括Windows)中,指针都不直接在内存芯片上指定位置。它们是特定于进程的虚拟内存空间中的位置,然后操作系统分配物理内存芯片的一部分以存储进程实际按需存储任何内容的部分的内容。当RAM耗尽时,可能会将一些数据交换到磁盘上。
reserve 是为堆栈分配的连续虚拟内存块的大小。低于和高于该范围的其他东西将被存储,因此储备金会对堆栈的增长程度设置上限。
幸运的是虚拟内存通常很多。在32位Windows上有2GiB,如果用/LARGEADDRESSAWARE
标志链接则为3GiB,如果编译为64位(x64
),则为巨量。唯一的例外是5.0之前的WinCE,你只有32MiB。因此,除非你创建数以万计的线程,否则你可以在这里慷慨解囊,因为如果你没有足够的,那么这个过程就会崩溃。
commit 是系统应为堆栈预分配的物理内存大小。这使得系统立即在物理内存中获得一些空间,这是一种共享资源并且可能很少。它可能需要交换或丢弃它以前的内容才能获得它。当你超过它时,系统会自动加扰一些,但代价是延迟很小。所以你通过增加这里的值来获得的唯一一点就是加速如果你实际上需要内存。如果你不这样做,它会变慢。所以你应该保守一点。
堆栈是放置局部变量的地方。如果你使用大型本地缓冲区 - 这通常是合理的,因为堆栈分配比堆分配快得多(通过malloc
/ new
/使用std::allocator
的任何东西) - 你需要保留足够的堆。如果不这样做,1MiB通常很多。
答案 1 :(得分:1)
保留对线程将具有多少堆栈空间设置上限。提交在其上设置了一个底线。因此它开始消耗提交的内存量并在达到预留时停止消耗。
答案 2 :(得分:0)
每个进程都有一个地址空间。每个线程的堆栈都位于此空间的某个位置。创建踏板时,OS会分配大小保留的地址空间。
但它没有为所有这些空间分配任何真实的内存。它仅分配提交内存量。
堆栈可以随着时间的推移而增长,操作系统会向其添加更多页面,从而扩展提交金额。但它无法无限增长。它不能超过保留。