10: Controladores DMA
Vc ja deve ter ouvido falar sobre controladores DMA. O unico problema e q nao sabe pra servem, ou o q sao... ate agora.
Os processos que usam dispositivos rapidos como fitas e discos, frequentemente tem de ler ou escrever milhares de caracteres de cada vez. Os dispositivos e processos poderao ser muito mais eficientes se um bloco de caracteres for transferido em cada operacao em vez de um unico caractere O acesso direto a memoria (Direct Memory Acess - DMA, Eureca !), permite a transferencia de bloco de caracteres. Ele permite que o controlador acesse a memoria por si mesmo
Com a E/S programada, a CPU tinha de transferir cada um dos caracteres e o controlador baseado em DMA representa um nivel maior de sofisticacao.
____________________________
| Memoria |
---------------------------
O controlador pode A A O controlador pode
ler dados da memoria | | ler dados da memoria e
e armazenar dados na | | armazenar dados na mememoria.
V V moria.
_____________ __________
| Controlador | <----> | CPU |
------------- ----------
A CPU ativa
o controlador e o
controlador interrompe
a CPU.
O desenho, mostra um controlador DMA e uma CPU. Quando um processo em execucao precisa ler ou escrever dados: o driver ativa o controlador como antes, mas nao transfere dado algum. Em vez disso, ele manda ao controlador as informacoes necessarias. As informacoes sao essas (acho qe nao esqueci de nenhuma, qq coisa corrija-me):
- A operacao a ser executada.
- Um endereco indicando a posicao de memoria que ele deve acessar.
- O numero de caracteres a transferir.
- O dispositivo envolvido
Logo que o controlador recebe essa informacoes, ele inicia o acesso a memoria. Se o comando era uma solicitacao d escrita, o controlador acessa o numero especificado de caracteres contiguos, comecando no endereco especificado, e coloca os caracteres no dispositivo. Quando o controlador, interrompe a CPU, como antes, o sistema operacional responde a interrupcao. Se a solicitacao de E/S era para uma leitura, ocorrem acoes analogas A vantagem, naturalmente, e qe ha menos de interrupcoes. Isso faz como que a CPU fique ainda mais disponivel para os outros processos. Mesmo que nao haja outros processos(por exemplo, sistema monotarefa), menos interrupcoes significam maior eficiencia.
Roubo de Ciclo
Os acessos simultaneos a memoria por dois componentes distintos de hardware criam um novo problema: E se eles entrarem conflito ? Se tanto o controlador como a CPU utilizam os mesmos barramentos, o que acontecera se ambos o par de dois (:P), tentarem acessar a memoria ao mesmo tempo ? Mesmo que eles usem diferentes barramentos, o que acontecera c ambos tentarem acessar o mesmo modulo de memoria simultaneamente ? De qq forma, o resultado e o mesmo: ha um conflito porque o Hardware pode atender somente a um acesso de cada vez !
Em casos assim, um arbitro da a preferencia ao controlador. A CPU fica impedida de acessar o barramento ou o modulo d memoria durante alguns ciclos de relogio interno, e assim a CPU e retardada. Chamamos isso "roubo de ciclo", ja que o controlador rouba alguns ciclos da CPU. Note que essa nao e uma interrupcao como aquelas descritas na secao anterior. A CPU nao foi interrompida, mas sim retardada. A CPU nao salva o estado atual do processo nem chama um manipulador d interrupcao. O retardamento ocorre estritamente no hardware.
Uso de Buffers
Quando um driver inicia uma operacao de E/S para um processo, ele dev especificar uma posicao de memoria - mas qual ? Pareceria logico especificar a posicao indicada pelo processo; no entanto, frequentemente isso nao e feito. Em vez disso, o driver em geral especifica uma area separada de memoria, chamada buffer. Mas por que nao transferir os dados entre o dispositivo e a memoria do processo ? Ha varias razoes A primeira e que o processo requer e o que o controlador fornece podem nao ser a mesma coisa. Por exemplo, vamos supunhetar qe um processo queira ler um registro , declarado em um programa Pascal (Rulez) ou Cobol (SuX), d um arquivo de disco. Em virtude das caracteristicas dos discos, o controlador na realidade le um setor inteiro contendo um registro. Mas onde, o controlador coloca os dados do setor ? Provavelmente esse contem muito mais dados que o processo queria, e o processo nao tem o espaco para eles. Um buffer e usado para guardar conteudo do setor. So entao, o registro e transferido do buffer para memoria do processo Vale notar que solicitacoes subsequentes de leitura para registros que ja estao no buffer, nao causam uma transferencia fisica de dados. Como os dados ja forma lidos, eles precisam apenas ser movidos do buffer pra a memoria do processo. Devemos observar, que embora o uso de buffers seja comum, as vezes os dados sao transferidos diretamente p/ ou da memoria do processo. A vantagem e que isso elimina uma etapa extra. A desvantagem e que a parte do processo nao pode ser removida da memoria, deixando menos memoria disponivel para os outros processos.
Kosmos