Escolar Documentos
Profissional Documentos
Cultura Documentos
Implementação
Sincronização no Kernel
Sistemas Operacionais
Andre Nathan
andrenth@cos.ufrj.br
Acesso concorrente
Acesso concorrente
Acesso concorrente
Acesso concorrente
Modelos de Sincronização
Modelos de Sincronização
Instruções Atômicas
Locks
Locks – cont.
Deadlocks
Deadlocks
Contenção
Contenção
Contenção
Operações Atômicas
API:
atomic_t v;
atomic_set(&v, 7); /* v = 7 (atomicamente) */
atomic_add(2, &v); /* v = v + 2 (atomicamente) */
atomic_inc(&v); /* v = v + 1 (atomicamente) */
printk("%d\n", atomic_read(&v)); /* imprime 10 */
Spin Locks
Spin Locks
Spin Locks
Spin Locks
API:
spin_lock_t lock = SPIN_LOCK_UNLOCKED;
spin_lock(&lock);
/* Região crítica */
spin_unlock(&lock);
Spin Locks
Spin Locks
API:
rwlock_t lock = RW_LOCK_UNLOCKED;
/* Leitor */
read_lock(&lock);
/* Região crítica */
read_unlock(&lock);
/* Escritor */
write_lock(&lock);
/* Região crítica */
write_unlock(&lock);
Semáforos
Semáforos
Semáforos
Semáforos
Semáforos
Semáforos
API:
static DECLARE_MUTEX(sem);
/*
* Tenta adquirir o semáforo. Se falhar, a tarefa é posta no
* estado TASK_INTERRUPTIBLE.
*/
if (down_interruptible(&sem)) {
/* Sinal recebido */
}
/* Região crítica */
/* Libera o semáforo */
up(&sem);
Semáforos Leitor-Escritor
/* ... */
down_write(&sem);
/* Região crítica (leitura/escrita) */
up_write(&sem);
Semáforos Leitor-Escritor
/* ... */
down_write(&sem);
/* Região crítica (leitura/escrita) */
up_write(&sem);
Desabilitando a Preempção
Desabilitando a Preempção
Desabilitando a Preempção
API:
preempt_disable();
/* Manipulação de variável compartilhada */
preempt_enable();
Alternativa: get_cpu():
int cpu;
Desabilitando a Preempção
API:
preempt_disable();
/* Manipulação de variável compartilhada */
preempt_enable();
Alternativa: get_cpu():
int cpu;