Considere una situación en la que tenemos un archivo compartido entre muchas personas.
- Si una de las personas intenta editar el archivo, ninguna otra persona debe estar leyendo o escribiendo al mismo tiempo, de lo contrario, los cambios no serán visibles para él/ella.
- Sin embargo, si alguna persona está leyendo el archivo, otras pueden leerlo al mismo tiempo.
Precisamente en OS llamamos a esta situación el problema de los lectores-escritores.
Parámetros del problema:
- Un conjunto de datos se comparte entre varios procesos.
- Una vez que un escritor está listo, realiza su escritura. Solo un escritor puede escribir a la vez.
- Si un proceso está escribiendo, ningún otro proceso puede leerlo.
- Si al menos un lector está leyendo, ningún otro proceso puede escribir
- Los lectores no pueden escribir y solo leer
Solución cuando Reader tiene prioridad sobre Writer
Aquí, prioridad significa que ningún lector debe esperar si el recurso compartido está actualmente abierto para lectura.
Se utilizan tres variables: mutex, wrt, readcnt para implementar la solución
- semáforo mutex, wrt; // Semaphore mutex se utiliza para garantizar la exclusión mutua cuando se actualiza readcnt, es decir, cuando cualquier lector entra o sale de la sección crítica y tanto lectores como escritores utilizan semaphore wrt
- lectura int ; // readcnt indica el número de procesos que realizan lectura en la sección crítica, inicialmente 0
Funciones para semáforo:
– wait() : decrementa el valor del semáforo.
– signal() : incrementa el valor del semáforo.
Proceso del escritor:
- El escritor solicita la entrada a la sección crítica.
- Si está permitido, es decir, wait() da un valor verdadero, ingresa y realiza la escritura. Si no se permite, sigue esperando.
- Sale de la sección crítica.
do { // writer requests for critical section wait(wrt); // performs the write // leaves the critical section signal(wrt); } while(true);
Proceso de lectura:
- El lector solicita la entrada a la sección crítica.
- Si se permite:
- incrementa la cuenta del número de lectores dentro de la sección crítica. Si este lector es el primero que ingresa, bloquea el semáforo wrt para restringir la entrada de escritores si hay algún lector dentro.
- Luego, señala mutex ya que cualquier otro lector puede ingresar mientras otros ya están leyendo.
- Después de realizar la lectura, sale de la sección crítica. Al salir, comprueba si no hay más lector dentro, señala el semáforo “wrt” ya que ahora, el escritor puede entrar en la sección crítica.
- Si no se permite, sigue esperando.
do { // Reader wants to enter the critical section wait(mutex); // The number of readers has now increased by 1 readcnt++; // there is atleast one reader in the critical section // this ensure no writer can enter if there is even one reader // thus we give preference to readers here if (readcnt==1) wait(wrt); // other readers can enter while this current reader is inside // the critical section signal(mutex); // current reader performs reading here wait(mutex); // a reader wants to leave readcnt--; // that is, no reader is left in the critical section, if (readcnt == 0) signal(wrt); // writers can enter signal(mutex); // reader leaves } while(true);
Por lo tanto, el semáforo ‘ wrt ‘ se pone en cola tanto en los lectores como en los escritores de tal manera que se da preferencia a los lectores si también hay escritores. Por lo tanto, ningún lector está esperando simplemente porque un escritor haya solicitado ingresar a la sección crítica.
Artículo aportado por Ekta Goel . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA