2010-04-06 35 views
11

Quiero usar setitimer() (o menos probable, alarm()) en proceso multiproceso en Linux 2.6+ con NPTL-enabled libc. ¿Qué hilo recibirá sigalarm (SIGALRM) de kernel?setitimer, SIGALRM y proceso multiproceso (linux, c)

Gracias.

actualización 2014-04: ¿Cómo debo configurar el setitimer() en el programa multiproceso, si quiero escribir una utilidad de creación de perfiles como cpuprofile de gperftools; pero en mi herramienta quiero apoyar tanto los programas vinculados dinámicamente (de modo que es posible inyectar mi propia biblioteca para iniciar el perfilado) como los programas vinculados estáticamente (sin la posibilidad de hacer ^^^^^^).

Mi herramienta de perfilado actual funciona con la configuración setitimer justo después fork() y antes exec(), y también se utiliza ptrace para obtener el control sobre el programa de destino y para secuestrar SIGPROF/SIGVPROF/SIGALRM generada por el setitimer. No tengo una idea exacta de cómo funciona con los programas multiproceso.

+1

es lo mismo para freebsd y solaris? – osgx

Respuesta

13

Desde la página signal(7) hombre:

Una señal de proceso dirigida puede entregado a cualquiera de los hilos que actualmente no tienen la señal de bloqueado. Si hay más de uno de los hilos tiene la señal desbloqueada, , entonces el kernel elige un hilo arbitrario al cual entregar la señal.

Ahora, alarm(2) página del manual dice que:

alarma() se encarga de una señal SIGALRM para ser entregados al proceso en el segundos segundos.

Por lo tanto, la señal se envía a un proceso(una señal podría estar dirigido a cierta hilo también) y por lo tanto no se sabe cuál de los hilos lo recibirá.

Lo mismo con setitimer(2):

Cuando cualquier temporizador expira, una señal es enviada a el proceso, y los reinicia el temporizador (potencialmente).

Puede bloquear SIGALARM en todos sus hilos excepto uno, entonces puede estar seguro de que será entregado a ese único hilo. Suponiendo que está utilizando pthreads, puede bloquear señales con pthread_sigmask().

+0

y ¿qué pasa con setitimer? – osgx

+0

Pasa lo mismo con todas las señales. – nos

+2

@nos Básicamente, pero puede entregar señales directamente a un determinado hilo con, por ejemplo, 'pthread_kill()' – pajton

4

No fue tema interesante en LKML en 2010 https://lkml.org/lkml/2010/4/11/81: "setitimer vs. hilos: SIGALRM volvió a qué hilo (maestro proceso o niño individual)?" Por Frantisek Rysanek (cz). Autor dice que setitimer utiliza señales por hilos, al menos en los tiempos antes de Fedora 5:

... setitimer() tenían granularidad por hilo.Solía ​​entregar un SIGALRM del temporizador al hilo particular que llamaba setitimer().

Pero en sombreros de ala más recientes se cambió el comportamiento ("hombre pthreads", ... "Hilos no comparten contadores de intervalos (fijos en el kernel 2.6.12).")

En el tema, Andi Kleen (Intel) recommends to switch to "temporizadores POSIX (timer_create)"; y en ML thread Davide Libenzi sugiere el uso de timerfd (timerfd_create, timerfd_settime) en Linuxes no antiguos.

+0

Google con el proceso de '' setitimer' thread ". Otras páginas interesantes: [Solaris 9] (http://www.shrubbery.net/solaris9ab/SUNWdev/MTP/p34.html) "Cuando el temporizador de intervalo expiró, ya sea SIGVTALRM o SIGPROF, según corresponda, se envió al LWP que poseía el temporizador de intervalo. "; [Redhat error 142790 "los temporizadores de la CPU del temporizador deben ser por proceso, no por subproceso", 2004] (https://bugzilla.redhat.com/show_bug.cgi?id=142790) "setitimer opera en subprocesos individuales, incluso bajo NPTL . POSIX dice que debería ser todo el proceso ". Enviar mensajes de odio a POSIX y Roland McGrath ("Mis cambios están en el árbol de Linus ahora ... 2.6.12") – osgx

+0

Google-perftools (gperftools) con cpuprofile debería tener los mismos problemas con 'setitimer': https://code.google .com/p/gperftools/"* Problema de OS X: en programas multiproceso, parece que OS X a menudo entrega la señal de perfil (desde sigitimer()) al hilo principal, incluso cuando está durmiendo, en lugar de hilos generados que están haciendo Trabajo actual*"; https://chromium.googlesource.com/external/gperftools/+/8e188310f7d8732d81b7b04f193f89964b7af6c5/src/profiler.cc - "* TODO: Detecta si setitimer() se aplica a todos los hilos en el proceso. *" – osgx

+0

HPUX tiene intervalo adicional temporizadores con un comportamiento bien definido para los hilos: http://www.polarhome.com/service/man/generic.php?qf=setitimer&type=2&of=HP-UX&sf=2 * Además ... HP-UX proporciona el después de tres temporizadores de intervalo por subproceso para subprocesos, ... la señal se entrega al subproceso ... "* – osgx

Cuestiones relacionadas