¿Alguien puede explicar simplemente qué es la contención de hilos?
Lo he buscado en Google, pero parece que no puedo encontrar una explicación simple.
multithreading
language-agnostic
Tony el león
fuente
fuente
Respuestas:
Básicamente, la contención de subprocesos es una condición en la que un subproceso está esperando un bloqueo / objeto que actualmente está retenido por otro subproceso. Por lo tanto, este subproceso en espera no puede usar ese objeto hasta que el otro subproceso haya desbloqueado ese objeto en particular.
fuente
Varias respuestas parecen centrarse en la contención de bloqueos, pero los bloqueos no son los únicos recursos en los que se puede experimentar la contención. La contención es simplemente cuando dos subprocesos intentan acceder al mismo recurso o recursos relacionados de tal manera que al menos uno de los subprocesos contendientes se ejecuta más lentamente de lo que lo haría si los otros subprocesos no se estuvieran ejecutando.
El ejemplo más obvio de contienda está en una cerradura. Si el hilo A tiene un bloqueo y el hilo B quiere adquirir ese mismo bloqueo, el hilo B tendrá que esperar hasta que el hilo A libere el bloqueo.
Ahora, esto es específico de la plataforma, pero el hilo puede experimentar ralentizaciones incluso si nunca tiene que esperar a que el otro hilo libere el bloqueo. Esto se debe a que un bloqueo protege algún tipo de datos y, a menudo, los datos en sí también se contendrán.
Por ejemplo, considere un hilo que adquiere un bloqueo, modifica un objeto, luego libera el bloqueo y hace algunas otras cosas. Si dos subprocesos están haciendo esto, incluso si nunca luchan por el bloqueo, los subprocesos pueden correr mucho más lento de lo que lo harían si solo se estuviera ejecutando un subproceso.
¿Por qué? Supongamos que cada hilo se ejecuta en su propio núcleo en una CPU x86 moderna y los núcleos no comparten una caché L2. Con solo un hilo, el objeto puede permanecer en la caché L2 la mayor parte del tiempo. Con ambos subprocesos en ejecución, cada vez que un subproceso modifica el objeto, el otro subproceso encontrará que los datos no están en su caché L2 porque la otra CPU invalida la línea de caché. En un Pentium D, por ejemplo, esto hará que el código se ejecute a la velocidad FSB, que es mucho menor que la velocidad de la caché L2.
Dado que la contención puede ocurrir incluso si el bloqueo en sí mismo no se disputa, la contención también puede ocurrir cuando no hay bloqueo. Por ejemplo, digamos que su CPU admite un incremento atómico de una variable de 32 bits. Si un hilo sigue aumentando y disminuyendo una variable, la variable estará activa en la caché la mayor parte del tiempo. Si dos subprocesos lo hacen, sus cachés competirán por la propiedad de la memoria que contiene esa variable, y muchos accesos serán más lentos ya que el protocolo de coherencia de caché opera para asegurar la propiedad de cada núcleo de la línea de caché.
Irónicamente, las cerraduras suelen reducir la contención. ¿Por qué? Porque sin un bloqueo, dos subprocesos podrían operar en el mismo objeto o colección y causar mucha contención (por ejemplo, hay colas sin bloqueo). Los bloqueos tenderán a desprogramar los subprocesos rivales, permitiendo que se ejecuten los subprocesos no rivales. Si el subproceso A tiene un bloqueo y el subproceso B quiere ese mismo bloqueo, la implementación puede ejecutar el subproceso C en su lugar. Si el hilo C no necesita ese bloqueo, entonces la contención futura entre los hilos A y B puede evitarse por un tiempo. (Por supuesto, esto supone que hay otros subprocesos que podrían ejecutarse. No ayudará si la única forma en que el sistema en su conjunto puede hacer un progreso útil es ejecutando subprocesos que compiten).
fuente
Desde aqui :
fuente
Creo que debería haber alguna aclaración del OP sobre el trasfondo de la pregunta; puedo pensar en 2 respuestas (aunque estoy seguro de que hay adiciones a esta lista):
si se refiere al "concepto" general de la contención de subprocesos y cómo puede presentarse en una aplicación, me refiero a la respuesta detallada de @ DavidSchwartz anterior.
También está el contador de rendimiento '.NET CLR Locks and Threads: Total # of Contentions'. Según la descripción de PerfMon para este contador, se define como:
... y estoy seguro de que otros para otros sistemas operativos y marcos de aplicaciones.
fuente
Tienes 2 hilos. Thread A y Thread B, también tienes el objeto C.
A está accediendo actualmente al objeto C y ha colocado un candado en ese objeto. B necesita acceder al objeto C, pero no puede hacerlo hasta que A libere el bloqueo del objeto C.
fuente
Otra palabra podría ser concurrencia. Es simplemente la idea de dos o más subprocesos que intentan utilizar el mismo recurso.
fuente
Para mí, la contención es una competencia entre 2 o más hilos sobre un recurso compartido. El recurso puede ser un candado, un contador, etc. Competencia significa "quién lo obtiene primero". Cuantos más hilos, más contención. Cuanto más frecuente sea el acceso a un recurso, mayor será la contención.
fuente
Como en el ejemplo, los dos casos dan significado a la rivalidad.
fuente
La contención de subprocesos también se ve afectada por las operaciones de E / S. Ejemplo cuando un subproceso en espera de lectura de archivo se puede considerar como una disputa. Utilice los puertos de terminación de E / S como solución.
fuente
de la documentación de dotTrace
fuente