concurrency - sincronizacion - ¿Diferencia entre exclusión mutua y sincronización?
exclusion mutua y sincronizacion sistemas operativos (2)
La mejor manera de entender la diferencia es con la ayuda de un ejemplo. A continuación se muestra el programa para resolver el problema del consumidor productor clásico a través del semáforo. Para proporcionar la exclusión mutua, generalmente utilizamos un semáforo binario o mutex, y para proporcionar la sincronización, usamos el semáforo.
BufferSize = 3;
semaphore mutex = 1; // used for mutual exclusion
semaphore empty = BufferSize; // used for synchronization
semaphore full = 0; // used for synchronization
Producer()
{
int widget;
while (TRUE) { // loop forever
make_new(widget); // create a new widget to put in the buffer
down(&empty); // decrement the empty semaphore
down(&mutex); // enter critical section
put_item(widget); // put widget in buffer
up(&mutex); // leave critical section
up(&full); // increment the full semaphore
}
}
Consumer()
{
int widget;
while (TRUE) { // loop forever
down(&full); // decrement the full semaphore
down(&mutex); // enter critical section
remove_item(widget); // take a widget from the buffer
up(&mutex); // leave critical section
consume_item(widget); // consume the item
}
}
En el código anterior, la variable de exclusión mutua proporciona exclusión mutua (permite que solo un subproceso acceda a la sección crítica) mientras que la variable completa y la vacía se utilizan para sincronizar (para calcular el acceso del recurso compartido entre varios subprocesos).
¿Cuál es la diferencia entre los dos anteriores?
Esta pregunta vino a mi mente porque encontré que
Monitores y cerraduras proporcionan exclusión mutua.
Semáforos y variables condicionales proporcionan sincronización.
¿Es esto cierto?
También mientras buscaba encontré este article
Cualquier aclaración por favor.
La exclusión mutua significa que solo un solo hilo debe poder acceder al recurso compartido en un momento dado. Esto evita las condiciones de carrera entre los hilos que adquieren el recurso. Los monitores y los candados proporcionan la funcionalidad para hacerlo.
La sincronización significa que usted sincroniza / ordena el acceso de múltiples hilos al recurso compartido.
Considera el ejemplo:
Si tiene dos hilos, Thread 1
y Thread 2
.
Thread 1
y el Thread 2
ejecutan en paralelo, pero antes de que el Thread 1
pueda ejecutarse, digamos una declaración A
en su secuencia, es obligatorio que el Thread 2
ejecute una declaración B
en su secuencia. Lo que necesitas aquí es la sincronización. Un semáforo proporciona eso. Pones una espera semifada antes de la declaración A
en el Thread 1
y publicas en el semáforo después de la instrucción B
en la Thread 2
.
Esto asegura la sincronización que necesita.