2009-06-29 1 views
6

Из этого ответа: When is a C++ terminate handler the Right Thing(TM)?ОС; ресурсы автоматически очистить

Было бы неплохо иметь список ресурсов, которые «являются» и «не» автоматически очищаются с помощью операционной системы, когда приложение завершает работу. В вашем ответе было бы неплохо, если бы вы могли указать ОС/ресурс и предпочтительно ссылку на какой-либо документ (если это необходимо).

Очевидный:

Память: Да автоматически очищаются. Вопрос. Есть ли исключения?

+0

как насчет контр-примера, чтобы дать нам представление о том, что вам нужно? – skaffman

+0

Сложные ресурсы. Например, службы (например, DB). –

+0

Услуги обычно не относятся к процессам. –

ответ

4

Есть некоторые неясные ресурсы для Windows не чистят, когда приложение сбоев или выходов без явного их освобождения, главным образом потому, что ОС не знает, важно ли им уходить или нет.

  1. Временные файлы - как упомянули другие.
  2. Зарегистрировано в глобальном масштабе WNDCLASS es («Никакие классы окон, зарегистрированные в DLL, не регистрируются при выгрузке DLL. DLL должна явно отменить регистрацию своих классов при ее разгрузке». MSDN) Если ваш глобальный класс окна также имеет класс DC, то этот DC также протекает.
  3. Глобальный ATOM s (относительно ограниченный ресурс).
  4. Идентификаторы оконных сообщений, созданные с помощью RegisterWindowMessage.Они предназначены для утечки, поскольку нет UnregisterWindowMessage.
  5. Семафоры и события не просачиваются технически, но когда приложение-владелец уходит, не сигнализируя об этом, другие процессы могут зависать. Это неверно для Mutex. Если утерянное приложение исчезнет, ​​другие процессы, ожидающие этого Mutex, будут выпущены.
  6. Возможно, существует некоторая остаточная странность в Windows XP и ранее, если вы не отмените регистрацию hot key перед выходом. Другие приложения могут быть неспособны зарегистрировать одну и ту же горячую клавишу.
  7. В Windows XP и ранее это не редкость, когда вы запускаете консольное консольное окно после сбоя процесса. (В частности, приложение GUI, которое также создает консольное окно.) Оно отображается на панели задач. Все, что вы можете сделать, это свести к минимуму, восстановить или переместить окно.
  8. Багги-драйверы могут быть усугублены приложениями, которые явно не освобождают ресурсы при выходе. Простые утечки пула довольно распространены.
  9. Данные скопированы в буфер обмена. Я полагаю, что на самом деле это не так, потому что в данный момент это принадлежит ОС, а не приложение, которое оно там есть.
  10. Установленные крючки, установленные на глобальном уровне, не выгружаются, когда процесс установки падает, прежде чем снимать крюк.
3

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

Если вы ищете программные артефакты, которые могут сохраняться за завершение процесса, на Windows, вы по крайней мере:

  • ключей реестра, которые создаются без REG_OPTION_VOLATILE
  • Файлы, созданные без FILE_FLAG_DELETE_ON_CLOSE
  • Записи в журнале событий
  • Бумага, которая использовалась для печати
+1

Да, это идеал. Но не все ресурсы принадлежат ОС. –

+0

@Martin - ваше название говорит о ресурсах ОС :) Даже тогда это ошибка в компоненте или службе, которые выделили ресурс. – Michael

+0

Какие ресурсы не принадлежат ОС в конечном счете? –

3

В Windows практически все, с чем вы можете получить управление, должно фактически управляться ОС - вот почему вы получаете только ручку. Это включает, но не ограничивается Томом следующий (список скопирован из MSDN документов для CloseHandle() API):

Communications device 
Console input 
Console screen buffer 
Event 
File 
File mapping 
Job 
Mailslot 
Mutex 
Named pipe 
Process 
Semaphore 
Socket 
Thread 
Token 

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

Другие операционные системы работают одинаково. Трудно представить себе, что ОС стоит своего имени (я исключаю встроенные системы и т. Д.), Где это не так - управление ресурсами является # 1 raison d'etre для операционной системы.

+0

Мы можем согласиться, что все управляемые через ручку будут в конечном итоге освобождены ОС. –

+0

Это зависит от того, что вы подразумеваете под выпуском. Аварийный процесс не может содержать Mutex (другой процесс, ожидающий Mutex, получит право собственности на WAIT_ABANDONED). Но для Семафора это другое. Если другой процесс ждет этого, он будет висели. Если вы убьёте висящее приложение, система вернет объект Семафор. –

+0

У меня есть приложение, которое, когда он падает, регулярно выходит за окно консоли зомби (это приложение Windows, также создает консольное окно). Я должен периодически перезагружаться, чтобы очистить их все. –

3

Временные файлы хороший пример того, что будет не быть очищены - ручка отпущена, но файл не будет удален

+0

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

+0

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

+0

Но очевидно, что процесс не должен удалять его временные файлы (или что ОС должна). Рассмотрите свои файлы резервного копирования текстового процессора - вы не хотите потерять их при панике Word (или что-то еще). –

 Смежные вопросы

  • Нет связанных вопросов^_^