【问题标题】:What is the Difference between reserve and commit argument to CreateThread?CreateThread 的保留和提交参数有什么区别?
【发布时间】:2014-08-07 06:41:02
【问题描述】:

CreateThread Windows API 函数的保留参数和提交参数有什么区别?

我无法理解以下几行..

reserve 参数设置系统应为线程堆栈保留的地址空间量。默认值为 1 MB。 commit 参数指定最初应提交到堆栈保留区域的物理存储量。

这两行您将在本段中找到它们,它解释了 c++ 中CreateThread 函数的参数之一

cbStackSize

cbStackSize 参数指定线程可以为自己的堆栈使用多少地址空间。每个线程都有自己的 堆。当CreateProcess 启动一个进程时,它在内部调用CreateThread 来初始化该进程的主线程。为了 cbStackSize 参数,CreateProcess 使用存储在可执行文件中的值。您可以使用 链接器的/STACK 开关:

/STACK:[ reserve][, commit]

reserveargument 设置系统应该为线程堆栈保留的地址空间量。默认值为 1 MB。 commit 参数指定最初应提交到堆栈保留区域的物理存储量。

【问题讨论】:

  • 您能否重新表述问题,以便立即明确您在谈论哪个函数的论据? ...或者我会尽力为你做。
  • 上面提到“这两行你会在本段中找到它们,它解释了c++中createthread函数的参数之一”
  • 这里可以编辑问题。我已经编辑了这个问题,使其更加明显并应用了正确的格式。如果您不喜欢它,可以进一步编辑它。
  • 顺便说一句,Windows API 中没有createthread 函数,只有CreateThread。 C 和 C++ 区分大小写。

标签: c++ winapi virtual-memory


【解决方案1】:

区别是虚拟内存和物理内存的区别。

在任何名副其实的操作系统中,包括 Windows,指针并不直接指定内存芯片上的位置。它们是特定于进程的虚拟内存空间中的位置,然后操作系统会分配部分物理内存芯片来存储进程实际按需存储任何内容的部分的内容。并且当 RAM 用完时可能会将一些数据交换到磁盘。

reserve 是为堆栈分配的连续虚拟内存块的大小。低于和高于该范围的其他东西将被存储,因此储备设置了堆栈可以增长的上限。

幸运的是,虚拟内存通常很充足。在 32 位 Windows 上,您有 2GiB,如果您使用 /LARGEADDRESSAWARE 标志链接,则为 3GiB,如果您编译为 64 位 (x64),则数量巨大。唯一的例外是 5.0 之前的 WinCE,您只有 32MiB。因此,除非您创建数以亿计的线程,否则您可以在这里大方并且应该大方,因为如果您没有足够的线程,进程将会崩溃。

commit 是系统应为堆栈预分配的物理内存大小。这使得系统立即在物理内存中获得一些空间,这是共享资源,可能是稀缺的。它可能需要交换或丢弃它以前的内容才能得到它。当你超过它时,系统会以小延迟为代价自动加扰一些。因此,通过增加此处的值,您获得的唯一好处就是稍微加快速度如果您确实需要内存。如果你不这样做,它会变慢。所以在这里你应该保守一点。

堆栈是放置局部变量的地方。如果你使用大的本地缓冲区——这通常是合理的,因为堆栈分配比堆分配快得多(通过malloc/new/任何使用std::allocator的东西)——你需要保留足够的堆栈。如果你不这样做,1MiB 通常就足够了。

【讨论】:

    【解决方案2】:

    保留设置了线程将拥有多少堆栈空间的上限。提交在其上放置了一层。因此,它开始消耗提交的内存量,并在达到保留时停止消耗。

    【讨论】:

    【解决方案3】:

    每个进程都有一个地址空间。每个线程的堆栈都位于这个空间的某个地方。创建线程时,操作系统会分配一块大小为 reserve 的地址空间。

    但它并没有为所有这些空间分配任何实际内存。它只分配 commit 内存量。

    堆栈会随着时间的推移而增长,操作系统会向其中添加更多页面,从而扩展提交数量。但它不能无限增长。它不能超过reserve

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 2016-12-21
      • 2011-05-04
      • 2012-09-24
      相关资源
      最近更新 更多