Может ли стек перерасти в кучу? - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я изучаю операционные системы и узнал, что стек расположен между ядром и кучей.Что меня смущает, так это то, что в большинстве реализаций, поскольку стек имеет тенденцию расти вниз, а куча растет до более высоких адресов памяти, что мешает стеку расти в кучу?Если бы это было возможно, что бы произошло, если бы оно превратилось в кучу?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Очень упрощенный вид памяти традиционно выглядит примерно так:

 ===================
| Operating System  | High memory
 ===================
|   Your program    |
|  ---------------  |
| | Process stack | |
|  ---------------  | Transient program area
| |  Process heap | |
|  ---------------  |
| |  Program code | |
|  ---------------  |
 ===================
| Operating system  | Low memory
 ===================

Как вы указали, стек процессов начинается чуть ниже кода операционной системы и растет вниз.Куча процесса, с другой стороны, начинается чуть выше фиксированного программного кода и растет вверх.

В первые дни операционных систем ПК это действительно была физическая структура программы в памяти.Например, операционная система CP / M зарезервировала первые 256 байтов памяти для некоторого кода начальной загрузки операционной системы, а остальные необходимые службы операционной системы заняли область высокой памяти.Программы запускались по адресу 0x0100 и могли использовать всю память между ними и началом кода операционной системы вверху.MS-DOS была очень похожа.

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

Современные компьютеры имеют гораздо более продвинутые схемы памяти, и этой концептуальной картины нет.дольше держитсяСегодня операционные системы могут гораздо эффективнее обеспечивать ограничения доступа к памяти.Например, процессу назначается фиксированный сегмент для его стека (обычно порядка 1 мегабайта).Если программа пытается использовать больше стекового пространства, чем выделено, диспетчер памяти не допустит этого.Программа вылетит с нарушением прав доступа.И куча программы не может вырасти в память, выделенную для стека по той же причине.

0 голосов
/ 07 декабря 2018

Это не обязательно правильно:

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

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

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

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

...