Title: | MS Windows NT Developers |
Notice: | See note 1222 for MS bug reporting info |
Moderator: | TARKIN::LIN EIBER |
Created: | Mon Nov 11 1991 |
Last Modified: | Tue Jun 03 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 3247 |
Total number of notes: | 15633 |
Folks, I need some help in tuning my application. 1. Whats the default stack size for a thread in NT? The doc. is not very clear (see for the extract of the doc at the end). A sample test program which creates 500 threads (with no local/global variables) had 12248K as the VM size. So is the default stack size for a thread ~ 24K? 2. My next, more important question is how do I reduce this stack size, so that I can reduce the memory size (VM) of my application which creates a large number of threads? These following options: - linker /STACK, - dwStack parameter in CreateThread(), - using Editbin supposidely exists to change the default stack size. But unfortunately they only help me in increasing it but not reducing it. Thanks -Jay ============================================================================ Under linker options: >>>> Stack Allocations This option sets the size of the stack in bytes. Command-line equivalent: /STACK:reserve[,commit] The Reserve text box (or the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. >>>> Under CreateThread: >>>> dwStackSize Specifies the size, in bytes, of the stack for the new thread. If 0 is specified, the stack size defaults to the same size as that of the primary thread of the process. The stack is allocated automatically in the memory space of the process and it is freed when the thread terminates. Note that the stack size grows, if necessary. >>>>> Thanks -Jay
T.R | Title | User | Personal Name | Date | Lines |
---|---|---|---|---|---|
3208.1 | EDSCLU::JAYAKUMAR | Tue Mar 18 1997 08:26 | 8 | ||
Any hints, tips on how I might lower the thread stack size than the default value (at thread creation time) so that I can decrease the mem size of the application). I was browsing the Knowledge Base CD, and there isn't much more than what the SDK doc. already has. -Jay | |||||
3208.2 | POLAR::MOKHTAR | Tue Mar 25 1997 09:46 | 34 | ||
First you should distinguish between reserved memory and commited memory. Reserved memory reserves addresses in virtual memory space. committed memory commits memory already reserved from virtual space to physical memory and/or page file. The default reserved stack space for each thread is 1M virtual space ( under this value you are limited to at most 2000 threads ). However the default commited memory from this reserved space is 4K. If a thread actually needs to reference space beyond this 4K page, an internal exception is generated and NT will trap it and commit more memory, in 4K chuncks, from the 1M virtual space into physical memory/page file. This method allows continious address space to be reserved/available for the stack without requiring physical memory/page file unless it is really needed, and when it is needed it is allocated/commited in 4K chuncks. The 1M default value can be changed through the linker STACK option. The 4K default value for commit chunk can be changed by specifying a specific value in the beginthread/createthread 'stack size' parameter. On a side note : one can also take advantage of reserve versus commit memory by allocating memory using the VirtualAlloc group of functions. Howerver if memory is allocated via GlobalAlloc/LocalAlloc or C run time library malloc, it will be reserved and commited in one step. My recollection is the heap assigned for them is only 1M ( default heap for the entire process ). If you wish a bigger heap you can create a new heap and use HeapAlloc, which also reserves and commits in 1 step. hope this helps maged | |||||
3208.3 | BHAJEE::JAERVINEN | Ora, the Old Rural Amateur | Tue Mar 25 1997 11:22 | 7 | |
This was already discussed in (I think) the Visual C++ conference (I'd wish coss-postings were indicated). Anyway, it turns out that the autor of .0 is running on an Alpha, i.e. page size 8k. Thus the minimum (virtual) stack space is 24k (one page, and a guard page at both sides). | |||||
3208.4 | EDSCLU::JAYAKUMAR | Wed Mar 26 1997 12:16 | 8 | ||
re: .2 Thanks for your explanation. It appears that the stack size cannot be less than 3 pages, which happens to be 24K on Alpha. Note 1096 HUMANE::VISUALC has some discussion on the same issue. -Jay |