Pergunta

O que significa usando uma cerca memória explícita?

Foi útil?

Solução

Para ganhos de desempenho CPUs modernas, muitas vezes executar instruções fora de ordem para fazer o máximo uso do silício disponível (incluindo memória de leitura / escrita). Porque o hardware impõe a integridade instruções você nunca perceber isso em um único segmento de execução. No entanto, para vários segmentos ou ambientes com memória volátil (memória mapeada I / O, por exemplo) isso pode levar a um comportamento imprevisível.

Uma cerca de memória / barreira é uma classe de instruções que a memória média de leitura / gravações ocorrem na ordem que você espera. Por exemplo, um 'muro inteiro' todos leitura / escreve antes da cerca são comprometidos diante daqueles depois da cerca.

cercas de memória Nota são um conceito hardware. Em linguagens de alto nível que estamos acostumados a lidar com mutexes e semáforos - estes podem muito bem ser implementado usando cercas de memória no nível baixo e uso explícito das barreiras de memória não são necessárias. Uso de barreiras de memória requer um estudo cuidadoso da arquitetura de hardware e mais comumente encontrados em drivers de dispositivo do que o código do aplicativo.

O reordenamento CPU é diferente de optimizações do compilador - embora os artefatos podem ser semelhantes. Você precisa tomar medidas separadas para parar o compilador reordenando suas instruções se isso pode causar um comportamento indesejável (por exemplo, o uso da palavra-chave volátil em C).

Outras dicas

minha resposta a outra pergunta, Quais são alguns truques que um processador faz ao código otimizar :?

O mais importante seria o acesso à memória reordenamento.

cercas memória ausente ou instruções serialização, o processador está livre para acessos à memória reorganizar. Algumas arquiteturas de processadores têm restrições sobre o quanto eles podem reordenar; Alfa é conhecido por ser o mais fraco (isto é, aquela que pode reordenar o mais).

Um bom tratamento do assunto podem ser encontradas na documentação fonte do Linux kernel, em Documentação / memória de barriers.txt

Na maioria das vezes, é melhor usar primitivas de seu compilador ou biblioteca padrão de bloqueio; estes são bem testado, deve ter todas as barreiras de memória necessários no local, e provavelmente são bastante otimizada (otimizar primitivas de bloqueio é complicado, até mesmo os especialistas pode obtê-los errado às vezes).

Na minha experiência, se refere a um memória barreira, que é uma instrução (explícita ou implícita) para acesso à memória sincronizar entre vários segmentos.

O problema ocorre na combinação de compiladores agressivos modernos (eles têm incrível liberdade para instruções de reordenamento, mas geralmente não sabe nada de seus threads) e modernas CPUs multicore.

Uma boa introdução para o problema é o " O 'Double -Checked bloqueio é quebrado' Declaração ". Para muitos, foi a chamada wake-up que haja dragões.

barreiras de memória completos implícitas são normalmente incluídos nas rotinas de sincronização de encadeamento plataforma, que cobrem o cerne da questão. No entanto, para a programação livre-lock e personalizado implementação, padrões de sincronização leves, muitas vezes você precisa apenas a barreira, ou mesmo apenas uma barreira one-way.

Wikipedia sabe tudo ...

barreira de memória, também conhecido como membar ou cerca de memória, é uma classe de instruções que causam um centro unidade de processamento (CPU) para impor uma ordenando restrição na memória operações emitido antes e depois da barreira de instrução.

CPUs empregam otimizações de desempenho que pode resultar em out-of-order execução, incluindo carga de memória e operações de armazenamento. operação de memória reordenamento normalmente passa despercebido dentro de um único segmento de execução, mas provoca um comportamento imprevisível em concorrente programas e drivers de dispositivo a menos que cuidadosamente controlado. O exato natureza de uma restrição de ordenação é dependentes, e definido pelo hardware modelo de memória da arquitetura. Alguns arquiteturas de fornecer múltiplos barreiras pela aplicação diferente restrições de ordenação.

barreiras de memória são normalmente utilizados aquando da aplicação da máquina de baixo nível código que opera sobre a memória compartilhada por vários dispositivos. Tal código inclui primitivas de sincronização e estruturas de dados sem bloqueio em multiprocessador, sistemas e dispositivo motoristas que se comunicam com o computador hardware.

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