2010-09-03 15 views
5

http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21¿Cómo funciona Linux sincronizar preempt recuento

Sólo estoy tratando de obtener el código fuente de Linux. Vi este conteo preventivo y ¿cómo garantiza Linux que el recuento preventivo es atómico? El código simplemente incrementa el valor.

También tengo otra pregunta. ¿Por qué los mangos de interrupción necesitan mantener la exclusión mutua? Porque solo uno puede ejecutar a la vez ¿verdad?

También cuando las interrupciones están deshabilitadas, ¿qué hace el sistema operativo? ¿Ignorar interrupciones o mantener una cola?

Respuesta

6

Incrementa preempt_count() - Anuncio de la () - que es una macro se define como:

#define preempt_count() (current_thread_info()->preempt_count) 

por lo que es incrementar una variable per-hilo, que no requiere ningún bloqueo y es seguro.


Lo mejor es preguntar a sus múltiples cuestiones como cuestiones separadas, pero brevemente:

  • manejador de interrupciones en general pueden ser interrumpidos por otros controladores de interrupción;
  • Los controladores de interrupción se pueden ejecutar en un núcleo de la CPU mientras que otro código del núcleo se está ejecutando en otro núcleo;
  • Las interrupciones generalmente se desactivan mediante un mecanismo de hardware. Estos tienden a recordar interrupciones pendientes, pero solo hasta un máximo de uno por vector de interrupción.
+0

Muchas gracias. pueden ustedes responder mis siguientes preguntas también por favor. – mousey

+0

muchas gracias. – mousey

+0

@caf, y mousey: si inc/dec también es llamado por manejadores de fallas o controladores de interrupción, ¿sería seguro? ¿O hay reglas que dicen que no se puede hacer? Ideas? – minghua

0

Cada procesador moderno tiene alguna variante de la instrucción atómica test-and-set.

+1

compruebe la fuente. No utiliza ninguna instrucción específica del sistema. Simplemente incrementa – mousey

1

El funcionamiento en la variable prevent -count no es atómico. La región del código entre un inc y un dec de una cuenta anticipada de un subproceso está garantizada para que el planificador no la cambie. El cambio de contexto del subproceso actual en esta región de código solo puede ocurrir en otras excepciones o interrupciones incorporadas. Después de que se complete la primera operación inc, los demás controladores verán que la variable no es cero, por lo tanto, no causará un cambio de contexto. Antes de que el inc finalice, el hilo se puede cambiar, pero está bien ya que el código no ha llegado a la zona protegida.

Algunos detalles: La definición de una variable atómica debe ser algo así como "Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption". La operación "Leer-Modificar-Escribir" en una cuenta previa-preventiva puede ser interrumpida por otro manejador de excepciones o manejador de interrupciones, pero solo de manera estrictamente incrustada, eso es por el diseño del kernel. Dado que esas operaciones integradas están en pares, por lo tanto, el valor de una cuenta previa no se corrompe con el tiempo. Aunque se puede interrumpir una operación R-M-W y se puede desconectar el hilo actual (solo si no se ha completado ninguno de los inc inc incrustados), pero está bien ya que el código no ha llegado a la región protegida. Una vez que se vuelve a conectar el hilo, continuará con la operación R-M-W y desde ese punto el hilo actual no se apagará hasta que todas las decimales aparejadas finalicen.

Cuestiones relacionadas