Вне памяти понятия


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

2 5

2 ответа:

  • нет понятия "середина"
  • в зависимости от того, как работает базовая операционная система (если она вообще существует!) управляет процессами (если есть такая вещь на платформе!), стек может иметь ограниченный размер, намного меньший ,чем "остальная часть всей памяти"
  • в зависимости от того, как работает базовая операционная система (если она вообще существует!) управляет виртуальным пространством памяти (если такое есть на платформе!), куча может иметь ограниченный размер, гораздо меньший ,чем " остальная часть целого память "
Если какой-либо из этих пределов существует, то существует очень малая вероятность того, что эти области встретятся друг с другом. На самом деле, скорее всего, они скорее всего просто исчерпают пространство, и механизмы защиты поднимут соответствующие аппаратные программные исключения. Это означает, что событие "вне памяти" не является чем-то одним. Есть ООМ в стеке, и ООМ в куче. В моих частях света традиционно то, что связано со стеком, называется StackOverflow :) и тот связанный с кучей-это выход из памяти [кучи]. Примечательно, что если ваша платформа имеет понятие виртуальной памяти, то стек, скорее всего, все еще является сингулярным блоком пространства, но куча, вероятно, будет разреженной конструкцией и будет состоять из нескольких рассеянных блоков пространства, не обязательно физически упорядоченных каким - то восходящим или нисходящим образом. В таком случае трудно говорить о какой-либо встрече с чем-либо. StackOverflow происходит, когда стек достигает предела размера, и OutOfMemory происходит когда диспетчер памяти не может найти подходящее свободное отверстие в пространстве памяти.

Если игнорировать виртуальную память, а если говорить только о "сыром железе", то это зависит от .. где на самом деле находится стек. IIRC(!), на некоторых (действительно старых) платформах стек был предварительно распределен в некотором предопределенном пространстве, расположенном в начале физической памяти, скажем, первые десять страниц, и вырос "до дна". Затем были несколько страниц таблиц аппаратных карт и изображений состояния порта, а затем оставшийся хвост был кучей. При такой настройке StackOverflow повышается, когда указатель стека достигает нуля . Это было довольно "умно", потому что обнаружение нуля легко с флагами состояния процессора.. Кроме того, для этих старых процессоров было намного легче достичь более низких адресов, чем более высоких, поэтому размещение часто доступного стека в более низких адресах было большим плюсом.

IIRC(!), более новые платформы не имеют этих проблем (обычно, давайте игнорировать NUMA и подобные вещи), а текущие традиционная установка "сырого оборудования" помещает специальные области (таблицы, карты портов и т. д.) В начало пространства, затем кучу, затем "свободную область", затем стек, и StackOverflow происходит, когда свободная область исчезает, то есть когда стек встречается с любым блоком уже у кучи. Обратите внимание, что StackOverflow все еще не означает OutOfMemory: стек может быть переполнен, но куча может иметь некоторые пробелы и все еще может иметь много свободного места!

Пожалуйста, имейте в виду, что эти "IIRC" важны. Я не эксперт по Arduino и текущим архитектурам процессоров, а также "историческому" blargh выше, возможно, совсем не подходит с точки зрения того, что было новее/старше. Я даю ему вероятность 80%, чтобы быть правдой.

Стек имеет определенный выделенный размер, и если вы выходите за пределы этого размера, у вас будет переполнение буфера стека.

В программном обеспечении переполнение стека происходит, когда используется слишком много памяти. стек вызовов. Стек вызовов содержит ограниченный объем памяти, часто определяется в начале программы.

Источник Википедия