struct bed {
wait_queue queue;
}
sleep(b, k) {
currentproc->state = BLOCKED;
insert_queue(b->queue, currentproc);
unlock(k);
schedule();
lock(k);
}
wakeup(b) {
p = remove_queue(b->queue);
if (p != NULL)
p->state = READY;
}
struct better_mutex {
mutex k;
bed b;
int free;
}
better_lock(k) {
lock(k->mutex);
if (!k->free)
sleep(k->bed, k->mutex);
k->free = 0;
unlock(k->mutex);
}
better_unlock(k);
lock(k->mutex);
k->free = 1;
wakeup(k->bed);
unlock(k->mutex);
}
Monitores são módulos de programação:
Somente uma função pode ser executada a cada instante (exclusão mútua).
Não se assume nada:
Primitivas:
void producer() {
message m, ack;
while(TRUE) {
receive(consumer, &ack);
produce_item(&m);
send(consumer, &m);
}
}
void consumer() {
message m, ack;
send(producer, &ack);
while(TRUE) {
receive(producer, &m);
consume_item(m);
send(producer, &m);
}
}
Mas e exclusão mútua ???
Relação entre mailboxes e processos:
P0: chama f(a, b, c) durante sua execução
P1: servidor: loop infinito esperando pedidos de execução de f.
P0 P1 ... f(a, b, c); send(p1, a, b, c); receive(p, a, b, c); r = f(a, b, c); receive(r); send(p, r); ...
struct wait_queue {
struct task_struct *task;
struct wait_queue *next;
};
void add_wait_queue(queue, entry);
void remove_wait_queue(queue, entry);
Wait queues são modificadas por rotinas de interrupção. Por causa disto elas só podem ser acessadas através das rotinas acima.Um processo esperando por um evento é colocado na wait_queue correspondente:
void sleep_on(struct wait_queue **queue)
{
struct wait_queue entry={current,NULL}
current->state = TASK_UNINTERRUPTABLE;
add_wait_queue(queue, &entry);
schedule();
remove_wait_queue(queue, &entry);
}
void wake_up(struct wait_queue **queue)
{
struct wait_queue *p = *queue;
do {
p->task->state = TASK_RUNNING;
p = p->next;
} while (p != *queue);
}
struct semaphore {
int count;
struct wait_queue *wait;
};
void wait(struct semaphore *sem)
{
while (sem->count <= 0)
sleep_on(sem->wait);
sem->count--;
}
void signal(struct semaphore *sem)
{
sem->count++;
wake_up(&sem->wait);
}