







Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Sistemes operatius, Profesor: Maria Bosch, Carrera: Enginyeria Informàtica, Universidad: UPC
Tipo: Ejercicios
1 / 13
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!








SolProbConcTardor09 1 02/12/
Solucions a problemes de concurrència/ tardor
Problema del barber adormit
Procés barber espera (afaitar) aten_client senyal (afaitat) fprocés
Procés client (^) i espera (mutex) si (cadires > 0) llavors cadires -- senyal (mutex) senyal (afaitar) espera (afaitat) espera (mutex) cadires ++ senyal (mutex) sino senyal (mutex) destruir_procés fsi fiprocés
Varglobals: cadires = 7; afaitar: semàfor mutex, afaitat: semàfor binari init (afaitar,0); init (afaitat, 0); init (mutex,1)
1
ll barber, client (^) i
Disposem de tres tipus de fluxes (client, cuiner, safataire) que executaran el següent codi:
void client ()
{ agafar_safata_neta; /* s’espera fins obtenir una safata neta escollir_menjar(); /* s’espera fins obtenir menjar escollir_lloc(); /* s’espera fins obtenir lloc buit menjar(); alliberar_lloc; retornar_safat_bruta; }
void cuiner () { While (!fi) { Servir_menjar(); ... } } void safataire () { while (!fi) { agafar_safata_bruta (); /*s’espera fins obtenir safata netejar_safata(); retornar_safata_neta(); } }
SolProbConcTardor09 2 02/12/
Respon a les següents preguntes. Allà on hagis d’implementar codi, indica si les variables són locals o globals, la seva inicialització, i justifica la resposta
a) Suposant que la capacitat del restaurant és de N LLOCS posicions, implementa les rutines escullir_lloc() i alliberar_lloc(). Observa que la rutina escollir_lloc ha de retornar el control quan hi hagi algún lloc lliure però no cal que indiqui quin.
init (lloc, LLOCS); void escollir_lloc() { espera(lloc) ; } void alliberar_lloc() { senyal(lloc) ; }
b) Implementa les rutines agafar_safata_neta(), retornar_safata_bruta(), agafar_safata_bruta(), retornar_safata_neta(). Pots suposar que inicialment hi ha NETES safates netes i BRUTES safates brutes.
init (n, NETES); init (b, BRUTES);
void agafar_safata_neta() { espera(n); } void agafar_safata_bruta() { espera(b); } void retornar_safata_neta() { senyal(n); } void retornar_safata_bruta() { senyal(b); }
c) En un moment donat és necessàri afegir N safates netes addicionals. Tenint en compte el que has indicat en l’apartat anterior, implementa la rutina afegir_safates (int N) per fer aquesta tasca.
SolProbConcTardor09 4 02/12/
inicialitzacions (); while (1) { espera(s1) obtenir_petició (pet); crear_fluxe tractar_petició (pet); } }
void tractar_petició (petició pet) { /tractament d’una petició/ ... espera (mutex) #pet ++ senyal (mutex) senyal(s1) fi_fluxe; }
c) El servidor disposa d’un nombre màxim de fitxers temporals per a realitzar la seva tasca MAX_TEMP i les peticions (pet) contenen un camp (temporals) que indica quants fitxers temporals són necessàris per a atendre la petició, se suposa que temporals sempre serà més petit que TEMP_MAX. A la rutina tractar_petició tenim el següent codi, on tempor és una variable de tipus semàfor inicialitzat a MAX_TEMP. Pot donar algún tipus de problema aquest codi? justifica-ho. En cas afirmatiu proposa una solució.
Al main() mutex2: semàfor; init ( mutex2,1);
void *tractar_petició (petició pet) { int i; espera (mutex2); for (i=0; i < pet.temporals; i++) espera (tempor); senyal (mutex2); / tractament d’una petició */ for (i=0; i < pet.temporals; i++) senyal (tempor); }
Tant les estacions de reserva com les rentadores estàn connectades a un ordinador central. L’ordinador central manté dues variables per al control del sistema:
init (s1,MAXPETICIONS) init (mutex,1) #pet =
Com que varies peticions poden acabar simultaniament, cal accedir a la variable pet en exclusió mútua
SolProbConcTardor09 5 02/12/
A continuació és mostra el codi actualment implementat en l’ordinador central per a obtenir les rentadores i per alliberar-les:
void obtenir_rentadora(int nrent) { int i,j ; for (i=0; i<nrent; i++){ wait(nlliures); j = 0; while ((disponible[j] == false && (j<NRENTADORA)) j++ ; if (j==NRENTADORA) error(“FATAL ERROR”); else disponible[j] = false; } }
void allibera_rentadora (int rent) { signal (nlliures) ; disponible[rent] = true ; }
Després d’unes setmanes de funcionament han aparegut dos tipus de problemes : a) A vegades una estació de reserva dóna « FATAL ERROR » i no hi ha més remei que reinicialitzar el sistema b) Sembla que, de tant en tant, a dos clients diferents se’ls assigna la mateixa rentadora al mateix temps Es demana resoldre aquests problemes explicant per qué passa cadascun d’ells i modificant el codi per a resoldre-ho.
void allibera_rentadora (int rent) { disponible[rent] = true ; signal (nlliures) ; }
SolProbConcTardor09 7 02/12/
void client () {
anar_a_la_orxateria (); sema_wait (&sem4); sema_wait (&sem5); n_orxates = quantes_orxates () ; sema_signal (&sem5); sema_signal (&sem2); sema_wait (&sem3); sema_signal (&sem4); prendre_orxates (); }
void orxater () { int preparade s = 0; while (TRUE) { preparar_orxata () ; sema_signal (&sem1); sema_wait (&sem6); preparades ++ ; sema_signal (&sem6); } }
SolProbConcTardor09 8 02/12/
funcionament serà el següent: Quan un cotxe vol entrar al parking, farà una crida
fins que hi hagi lloc perquè ha sortit algún cotxe. Per sortir del parking, els cotxes faràn una crida
parking.
Es proposa la següent solució d’implementació de la part més significativa de les funcions:
fsi
cua— ()*
fsi
Es demana respondre a les següent qüestions tot justificant breument les respostes.
senyal (mutex)
SolProbConcTardor
10
02/12/
Volem conèixer la densitat del trànsit en un cert punt de l’autopista. El sistema de mesura que s’utilitzaconsisteix en dos sensors, un per cadascun dels sentits. Aquests sensors capten cada cert temps laquantitat de vehicles que han passat en un determinat sentit.Dissenyeu un programa amb tres accions concurrents; dues d’elles executaran el mateix codi, queconsistirà en llegir el sensor, cadascuna el seu, i emmagatzemar el valor llegit. L’altre mostrarà perpantalla, la quantitat de cotxes que han passat en cada sentit i la mitjana de la via. Es propasa elsegüent codi com a punt de partida de la solució.a) Afegiu les primitives de semàfors per a sincronitzar les accions i que les dades mostrades perpantalla siguin coherents i la mitjana es calculi només quan hagin arribat noves dades en els dossentits. És important que la solución tingui el màxim de paral·lelisme, és a dir, que les exclusionsmútues siguin mínimes. Algorisme
Tràfec
var tràfec : taula [1..2] de enter
sincro : semàfor
/*sincro lectors/escriptors
mutex : taula [1..2] de semàfor /*E.M. tràfec
fvar init (mutex [1],1); init (mutex [2], 1); init (sincro,0); Lector[1] || Lector[2] || Escriptor FalgorismeAcció
Lector ( sentit: enter)
var dada : enter fvarRepetir
dada := llegir_sensor(sentit) espera (mutex[sentit]) tràfec [sentit] := dada senyal (sincro) Finsque fals
Acció
Escriptor
var mitjana: enter fvarRepetir
espera (sincro)espera (sincro) mostra_a_pantalla ( tràfec[1] )mostra_a_pantalla ( tràfec[2] )mitjana:=sencer((tràfec[1]+ tràfec[2]) / 2) senyal (mutex [1])senyal (mutex [2]) mostra_a_pantalla (mitjana) finsque falsFacció
SolProbConcTardor
11
02/12/
b)
El mateix que l’anterior però amb pas de missatges
Algorisme
Tràfec-missatges
var tràfec : taula [1..2] de enter
sincro : bústia
/*sincro lectors/escriptors
mutex : taula [1..2] de bústia /*E.M. tràfec
fvar envia (mutex [1],mssg); envia (mutex [2], mssg); Lector[1] || Lector[2] || Escriptor FalgorismeAcció
Lector ( sentit: enter)
var dada : enter fvarRepetir
dada := llegir_sensor(sentit) rep (mutex[sentit], mssg) tràfec [sentit] := dada envía (sincro,mssg) Finsque fals
Acció
Escriptor
var mitjana: enter fvarRepetir
rep (sincro)rep (sincro) mostra_a_pantalla ( tràfec[1] )mostra_a_pantalla ( tràfec[2] )mitjana:=sencer((tràfec[1]+ tràfec[2]) / 2) envia (mutex [1])envía (mutex [2]) mostra_a_pantalla (mitjana) finsque falsFacció
SolProbConcTardor
13
02/12/
Solució amb pas de missatges (esquemàtic) A1:
rep (N, mssg)
crear_?
rep (N, mssg)
envia (N mssg)
rep (N, mssg)
crear_A } A2:
rep (M mssg)
opció (&mssg)
envia (M, mssg)
cas B2 : crear_B
cas C2 : crear_C3cas D2 : crear_D
Capacitat de la bústia M^ 0 : El primer procés que acabi, envía el missatge, el procés emisor podrà continuar quan A2 hagi llegit el missatge, però el 2on i 3erprocessos quedaran bloquejats indefinidament, esperant que A2 llegeixi el missatge però això no passarà mai perqué A2 ja ha finalitzat.1 : El primer procés que acabi, envía el missatge, el procés emisor
i el 2on procés podran continuar quan A2 hagi llegit el missatge,
però el 3er procés quedarà bloquejat indefinidament, esperant que A2 llegeixi el missatge però això no passarà mai perqué A2 ja hafinalitzat.Conclusió!! M ha de ser de capacitat 2