qual é a diferença entre bloqueios de rotação e semáforos?


15

Quais são as diferenças básicas entre bloqueios de rotação e semáforos em ação?



@Gilles Também olhei para esse, mas a única menção de semáforos na página é Warren comentando que "se alguém quer saber a diferença entre um bloqueio de rotação e, digamos, um semáforo, essa é uma pergunta diferente".
Michael Mrozek

@ Michael: ok, acho que as respostas abordaram o ponto principal, mas você está certo que ninguém afirmou explicitamente que os semáforos eram um dos outros tipos de bloqueios.
Gilles 'SO- stop be evil'

Explicação por Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut

Duplicação de stackoverflow.com/questions/195853/spinlock-versus-semaphore Muitas boas explicações estão presentes no encadeamento que perguntei.
Iankits

Respostas:


13

Ambos gerenciam um recurso limitado. Primeiro, descreverei a diferença entre o semáforo binário (mutex) e o bloqueio de rotação.

Os bloqueios de rotação executam uma espera ocupada - ou seja, ele continua executando o loop:

while (try_acquire_resource ());
...
release();

Ele executa um bloqueio / desbloqueio muito leve, mas se o segmento de bloqueio for antecipado por outro, que tentará acessar o mesmo recurso, o segundo tentará simplesmente adquirir recursos até que ele acabe com os quanta de CPU.

Por outro lado, o mutex se comporta mais como:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Portanto, se o encadeamento tentar adquirir o recurso bloqueado, ele será suspenso até que esteja disponível para ele. O bloqueio / desbloqueio é muito mais pesado, mas a espera é 'livre' e 'justa'.

O semáforo é um bloqueio que pode ser usado várias vezes (conhecido na inicialização) por um número de vezes - por exemplo, 3 segmentos têm permissão para reter simultaneamente o recurso, mas não mais. É usado, por exemplo, no problema produtor / consumidor ou em geral nas filas:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

Boa explicação, só quero enfatizar um ponto. Semáforo vs mutex é uma questão de interface: um mutex é mantido ou não, enquanto um semáforo é mantido por até N threads; um mutex é um caso especial de semáforo com N = 1. Spinlock vs outro tipo de bloqueio é uma questão de implementação: um spinlock continua tentando adquiri-lo, enquanto outros aguardam uma notificação. Em um contexto de kernel Linux, o único bloqueio com uma implementação de rotação tem uma interface mutex.
Gilles 'SO- stop be evil'

Em um contexto de kernel Linux, o único bloqueio com uma implementação de rotação tem uma interface mutex. Eu não entendo essa linha. Você poderia, por favor, expandir isso?
Sen

@ Sen: Ele quis dizer que o bloqueio de rotação no Linux se comporta como binário (está bloqueado ou não). É possível ter uma trava giratória se comportando como semáforo.
Maciej Piechotka

“Mas se o segmento de bloqueio for impedido por outro, que tentará acessar o mesmo recurso, o segundo tentará simplesmente adquirir recursos até que os seus quanta de CPU acabem.”: Mas ainda existe um problema no Mutex também. E se uma tarefa com mais prioridade precisar acessar o recurso ... está apenas na fila? Talvez seja melhor cancelar o compartilhamento de recursos entre tarefas com prioridades diferentes.
Hibou57

@ Hibou57: Sim, está bloqueado porque o estado não é consistente e o uso do recurso teria efeitos "engraçados" (digamos que o thread de baixa prioridade estivesse no meio de adicionar ou remover algo de / para a lista vinculada). O objetivo desta declaração era que, se o encadeamento estiver bloqueado, ele não será agendado, portanto não consumirá recursos, enquanto o encadeamento aguardando no spinlock. O bloqueio para sistemas em tempo real (especialmente difícil) é um tópico diferente e não tenho conhecimento suficiente para respondê-lo - no entanto, esses sistemas às vezes implementam doações prioritárias ou outras técnicas.
Maciej Piechotka

2

Spinlocks são usados ​​em um contexto de interrupção, onde dormir não é permitido. Eles pesquisam em um loop restrito, sem fazer nada até que o recurso seja adquirido. Usado principalmente em ISRs, e mais seguro e eficiente.

Semáforos podem ser usados ​​em um contexto de processo, onde dormir é bom.


1

Aqui está minha resposta rápida: um bloqueio de rotação e um semáforo binário (que gerencia um recurso que só pode ser usado por uma coisa) são quase idênticos. Sua distinção é que os bloqueios giratórios gerenciam o código a ser executado enquanto os semáforos binários gerenciam algum tipo de recurso singular (por exemplo, tempo da CPU, saída do display)

Um semáforo comum, no entanto, é capaz de gerenciar vários threads acessando um recurso que pode ser dividido entre vários, mas é limitado (por exemplo, memória, largura de banda da rede)

Em resumo, é provável que um bloqueio de rotação continue perguntando a um semáforo se ele pode usar um recurso. (Imagine uma criança tendo que ir ao banheiro e esperando que outra pessoa termine.)

Fontes: Introdução à programação de sistemas, sistemas operacionais e wikipedia

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.