c1) monitor choicesem { queue of condition c int value void P(void) { if (value == 0) { c = new condition() q.append(c) c.wait() free(c) } else { value-- } } void V(int n){ if (q.isEmpty()){ value++ } else { if (q.len() > n) { c = q.get(n+1) } else { c = q.get(1) } c.signal() } } } c2) /*IDEA: mando messaggi di lunghezza inferiore per etichettare la fine di un messaggio*/ void asend (msg_t *msg, pid_t dest): while msg.len >= 251_ lasend(<getpid(), 251, msg[:251]>, dest) msg = msg[251:] lasend(<getpid(), msg.len(), msg) msg_t arecv(pid_t sender) while True: <pid, len, msg> = larecv(sender) if len == 251: msgfrom[pid] = msgfrom[pid] + msg else: m = msgfrom[pid] + msg msgfrom[pid] = None return m g1) P1: cpu 3, I/O 3, cpu 5, I/O 3, cpu 1, I/O 3, cpu 1 P2: cpu 3, I/O 2, cpu 1 P3: cpu 2, I/O 3, cpu 5, I/O 3, cpu 1 CPU scheduler priorità statica p1, p3, p2 I/= scheduler FIFO