Многопоточность, многопроцессорность с сигналами STOP и Continue - PullRequest
3 голосов
/ 02 сентября 2010

Я работаю над проектом, где мне нужно получить собственный стек Java-приложения.я могу достичь этого частично.благодаря ptrace / multiprocessing и сигналы.

в Linux обычное Java-приложение имеет минимум 14 потоков.из этих 14 меня интересует только основной поток, из которого я должен получить собственный стек.Учитывая эту цель, я запустил отдельный процесс с использованием fork (), который отслеживает собственный стек основного потока.Короче говоря, у меня есть 2 отдельных процесса: один отслеживается, а другой - мониторинг с использованием ptrace и обработки сигналов.

шаги в процессе мониторинга:

1) получить основной идентификатор потока из14 других потоков процесса.

2) ptrace_attach main_ID

3) ptrace_cont main_ID

непрерывный цикл запускается

{

4) убить (main_ID, SIGSTOP),

5) наноспит и проверить состояние из / proc / [pid] / stat dir

6) ptrace_peekdata для чтения стека и навигации

7) ptrace_cont main_ID

8) наносон и проверка состояния из / proc / [pid] / stat dir

}

9) ptrace_detach main_ID

, который идеально непрерывно дает информацию о собственном стеке.но иногда я сталкиваюсь с одной проблемой.

Проблема:

когда я посылаю kill (main_ID, SIGSTOP) в главный поток, другие потоки из процесса завершаются илиостановленное состояние (T) и все блоки процесса.это не консистентное поведение, и весь процесс выполняется правильно.я не мог понять это поведение, поскольку я только сигнализирую основной поток, почему другие потоки затронуты этим?Может ли кто-нибудь помочь мне в анализе проблемы?

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

Спасибо, Sandeep

1 Ответ

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

Если вы используете Linux, вы должны использовать tkill (2) или tgkill (2) вместо kill (2). В FreeBSD вы должны использовать системный вызов SYS_thr_kill2. За справочную страницу tkill (2):

tgkill () отправляет сигнал sig в ​​поток с идентификатором потока tid в группа потоков tgid. (Напротив, kill (2) может использоваться только для отправки сигнал процессу (то есть группе потоков) в целом и сигнал будет доставлен в произвольный поток в рамках этого процесса.)

Не обращайте внимания на то, что tkill (2) и его друзья предназначены для использования в библиотеке внутренних потоков; обычно они используются отладчиками / трассировщиками для отправки сигналов определенным потокам.

Кроме того, вы должны использовать waitpid (2) (или его разновидность), чтобы дождаться, пока поток получит SIGSTOP, вместо опроса / proc / [pid] / stat. Этот подход будет более эффективным и более отзывчивым.

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

...