Что происходит, когда стек и "куча" сталкиваются

Самый легкий ответ сначала: нет никакого различия между Вашими вторыми двумя примерами. По умолчанию средства доступа свойства являются атомарными.

Атомарные средства доступа в не собрали "мусор" среда (т.е. когда использование сохраняет/выпускает/автовыпускает), будет использовать блокировку, чтобы гарантировать, что другой поток не вмешивается в корректную установку/получение значения.

Посмотрите" Производительность и Поточная обработка " раздел Objective C Apple 2,0 документации еще для некоторой информации и для других соображений при создании многопоточных приложений.

55
задан Preet Sangha 26 August 2009 в 00:57
поделиться

4 ответа

In a modern languages running on a modern OS, you'll get either a stack overflow (hurray!) or malloc() or sbrk() or mmap() will fail when you try to grow the heap. But not all software is modern, so let's look at the failure modes:

  • If the stack grows into the heap, the typically C compiler will silently start to overwrite the heap's data structures. On a modern OS, there will be one or more virtual memory guard pages which prevent the stack from growing indefinitely. As long as the amount of memory in the guard pages is at least as large as the size of the growing procedure's activation record, the OS will guarantee you a segfault. If you're DOS running on a machine with no MMU, you're probably hosed.

  • If the heap grows into the stack, the operating system should always be aware of the situation and some sort of system call will fail. The implementation of malloc() almost certainly notices the failure and returns NULL. What happens after that is up to you.

I'm always amazed at the willingness of compiler writers to hope that the OS puts guard pages in place to prevent stack overflow. Of course, this trick works well until you start having thousands of threads, each with its own stack...

62
ответ дан 7 November 2019 в 07:12
поделиться

Это зависит от платформы. На многих платформах этого вообще не может произойти (куча и стек размещены на разных страницах, и они не должны пересекаться.

Имейте в виду, что идея увеличения кучи и роста стека вниз - это только концептуально. На очень маленьких системах (таких как старые 8-битные микросхемы, на которых выполнялся CP / M) и на некоторых PIC и других моделях с плоской памятью (без MMU или какой-либо другой виртуальной или защищенной памяти) тогда куча и стек на самом деле может быть реализовано таким образом. В этом случае поведение будет неопределенным ... но почти наверняка произойдет сбой, как только код попытается вернуться на какой-то адрес в верхней части поврежденного стека или следовать косвенному указателю из одной части из кучи в другой или ...

В любом случае ты выиграл ' не увидеть его на любой современной рабочей станции или сервере общего назначения. Вы достигнете предела ресурсов и получите сбои malloc, или вы столкнетесь с виртуальной памятью, и в конечном итоге система превратится в трепещущую кучу «нажмите красный переключатель».

42
ответ дан 7 November 2019 в 07:12
поделиться

В такие времена пора обратиться к мудрым словам доктора Эгона Шпенглера ....

  • Доктор. Эгон Шпенглер: Я забыл вам сказать кое-что очень важное.
  • Dr. Питер Венкман: ​​Что?
  • Доктор. Эгон Шпенглер: Не позволяйте куче сталкиваться со стопкой.
  • Dr. Питер Венкман: ​​Почему?
  • Dr. Эгон Шпенглер: Было бы плохо.
  • Dr. Питер Венкман: ​​Я немного не уверен в том, что здесь «хорошо / плохо». Что значит «плохо»?
  • Dr. Эгон Шпенглер: Попытайтесь представить, как вся жизнь, как вы ее знаете, мгновенно останавливается, а каждая молекула в вашем теле взрывается со скоростью света.
  • Dr. Рэй Станц: Полное протонное обращение!
  • Dr. Питер Венкман: ​​Это плохо. Хорошо. Хорошо, важный совет по безопасности. Спасибо, Эгон.
12
ответ дан 7 November 2019 в 07:12
поделиться

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

Наконец, конечно, Вселенная может треснуть.

6
ответ дан 7 November 2019 в 07:12
поделиться