2009-12-16 2 views
5

В чем разница (или причин) между программой, которая вылетает, и программой, которая висит (перестает отвечать) на C++?Разница между программой, которая вылетает, и программой, которая висит

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

Излишняя всю память вызывает зависание программы? или аварии? Я немного смущен между различиями и их причинами.

+0

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

+0

Я не думаю, что мы можем ответить на этот вопрос, как написано. Существует множество причин, по которым программа может неожиданно выйти или перестать отвечать на запросы. Можете ли вы уточнить, что вы не понимаете? –

+0

@Pop, Kristo: Я действительно проверяю код, который висит, но я вижу некоторые проблемы с утечкой памяти. Но я не уверен, что утечка памяти приведет к зависанию программы. – jasonline

ответ

11

Сбой обычно вызван незаконной инструкцией, например. доступ к недопустимой памяти, деление на ноль и т. д. Обычно это проявляется как хорошо известное исключение, которое обрабатывается операционной системой.

висячие можно разбить на 2 достаточно высоких категорий уровня:

  • ТУПИК, как правило, вызваны 2 нитями, конкурирующих за ресурс, каждый из которых требует ресурса, удерживаемого другой поток будет выпущен , Общей причиной этого является приобретение нескольких блокировок в непоследовательных заказах в нескольких потоках, что приводит к общему ABBA deadlock pattern (и это не имеет ничего общего со шведской поп-музыкой).
  • Livelock, что означает, что код по-прежнему активно работает, но вы достигли состояния, которое вы не можете оставить. Например:
    • состояние 2 процессов/потоков постоянно меняются, никогда не достигая конец условию
    • в то время как цикл, где никогда не будет удовлетворено условие выхода, или бессрочный цикл (хотя это растягивая определение «livelock»).

Обновление на основе вопроса комментарий

@Pop, Kristo: Am фактически проверка на код, который висит, но я вижу некоторые проблемы на утечки памяти. Но я не действительно уверен, что если утечка памяти вызывает программу для зависания . - jasonline

Утечка памяти может привести к взрыву программы, но это зависит от различных факторов:

  • Размер утечки
  • Частота утечки
  • Срок применения

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

В C++, если оператору new не удается выделить память, будет выбрано исключение std::bad_alloc. Это, скорее всего, будет зависеть от ОС, что приведет к сбою (если вы не написали конкретный обработчик в своем приложении для этого исключения и не сможете обработать его более изящно).

+0

И основное различие между сбоями и зависанием состоит в том, что сбой обычно завершает процесс, а зависание продолжает процесс без заметного прогресса. – Amber

+0

Dav: Да, я понимаю эффекты, но то, что я хотел бы узнать больше, - их причины. – jasonline

0

Повреждения также могут быть вызваны ожиданием внешних ресурсов, в основном сетевых. Хотя обычно это случается через некоторое время. Видение также может быть вызвано прекращением потока, который обрабатывает что-то, связанное с обработкой. Например, если поток пользовательского интерфейса отправил рабочий поток для выполнения некоторой работы, и рабочий поток умер, программа, похоже, будет висела.

0

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

Вы можете узнать больше о том, как цикл обработки сообщений работает здесь:

http://www.winprog.org/tutorial/message_loop.html

0

Важный фактором между подвешиванием и сбою является основной операционной системой в отношении поддержки, предоставляемой для программного обеспечения и аппаратных средств обработки исключений и/или защитный механизм. Например, в старом мире DOS вы можете повесить всю систему с недопустимым доступом к памяти при работе в реальном режиме (поскольку 386> DOS-расширители разбились с исключениями, по крайней мере, такими популярными, как DOS4GW).

Исключительное и неправильное поведение приложений в режиме пользователя может быть остановлено при надлежащей поддержке со стороны ОС и библиотек времени выполнения, за исключением взаимоблокировок.

В коде режима ядра, конечно, возможность висит намного выше.

0

Похоже, вы в основном ответили на свой вопрос.

несколько дополнительных причин, я могу думать за аварии:

  • Нелегальная инструкция. Например, если вы запустите SSE-код на старый процессор.
  • Плохой доступ к памяти довольно расплывчатый. Существуют такие подсекции, как невысокий доступ к словам на некоторых процессорах, переполнение стека, доступ к несвязанным страницам, запись на страницы только для чтения, выполнение невыполняемых страниц, параллельный доступ, приводящий к сломанным инвариантам, для обозначения несколько ...
  • В Linux ваш процесс может быть убит (по-видимому, случайным образом), если система очень мала в памяти. (См этого поиск "OOM killer")

В дополнении к тупикам, у вас есть:

  • "Livelocks".
  • нить UI заблокированы какое-либо другое действие (некоторые примеры: I/O, страницы выселяют на диск в условиях низкой памяти)
  • Другие ошибки программиста, такие как циклы, которые никогда не заканчиваются в некоторых условиях, которые не были протестированы.
+0

Спасибо за дополнительную информацию. – jasonline

0

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