Pergunta

Depois de ler o Test-e-Set Wikipedia entrada , ainda estou deixou com a pergunta "o que seria um Test-e-Set pode ser utilizado?"

Eu percebo que você pode usá-lo para implementar Mutex (conforme descrito na wikipedia), mas o que outros usos tem?

Foi útil?

Solução

Você usá-lo a qualquer momento você quer gravar dados para a memória depois de fazer algum trabalho e certifique-se outro segmento não tenha substituído o destino desde que você começou. Um monte de / free-mutex tomar este formulário.

Outras dicas

Um bom exemplo é "incremento."

Say dois segmentos executar a = a + 1. Say a começa com o valor 100. Se ambos os segmentos estão executando ao mesmo tempo (multi-core), ambos iria carregar a como 100, incremento de 101, e armazenar a volta em a. Errado!

Com test-and-set, você está dizendo "Set a para 101, mas somente se ele tem o valor 100." Neste caso, um segmento vai passar nesse teste, mas o outro irá falhar. No caso de falha, o fio pode repetir a declaração inteira, este tempo de carregamento a como 101. Sucesso.

Esta é geralmente mais rápido do que usar um mutex porque:

  1. Na maioria das vezes não há uma condição de corrida, por isso, a atualização acontece sem ter de adquirir algum tipo de mutex.
  2. Mesmo durante colisão, um segmento não é bloqueado em tudo, e é mais rápido para o outro segmento para apenas rotação e repetição do que seria a suspender-se em linha para alguns mutex.

Imagine que você estivesse escrevendo uma aplicação bancária, e sua aplicação tinha um pedido para retirar libras dez (sim, eu sou Inglês;)) da conta. Então você precisa ler o saldo da conta corrente em uma variável local, subtrair a retirada e, em seguida, escrever o equilíbrio de volta à memória.

No entanto, o que se outro, pedido concorrente acontece entre você ler o valor e você escrevê-lo fora? Há a possibilidade de que o resultado desse pedido vai ficar completamente substituído pelo primeiro, e o saldo da conta será incorreto.

Test-and-set nos ajuda a corrigir esse problema, verificando se o valor a sua substituição é o que você acha que deveria ser. Neste caso, você pode verificar que o equilíbrio foi o valor original que você lê. Desde que é atômica, é não-interruptível por isso ninguém pode puxar o tapete de debaixo de ti entre a leitura e a escrita.

Outra forma de corrigir o mesmo problema é tirar um bloqueio no local de memória. Infelizmente, os bloqueios são tremendamente difícil de acertar, difícil raciocinar sobre, tem problemas de escalabilidade e se comportar mal em face de falhas, de modo que não é um ideal (mas definitivamente prático) solução. Test-and-set se aproxima de formar a base de algum Software Transactional Memórias, que otimista permitir que cada transação para executar em simultâneo, com o custo de rolagem los todos de volta se eles conflitos.

Basicamente, a sua utilização é exatamente para mutexes, dada a enorme importância de atomicidade. É isso.

Test-and-set é uma operação que pode ser realizada com duas outras instruções, não atômica e mais rápido (atomicidade tem uma sobrecarga de hardware quando em sistemas com múltiplos processadores), então normalmente você não iria utilizá-lo por outras razões.

É usado quando você precisa para obter um valor compartilhado, fazer algo com ele, e altere o valor, assumindo outro segmento não tenha mudado.

Como para usos práticos, a última vez que o vi foi em implementações de filas simultâneos (filas que podem ser empurradas / estourados por vários segmentos sem a necessidade de semáforos ou mutexes).

Por que você usaria TestAndSet em vez de um mutex? Porque normalmente requer menos sobrecarga do que uma extensão mútua. Quando um mutex requer intervenção OS, um TestAndSet pode ser implementado como uma única instrução atômica sobre a CPU. Quando rodando em ambientes paralelos, com 100 dos tópicos, uma única mutex em uma seção crítica do código pode causar gargalos graves.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top