Algunas cosas a las que debes prestar atención cuando utilices bloqueos de giro de Linux
1. En la programación multiproceso del kernel, los bloqueos generalmente son necesarios para proteger los recursos compartidos, y el más utilizado es el spinlock. Sin embargo, debe tenerse en cuenta que se deben agregar todos los códigos de sección críticos. Bloquee la protección; de lo contrario, no se logrará el efecto de protección. Es decir, varios subprocesos que acceden a recursos compartidos deben trabajar juntos y bloquearse al mismo tiempo para garantizar que no se produzcan errores. Cuando se escribe código, a veces se pierde, lo que genera todo tipo de problemas extraños y es difícil encontrar la causa.
2. Cuando se utilizan dos o más bloqueos giratorios de forma anidada, asegúrese de prestar atención al orden de bloqueo y desbloqueo.
Por ejemplo: en el hilo 1, spinlock A -gt; spinlock B -gt; spin unlock B -gt; luego, en el hilo 2 que necesita sincronizarse, si es necesario el mismo bloqueo; para agregar, el orden también debe seguir siendo el mismo, spinlock A -gt; spinlock B -gt; spin unlock B -gt; de lo contrario, es probable que se produzca un punto muerto.
3. El tiempo de ejecución del código protegido por spinlock debe ser lo más corto posible. Si hay un código como un bucle for, se debe garantizar que el bucle pueda salir en poco tiempo. el bloqueo de giro se puede liberar.
4. El código protegido por spinlock no puede dormir durante la ejecución. Por ejemplo, kmalloc, copy_from_user, kthread_stop y otras llamadas no se pueden llamar entre spinlock y spinunlock, porque estas llamadas a funciones pueden hacer que el hilo entre en suspensión.
5. Spinlock tiene los siguientes tipos en uso real: spin_lock, spin_lock_bh, spin_lock_irqsave. En un uso específico, es necesario seleccionar el tipo de bloqueo giratorio apropiado según el contexto del bloqueo de la sección crítica protegida.
Spin_lock se usa para la sincronización entre diferentes subprocesos de la CPU. spin_lock_bh y spin_lock_irqsave se usan principalmente para la sincronización entre este subproceso de la CPU. El primero desactiva las interrupciones suaves y el segundo desactiva las interrupciones duras.