Вау! Так много ответов, и я не думаю, что один из них понял это правильно ...
1) Где и что они (физически в памяти реального компьютера)?
Стек - это память, которая начинается с наивысшего адреса памяти, выделенного для образа вашей программы, и затем уменьшается в этом значении. Он зарезервирован для параметров вызываемой функции и для всех временных переменных, используемых в функциях.
Есть две кучи: публичная и приватная.
Частная куча начинается с 16-байтовой границы (для 64-битных программ) или 8-байтовой границы (для 32-битных программ) после последнего байта кода в вашей программе, а затем увеличивается в значении , Это также называется кучей по умолчанию.
Если частная куча становится слишком большой, она перекрывает область стека, как и стек, если она становится слишком большой. Поскольку стек начинается с более высокого адреса и работает до более низкого адреса, при правильном взломе вы можете сделать стек настолько большим, что он будет переполнять область приватной кучи и перекрывать область кода. Хитрость заключается в том, чтобы перекрыть достаточно области кода, которую вы можете подключить к коду. Это немного сложно сделать, и вы рискуете сбой программы, но это легко и очень эффективно.
Общедоступная куча находится в собственном пространстве памяти вне пространства образов вашей программы. Именно эта память будет перекачана на жесткий диск, если ресурсы памяти станут недостаточными.
2) В какой степени они контролируются ОС или языковой средой выполнения?
Стек управляется программистом, частная куча управляется ОС, а общедоступная куча никем не контролируется, поскольку она является службой ОС - вы делаете запросы, и они либо удовлетворяются, либо отклоняются. *
2b) Каков их охват?
Все они являются глобальными для программы, но их содержимое может быть частным, общедоступным или глобальным.
2c) От чего зависит размер каждого из них?
Размер стека и частной кучи определяются параметрами времени выполнения вашего компилятора. Общая куча инициализируется во время выполнения с помощью параметра размера.
2d) Что делает человека быстрее?
Они не предназначены для быстрой работы, они предназначены для того, чтобы быть полезными. То, как их использует программист, определяет, являются ли они «быстрыми» или «медленными»
REF:
https://norasandler.com/2019/02/18/Write-a-Compiler-10.html
https://docs.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-getprocessheap
https://docs.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-heapcreate