2009-10-17 4 views
2

У меня смешанный процесс с собственным и управляемым кодом, запущенным на сервере Windows 2003.Что именно происходит, когда мой процесс убит?

Когда я убиваю свой процесс из процесса, он переходит в состояние 100% -ного процессора и некоторое время остается на месте (иногда даже 10 минут) перед отъездом. За это время я не могу «убить» его или сделать что-нибудь еще.

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

Спасибо, Dan

+1

Это на Vista/Win7? –

+1

Он сказал 'Windows server 2003'. – Jim

+0

Простите, пропустил это, спасибо. Вы получаете то же поведение с другими инструментами, как kill.exe из набора ресурсов, taskkill.exe с параметром/F или pskill.exe? –

ответ

1

Попробуйте его с помощью Завершить процесс (на вкладке Process) из диспетчера задач вместо этого, и попробовать, есть ли разница, если вы выбираете убить процесс с дерева на любом диспетчере задач или Winternal в Process Explorer, однако я сомневаюсь, что это поможет.

Процесс должен быть убит (почти) мгновенно, однако есть некоторые подлые способы придерживаться. Если вы написали свое собственное приложение, я предполагаю, что это не так. Более вероятно, что другим процессам не нравится, когда вас отнимают. Установите Process Monitor на скорость быстрого обновления и отсортируйте столбец процессора. Теперь вы должны увидеть, какой процесс вызывает 100% -ную проблему. Скорее всего: система.

В случае, если вы используете много памяти, особенно. когда это в целом больше, чем физическая память, система будет реорганизоваться (т. е. переместить память с диска обратно в физическую память). Подобное поведение происходит (вплоть до замораживания моей системы), когда я убиваю Firefox после того, как открываю 500 + вкладки, занимая 1,5 ГБ памяти. Такое поведение (медленная реорганизация памяти) улучшилось с более поздними версиями Microsoft Windows.

ОБНОВЛЕНИЕ: внутренне, proc expl. вызывает TerminateProcess (среди прочих), который принудительно закрывает все ручки и потоки. MSDN API ref говорит: «TerminateProcess инициирует завершение и немедленно возвращается. Это останавливает выполнение всех потоков в процессе и требует отмены всех ожидающих ввода-вывода. Прекращенный процесс не может выйти, пока все ожидающие ввода-вывода не будут завершены или отменены».. Это означает, что: ваш ввод-вывод может блокировать этот процесс (хотя мне интересно, как он может довести ваш процесс до 100%, I/O обычно этого не делает).

+0

Я уверен, что мой процесс принимает 100% -ный процессор, а не какой-то другой процесс. Память reorg. звучит интересно - я посмотрю на это. Спасибо – DanJ

0

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

Когда ваше приложение убито, в идеале ожидается, что все ресурсы, которые будут использованы, будут освобождены, но именно поэтому вы должны обеспечить реализацию интерфейса IDispose, чтобы помочь с этим, иначе вы можете обнаружить, что какой-то файл открыть, который не может быть повторно открыт, и ваш единственный вариант - перезагрузка.

Это происходит, когда вы пытаетесь убить другие приложения или только этот?

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

+0

если приложение убито таким образом, объекты IDisposable больше не вызываются, все источники (дескрипторы объектов) принудительно закрываются. – Abel

0

Не могли бы вы взглянуть на потоки в Process Explorer? Посмотрите, что работает, и особенно то, что занимает 100% процессор. Посмотрите, можете ли вы найти стек вызовов и изолировать конкретный поток или даже функцию. Отправьте ответ здесь, если сможете!

+0

Проводник процесса не может получить стек потока после того, как я убью процесс. – DanJ

1

Очевидно, что-то пытается продолжить работу, что вызывает состояние зависания/тупика, которое вы видите. Я мог бы попытаться объяснить, как использовать некоторые инструменты, чтобы попытаться выяснить, что происходит, но я, вероятно, должен просто отложить вас до мастера ... Tess - Lab on High CPU Hang

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

0

Мой психический отладчик состоит в том, что у вас было много ресурсов, все еще выделенных (например, файлы/рег-дескрипторы, объекты win32k и т. Д.), И ядро ​​очищает их. Когда вы используете Process Explorer для взлома в приложение, используется ли использование ресурсов?

+0

Использование ресурсов выглядит нормально, но похоже, что я чего-то не хватает. Память, ручки, потоки, все выглядит нормально. Любые другие ресурсы, которые я должен искать? – DanJ

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