slk cordoba spinlock

slk - spinlock cordoba



¿Qué son exactamente "bloqueos de giro"? (11)

Bueno, sí, el punto de las cerraduras de giro (frente a secciones críticas tradicionales, etc.) es que ofrecen un mejor rendimiento en algunas circunstancias (sistemas multinúcleo ...), ya que no producen inmediatamente el resto de la cantidad del hilo.

Siempre me pregunté qué son: cada vez que los escucho, imágenes de dispositivos futuristas parecidos a voladizos se vuelven bailar (rodar) por mi mente ...

¿Qué son?


Cuando usa bloqueos regulares (mutexes, secciones críticas, etc.), el sistema operativo coloca el hilo en el estado de ESPERA y lo preempts al programar otros hilos en el mismo núcleo. Esto tiene una penalización de rendimiento si el tiempo de espera es muy corto, porque el hilo ahora tiene que esperar a que se preempts una preempts para volver a recibir el tiempo de CPU.

Además, los objetos kernel no están disponibles en todos los estados del kernel, como en un manejador de interrupciones o cuando el paginado no está disponible, etc.

Los Spinlocks no causan prioridad, sino que esperan en un bucle ("giro") hasta que el otro núcleo libera el bloqueo. Esto evita que el hilo pierda su quantum y continúa tan pronto como se libera el bloqueo. El mecanismo simple de spinlocks permite que un kernel lo utilice en casi cualquier estado.

Es por eso que en una máquina de un solo núcleo, un spinlock es simplemente un "deshabilitar interrupciones" o "elevar IRQL" que previene completamente la programación de hilos.

Spinlocks finalmente permite que los núcleos eviten "Big Kernel Lock" (un bloqueo adquirido cuando el núcleo ingresa al kernel y se libera en la salida) y tiene un bloqueo granular sobre las primitivas del kernel, lo que provoca un mejor procesamiento múltiple en máquinas multinúcleo y un mejor rendimiento.

EDITAR: surgió una pregunta: "¿Eso significa que debería usar dispositivos espirales siempre que sea posible?" y trataré de responderlo:

Como mencioné, los Spinlocks solo son útiles en lugares donde el tiempo de espera anticipado es más corto que un quantum (léase: milisegundos) y la preferencia no tiene mucho sentido (por ejemplo, los objetos kernel no están disponibles).

Si se desconoce el tiempo de espera, o si está en modo de usuario, los Spinlocks no son eficientes. Consume el 100% del tiempo de CPU en el núcleo en espera mientras verifica si hay un spinlock disponible. Evita que otros subprocesos se ejecuten en ese núcleo hasta que expire su quantum. Este escenario solo es factible para ráfagas cortas a nivel de kernel y una opción poco probable para una aplicación de modo de usuario.

Aquí hay una pregunta en SO abordar eso: Spinlocks, ¿qué tan útiles son?


En pocas palabras, el spinlock emplea atomic compare y swap (CAS) o prueba y conjunto como instrucciones para implementar lockless free, wait free thread idiom. Tales estructuras se escalan bien en máquinas de núcleos múltiples.


Es pertty mucho un lazo que continúa hasta que se cumpla una cierta condición:

while(cantGoOn) {};


Es un ciclo que gira hasta que se cumple una condición.


Es un tipo de cerradura que ocupa la espera

Se considera un antipatrón, a excepción de la programación de controladores de muy bajo nivel (donde puede ocurrir que llamar a una función de espera "adecuada" tenga más sobrecarga que simplemente el bloqueo ocupado durante unos pocos ciclos).

Ver por ejemplo linuxjournal.com/article/5833 .


SpinLocks son aquellos en los que el hilo espera hasta que el bloqueo esté disponible. Esto normalmente se usará para evitar la sobrecarga de la obtención de los objetos del kernel cuando hay un alcance para adquirir el objeto kernel dentro de un período de tiempo pequeño.

Ex:

While(SpinCount-- && Kernel Object is not free) {} try acquiring Kernel object


Spinlock, es un tipo de bloqueo, que no es bloqueable y no puede dormir. Cualquier hilo que quiera adquirir un spinlock para cualquier recurso compartido o crítico girará continuamente, desperdiciando el ciclo de procesamiento de la CPU hasta que adquiera el bloqueo para el recurso especificado. Una vez que se adquiere spinlock, intenta completar el trabajo en su quantum y luego liberar el recurso respectivamente. Spinlock es el tipo de bloqueo de mayor prioridad, simplemente puede decirse, es un tipo de bloqueo no preventivo.


Supongamos que un recurso está protegido por un bloqueo, un hilo que quiere acceder al recurso necesita adquirirlo primero. Si el bloqueo no está disponible, el hilo podría verificar repetidamente si el bloqueo se ha liberado. Durante este tiempo, el hilo ocupado espera, verificando el bloqueo, usando la CPU, pero sin hacer ningún trabajo útil. Tal bloqueo se denomina bloqueo de giro.


Te conviene utilizar un spinlock cuando creas que es más económico ingresar en un bucle de espera ocupado y agrupar un recurso en lugar de bloquear cuando el recurso está bloqueado.

El giro puede ser beneficioso cuando los bloqueos son de grano fino y de gran tamaño (por ejemplo, un bloqueo por nodo en una lista vinculada), así como cuando los tiempos de bloqueo son siempre extremadamente cortos. En general, mientras se mantiene un bloqueo de giro, se debe evitar el bloqueo, llamar a cualquier cosa que pueda bloquearse, mantener más de un bloqueo de giro a la vez, hacer llamadas dinámicas (interfaz y virtuales), hacer llamadas estáticamente distribuidas en cualquier código que uno no. poseer o asignar memoria.

También es importante tener en cuenta que SpinLock es un tipo de valor, por razones de rendimiento. Como tal, uno debe tener mucho cuidado de no copiar accidentalmente una instancia de SpinLock, ya que las dos instancias (el original y la copia) serían completamente independientes entre sí, lo que probablemente conduzca a un comportamiento erróneo de la aplicación. Si se debe pasar una instancia de SpinLock, se debe pasar por referencia en lugar de por valor.


while(something != TRUE ){}; // it happend move_on();