universitystudyingsubject-2203
LSOP
Sistemi Operativi
Glossario:
- LSOP = Laboratorio di Sistemi Operativi Protocol
- xd
Bingo (20/02/2024)
V1 con barriere/cond/mutex
non funziona
—strutture —
struct_condivisa con
- ultimo_numero_estratto
- stato (ATTESA_ESTRAZIONE, ATTESA_CONTROLLO)
- is_cinquina_available
- mutex
- cond_aspetta_estrazione
- cond_aspetta_controllo
- barrier_controllo_effettuato
struct_giocatore con
- card
- vincita = (NULL, CINQUINA, BINGO)
- struct_condivisa
— flusso —
main (dealer):
- crea struct_condivisa
- crea n struct_giocatore
- crea n thread passandogli struct_giocatore
- barrier_init(barrier_controllo_effettuato, n)
- in loop:
- genera nuovo numero
- stato = ATTESA_ESTRAZIONE
- cond_broadcast(cond_aspetta_estrazione)
- while (stato != ATTESA_CONTROLLO)
- cond_wait(cond_aspetta_controllo)
- controllo se ci sono vincitori (cinquine o bingo)
- se c’è cinquina stampo la vincita
- se c’è un bingo, stampo la vincita e uccido tutti
i-esimo thread:
- while (stato != ATTESA_ESTRAZIONE)
- cond_wait(cond_aspetta_estrazione)
- controlla e aggiorna la card
- se ha fatto cinquina e is_cinquina_available: vincita = CINQUINA
- else se ha fatto bingo:
- vincita = BINGO
- stato = ATTESA_CONTROLLO
- cond_signal(cond_aspetta_controllo)
- else:
- barrier_wait(barrier_controllo_effettuato)
- if (PTHREAD_BARRIER_SERIAL_THREAD)
- stato = ATTESA_CONTROLLO
- cond_signal(cond_aspetta_controllo)
V2 con semafori/mutex
— strutture—
struct_condivisa con
- sem_t wait_card_arrival
- sem_t wait_card_extraction
- sem_t card_extraction_done
- sem_t wait_others
- ultimo_numero_estratto
struct_giocatore con
- cards
- vincita = (NULL, CINQUINA, BINGO)
- struct_condivisa
— flusso —
dealer
crea struct_condivisa shared
sem_init(shared.wait_card_arrival, 0)
for (player in players) {
crea struct_giocatore
struct_giocatore = new card
pthread_create(struct_giocatore)
wait(wait_card_arrival)
}
is_cinquina_available = false
sem_init(shared.wait_card_arrival, 0)
sem_init(shared.wait_card_extraction, 0)
sem_init(shared.card_extraction_done, 0)
sem_init(shared.wait_others, 0)
while (true) {
struct_condivisa.ultimo_numero_estratto = random()
for (player in players)
post(shared.wait_card_extraction)
player* winner_player = NULL
for (player in players) {
sem_wait(shared.card_extraction_done)
if (shared.is_cinquina_available and player.vincita == CINQUINA and player == NULL)
winner_player = &player
if (player.vincita == BINGO and player == NULL)
winner_player = &player
}
for (player in players) {
sem_post(shared.wait_others)
}
if (winner_player != NULL) {
shared.is_cinquina_available = false
if (winner_player->vincita == CINQUINA) {
print "Px: Carta con cinquina:" winner_player->card
}
else if (winner_player->vincita == BINGO) {
exit(0)
}
}
}
player
stampa card
sem_post(wait_card_arrival)
while (true) {
sem_wait(shared.wait_card_extraction)
controlla se c'è ultimo_numero_estratto in cards
if (cinquina)
vincita = CINQUINA
else if (bingo)
vincita = BINGO
else
vincita = NONE
sem_post(shared.card_extraction_done)
sem_wait(shared.wait_others)
}
Calc-Verifier-2 (02/02/2024)
— strutture —
struct s_shared {
int op1, op2, result;
char op;
pthread_t tid; // richiedente
pthread_mutex_t mutex;
sem_t sem_wait_op;
sem_t sem_done_op;
sem_t sem_wait_others;
}
struct s_operation {
char op;
int (*fun)(int, int);
s_shared *shared_ptr;
}
struct s_calc {
int r_attended;
int r_obtained;
pthread_t tid;
s_shared *shared_ptr;
}
— flusso —
main
int add(int op1, int op2) { return op1 + op2; }
int sub(int op1, int op2) { return op1 - op2; }
int mul(int op1, int op2) { return op1 * op2; }
s_shared shared;
s_operation operations[3] = {
{ '+', add, &shared },
{ '-', sub, &shared },
{ '*', mul, &shared }
};
s_calc calcs[n];
calc.shared_ptr = &shared;
for operations[i].shared_ptr = &shared;
sem_init(shared.sem_wait_op, 0, 0);
sem_init(shared.sem_done_op, 0, 0);
sem_init(shared.sem_wait_others, 0, 0);
for (i=0 to n) {
pthread_create(&calcs[i].tid, calcscalc, NULL, &calcs[i]);
}
for (i=0 to 3) {
pthread_create(operation, operations[i]);
}
for (i=0 to n) {
pthread_join(calcs[i].tid, NULL);
}
// controlla r_attended vs r_obtained
calc (n per file)
f = apri file
int op1, op2;
foreach (riga) {
if (riga is first) {
op1 = riga;
continue;
}
/*
char row[101];
fgets(row, 100, f);
if (sscanf(row, "%c %d") == 2)
*/
if (riga is last) { // come capirlo?
data.r_attended = riga;
continue;
}
pthread_mutex_lock(&shared.mutex);
(op, valore) = riga;
op2 = valore
shared.op1 = op1;
shared.op2 = op2;
shared.op = op;
shared.tid = gettid();
// wait
for (i=0 to 3)
sem_post(shared.sem_wait_op)
for (i=0 to 3)
sem_wait(shared.sem_done_op)
for (i=0 to 3)
sem_post(shared.sem_wait_others)
op1 = shared.result
pthread_mutex_unlock(&shared.mutex);
}
data.r_obtained = op1;
operation (3)
while (true) {
sem_wait(shared.sem_wait_op);
if (data.op == shared.op)
shared.result = data.fun(shared.op1, shared.op2);
sem_post(shared.sem_done_op);
sem_wait(shared.sem_wait_others);
}