Está en la página 1de 2

Sistemas Operativos 

 
Taller Procesos Concurrentes 
 
Integrantes: Cristian Narvaez, Isabella Peña 
 
 
El problema del canotaje 
 
Una  empresa  turística  ofrece  el  servicio  de  canotaje.  Para  ello,  las personas deben abordar 
un  bote  inflable  con  capacidad  para  M  pasajeros,  que  es  manejado  por  un  guía  experto  y 
que  los  llevará  desde  un punto río arriba hasta un punto más abajo. Desarrolle un algoritmo 
que  permita  sincronizar  los  recorridos  en  canotaje  que  realizan  ​N>=M  personas  en  un  día, 
teniendo en cuenta que: 
 
● Cada pasajero realiza el recorrido sólo una vez. 
● El  bote  debe  estar  lleno  antes  de  salir  del  punto  de  partida,  a  excepción  del  último 
bote del día(​situación que se presenta cuando N no es múltiplo de M​). 
● Cuando  un  guía  termina  un  recorrido,  debe  llevar  su  bote  hasta  el  punto  de  partida. 
Sólo  en  ese  momento  se  puede  iniciar  el  embarque  de  otro  grupo  de  personas.  Su 
trabajo termina cuando han viajado todas las personas. 
 
 
Solución 
 
mutex = semaphore(1) ​//semáforo para los pasajeros que abordan 
mutex2 = semaphore(1) / ​ /semáforo para los pasajeros que se bajan 
embarcados = 0 ​//los pasajeros que suben, es decir M 
desembarcados = 0 / ​ /los pasajeros que bajan 
colaEmbarque = semaphore(0) / ​ /lista de espera para abordar 
colaDesembarque = semaphore(0) / ​ /lista de espera para bajar 
todosABordo = semaphore(0)​ //indica que el bote está lleno 
todosEnTierra = semaphore(0) / ​ /indica que el bote está vacío 
 
 
//SOLUCIÓN PARA EL GUÍA 
 
faltan = N 
finalizado = falso 
 
guia(){ 
mientras(!finalizado){ 
embarcar(); 
up(​&​colaEmbarque); 
down(​&​todosABordo); 
recorrido(); 
desembarcar(); 
up(​&​colaDesembarque); 
down(​&​todosEnTierra); 


 
//SOLUCIÓN PARA EL PASAJERO 
 
pasajero(){ 
down(​&​colaEmbarque); 
abordar(); 
down(​&​mutex); 
embarcados+=1; 
si(embarcados==M){ 
up(​&​todosABordo); 
embarcados=0; 

up(​&​mutex); 
down(​&​colaDesembarque); 
bajar(); 
down(​&​mutex2); 
desembarcados+=1; 
 
si(desembarcados==M){ 
up(​&​todosEnTierra); 
desembarcados=0; 

up(​&​mutex2); 

También podría gustarte