Pregunta

¿Por qué son POSIX mutexes considera más pesado o más lento que futexes?Donde es la sobrecarga que viene en el pthread mutex tipo?He oído que pthread los mutexes se basa en futexes, y cuando no impugnados, no realice llamadas en el kernel.Parece entonces que un pthread mutex es un mero "contenedor" alrededor de un futex.

Es la sobrecarga simplemente en la función de contenedor de la llamada y la necesidad de la exclusión mutua función de "configuración" de la futex (es decir, básicamente la instalación de la pila para el pthread mutex llamada a la función)?O hay algo más de memoria de la barrera de los pasos que tienen lugar con la pthread mutex?

¿Fue útil?

Solución

Debido a que permanecen en el espacio de usuario tanto como sea posible, lo que significa que requieren menos llamadas del sistema, lo que es inherentemente más rápido porque el contexto cambia entre el modo de usuario y el modo de núcleo es costoso.

Supongo que estás hablando de núcleo Hilos cuando hablas de los hilos Posix. Es completamente posible tener una implementación totalmente del espacio de usuario de los hilos POSIX que no requieren llamadas de sistema pero que tengan otros problemas propios.

Entiendo que un Futex está a medio camino entre un hilo de Kernel Posix y un hilo de usuarios Posix.

Otros consejos

Se crearon futexes para mejorar el rendimiento de los mutexes pthread. NPTL usa futexes, LinuxThreads precedido Futexes, que creo que es donde viene la consideración "más lenta". NPTL Mutexes puede tener algunas sobrecargas adicionales, pero no debería ser mucho.

Editar:La sobrecarga real básicamente consiste en:

  • Seleccionar el algoritmo correcto para el tipo mutex (normal, recursivo, adaptativo, verificación de errores; normal, robusto, herencia prioritaria, protegido por la prioridad), donde el código sugiere mucho al compilador que probablemente estamos utilizando un Mutex normal (así que debe transmitir que a la lógica de predicción de la rama de la CPU),
  • y una escritura del propietario actual del mutex si logramos tomarlo, que normalmente debería ser rápido, ya que reside en la misma línea de caché que el bloqueo real que acabamos de tomar, a menos que el bloqueo esté fuertemente contado y algún otro La CPU accedió al bloqueo entre el tiempo que lo tomamos y cuando intentamos escribir el propietario (esta escritura no tiene necesidad para mutexes normales, pero es necesario para verificar errores y mutexes recursivos).

Entonces, algunos ciclos (caso típico) a unos pocos ciclos + una rama de predicción errónea + una falla de caché adicional (en el peor de los casos).

La respuesta corta a su pregunta es que se sabe que los futexes se implementan lo más eficientemente posible, mientras que un PTHread Mutex puede o no serlo. Como mínimo, un mutex pthread tiene una sobrecarga asociada con la determinación del tipo de mutex y futexes no. Por lo tanto, un Futex casi siempre será al menos tan eficiente como un Mutex PTHread, hasta y a menos que alguien piense en alguna estructura más ligera que un Futex y luego libera una implementación de PTHReads que lo usa para su mutex predeterminado.

Técnicamente hablando, los mutexes no son más lentos o más rápidos que los futexes. pthread es solo una API estándar, por lo que si son lentos o rápidos depende de la Implementación de esa API.

Específicamente en Linux PTHread Los mutexes se implementan como futexes y, por lo tanto, son rápidos. En realidad, no desea usar la API Futex en sí misma, ya que es muy difícil de usar, no tiene las funciones de envoltura apropiadas en GLIBC y requiere codificación en el ensamblaje que no sea portátil. Afortunadamente para nosotros, los mantenedores GLIBC ya codificaron todo esto para nosotros bajo el capó de la API PTHREAD MUTEX.

Ahora, porque la mayoría de los sistemas operativos no implementó futexes Entonces, los programadores generalmente significan por PTHread Mutex es el rendimiento que obtiene de la implementación habitual de mutexes pThread, que es más lento.

Por lo tanto, es un hecho estadístico que en la mayoría de los sistemas operativos que cumplen con POSIX, el PThread Mutex se implementa en el espacio del núcleo y es más lento que un Futex. En Linux tienen el mismo rendimiento. Podría ser que hay otros sistemas operativos donde se implementan mutexes pthread en el espacio del usuario (en el caso no contenido) y, por lo tanto, tengo un mejor rendimiento, pero solo conozco a Linux en este punto.

En AMD64, un futex es 4 bytes, mientras que un nptl pthread_mutex_t es 56 bytes. Sí, hay una sobrecarga significativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top