Очень упрощенный вид памяти традиционно выглядит примерно так:
===================
| 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 мегабайта).Если программа пытается использовать больше стекового пространства, чем выделено, диспетчер памяти не допустит этого.Программа вылетит с нарушением прав доступа.И куча программы не может вырасти в память, выделенную для стека по той же причине.