Entradas/Saídas Programação por interrupções Programação da porta série Recepção Concorrência no acesso a recursos Programação por DMA
Relembrar a recepção com espera activa Para receber um byte pela porta série temos: unsigned char receive_serial( ) { unsigned char s; } do { s = // Conteúdo do registo de estado (LSR) } while ( /* bit RBR pronto de LSR == 0 */ ); return // Conteúdo do registo de dados a receber Arquitectura de Computadores (2008/2009): Entradas/Saídas 701
Recepção com interrupções Leitura de caracteres pelo programa Remover o byte mais antigo buffer Inserir na 1ª posição livre Rotina de tratamento da interrupção Byte Interrupção 12 (IRQ4) UART 1 A gerar interrupção quando RBR pronto Arquitectura de Computadores (2008/2009): Entradas/Saídas 702
Recepção com interrupções A rotina recv_serial lê o byte de um buffer Espera em ciclo (com as interrupções ligadas) que haja um elemento no buffer unsigned char receive_serial() { } while (/* buffer vazio */) ; // esperar // ler byte do buffer // retornar byte lido Arquitectura de Computadores (2008/2009): Entradas/Saídas 703
Recepção com interrupções A rotina de interrupções pode encontrar o buffer cheio Se tal acontece não pode ficar em espera activa (porquê?) perde-se o byte que chegou Rotina de tratamento de interrupções RBR pronto { if (/* buffer cheio */) /* Erro! Não há espaço no buffer mas não se pode esperar */ else { // ler byte da porta série // colocar byte no buffer } // Enviar EOI para o PIC } Arquitectura de Computadores (2008/2009): Entradas/Saídas 704
Características: Implementação do Buffer Zona de memória acessível ao programa e à rotina de tratamento da interrupção Pode ser indirectamente por exemplo: o programa recorre a chamadas ao sistema Capacidade suficiente para que o programa e o periférico trabalhem dessincronizados Não perder os dados que entram do periférico Manter o periférico ocupado com as saídas Operações de: por e tirar: bufput() e bufget() testar buffer vazio/cheio: bufempty() e buffull() Disciplina FIFO (First-In-First-Out) Arquitectura de Computadores (2008/2009): Entradas/Saídas 705
Buffer circular - exemplo unsigned char buffer[n]; int put = 0; // 1ª casa livre int get = 0; // casa ocupada há mais tempo int nc = 0; // nº de bytes no buffer void bufput (unsigned char c) { /* assume que buf não está cheio */ buffer[put] = c; put = (put + 1) % N; nc ++; } N-2 N-1 0 1 a' b' c' 2 get 3 put unsigned char bufget() { /* assume que buf não está vazio */ unsigned char x = buffer[get]; get = (get + 1) % N; nc --; return x; } int buffull() { return (nc == N); } int bufempty() { return (nc == 0); } Arquitectura de Computadores (2008/2009): Entradas/Saídas 706
Actualização do nº de bytes no buffer A rotina send_serial, ao usar a função bufput, incrementa o número de bytes no buffer: nc ++ Suponhamos que o compilador traduz para mov eax, [nc] inc eax mov [nc], eax A rotina de atendimento de interrupções de transmissão, ao usar a função bufget, decrementa o número de bytes no buffer: nc -- Suponhamos que o compilador traduz para mov eax, [nc] dec eax mov [nc], eax Arquitectura de Computadores (2008/2009): Entradas/Saídas 707
Actualização do nº de bytes no buffer Suponhamos que nc é 20 e que, enquanto a rotina send_serial deposita um carácter, ocorre uma interrupção motivada pelo facto do registo THR ter ficado vazio send_serial nc 20 19 21 Rotina de tratamento ; push regs mov eax, [nc] ; nc==20 inc eax mov [nc], eax ; nc==21 eax tem 21; Este valor é salvo mov eax,[nc] ;nc==20 dec eax mov [nc], eax ;nc==19 Restaura o valor de eax (21) ; pop regs iret Arquitectura de Computadores (2008/2009): Entradas/Saídas 708
Actualização do nº de bytes no buffer Após inserir um carácter e remover outro, nc deveria ter ficado com 20 Ficou com 21 o que é um erro que vai provocar problemas para o futuro nas chamadas de bufempty() e buffull() Isto aconteceu porque a acção de actualização da variável foi interrompida a meio e foi chamada uma rotina que actualiza a mesma variável race condition (corrida) Arquitectura de Computadores (2008/2009): Entradas/Saídas 709
Actualização do nº de bytes no buffer A variável nc é partilhada pela rotina send_serial/recv_serial e pela rotina de tratamento de interrupções. A sua actualização não pode ser interrompida constitui o que se chama uma secção crítica Para resolver isto é preciso alterar as rotinas para que não sejam interrompidas na alteração de nc: Por ex. usando as instruções máquina CLI e STI Assim garante-se que nc é actualizado correctamente Arquitectura de Computadores (2008/2009): Entradas/Saídas 710
Vantagens das interrupções: revisão O uso de interrupções permite sobrepor (overlap) a computação e a realização de entradas/saídas pelos periféricos Permitem adaptar a velocidade relativa de CPUs e periféricos, tirando melhor partido do CPU e dos periféricos Um computador que usa interrupções permite programar mais eficientemente as operações de entrada/saída e tem melhor desempenho do que um que não tem Arquitectura de Computadores (2008/2009): Entradas/Saídas 711
Transferências conduzidas por interrupções Nas transferências de dados para/dos periféricos, o CPU só está envolvido quando é realmente necessário executando o código da rotina de tratamento que faz IN/OUT desses bytes para o controlador do periférico Não existe CPU em espera Mas poderá ser melhor? Para periféricos orientados ao bloco, pedir logo a transferência do bloco completo de bytes, num único pedido ao controlador? Arquitectura de Computadores (2008/2009): Entradas/Saídas 712
Transferência de blocos de bytes Periféricos orientados ao bloco Exemplo: 512 bytes para enviar: enviar_bloco() por bloco no buffer ligar interrupções transferência RotinaServiço: envia próximo byte do buffer se último byte desligar interrupções transferência iret RotinaServiço é chamada 512 vezes Arquitectura de Computadores (2008/2009): Entradas/Saídas 713
Acesso directo à memória (DMA) As E/S usando interrupções ainda requerem uma intervenção activa do CPU CPU precisa de intervir muitas vezes para um bloco de dados A resposta a estes problemas é remeter para o hardware o papel desempenhado pela Rotina de Serviço Um novo dispositivo que permita transferências entre Memória e Controladores sem intervenção do CPU Acesso Directo à Memória (Direct Memory Access) Requer hardware extra com acesso ao bus: o controlador de DMA O controlador de DMA pode tomar conta do bus (bus master) e aceder à memória e ao periférico Arquitectura de Computadores (2008/2009): Entradas/Saídas 714
Controlador de DMA exemplo Registos de um controlador genérico: Endereço endereço de memória Contador número de bytes a transferir Canal DMA (DMA channel) identifica o periférico alvo Controlo comandos, por exemplo: sentido da transferência CPU Memória Controlador de DMA endereço contador canal DMA controlo selecção do periférico alvo da DMA (canal DMA) Controlador com DMA Periférico Interrupção Arquitectura de Computadores (2008/2009): Entradas/Saídas 715
Operação com DMA O CPU informa o controlador de DMA sobre a transferência pretendida: Leitura da memória ou escrita em memória Endereço (canal de DMA) do controlador do periférico Endereço do bloco de memória central onde estão / para onde vão os dados a transferir Número de bytes a transferir O CPU volta ao processamento O controlador de DMA trata da transferência O controlador de DMA envia uma interrupção quando termina toda a transferência (ou se erro) Arquitectura de Computadores (2008/2009): Entradas/Saídas 716
Custo das interrupções O progresso do programa só é parado durante a transferência CPU a 1GHz e rotina de tratamento com 100 instruções a 1 inst/hz 1000 transferências I/O (1000 bytes) 1000 interrupções 1000 rotinas de serviço Custa ao CPU: 1 000*100 = 100 000 Hz Por outro lado, 1GHz = 10^9 Hz = 10^9 ciclos do relógio por segundo Como a recepção de um byte são 100 ciclos No melhor dos casos transfere-se 10^9/100 = 10^7 = 10 Mbytes/s (mas depende também da velocidade do bus, periférico e memória) Arquitectura de Computadores (2008/2009): Entradas/Saídas 717
Transferência usando DMA Suponhamos que a preparação do DMA também "custa" 100 Hz Transferência de 1000bytes: Custa ao CPU: 100+100 = 200 Hz A taxa máxima de transferência depende do bus, memória, do controlador de DMA e do periférico Arquitectura de Computadores (2008/2009): Entradas/Saídas 718
Entradas/Saídas Exemplos de dispositivos de entrada/saída (periféricos) Discos duros Suportes ópticos Discos RAID
Exemplo:Teclado orientado ao byte De cada vez, o teclado, disponibiliza um byte com o carácter premido Podemos obter cada um desses bytes individualmente Podemos "ver" o teclado como um periférico de leitura que providencia uma sequência (stream) de bytes Arquitectura de Computadores (2008/2009): Entradas/Saídas 720
Exemplo: Discos orientados ao bloco A unidade de transferência é o sector (2KB, 4KB, etc.) Arquitectura de Computadores (2008/2009): Entradas/Saídas 721
Discos duros É normal que um disco seja constituído por vários discos colocados verticalmente. A distancia radial da cabeça ao centro denomina-se cilindro. Um disco com n níveis, terá 2*n cabeças e 2*n pistas (tracks) por cilindro. As tracks são divididas em sectores. Arquitectura de Computadores (2008/2009): Entradas/Saídas 722
Discos duros Para se realizar uma transmissão é necessário definir a track (ou a cabeça), o cilindro, o sector de início e quanta informação transmitir O tempo que leva a cabeça a colocar-se na track pretendida denomina-se seek time O tempo que leva a cabeça a posicionar-se sobre o sector pretendido denomina-se latência rotacional A soma do seek time e da latência dá o tempo de acesso Arquitectura de Computadores (2008/2009): Entradas/Saídas 723
Exemplo: ópticos orientados ao bloco A unidade de transferência é o sector de 2K Existem outros modos que definem outro tipo de sectores Arquitectura de Computadores (2008/2009): Entradas/Saídas 724
Suportes ópticos Uma única track em espiral, com baixos (pits) e altos (lands) A fronteiras dos pits alteram a intensidade da reflexão do laser na superfície do disco A mudança, ou ausência de mudança, de pit para land ou de land para pit são interpretadas como dígitos binários: A mudança de pit para land ou de land para pit 1 Ausência de mudança 0 Arquitectura de Computadores (2008/2009): Entradas/Saídas 725
Suportes ópticos: CD e DVD CD-ROM (Compact Disk Read Only Memory) e CD-RW (Compact Disk Read Write) até 742 MB DVD (Digital Versatile Disk) Um lado, uma camada Um lado, duas camadas Dois lados, uma camada Dois lados, duas camadas 4.7 GB 8.5 GB 9.5 GB 17 GB Arquitectura de Computadores (2008/2009): Entradas/Saídas 726
Suportes ópticos: Blue-ray Discos Blue-violet HD-DVD: NEC e Toshiba 15 GB (terminou em 2/2008) Blu-Ray: consórcio com Sony, Samsung, Pioneer Blu-ray: BD-Rom, BD-R (gravável), BD-RE (regravável) Um lado, uma camada Um lado, duas camadas Dois lados, uma camada Dois lados, duas camadas Protótipos Um lado, quatro camadas Um lado, apenas três camadas 25 GB 50 GB 50 GB 100 GB 100 GB 200 GB Tecnologia Durabis garante resistência a arranhões e gordura Arquitectura de Computadores (2008/2009): Entradas/Saídas 727
Discos RAID RAID (Redundant Array of Inexpensive Disks). Consiste na organização de vários discos num só disco lógico de alta capacidade e performance. Arrays de discos dividem os dados pelos vários discos e acedem à informação em paralelo para obter: Taxas de transferência melhores no acesso a grande quantidades de dados Taxas de I/O em acessos de pequena envergadura: atendimento de vários pedidos em simultâneo. A divisão dos dados garantem um balanceamento da carga ao longo dos discos. Evitando discrepâncias na quantidade de acessos a cada disco. Arquitectura de Computadores (2008/2009): Entradas/Saídas 728
Discos RAID No entanto, arrays de vários discos são mais vulneráveis a falhas Se o tempo médio de falhas de um disco for 500000 horas, para 100 discos temos 5000 horas: 500000/100 A solução passa por melhorar a tolerância a falhas Introdução de redundância dos dados Esta solução tem, no entanto, dois problemas Quando se realiza uma escrita é necessário alterar todas as cópias do dados Se o sistema crachar durante uma operação de I/O é difícil garantir a coerência dos dados Arquitectura de Computadores (2008/2009): Entradas/Saídas 729
Discos RAID Para se obter boas performances com uma array de discos é necessário ponderar 3 pontos: Maximizar o número de discos acedidos em paralelo. Minimizar o espaço em disco dedicado à redundância de dados. Minimizar o desperdício de tempo (overhead) causado pelos pontos anteriores. Tipos de arrays RAID RAID 0 a 6 Conjunções de vários tipos Exemplo: 0+1 Arquitectura de Computadores (2008/2009): Entradas/Saídas 730
Discos RAID RAID 0 (não redundante): sem redundância. Mais rápido Não tolerante a falhas. Usados em ambientes de supercomputação, onde o mais importante é a velocidade não a tolerância a falhas. Arquitectura de Computadores (2008/2009): Entradas/Saídas 731
Discos RAID RAID 1 (espelho): Para cada disco existe um outro que contém a sua cópia Implica duas escritas. A leitura pode ser optimizada, sendo o pedido encaminhado para o disco com menos pedidos e latência rotacional. Usado em bases de dados, onde a tolerância a falhas e a disponibilidade da informação é mais importante do que a eficiência do modo como os dados são guardados. Arquitectura de Computadores (2008/2009): Entradas/Saídas 732
Discos RAID RAID 2 (código de Hamming): Precisa de log 2 de discos de paridade Usa o código de Hamming para detectar se um disco falhou e qual foi esse disco Nunca foi lançado comercialmente RAID 3 (paridade bit-interleaved): 1 disco de paridade Nesta abordagem é mais fácil detectar qual o disco que falhou. Isso reflecte-se na existência de apenas de um disco de paridade. Para o array: 0 1 1 1 Temos como bit paridade 1 = 0 xor 1 xor 1 xor 1 Se o primeiro disco falhar os dados podem ser corrigidos aplicando novamente XORs: 1 xor 1 xor 1 xor 1 = 0. Arquitectura de Computadores (2008/2009): Entradas/Saídas 733
Discos RAID Arquitectura de Computadores (2008/2009): Entradas/Saídas 734
Discos RAID RAID 4 (paridade block-interleaved): semelhante ao anterior. A diferença está na unidade do interleaving, que passa do bit para um bloco de dados. Arquitectura de Computadores (2008/2009): Entradas/Saídas 735
Discos RAID RAID 5 (paridade block-interleaved distribuída): a informação da paridade é distribuída pelos vários discos. Elimina o problema do número de acessos ao disco de paridade. Arquitectura de Computadores (2008/2009): Entradas/Saídas 736
Discos RAID RAID 6 (redundância P+Q): usa dupla protecção Usa duas informações para cada bloco de dados P Paridade, Q Código de Reed-Soloman. Arquitectura de Computadores (2008/2009): Entradas/Saídas 737
Discos RAID RAID 10 ou 1+0 (divisão espelhada): combina o RAID 0 e o RAID 1. Os discos são espelhados em pares para se obter melhor performance Existem outras combinações: Raid 0+1 Raid 5+0 Arquitectura de Computadores (2008/2009): Entradas/Saídas 738