Как я могу определить, находится ли процесс в тупике или ожидает ввода-вывода - PullRequest
1 голос
/ 04 ноября 2011

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

РЕДАКТИРОВАТЬ: Я хотел бы знать о методах и API, а также сделать это.Так что я могу запустить программу мониторинга, если захочу.

Ответы [ 4 ]

2 голосов
/ 04 ноября 2011

В Windows вы можете подключить WinDbg, а затем выполнить !analyze -v -hang, чтобы определить, какой поток ожидает ввода-вывода. (Единственный раз, когда я использовал это, мне повезло, и это был открытый вызов, который ждал, поэтому я очень быстро узнал имя файла.)

2 голосов
/ 04 ноября 2011

В Linux я бы использовал sar -u 1.Если столбец %iowait высокий, то приложение, вероятно, ожидает ввода-вывода

0 голосов
/ 05 ноября 2011

Ответ заключается в том, что существует множество возможных решений в качестве решений.

Если в вашем приложении вы используете open () с lockf () или flock () для блокировки ресурса.Поэтому в следующий раз, когда другой процесс (или тот же процесс) попытается скопировать () тот же файл, он будет заблокирован.

Если вы открываете файл с неблокирующими блокировками LOCK_NB (см. «Man -s 2 flock in Ubuntu)», а затем возвращаетесь с ошибкой EWOULDBLOCK, то вы можете сделать вывод, что файл заблокирован.

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

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

http://www.dba -oracle.com / t_deadlock.htm

Другие курсы описаны в общих курсах ОС:

http://lovingod.host.sk/tanenbaum/Recovery-from-Deadlock.html

0 голосов
/ 04 ноября 2011

В Linux вы можете присоединить gdb к запущенному процессу. Он остановит процесс в том месте, где он запущен, с bt вы получите обратную трассировку. Вы также можете получить информацию о всех запущенных потоках, переключаться между ними и просматривать обратную трассировку каждого, используя info threads; thread N; bt.

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

...