Uma CPU congela completamente ao usar um DMA?

19

Tenho uma pergunta bastante direta, mas não consegui encontrar uma resposta para ela em nenhum lugar.

Em um sistema Von-Neumann em que código e dados residem na mesma RAM, a CPU deve buscar todas as instruções na memória. Agora, para mover grandes quantidades de dados entre os componentes do computador, existe um controlador de acesso direto à memória que permite que os periféricos tenham acesso à RAM do sistema principal.

Minha pergunta é a seguinte: se o DMA está permitindo uma transferência de dados (possivelmente muito longa) entre, digamos, o disco rígido e a RAM, isso não significa que a CPU não pode usar RAM e, portanto, não pode buscar sua próxima instrução?

Em resumo, o DMA deve substituir o processador, arbitrando todas as leituras e gravações de E / S, a fim de liberar o processador para fazer outras coisas. No entanto, se não puder buscar suas instruções na RAM, não será liberado de qualquer maneira.

Há alguns detalhes que estou perdendo aqui?

obrigado

Mahkoe
fonte
7
Sim. O DMA raramente é executado na largura de banda completa da memória. Ele apenas rouba um ciclo (ou uma explosão de ciclos) de vez em quando, controlado pela taxa do dispositivo de E / S.
Dave Tweed
O computador doméstico Amiga contornou isso observando que a CPU usada na verdade só acessava o barramento dois ciclos e depois permanecia fora do barramento por dois ciclos, quando ainda estava funcionando a toda velocidade. Os periféricos baseados em DMA (gráficos, áudio, disco) usavam os ciclos intermediários. Não é uma resposta para a sua pergunta, pois a pergunta é hipotética e os computadores são sempre arruinados por detalhes práticos. :)
tubo de
2
@pipe: Isso não parece certo. O Amiga usava uma CPU M68K, que possui um barramento completamente assíncrono. Você pode estar pensando no Apple II, que aproveitou o fato de que sua CPU 6502 usa apenas o barramento para metade de cada ciclo de clock e a outra metade para a saída de vídeo, que também serviu para manter a DRAM atualizada.
Dave Tweed
4
As CPUs modernas têm caches que, em média, resolvem 95% dos acessos à memória. Contanto que a CPU não precise de RAM, o DMA não estará interferindo.
precisa saber é o seguinte
2
@DaveTweed Nope. Se você observar os tempos do barramento para o 68000, cada "ciclo de barramento" (leitura ou gravação) é dividido em 8 estados, com um mínimo de 4 ciclos de clock reais, dos quais apenas alguns deles dirigem o barramento de dados. Porém, essa multiplexação requer algum hardware extra, porque aciona o barramento de endereços o tempo todo.
tubo de

Respostas:

18

Você está certo de que a CPU não pode acessar a memória durante uma transferência DMA. No entanto, existem dois fatores que, combinados, permitem o acesso aparente à memória paralela pela CPU e pelo dispositivo que realiza a transferência do DMA:

  • A CPU leva vários ciclos de clock para executar uma instrução. Depois de buscar a instrução, que leva talvez um ou dois ciclos, ela pode executar a instrução inteira sem acesso adicional à memória (a menos que seja uma instrução que acesse a memória, como uma movinstrução com operando indireto).
  • O dispositivo que realiza a transferência de DMA é significativamente mais lento que a velocidade da CPU, portanto, a CPU não precisará interromper todas as instruções, mas apenas ocasionalmente quando o dispositivo DMA estiver acessando a memória.

Em conjunto, esses dois fatores significam que o dispositivo que realiza a transferência de DMA terá pouco impacto na velocidade da CPU.

EDIT: Esqueci de mencionar que também há o fator de cache da CPU, que, enquanto o código que a CPU está executando estiver no cache, ele não precisará acessar a memória real para buscar instruções, portanto, uma transferência de DMA não será para atrapalhar (embora se a instrução precisar acessar a memória, obviamente ocorrerá um acesso real à memória - potencialmente, será necessário aguardar uma pausa no uso da memória do dispositivo DMA).

Micheal Johnson
fonte
4
Como uma abordagem adicional, alguns sistemas podem oferecer vários canais para acessar a memória. A CPU pode ter permissão para usar um canal enquanto o mecanismo DMA trabalha no outro
Cort Ammon - Restabelecer Monica
1
@CortAmmon Acredito que a memória de canal duplo geralmente é espalhada pelo espaço de endereço físico, por exemplo, se você tem 2 GB de RAM, o 1 GB inferior está no primeiro canal e o 1 GB superior está no segundo canal. Nesse caso, se a CPU e o DMA quiserem acessar a mesma área de 1 GB de memória, eles estarão no mesmo canal e, portanto, potencialmente entrarão em conflito.
Micheal Johnson
Não tenho certeza se muitos sistemas reais já usaram uma arquitetura VNM verdadeira. O gargalo era muito estreito. Realmente era um dispositivo teórico usado em CS. O mais próximo que consigo pensar era um dispositivo Texas de 16 bits dos anos 70 que tinha seus registros na RAM. Estou pensando em uma placa de vídeo em que a RAM de duas portas é usada. Chips como ARM, especialmente os de ponta, realizam o mesmo em muitos barramentos internos (AHP, APB, Stacks). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR
1
Não achei que a pergunta fosse sobre um CPU Von-Neumann rigoroso, mas um prático, como o x86 ou o ARM, que são vagamente Von-Neumann. No caso de um Von-Neumann estrito, sem nenhum registro interno, a capacidade da CPU continuar em execução durante o DMA se resume ao meu segundo ponto na minha resposta: o DMA não está usando toda a largura de banda da memória.
precisa
20

Se houver uma única interface de memória, haveria hardware para arbitrar entre solicitações. Normalmente, um processador teria prioridade sobre a E / S sem passar por E / S, mas mesmo com a E / S sempre tendo prioridade, o processador teria algumas oportunidades para acessar a memória porque a E / S tende a ter demandas de largura de banda mais baixas e a ser intermitente.

Além disso, normalmente há mais de uma interface para a memória. Processadores com desempenho mais alto geralmente têm caches (se o DMA não é coerente, os caches nem precisam ser espionados; mesmo com espião, a sobrecarga geralmente seria pequena por causa da diferença de largura de banda entre o cache e a memória principal ou (quando o DMA é transferido para L3 cache) entre o cache L3 e o cache L1), fornecendo uma interface separada para acessar a memória. Os microcontroladores geralmente acessam as instruções de uma memória separada baseada em flash, permitindo que a busca prossiga durante o DMA para a memória no chip, e geralmente possuem memória fortemente acoplada a uma interface independente (permitindo muitos acessos de dados para evitar conflitos de DMA).

Mesmo com uma única interface de memória, o pico da largura de banda geralmente será maior do que a largura de banda normalmente usada. (Para busca de instruções, mesmo um buffer pequeno com carregamento de memória maior que a média da memória permitiria a busca de instruções do buffer enquanto outro agente estiver usando a interface de memória, explorando a tendência do código de não ramificar.)

Observe também que, como um processador acessa dados, se houver uma única interface de memória, deve haver um mecanismo de arbitragem entre acessos a dados e acessos a instruções.

Se o processador (com uma única interface de memória) fosse forçado a implementar uma cópia de um buffer de dispositivo de E / S para a memória principal, ele também precisaria buscar instruções para executar a cópia. Isso pode significar dois acessos à memória por palavra transferida, mesmo em um ISA com operações de memória / memória (um ISA de armazenamento de carga pode exigir três acessos à memória ou mais se o endereçamento de memória pós-incremento não for fornecido); isto é, além do acesso de E / S, que em sistemas antigos pode compartilhar a mesma interface que a memória principal. Um mecanismo DMA não acessa instruções na memória e evita essa sobrecarga.

Paul A. Clayton
fonte
2

Como existe apenas um sistema de barramento, que é bloqueado pelo acesso à memória do DMA, a CPU não pode funcionar enquanto o DMA estiver movendo dados e, portanto, é interrompido.

A idéia por trás disso é a seguinte:

Se você deseja copiar dados consecutivos da memória, a CPU precisaria fazer algo assim:

Calcular endereço-> ler dados-> calcular novo endereço (+ 1 palavra) -> ler dados ...

Enquanto o DMA faz o cálculo do novo endereço em paralelo (dependendo do modo) e, portanto, é mais rápido. Portanto, o DMA pode funcionar com a capacidade total do barramento (teoricamente).

NeinDochOah
fonte
"como existe apenas um único sistema de barramento" ... não é uma suposição segura a ser feita com computadores modernos com memória e barramento periférico em velocidade diferente e com a tradução de protocolo entre eles.
precisa saber é o seguinte
3
Em computadores mais antigos: havia uma supervisão de design no Apple II (ou algum antecessor / protótipo dele), na medida em que eles literalmente interromperam a CPU. Os registros em um 6502 são implementados como memória dinâmica. A maneira como eles interromperam a CPU interrompeu a atualização. O comprimento máximo do DMA acabou sendo muito, muito dependente da máquina.
precisa saber é o seguinte
Como a pergunta era sobre arquitetura von neumann e DMA, isso soa mais como uma pergunta sobre microcontroladores (então, novamente, discos rígidos são mencionados no exemplo). Também como Paul A. Clayton aponta, fica ainda mais complicado quando você considera o cache multinível. Pode-se também pensar em uma CPU em que vários opcodes estão contidos em uma palavra e são executados após o outro ou com cache próprio, onde haveria código que a CPU poderia executar, mas a saída teria que ser armazenada em buffer ... então sim, você está ali existem infinitas possibilidades.
precisa saber é o seguinte
2

De um modo geral, não.

Na maioria das arquiteturas de sistema, todos os pedidos de acesso à memória têm uma prioridade atribuída a eles. Quando há mais solicitações simultâneas de memória do que o sistema pode atender por vez, as solicitações com prioridade mais alta são atendidas primeiro. Solicitações de memória iniciadas pela CPU geralmente recebem a maior prioridade possível.

crepúsculo
fonte
0

Em geral não.

Alguns sistemas com certeza, apenas um mestre de cada vez. Um design um pouco mais antigo, se for esse o caso (mesmo os designs antigos costumavam ter soluções paralelas). Um tipo moderno de barramento através de cada barramento (endereço, gravação de dados, leitura de dados) opera independentemente e possui um tag ou ID por ciclo de clock para mostrar a qual transação esse ciclo de clock está associado. Assim, você pode ter muitas / muitas transações em andamento ao mesmo tempo nas duas direções, com diferentes transações embaralhadas juntas nos barramentos de leitura ou gravação de dados. Quem será o próximo seria baseado em prioridade, não há regra de que as transações no barramento precisem ser realizadas na ordem em que as instruções do software são definidas, o processador pode determinar que pode iniciar algumas antes das outras, e, naturalmente, as respostas voltarão em diferentes ordens, dependendo da proximidade e rapidez do alvo. Da mesma forma, as buscas não estão em ordem, a previsão de ramificação dispara buscas de aparência aleatória sempre que necessário.

Uma transação de dma grande exigiria muito mais largura de banda de barramento, mas dizer que o processador trava, não necessariamente o caso, também depende da arquitetura e do código. O código pode ter uma instrução que diz parar até que esse final do sinal / evento de transferência aconteça e, em seguida, garantir que o processador termine o que pode fazer no tubo e depois pare. Mas isso ou algumas arquiteturas podem não exigir que você pare, não é realmente sensato parar de qualquer maneira, com tanta largura de banda desperdiçada. Qual seria o sentido do dma de qualquer maneira, se ele não operar em paralelo, apenas codifique a transferência em um loop, as buscas adicionam alguns ciclos, talvez dependendo da arquitetura, que não são tão dispendiosos quanto a sobrecarga, a energia etc. da lógica do dma. O dma funciona para a arquitetura e o sistema específicos em que você está e decide se vale a pena usar,

Não existe uma resposta genérica para como o dma funciona, ele depende muito do design do sistema e de todos os componentes dentro do sistema.

old_timer
fonte