ingsteban | |
| 2010-12-12 19:46 - Respuestas: 1 - Tema nº: 2742066
Sistemas Operativos
Resuelva el siguiente problema por medio de semáforos:
En el país de Sangala en África hay un cañón muy profundo con una simple cuerda para cruzarlo.
Los sangalos necesitan cruzar ese cañón constantemente en ambas direcciones y pueden hacerlo poniendo una mano delante de otra de forma sucesiva. Como los sangalos son muy agresivos, si dos de ellos se encuentran en cualquier punto de la cuerda yendo en direcciones opuestas, estos se pelearán y terminarán cayendo por el cañón y muriendo. Por otro lado, la cuerda no es muy resistente y aguanta a un máximo de cinco sangalos simultáneamente. Si en cualquier instante hay más de cinco sangalos en la cuerda, ésta se romperá y los sangalos caerán también al vacío.
Asumiendo que podemos enseñar a los sangalos a usar semáforos, queremos diseñar un sistema de sincronización que:
1. No permita más de cinco sangalos en la cuerda.
2. Asegura que, una vez que un sangalo ha tomado la cuerda, ningún otro sangalo comenzará a recorrer la cuerda en la dirección opuesta.
3. No es necesario prevenir la inanición, es decir, una fila interminable de sangalos en una dirección puede provocar inanición sobre los sangalos que pretenden recorrer la cuerda en la otra dirección. Se supone que nunca existirá una fila interminable de sangalos. Existe una solución que previenen la inanición pero es muy ineficaz en el uso del recurso.
Para ello es necesario diseñar un solución (con el método gráfico o algorítmico de su elección) que lance aleatoriamente en el tiempo procesos sangalo_va() y sangalo_viene(). También es necesario que los procesos sangalo_va() y sangalo_viene() dispongan de la sincronización anteriormente indicada. Asumir la existencia de las funciones: cruzar_cuerda() y nuevo_sangalo(). La última de estas funciones espera un tiempo determinado y devuelve 1 o 0 dependiendo de la dirección de cruce del siguiente sangalo que va a aparecer.
Para la sincronización de los procesos, utiliza variables compartidas y semáforos. De igual forma, se utilizarán las funciones wait(s) y signal(s) para manipular los semáforos.
| |
|