суббота, 16 мая 2009 г.

Почему некоторые убитые процессы продолжают показываться в Диспетчере Задач?

Это перевод Why do some process stay in Task Manager after they've been killed? Автор: Реймонд Чен.

Когда процесс завершается (либо по естественным причинам, либо из-за чего-то более грубого, типа TerminateProcess) - часть процесса, принадлежащая пользовательскому режиму, отбрасывается. Но часть процесса от режима ядра не может быть отброшена, пока все драйверы не закончат работу с потоком.

Например, если поток во время завершения производил операцию ввода-вывода (I/O operation), то ядро оповещает драйвер, выполняющего эту операцию, о том, что эту операцию надо бы отменить. Если драйвер - "хороший", то он отменяет недовыполненный запрос ввода-вывода и отпускает поток.

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

Ну, это вообще-то упрощённая картина того, что происходит на самом деле. Комментатор Commenter Skywing дал более точное объяснение для тех, кто любит более точные объяснения.

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

После того, как все драйверы признали смерть процесса, "мясо" процесса наконец-то уходит. Всё, что после него остаётся - "объект процесса", который живёт до тех пор, пока не закроются все описатели процесса и его потоков (вы ведь не забываете вызывать CloseHandle для закрытия дескрипторов в записи TProcessInformation, возвращаемой вам функцией CreateProcess, не так ли?).

Другими словами, если процесс всё ещё слоняется по округе после того, как вы его убили - то это значит, что он действительно мёртв, просто не все системные драйверы поставили на это событие своё "добро".

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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