2

Как ОС определяет, сколько пространства стека будет передано каждому потоку в адресном пространстве базового процесса?Как операционная система определяет, сколько пространства стека должно быть выделено для каждого потока?

А что, если нить использует все пространство стека, выделенное ему первоначально, и существует много недоиспользуемого пространства другими потоками одного и того же процесса? Я понимаю, что проблема такого же типа b/w стека и кучи разрешается обоими из них, растущими в противоположных направлениях.

Оставляет ли ОС больше места в другом месте в памяти для потока или вызывает переполнение стека?

+2

Что происходит, когда нить исчерпывает свой стек? Ответ выше вашего вопроса. –

+0

Но что, если в пространстве адресов процесса было много недоиспользуемого пространства другими потоками, все равно это приведет к переполнению стека? – amiageek

+1

Да. Стек каждого потока является отдельным и независимым от других стеков потоков. Смешение их в целом было бы очень плохой идеей. –

ответ

4

Это не до ОС, чтобы решить, что это работа программиста. Взяв Windows в качестве примера, размер стека начинается с потока, который запускается ОС, указан в заголовке исполняемого файла. Размер IMAGE_OPTIONAL_HEADER.SizeOfStackReserve. Что передает доллар любому инструменту, сгенерированному заголовком, как компоновщик, вы используете его /STACK option для установки размера.

Большинство инструментов сборки будут использовать разумный размер по умолчанию, один мегабайт для размера резерва очень распространен, 4096 (одна страница) для начального размера фиксации. Или не столь разумные дефолты, программы .NET печально совершают все пространство стека впереди.

Это также необходимо указать при запуске потока, функция winapi, такая как CreateThread, принимает аргумент для установки размера. По умолчанию доступно, если вы укажете 0, то ОС использует размер, указанный в заголовке EXE. Это очень часто, фактический размер редко критичен, поскольку большинство программ сильно увеличивают размер стека. Важно оставаться вдали от катастрофы. Обратите внимание, что превышение размера стека не стоит ничего в операционной системе с запросами, вы платите только за то, что используете.

Запуск из пространства стека является неустранимой ошибкой во многих случаях, процессор больше не может звонить. Причина этого имени веб-сайта. То, что есть другие потоки вокруг, которые не потребляют весь их стек, не имеет значения, коммутационные стеки вообще не могут работать. Программы используют указатели для стека пространства, вы не можете найти их для обновления значения.

+0

Означает ли это, что если поток использовал пространство стека по умолчанию, программист хотел, чтобы он имел и за пределами этого пространства начало стека следующего потока, программа дала бы мне переполнение стека, или этот стек может быть заменен из своего текущего местоположения в памяти и хранится в каком-либо другом месте в памяти, где доступно пространство, после внесения изменений в карту виртуальной памяти? – amiageek

+2

На вопрос и ответили. Вам нужно перестать предполагать, что «обмен» может работать. Это невозможно. Изучение языка C - это хороший способ понять машину. –

Смежные вопросы