2011-08-15 16 views
6

Yo sé que en Linux mutex se implementan como futexes abajo y futex utiliza de comparación y de intercambio mecanismo. Y generalmente para adquirir bloqueos, un hilo de espacio de usuario no necesita realizar una llamada al sistema ya que el bloqueo se resuelve en el espacio de usuario.objeto mutex llamado

Ahora mi pregunta es qué sucede cuando hay mucha contención y muchos hilos intentan bloquear un mutex al mismo tiempo. ¿Se produce una llamada al sistema para que el kernel decida qué subproceso concede el mutex? ¿Especialmente cuando las prioridades de la secuencia son diferentes? Yo mismo pienso eso.

Respuesta

7

Mientras no haya conflicto, no se realizarán llamadas al sistema. Si hay una disputa, se realiza una llamada al sistema para colocar el hilo en una cola de espera que luego se usará para encontrar el primer hilo que se activará cuando el mutex se libere. Además, se realiza un ajuste en el syscall al valor de futex para que el hilo que posee actualmente no pase por la rutina de desbloqueo "vía rápida" de usuario-tierra (que simplemente restablece el futex a cero o "desbloqueado" valor), pero en su lugar hará otra llamada al sistema para verificar la cola de suspensión para que los subprocesos en espera pasen la propiedad de bloqueo. Con más hilos compitiendo por un candado, habrá, por supuesto, una mayor probabilidad de que se encuentre una contención, pero nuevamente, si no hay contienda, entonces no se realiza una llamada al sistema.

3

Los futex hacen solo un pequeño número de bucles antes de volver a caer en un syscall, por lo que en el caso de contensión de bloqueo alto, hay una alta probabilidad de que los threads retrocedan a un syscall.