В чем разница между резервным аргументом и аргументом коммита CreateThread
Функция Windows API?
Я не могу понять следующие строки ..
Аргумент reserve устанавливает количество адресного пространства, которое система должна зарезервировать для стека потока. По умолчанию это 1 МБ.
Аргумент commit указывает объем физической памяти, который должен быть изначально зафиксирован в зарезервированной области стека.
эти две строки вы найдете их в этом параграфе, который объясняет один из параметров CreateThread
функция в с ++
cbStackSize
cbStackSize
Параметр указывает, сколько адресного пространства поток может использовать для своего собственного стека. Каждый поток имеет свой собственный
стек. когдаCreateProcess
запускает процесс, он внутренне вызываетCreateThread
инициализировать основной поток процесса. Для
cbStackSize
параметр,CreateProcess
использует значение, хранящееся в исполняемом файле. Вы можете контролировать это значение, используя
компоновщика/STACK
переключатель:
/STACK:[ reserve][, commit]
Резервный аргумент устанавливает объем адресного пространства, которое система должна зарезервировать для стека потока. По умолчанию это 1 МБ.
Обязательный параметр определяет объем физической памяти, который должен быть изначально зафиксирован в зарезервированной области стека.
Различие — это различие между виртуальной и физической памятью.
В любой операционной системе, достойной этого названия, в том числе в Windows, указатели не указывают места на чипе памяти напрямую. Они представляют собой места в виртуальной памяти, зависящей от процесса, и операционная система затем выделяет части физической микросхемы памяти для хранения содержимого частей, где процесс фактически сохраняет что-либо по требованию. И может поменять некоторые данные на диск, когда ему не хватает оперативной памяти.
резерв размер непрерывного блока виртуальной памяти, выделяемого для стека. Ниже и выше диапазона будут храниться другие данные, поэтому резерв устанавливает верхний предел того, насколько большим может быть стек.
К счастью, виртуальной памяти обычно много. У вас 2GiB на 32-битной Windows, 3GiB, если вы связываетесь с /LARGEADDRESSAWARE
флаг и огромное количество, если вы компилируете для 64-бит (x64
). Единственным исключением является WinCE до 5.0, где у вас есть только 32 МБ. Поэтому, если вы не создаете миллионы потоков, вы можете быть здесь щедрыми, и вы должны быть такими, потому что если вам не хватит, процесс завершится сбоем.
совершить это размер физической памяти, которую система должна предварительно выделить для стека. Это позволяет системе немедленно получить место в физической памяти, которая является общим ресурсом и может быть недостаточной. Может потребоваться поменять или удалить его предыдущий контент, чтобы получить его. Когда вы превысите его, система автоматически закодирует еще немного за счет небольшой задержки. Таким образом, единственное, что вы получаете, увеличивая это значение, это небольшое ускорение. если у вас действительно есть потребность в памяти. Это замедлится, если вы этого не сделаете. Так что вы должны быть консервативны здесь.
В стеке размещаются локальные переменные. Если вы используете большие локальные буферы — и это часто разумно, так как распределение стека происходит намного быстрее, чем распределение кучи (через malloc
/new
/ все, что использует std::allocator
) — вам нужно зарезервировать достаточно стека. Если вы этого не сделаете, 1MiB обычно достаточно.
Запас устанавливает потолок на то, сколько стекового пространства будет иметь нить. Коммит ставит пол на это. Таким образом, он начинает потреблять объем фиксации памяти и перестает потреблять, когда он достигает резерва.
Каждый процесс имеет адресное пространство. Стек каждой нити находится где-то в этом пространстве. При создании протектора ОС выделяет часть адресного пространства размером резерв.
Но это не назначает никакой реальной памяти всему этому пространству. Назначает только совершить количество памяти.
Стек может расти со временем, и ОС будет добавлять к нему больше страниц, расширяя совершить количество. Но оно не может расти бесконечно. Это не может расти больше чем резерв.