[Guia de resolução para teste 2 - ASC I - 2006/2007 NOTA: NÃO CONSIDERE ESTAS RESPOSTAS COMO COMPLETAS! ] 1- 513,625 513(10) -> 1000000001(2) 0,625(10) -> 0,101(2) +1,000000001101(2) x 2^9 representação -> 0 10001000 00000000110100000000000 2- a1) Falsa, porque a rotina é chamada pelo próprio mecanismo de interrupções no CPU e não pode ser chamada com CALL. a2) Verdade, porque o PIC não aceita interrupções de menor prioridade enquanto não terminar o tratamento em curso, e o PIC só sabe dessa terminação pelo comando "E-O-I" a3) Verdade, porque o vector de interrupções é usado para saber o endereço da rotina a chamar para cada interrupção. Temos assim de indicar a "nossa" rotina na posição correspondente. a4) Falsa, o programa perde caracteres se os não tratar (o que quer que lhes queira fazer) ao ritmo superior ao da sua chegada. Por exemplo: recebido um, antes de voltar a ler outro do controlador chegam dois pela porta série. Este problema até pode ser menor no caso das interrupções, pois só perdemos caracteres quando o buffer encher. b) void interrupt recebeCar(void) { unsigned char c; enable(); c = inByte(RXDATA); /* RXDATA registo de dados que chegam (0x3f8) */ if (!bufferFull()) putBuffer(c); else caracteresPerdidos ++; outByte(PICCOM,EOI); /* PICCOM registo comando do PIC (0x20); EOI (0x20) */ } 3- Nos periféricos orientados ao bloco. Este mecanismo permite desocupar o CPU da transferência dos vários bytes de cada bloco, sendo estes transferidos pela DMA em simultâneo com a execução de código pelo CPU, só necessitando este de tratar a interrupção que marca o fim de cada bloco. 4- a) blocos de 64bytes -> 6bits 0000000000001000000 001000 num. bloco de memória = 0000000000001000000(2) = 64 byte neste bloco = 001000(2) = 8 (e seguintes dependendo do tamanho da transferencia. Se 32bits então seriam mais os 3 bytes seguintes) b) mapa directo 512*2^10 / 64 = 512*2^4 = 2^13 blocos na cache -> 13 bits 000000 0000010000000 001000 bloco da cache = 0000010000000(2) = 64 encontra o bloco (hit) se o bloco 64 da cache for valido (valid bit = 1) e a sua chave igual a 000000(2). c) escrita em que há cache miss -> trazer bloco 64 da memória para bloco 64 da cache (como write-through o bloco que sai da cache já está actualizado na memória); actualiza chave com o valor 0 e bit validade a 1; escreve byte 8 e seguintes na cache assim como os equivalentes na memória. d) 0,95*4 + 0,05*20 = 4,8 ns 5- a) memória virtual -> 2^25 / 2^12 = 2^13 = 8192 paginas memória fisica instalada -> 2^23 / 2^12 = 2^11 = 2048 paginas b) endereços virtuais de 25 bits: 2^25 = 32 MBytes usando memória secundária (disco) como extensão da memória fisica instalada c) 4K -> 12 bits os 13 bits mais significativos = num pagina virtual os 12 bits menos significativos = deslocamento dentro da pagina d) -> procura (memória associativa) na TLB a página virtual do endereço se encontra: substitui pág. virtual no endereço pela pág. fisica indicada senão: consulta TP em memória na entrada dada pelo num. página virtual se válida (pag. em memória): substitui no endereço pela pág. indicada e acrescenta na TLB este par: (pág.virtual,pág.fisica), se necessário substituindo uma entrada (LRU por exemplo) ... senão: page fault 6- a) sendo o mesmo Instrution Set (executando as mesmas instruções) 1,4/1 = 1,4 b) Quando falha o pipelining, devido a dependencias nos dados, acessos à memória e principalmente devido aos saltos condicionais (branchs), o pipeline é atrasado ou mesmo despejado e recomeçado de novo. Um pipeline mais longo significa mais trabalho desperdiçado quando dessas falhas, podendo não tirar partido o suficiente do pipelining para conseguir a média de uma instrução por ciclo de relógio que se estava a assumir.