Дизайн виртуальной машины с отдельным стеком и кучей
Я пытаюсь узнать немного больше о виртуальных машинах и языках программирования в целом, реализуя некоторые вещи, которые можно найти в книгах. Книга, которую я сейчас изучаю, хранит стек и кучу в одной области памяти. Стек растет вверх, а куча растет вниз. Я хотел бы знать, в чем преимущества этого, помимо, возможно, более простой стратегии для операций загрузки / хранения, потому что вам не нужно различать две разные области памяти.
Причина, по которой я спрашиваю, состоит в том, что я думаю об отклонении от плана в книге и наличии двух разных областей памяти для стека и кучи. Мне кажется, это имеет больше смысла, и мне не нужно беспокоиться о том, что регистры стека и кучи сталкиваются друг с другом.
2 ответа
Я хотел бы знать, в чем преимущества этого, кроме, возможно, более простой стратегии для операций загрузки / хранения (...)
Преимущество заключается в том, что вам не нужна виртуальная память, что позволяет использовать эту концепцию на самых простых процессорах / архитектурах. Также вам не нужна операционная система, которая отслеживает области памяти и их назначение программам. Другими словами, такая реализация хорошо подходит, например, для небольших встроенных систем, которые обычно не имеют (и не нуждаются) в вычислительной мощности современного настольного или серверного ЦП.
(...) потому что вам не нужно различать две разные области памяти.
Я предполагаю, что под областями памяти вы подразумеваете концепцию нескольких смежных областей памяти, которые разделены так, что у каждой из них есть диапазон адресов относительных индексов. (0, ..., n)
где n - максимальное количество байтов в этой области.
Это имеет большой смысл, если у вас есть виртуальная память, то есть ЦП реализует слой поверх физической памяти, который дает программам иллюзию того, что у каждой есть отдельное, непрерывное пространство памяти.
Ну, на старых машинах с ограниченной памятью и без виртуальной памяти два раздела памяти представляли два противоположных конца свободного пространства машины. Если у вас 48к непрерывного пространства, один конец - это стек, растущий вверх, а другой - куча, растущая вниз. В конце концов они сталкиваются, и вам "не хватает памяти".
Вот откуда вдохновение. Современные машины, безусловно, не испытывают проблем с памятью (обязательно), и у вас есть система виртуальных машин, которая помогает изолировать разрозненные части, такие как куча и стек. Тогда у вас нет реальной причины "расти" на одном и "расти" на другом. Скорее вы выделяете их до нужного размера и просто начинаете расти, пока не закончится.
Также, конечно, сегодня, с помощью виртуальных машин вы можете контролировать выполнение и тому подобное в стеке (или даже в области кучи). В прошлом не было проблем с меньшими, более старыми машинами.