Максимальный размер стека многопоточного процесса

В моем понимании

  1. каждый поток процесса получает стек, в то время как обычно для процесса существует только одна куча.
  2. Существует предел максимального размера стека по умолчанию, установленный ОС.

    1. Windows-64 bit : 1MB
    2. Linux-64 бит: 8 МБ

Применяется ли это ограничение на уровне процесса или каждый поток может иметь стек размером 1 МБ/8 МБ?

А что происходит с памятью, отведенной под стек, после выхода из потока?


person MankPan    schedule 11.05.2019    source источник


Ответы (2)


каждый поток процесса получает стек, в то время как обычно для процесса существует только одна куча.

Правильно.

Применяется ли это ограничение на уровне процесса или каждый поток может иметь стек размером 1 МБ/8 МБ?

Каждый поток получает свой собственный стек; предел размера стека для каждого потока (т. е. это не общий предел для всех потоков в процессе)

А что происходит с памятью, отведенной под стек, после выхода из потока?

Страницы памяти освобождаются и становятся доступными для использования другим кодом в будущем.

person Jeremy Friesner    schedule 11.05.2019
comment
Страницы памяти освобождаются и становятся доступными для использования другим кодом в будущем. При выходе из потока это происходит только для отсоединенного потока, для неотсоединенного (который, по крайней мере, для потоков POSIX является значением по умолчанию) это происходит, когда поток объединяется. - person alk; 11.05.2019
comment
@alk В базовой технологии потока нет ничего похожего на отсоединенный или неотсоединенный материал, отсоединенный / неотсоединенный материал находится на уровне C. - person Michael Chourdakis; 11.05.2019
comment
@MichaelChourdakis У потоков также нет стеков - что-то должно управлять стеком для потока. Стек управляется теми же механизмами, что и отсоединенный/неотсоединенный. - person Andrew Henle; 11.05.2019

каждый поток процесса получает стек, в то время как обычно для процесса существует только одна куча.

Верно первое. Последнее ложно. Процессы часто имеют несколько куч, особенно при связывании в стороннем коде.

Применяется ли это ограничение на уровне процесса или каждый поток может иметь стек размером 1 МБ/8 МБ?

За нить.

А что происходит с памятью, отведенной под стек, после выхода из потока?

Обычно они остаются выделенными для процесса до тех пор, пока процесс не завершится и адресное пространство больше не будет существовать.

person user3344003    schedule 11.05.2019