Что такое стек и куча

 Когда компьютеры были большими, а программы маленькими, память компьютера (все 16Кб) выглядела так:

Четверть памяти (4кБ) использовала операционная система для работы с оборудованием, для копирования данных, работы с устройствами ввода-вывода; остальное отводилось под пользовательские задачи. Компьютер был однозадачным - одновременно мог выполнять только одну задачу.

Память многозадачного компьютера выглядит так:

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

Чтобы компьютер мог одновременно выполнять несколько задач, используется адресное пространство имеющее вид «код-стек-куча» (code-stack-heap)

Здесь код - скомпилированный код программы из нулей и единиц, стек (stack) - область памяти в которой программа хранит информацию о используемых переменных, функциях и их аргументах.При вызове функции стек увеличивается, при завершении - уменьшается. Куча (heap) - область, в которой программа проводит арифметические вычисления. Использовать часть памяти кучи позволяет функция malloc(), освободить - функция free()


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

Азы устройства памяти