Você está na página 1de 43

Machine Translated by Google

ESTRUTURADA
ORGANIZAÇÃO DE COMPUTADORES

SEXTA EDIÇÃO

SOLUÇÕES DE PROBLEMAS

ANDREW S. TANENBAUM
Universidade Gratuita
Amsterdã, Holanda

SALÃO DO PRÍNCIPE

RIO SUPERIOR DA SELA, NJ 07458


Machine Translated by Google
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 1 3


SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 1

1. a. Um tradutor converte programas de um idioma para outro.


b. Um intérprete executa uma instrução de programa por instrução. c.
Uma máquina virtual é uma máquina conceitual, que não existe.

2. É possível, mas há problemas. Uma dificuldade é a grande quantidade de código produzido.


Como uma instrução ISA faz o trabalho de muitas microinstruções, o programa resultante
será muito maior. Outro problema é que o compilador terá que lidar com uma linguagem
de saída mais primitiva, portanto, ela própria se tornará mais complexa. Além disso, em
muitas máquinas, o microprograma está em ROM. Torná-lo alterável pelo usuário exigiria
colocá-lo na RAM, que é muito mais lento que o ROM. Do lado positivo, o programa
resultante pode ser muito mais rápido, pois a sobrecarga de um nível de interpretação
seria eliminada.

3. Durante o projeto detalhado de um novo computador, o dispositivo e os níveis lógicos


digitais da nova máquina podem ser simulados em uma máquina antiga, o que os coloca
em torno do nível 5 ou 6.

4. Cada nível de interpretação desacelera a máquina por um fator de n/ m. Desta forma,


os tempos de execução para os níveis 2, 3 e 4 são kn/m, kn2 / m2 , e kn3 / m3 , ré
respectivamente.

5. Cada nível adicional de interpretação custa algo com o tempo. Se não é


necessário, deve ser evitado.

6. Você perde um fator de n em cada nível, portanto, os tempos de execução das instruções nos níveis
3 e 4 são kn, kn2 , 2 e kn3 , respectivamente.

7. Hardware e software são funcionalmente equivalentes. Qualquer função feita por um pode,
em princípio, ser feita pelo outro. Eles não são equivalentes no sentido de que para fazer
a máquina realmente funcionar, o nível inferior deve ser hardware, não software. Eles
também diferem no desempenho.

8. De jeito nenhum. Se você quisesse mudar o programa que o mecanismo de diferença


rodava, você teria que jogar o computador inteiro fora e construir um novo. Um computador
moderno não precisa ser substituído porque você deseja alterar o programa. Ele pode ler
muitos programas de muitos CD-ROMs.

9. Um exemplo típico é um programa que calcula o produto interno de dois arrays, A e B. As


duas primeiras instruções podem buscar A[0] e B[0], respectivamente. No final da iteração,
essas instruções podem ser incrementadas para apontar para A[1] e B[1], respectivamente.
Antes que a indexação e o endereçamento indireto fossem inventados, isso era feito.
Machine Translated by Google

4 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 1

10. O tempo de ciclo bruto não é o único fator. O número de bytes buscados por ciclo
também é um fator importante, aumentando com os modelos maiores. Velocidade da memória
e os estados de espera desempenham um papel, assim como a presença de cache. Uma arquitetura de E/
S melhor faz com que menos ciclos sejam roubados e assim por diante.

11. O projeto da Fig. 1-5 faz E/S um caractere por vez por programa explícito
comando. O da Fig. 1-6 pode usar o DMA para que o controlador faça todas as
trabalho, aliviando a CPU da carga e, assim, tornando-a potencialmente melhor.

12. Cada pessoa consome 730 etiquetas por ano não bissexto. Multiplique por 300 milhões e
você recebe 219 bilhões de tags por ano. Com um centavo a etiqueta, eles custam US$ 2,19 bilhões
por ano. Com PIB superior a US$ 10 trilhões, as tags somam 0,02% do
PIB, não um grande obstáculo.

13. Os seguintes aparelhos são normalmente controlados hoje em dia por


sistemas: rádios despertadores, fornos de microondas, televisores, telefones sem fio, máquinas de
lavar roupa, máquinas de costura e alarmes contra roubo.

14. De acordo com a lei de Moore, no próximo ano o mesmo chip terá 1,6 vezes mais
muitos transistores. Isso significa que a área de cada transistor será 1/1,6 ou
0,625 vezes o tamanho dos transistores deste ano. Uma vez que a área vai como o
quadrado do diâmetro, o diâmetro dos transistores do próximo ano deve ser 0,079
mícrons.

15. Em três anos, a potência dobrou duas vezes, de modo que o tempo de execução caiu em um
fator de quatro. Assim, uma corrida de 4 horas levará 1 hora. Em 6 anos ganhamos um outro fator de
quatro na potência, então o tempo de execução diminui para 15 min. Se nós
inicie a simulação agora, ela será concluída em 5 anos, mas se iniciarmos a simulação em 3 anos ela
será executada quatro vezes mais rápido e, portanto, completará em 1,25 anos. Se
adicionamos o atraso de 3 anos no início mais o tempo de execução de 1,25 ano, o tempo de execução
terminará em 4,25 anos, o que é mais rápido do que começar a corrida agora, o que
levaria 5 anos a partir da data de início para ser concluído.

16. Os números atuais obviamente dependem de quando o cálculo está sendo feito,
mas, por exemplo, suponha que a taxa de execução de instruções seja de 1 bilhão de instruções/s, a
memória seja de 1 GB e o custo seja de US$ 500. O ganho de velocidade é de 2000.
O 7090 tinha 1.179.648 bits de memória, enquanto 1 GB é 8.589.934.592 bits
dando um ganho de memória de 7281. Assim, o produto de tamanho de velocidade é 14.562.000
vezes melhor. E com uma melhoria de preço de 6000, o ganho total é de 87.372
milhões de vezes melhor. Agora vamos dimensionar a aeronave usando os mesmos números. Se isso
pudesse voar 2.000 vezes mais rápido, iria a 1,18 milhão de km/h, o que significa que poderia circundar
a Terra em 2 min. Um ganho de 7281 em capacidade implica cerca de 1,3 milhões de
passageiros. E nosso avião custaria cerca de US$ 667.

17. Depois dos mainframes, tivemos computadores pessoais. Um desenvolvimento atual está migrando a
computação para a nuvem, que é basicamente computação centralizada em todo o mundo.
novamente.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 2 5

SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 2

1. O ciclo do caminho de dados é de 20 ns. O número máximo de ciclos de caminho de dados/s é,


portanto, 50 milhões. O melhor que a máquina poderia fazer é, portanto, 50 MIPS.

2. O contador de programa deve ser incrementado para apontar para a próxima instrução. Se esta
etapa fosse omitida, o computador executaria a instrução inicial para
possivelmente é.

3. Você não pode dizer nada com certeza. Se o computador 1 tiver um pipeline de cinco estágios, ele
poderá emitir até 500 milhões de instruções/segundo. Se o computador 2 não estiver em pipeline,
não poderá fazer nada melhor do que 200 milhões de instruções/s. Assim, sem mais informações,
você não pode dizer qual é mais rápido.

4. A memória no chip não afeta os três primeiros princípios. Não é mais necessário ter apenas LOADs
e STOREs na memória de toque. Não há nenhuma razão específica para não ter uma arquitetura
de memória para memória se as referências de memória forem tão rápidas quanto as referências
de registro. Da mesma forma, a necessidade de muitos registros torna-se menor neste ambiente.

5. O mosteiro se assemelha à Fig. 2-7, com um mestre e muitos escravos.

6. O tempo de acesso aos registradores é de alguns nanossegundos. Para disco óptico, são algumas
centenas de milissegundos. A proporção aqui é de cerca de 108.

7. Existem 64 números de 6 bits, portanto, são necessários 4 trits. Em geral, o número de trits, k,
necessários para manter n bits é o menor valor de k tal que 3k ÿ 2n 8. Um pixel requer 6 +. 6 + 6 =

18 bits, então um único quadro visual é 1,8 × 107 bits.


Com 10 quadros por segundo, a taxa bruta de dados é de 180 Mbps. Infelizmente, a taxa de
processamento do cérebro é muitas ordens de magnitude menor do que isso. Como experiência,
tente observar o ruído aleatório em uma televisão colorida por alguns minutos quando nenhuma
estação estiver transmitindo e veja se você consegue memorizar o padrão de bits de cor no ruído.

9. Com 44.000 amostras por segundo de 16 bits cada, temos uma taxa de dados de 704
kbps.

10. Existem 2 bits por nucleotídeo, então a capacidade de informação do genoma humano é de cerca de
6 gigabits. Dividindo este número por 30.000, obtemos cerca de 200.000 bits por gene. Basta
pensar em um gene como uma ROM de 25 KB. Esta estimativa é um limite superior, porque muitos
dos nucleotídeos são usados para outros propósitos que não codificam genes.
Machine Translated by Google

6 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 2

11. Para eficiência com computadores binários, é melhor que o número de células seja uma potência
de 2. Como 1.073.741.824 é 230, é razoável, enquanto 1.000.000.000 não é.

12. De 0 a 9 os códigos são: 0000000, 1101001, 0101010, 1000011, 1001100,


0100101, 1100110, 0001111, 1110000 e 0011001.

13. Basta adicionar um bit de paridade: 00000, 00011, 00101, 00110, 01001, 01010, 01100,
01111, 10001 e 10010.

14. Se o comprimento total for 2n ÿ 1 bits, existem n bits de verificação. Conseqüentemente, a


porcentagem de bits desperdiçados é n/(2n ÿ 1) × 100%. Numericamente para n de 3 a 10
temos: 42,9%, 26,7%, 16,1%, 9,5%, 5,5%, 3,1%, 1,8% e 1,0%.

15. Cada caractere de 8 bits é colocado em uma palavra de código de 12 bits onde as posições 1,
2, 4 e 8 são posições de verificação. Após calcular os dígitos de verificação e agrupar cada 4
bits consecutivos em um dígito hexadecimal, a string ASCII de 5 caracteres é codificada em
hexadecimal como: C85 DD1 DF2 5F4 4D8.

16. Cada caractere ASCII de 8 bits é codificado em três dígitos hexadecimais. O primeiro conjunto
de dígitos hexadecimais: 0D3, tem um erro no bit 12 (como indicado pelo fato de que o bit 4 e
o bit 8 têm a paridade errada). O próximo conjunto, DD3, tem o bit 11 errado; o conjunto 0F2
tem o bit 7 errado; o conjunto 5C1 tem o bit 9 errado; o conjunto 1C5 tem o bit 1 errado; o
último conjunto CE3 não contém erros. Depois que as posições dos bits são corrigidas e os
dados extraídos das palavras de código e consultados na tabela ASCII, os caracteres
codificados são: bebês.

17. Com 4.096 bits/setor e 1.024 setores/trilha, cada trilha contém 4.194.304 bits.
A 7200 RPM, cada rotação leva 1/120 seg. Em 1 segundo pode ler 120 trilhas para uma taxa
de 503.316.480 bits/s ou 62.914.560 bytes/s.

18. A 160 Mbytes/seg e 4 bytes/palavra, a taxa de transferência do disco é de 40 milhões de


palavras/seg. Dos 200 milhões de ciclos de barramento/s, o disco leva 1/5 deles. Assim, a CPU
será desacelerada em 20 por cento.

19. Logicamente não importa, mas o desempenho é melhor se você alocar de fora para dentro. Uma
rotação da trilha mais externa demora tanto quanto uma rotação da trilha mais interna (porque
os discos rígidos giram com velocidade angular constante), mas há mais setores na pista mais
externa, então a taxa de transferência é maior. É mais inteligente usar primeiro os setores de
alto desempenho. Talvez o disco nunca encha e você nunca terá que usar o de menor
desempenho
setores.

20. Um cilindro pode ser lido em quatro rotações. Durante a quinta rotação, uma busca é feita para
o próximo cilindro. Como o tempo de busca faixa a faixa é menor que o tempo de rotação, o
programa deve esperar até que o setor zero volte novamente.
Portanto, são necessárias cinco rotações completas para ler um cilindro e estar posicionado
para iniciar a leitura do próximo. Ler os primeiros 9.999 cilindros leva, portanto, 49.995
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 2 7

rotações. A leitura do último cilindro requer quatro rotações, pois não é necessária
nenhuma busca final. As 49.999 rotações a 10 ms/rotação levam 499,99 seg. Se os
setores estiverem distorcidos, no entanto, pode ser possível evitar a quinta rotação por
trilha.

21. O RAID nível 2 pode se recuperar não apenas de unidades com falha, mas também de
erros transitórios não detectados. Se uma unidade fornecer um único bit ruim, o RAID
nível 2 corrigirá isso, mas o RAID nível 3 não.

22. No modo 2, os dados fluem a 175.200 bytes/s. Em um intervalo de tempo de 80 minutos, o


número de segundos é 5.920, portanto, o tamanho de um CD-ROM modo 2 de 80 minutos
é de 840.960.000 bytes ou 802 MB. É claro que no modo 2 não há correção de erros, o
que é bom para música, mas não para dados. No modo 1, apenas 2048/2336 dos bits
estão disponíveis para dados, reduzindo a carga útil para 737.280.000 bytes ou 703 MB.

23. O modo não importa, já que o laser precisa pulsar para bits de preâmbulo, bits de dados,
bits ECC e também para todos os bits de overhead. A taxa de dados bruta em 1x é de
75 setores/s, cada setor consistindo em 98 × 588 = 57.624 bits. Assim, 4.321.800 bits/
seg voam pela cabeça em 1x. Em 10x, isso é 43.218.000 bits/s. Assim, cada pulso não
deve durar mais do que 23,14 ns (na verdade, um pouco menos, pois há um intervalo
em branco entre os pulsos).

24. Cada quadro contém 345.600 pixels ou 1.036.800 bytes de informação. A 30 fps, a taxa
por segundo é de 31.104.000 bytes/s. Em 133 minutos, isso equivale a 2,482 × 1011
bytes. A capacidade do disco é 3,5 × 230 , que é cerca de 3,758 × 109 bytes. Estamos
errados por um fator de 66, então a compressão tem que ser 66x.

25. O tempo de leitura é o tamanho dividido pela velocidade: 25 × 230/4. 5 × 106 ou cerca de
5965 seg. Isso é quase uma hora e 39 minutos.

26. A maneira usual de lidar com isso seria ter um banco de 256 registradores de mapeamento
de 24 bits no hardware. Sempre que um byte fosse obtido da RAM de vídeo, o número
de 8 bits seria usado como um índice nos registradores de mapeamento. O registrador
selecionado forneceria os 24 bits para acionar a tela (tipicamente 8 bits cada para os
canhões de elétrons vermelho, verde e azul). Assim, de fato, 224 cores estão disponíveis,
mas a qualquer momento, apenas 256 estão disponíveis. Mudar as cores significa
recarregar os registros de mapeamento.

27. Para 32 intensidades, precisamos de 5 bits (já que 25 = 32). Para cada pixel precisamos
de 5 × 5 = 25 bits. Isso dá 25 × 108 bits/quadro. Uma resolução temporal de 10 ms
significa 100 quadros/s, então a taxa de bits é de 2500 × 108 bps. Isso é o mesmo que
312. 5 × 108 bytes/s. Usando 1 GB = 109 bytes, isso é 312,5 GB/s.
Machine Translated by Google

8 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 2

28. A tela deve pintar 1920 × 1080 × 75 pixels/seg. Este é um total de 155,52
megapixels. Assim, o tempo de pixel é de 6,43 ns.

29. Uma página tem 4.000 caracteres. Cada caractere usa 25% de 4 mm2 , ou 1 mm2 .
Assim, uma página tem 4000 mm2 de toner. Com uma espessura de 25 mícrons (0,025 mm),
o volume de toner em uma página é de 100 mm3 . A capacidade
cm3do
oucartucho
400.000de toner
mm3 Umé cartucho
de 400
é bom para 4.000 páginas. .

30. Cada intervalo pode transmitir 6 bits, então a taxa de dados é de 6n bps.

31. Um cabo de 12 MHz com QAM-64 tem uma taxa de dados de 72 Mbps. Com computadores nf
compartilhando a largura de banda, cada usuário obtém 72/nf Mbps. Assim, o usuário de cabo
obtém um serviço melhor se 72/nf > 2. Uma maneira alternativa de escrever isso é nf < 36. Em
outras palavras, se a largura de banda de 72 Mbps está sendo compartilhada por 36 usuários
ativos, é o mesmo que 2- Mbps ADSL; com menos usuários, o cabo ganha; com mais usuários,
o ADSL ganha.

32. Cada arquivo de imagem não compactado tem 18 milhões de bytes. Após a compactação 5x, são 3,6
milhões de bytes. Para gravar isso em 2 segundos, é necessária uma taxa de dados de 1,8 MB/s.

33. A imagem não compactada tem 144 milhões de bytes. A imagem compactada é de 28,8 milhões
de bytes. O número de imagens armazenadas é, portanto, 8 × 230/28. 8 milhões ou 298
imagens.

34. Um livro didático típico de ciência da computação tem cerca de um milhão de caracteres, então
precisa de cerca de 1 MB. Dez mil livros requerem 1010 bytes. Um CD-ROM tem 700 MB,
então você precisa de 15 CD-ROMs. Um DVD de camada dupla e face única comporta 4,7 GB,
portanto, toda a biblioteca cabe em três DVDs.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3 9


SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 3

1. Até certo ponto, os circuitos digitais são imunes a ruídos. Se um valor digital for
representado por, digamos, +5 volts para 1 e 0 volts para 0, então um pico de ruído de 1 volt
não tem efeito. Mas um pico de ruído de 3 volts pode transformar um 0 em 1.

2. A ordem é

hambúrguer ou cachorro-quente e batatas fritas


que pode ser analisado como
hambúrguer ou (cachorro quente e batata frita)
ou como

(hambúrguer ou cachorro-quente) e batata frita

A primeira análise leva às alternativas a e d. A segunda análise leva às alternativas e e d. Assim, a,


d e e são todos possíveis. A opção h é descartada por motivos educacionais: o cozinheiro é estúpido
demais para entender a piada.

3. Ele deve apontar para uma das estradas e perguntar: "Se eu perguntasse à outra quadrilha se
este é o caminho para a Disneylândia, o que eles diriam?" Se a resposta for não, ele
deve pegar a estrada; se a resposta for sim, ele não deve tomá-lo. A validade de
esta solução pode ser facilmente vista tentando todas as quatro combinações de certo/errado
estrada e mentirosos/verdadeiros.

4. A tabela verdade exigida é a seguinte:

PQP E QP E NÃO Q (P E Q) OU (P E NÃO Q)


00 0 0 0
01 0 0 0
10 0 1 1
11 1 0 1

5. Com três variáveis, a tabela verdade tem oito linhas, de modo que uma função pode ser descrita por
um número de 8 bits. Assim, existem 256 funções. Com n variáveis, o
tabela verdade tem k = 2n linhas e existem 2k funções.

6. Com três variáveis, a tabela verdade tem oito linhas, de modo que uma função pode ser descrita por
um número de 8 bits. Assim, existem 256 funções. Com quatro variáveis o
tabela tem 16 linhas, então uma função pode ser descrita por um número de 16 bits. Desta forma
Existem 65.536 funções.

7. Chame as duas variáveis A e B. Conecte as entradas da primeira porta NAND a A


e B. Pegue a saída e alimente-a em ambas as entradas da segunda porta NAND
e pronto, E.
Machine Translated by Google

10 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3

8. As entradas D1, D2, D4 e D7 estão todas conectadas ao terra As outras quatro entradas
estão ligados a Vcc.

9. A linha de entrada D0 fornece a saída para as linhas 0000 e 0001 da tabela verdade. A linha de entrada D1
fornece a saída para as linhas 0010 e 0011 da tabela verdade, e assim por diante. Para cada caso, os valores
da função para as duas linhas podem ser 00, 01, 10 e 11. Se forem 00, basta conectar a entrada ao terra; se
forem 11, basta conectá-lo ao Vcc. Se eles forem 01, observe que eles são exatamente iguais à quarta
variável de entrada, D, então conecte-os a D. Se eles forem 10, conecte-os a D. Os valores da tabela-verdade
para o exemplo, de 0000 a 1111, são 0111001110100001, então o circuito é o seguinte.

Vcc

D0

D1

D D2

D3
P
D4

D5

D6

D7

abc

10. O codificador se parece com isso. Observe que a linha 0 não é usada.

Entrada

01

Bit de baixa ordem

2
3
Bit de alta ordem
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3 11

11. O demultiplexador tem esta aparência.

Selecionado por

UMA B

AB

Entrada
AB

AB

UMA B

12. É um meio somador com C como a soma e D como o transporte.

13. O chip precisa de quatro pinos para o primeiro operando, quatro pinos para o segundo oper e quatro pinos
para o resultado, um pino para carry in e um pino para realizar (para
torná-lo em cascata), mais alimentação e terra, para um total de 16 pinos.

14. O transporte para o estágio i pode ser escrito como Ci = Pi ÿ 1 + Si ÿ 1Ci ÿ 1, onde Pi ÿ 1 é
o termo do produto Ai ÿ 1Bi ÿ 1 e Si ÿ 1 é o termo soma Ai ÿ 1 + Bi ÿ 1. Este resultado

segue diretamente do fato de que um carry é gerado a partir de um estágio se ambos os operandos forem
1, ou se um operando e o carry in forem ambos 1. Por exemplo,

C0 = 0

C1 = P0 + S0C0 = P0

C2 = P1 + S1C1 = P1 + P0S1

C3 = P2 + S2C2 = P2 + P1S2 + P0S1S2

C4 = P3 + S3C3 = P3 + P2S3 + P1S2S3 + P0S1S2S3

Assim que as entradas A e B estiverem disponíveis, todos os termos P e S podem ser gerados
simultaneamente em um tempo de atraso de porta. Então os vários termos AND
como P0S1S2 pode ser gerado em um segundo atraso de porta. Finalmente, todos os carregadores
pode ser produzido em um atraso de terceira porta. Assim, todos os carrys estão disponíveis após
três atrasos de porta, não importa quantos estágios o somador tenha. O preço pago por
essa aceleração é um número considerável de portas adicionais, é claro.

15. O tempo do circuito pode ser encontrado escrevendo um 0 em cada uma das linhas de entrada
e, em seguida, rastreando-os pelo circuito, adicionando 2 em cada porta. A entrada A
leva 4 ns para ficar disponível, então a saída da unidade lógica leva 8 ns
e a saída final de uma operação booleana leva 10 ns. As linhas de decodificação
que acionam a unidade lógica têm dois atrasos de porta, de modo que as linhas de habilitação são definidas
Machine Translated by Google

12 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3

Em muito tempo. O somador também leva 6 ns para produzir sua contribuição para a porta
de saída depois de ter A. O pior caso em todo o circuito é de 12 ns.

16. A ULA já é capaz de subtração. Note que em complemento de 2, B ÿ A = B + (ÿA). Para obter
ÿA, podemos usar A + 1. Assim, para subtrair A de B precisamos adicionar B, A e depois
incrementar a soma. O circuito já pode fazer isso afirmando INVA e INC e depois adicionando
as duas entradas.

17. Um ciclo básico é de 11 ns, incluindo propagação. Dezesseis ciclos levam 176 ns.
No entanto, a última propagação não é necessária, portanto, a resposta está disponível 175
ns após o início.

18. Uma maneira é negar ENB, forçando B a 0, então escolhendo o código de função 01 para
selecionar B como a função ALU. O complemento de 1 de 0 é -1 no complemento de 2 (todos
os bits 1). Enquanto INC for negado, as linhas de controle para A não importam. Uma
segunda maneira é negar e inverter A, colocando todos os 1s na entrada A.
Então negue ENB para forçar B a 0. Com A igual a -1 e B igual a 0, podemos somar ou OU-
los juntos.

19. A trava NAND é conectada da mesma forma que a trava NOR . Normalmente, ambas as
entradas devem ser 1 para obter consistência entre entrada e saída.

20. Use o mesmo circuito, mas substitua a porta AND no gerador de pulsos por uma porta NOR .
A única vez que ambas as entradas estarão baixas é logo após a borda descendente.

21. O projeto usa duas portas AND para a lógica de habilitação do chip mais duas portas AND por
linha de seleção de palavra mais uma porta AND por bit de dados. Para uma memória 256 ×
8, isso resulta em 2 + 512 + 2048 = 2562 portas AND . O circuito também usa uma porta OR
para cada bit da palavra; portanto, oito deles seriam necessários.

22. Não voará. Cada um dos quatro flip-flops precisa de três pinos, para D, Q e Q. Além disso, o
chip precisa de clock, energia e terra. A menos que você planeje lançar o primeiro chip de 15
pinos do mundo, você terá que usar um pacote de 16 pinos, desperdiçando assim um pino.
Assim, o design não é muito eficiente. Como um pino extra está disponível, você também
pode fazer algo com ele para tornar o chip mais flexível. Por exemplo, você pode usar o
décimo sexto pino para redefinir todos os FFs.

23. Os pinos podem ser multiplexados no tempo. Por exemplo, com n/2 pinos, metade dos bits
são apresentados em um ciclo e a outra metade em um ciclo seguinte. Muitas RAMs
dinâmicas funcionam dessa maneira. Ainda mais extremo é alimentar o endereço serialmente
no chip, um pouco de cada vez, usando um único pino.

24. Um barramento de dados de 32 bits significa que 32 chips devem ser usados em paralelo,
cada chip fornecendo 1 bit. Assim, a menor memória é composta por 32 chips, que são 32
megabits ou 4 Mbytes.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3 13

25. Com um período de clock de 20 ns, MREQ pode ser afirmado até 13 ns em T1.
Os dados são necessários 2 ns antes da transição de alto para baixo em T3, que ocorre 10 ns após o
início do ciclo. Do ponto médio de T1 ao ponto médio de T3 são 40 ns. Como a memória não pode iniciar
até 3 ns após a transição no primeiro ciclo e deve ser feita 2 ns antes da transição no terceiro ciclo, na pior
das hipóteses a memória tem apenas 35 ns para responder.

26. A memória agora teria 20 ÿ 3 ÿ 4 = 13 nsec para responder depois que MREQ e RD forem afirmados. Não
há muita margem, mas se todos os chips de memória sempre puderem responder em 10 ns, o sistema
ainda funcionará.

27. Em princípio pode ser negativo, mas deve ser afirmado depois que o endereço estiver estável, pois em uma
escrita, a memória não deve começar a mudar os bytes endereçados até que o endereço seja válido. Em
leituras, não importa.

28. No modo regular, são necessários três ciclos por transferência. No modo de bloco, leva um ciclo por
transferência, uma vez que a transferência foi iniciada. Portanto, as transferências em bloco têm quase
três vezes mais largura de banda. A largura do barramento não importa, então ainda é três vezes maior,
mesmo para transferências de 32 bits.

29. A CPU não pode confirmar MSYN até que tenha fornecido um endereço < TMSYN1,
T
A1 TMREQ1 < TMSYN1 e TRD1 < TMSYN1.

Os dados não podem ser declarados antes do MSYN, então

TMSYN1 < TD1 e TD1


< TSSYN1.

Uma vez que SSYN foi afirmado, o mestre pode limpar, então

TSSYN1 < TMSYN2,


TSSYN1 < TRD2,
TSSYN1 < TMREQ2, e
TSYN1 < T A2.

Finalmente,

TMSYN2 < TD2 e


TMSYN2 < TSSYN2.

30. Em um sistema multicore, os núcleos podem compartilhar caches e memória primária facilmente.
Ter um multiprocessador de memória compartilhada facilita a programação de muitos aplicativos. Muitas
vezes há também uma interconexão de alta largura de banda entre os núcleos para sinalização, etc.
Machine Translated by Google

14 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3

31. A lei de Moore diz que o número de transistores em um chip continua dobrando a cada 18
meses. Isso significa que os transistores estão ficando menores. No passado, os projetistas
usavam esse tamanho cada vez menor e distância entre os transistores menor para acelerar
o relógio. Mas agora a quantidade de calor que está sendo gerada torna inviáveis velocidades
de clock mais altas. Assim, os designers agora estão usando o aumento da contagem de
transistores para aumentar os caches e colocar mais CPUs em cada matriz.

32. O barramento de memória conecta a CPU à memória. É interno ao sistema e o ônibus mais
rápido do mercado. O barramento PCI serve para conectar dispositivos de E/S ao sistema,
não à memória.

33. Sim, existe. Ao ler a metade inferior de uma palavra, a metade inferior das 32 linhas de dados é
usada. No entanto, ao ler a metade superior, os projetistas de ônibus têm a opção de usar a
metade superior das linhas ou deslocar tudo para a metade inferior. O primeiro é um ônibus
injustificado; o último é um ônibus justificado. Ambos os tipos estão em uso.

34. O ciclo de reconhecimento de interrupção é necessário para que o dispositivo de interrupção


(ou o controlador de interrupção) possa ver que a interrupção foi aceita e a CPU deseja o
número do vetor de interrupção. Como a CPU pode desabilitar interrupções por um tempo
arbitrariamente longo, após declarar uma interrupção, um dispositivo pode ter que esperar um
longo tempo antes que a interrupção seja aceita, então ele precisa de alguma forma para ver
em qual ciclo ele deve emitir o número do vetor de interrupção .

35. A 400 MHz, um ciclo é de 2,5 ns. Quatro ciclos levam 10 ns. Uma palavra tem 4 bytes, então a
máquina precisa de 4 bytes a cada 10 ns, para uma taxa de dados de 400 Mbytes/s.

36. A 400 MHz, um ciclo é de 2,5 ns. Quatro ciclos levam 10 ns. Uma palavra tem 8 bytes, então a
máquina precisa de 8 bytes a cada 10 ns, para uma taxa de dados de 800 Mbytes/s.

37. Existem sete combinações: uma para palavras, duas para meias palavras (superior e inferior) e
quatro para bytes. Três pinos são suficientes para sete combinações se a codificação completa
for usada. Isso minimiza os pinos. Por outro lado, requer um decodificador externo, então há
algo a ser dito por ter quatro linhas, uma por byte, dizendo se aquele byte é necessário ou não.

38. O cache L1 é menor e mais rápido que o cache L2, que, por sua vez, é menor e mais rápido
que o cache L3. Não é economicamente viável construir um cache L1 com o tamanho e a
velocidade de um cache L3. Portanto, cada chip tem um cache L1 muito pequeno e muito
rápido, um cache L3 maior e mais lento e, às vezes, um cache L3 ainda maior e ainda mais
lento.

39. O tempo médio de acesso é 0, 20 × 1 + 0, 60 × 2 + 0, 20 × 10 = 3,4 ns.


Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 3 15

40. Cada quadro contém 921.600 bytes. Em um segundo, 30 desses quadros são necessários, ou 27.648.000
bytes. Se os dados trafegarem pelo barramento duas vezes, a largura de banda necessária será de
55.296.000 bytes/s ou 52,734 MB/s (1 MB é 220 bytes).

41. O sinal DEVSEL# não é realmente essencial. É bom saber que alguém
lá fora quer você, mas a informação real é transmitida por TRDY#.
42. Para operação 16x, são necessárias 16 pistas em cada sentido para uma capacidade bruta de 80
Gbps. A capacidade líquida é então de 64 Gbps.

43. Com um barramento de 32 bits, o disco deve fazer 262.144 transferências em 5 ms (uma rotação) ou cerca
de 52.429 transferências/ms. Neste tempo, ele usa até 52.429 do
100.000 ciclos de ônibus disponíveis por milissegundo, deixando apenas 47.571 para o
CPU. A CPU é, portanto, desacelerada para 47,571 por cento de sua velocidade máxima.

44. A taxa de quadros é de 1.000 quadros/s. A 64 bytes/frame, a taxa máxima de dados


para um dispositivo é 1.023.000 bytes/s ou 999,023 MB/s.

45. Como o circuito está agora, o PIO é selecionado por todos os endereços começando com
11, ou seja, qualquer endereço acima de 48K. Adicionar uma terceira linha faz com que ela seja selecionada
somente por endereços acima de 56K.
Machine Translated by Google

16 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 4

SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 4

1. Aqui estão os quatro passos:


(1) Ler uma instrução e decodificá-la.
(2) Encontre quaisquer dados associados necessários para processar a instrução.
(3) Processe a instrução.
(4) Escreva os resultados.

2. Apenas um registrador pode ser colocado no barramento B, então um único campo de 4 bits é suficiente
para especificar qual deles. O barramento C pode ter muitos registros selecionados para serem
carregados, portanto, é necessário um mapa de bits completo.

3. A função booleana necessária é

F = (JAMZ AND Z) OU (JAMN AND N) OU HIBIT


onde HIBIT é o bit de ordem superior do campo NEXT ADDRESS . Isso pode ser implementado com
duas portas AND que alimentam uma porta OR de 3 entradas.

4. Não. Não importa o que está no MBR, a próxima microinstrução virá de 0x1FF. O conteúdo do MBR é
completamente irrelevante. Não faz sentido fazer OR com MBR com 0x1FF, pois o resultado sempre
será 0x1FF, não importa o que esteja em MBR. O OR não faz nada.

5. Todos os compiladores adicionarão

BIPUSH 5
ISTOREk

no rótulo L2. No entanto, um compilador otimizado notará que i nunca é usado após a instrução if .
Portanto, a quarta e quinta instruções (ISTORE e ILOAD ) não são necessárias. O código torna-se

ILOAD j
ILOAD k
EU ADICIONO

BIPUSH 3
CMPEQ L1
ILOAD j
BIPUSH 1
SUB
ISTORE j
GOTO L2
L1: BIPUSH 0
ISTOREk
L2: BIPUSH 0
ISTOR i
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 4 17

6. Aqui estão duas maneiras de fazer isso:

ILOAD k ILOAD k
ILOAD n ILOAD n
EU ADICIONO BIPUSH 5
BIPUSH 5 EU ADICIONO

EU ADICIONO EU ADICIONO

ISTOR i ISTOR i

Aqui usamos a lei associativa, ou seja, o fato de ( j + k) + 4 ser o


igual a j + (k + 4), pelo menos se a possibilidade de overflow for ignorada.

7. A declaração pode ser algo como i = (j ÿ n ÿ 7) + (j ÿ n ÿ 7).

8. Não, o texto está correto. Se a condição for verdadeira, o bit Z é 1 e o controle passa
para L1. O endereço de L1 é calculado por OR do bit Z (que é um 1) em
MPC. Isso significa que L1 está na metade superior do armazenamento de controle.
Conseqüentemente, L2 deve estar na metade inferior.

9. Não é possível subtrair TOS do MDR, pois um dos operandos deve ser H
ou uma pequena constante. A única maneira de calcular MDR ÿ TOS é primeiro copiar MDR
para H.

10. O código e o número de microinstruções para cada um são ILOAD (6),


ILOAD (6), IADD (4), ISTORE (7). Isso adiciona até 23 microinstruções. Em 2,5
GHz, cada microinstrução leva 0,4 ns, então 23 delas levam 9,2 ns.

11. O código e o número de microinstruções para cada um são ILOAD (3),


ILOAD (3), IADD (3), ISTORE (5). Isso adiciona até 14 microinstruções. Em 2,5
GHz, cada microinstrução leva 0,4 ns, então 14 delas levam 5,6 ns. Sediada
neste resultado e no do problema anterior, verifica-se que os tempos de execução do Mic-2 são
5,6/9,2 dos tempos de execução do Mic-1. Portanto, um Mic-1 de 100 segundos
programa deve demorar 60,87 seg.

12. Algo assim faria o trabalho:

pop2a SP = SP ÿ 1
pop2b MAR = SP = SP ÿ 1; rd
pop2c
pop2d TOS = MDR; vá para Main1
Machine Translated by Google

18 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 4

13. Atualmente, o local 0 é o ponteiro de link, que raramente é usado. Assim, ter acesso barato
a ele não é especialmente útil. Para a máquina JVM completa, seria melhor ter LV apontando
para a primeira variável local (o primeiro parâmetro), com o ponteiro de link no deslocamento
-1 dele.

14. a. O resultado aritmético é floor(value)/ 2s , onde s é o inteiro sem sinal de 5 bits no topo da
pilha e value é a segunda palavra na pilha, interpretada como um inteiro com sinal de 32
bits. Observe que para inteiros negativos isso não é divisão truncada por uma potência de
2. É mais complicado do que outras instruções porque deve incluir um loop do para uma
contagem de deslocamento variável.

b. Esta sequência usa o sinal de controle de mudança SRA1, não usado de outra forma no
Mic-1.

15. a. O resultado aritmético é valor × 2s , onde s é o inteiro sem sinal de 5 bits no topo
da pilha e valor é a segunda palavra na pilha, interpretada como um inteiro com sinal de 32
bits. No entanto, o resultado pode não ser representável em 32 bits.

b. A sequência de microcódigo deve usar adição repetitiva para alcançar a operação de


deslocamento aritmético à esquerda. É mais complicado do que outras instruções porque
deve incluir um loop do para uma contagem de deslocamento variável.

16. Ele precisa encontrar a palavra OBJREF , então ele precisa saber quantos parâmetros pular
para localizá-lo na pilha.

17. Uma implementação possível é

dload1 MAR = LV + MBR1U; rd


dload2 H = MAR + 1
dload3 MAR = SP = SP + 1; wr
dload4 MAR = H; rd dload5 MAR
= SP = SP + 1; wr dload6 TOS =
MDR; goto (MBR)
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 4 19

18. A máquina de estado finito para o tênis se parece com isso.

Uma vitória
UMA

UMA

UMA
UMA
3,0 B
UMA

anúncio
3,1 B
de A
2,0 B
UMA UMA

3,2 B
UMA
B UMA

1,0 2,1 B
UMA B UMA
2,2 Deuce

1,1 UMA B
0,0 B UMA
B
UMA
UMA

B 1,2
0,1 B 2,3 anúncio
UMA UMA

de B
B 1,3
0,2
UMA

B B B
0,3 B

B B
vence

Deuce significa que o placar está empatado e que, se um dos jogadores marcar dois pontos
consecutivos, ele vence. A vantagem de X significa que X precisa de um ponto para ganhar.

19. Os estados (2, 2) e Deuce são equivalentes e podem ser fundidos. Remova (2, 2) e faça com que
os arcos que levam a ele vão para Deuce. Da mesma forma, (3, 2) é realmente o anúncio de A
e (2, 3) é realmente o anúncio de B.

20. O FSM se parece com isso. Os rótulos de estado não são exclusivos.
Sem filial
Sem filial Ramo
Ramo

000 Ramo 001 011 100 110 Sem filial 111


Não prever Não prever
Ramo Não prever Prever
Sem filial Prever Prever
nenhuma ramificação nenhuma ramificação nenhuma ramificação ramificação ramificação ramificação

Sem filial Ramo

Sem filial
Ramo

21. Uma versão de 5 bytes funcionaria bem. Uma versão de 4 bytes não funcionaria porque se
houvesse apenas 1 byte na fila e o MBR2 fosse referenciado, a referência não poderia ser
satisfeita, mas não haveria espaço para buscar outra palavra.

22. Definitivamente. Temos assumido uma taxa de acerto de cache de 100% até agora. Isso é irreal.
Às vezes, uma busca de memória será uma falha de cache e levará muito tempo.
Ter uma grande fila de bytes buscados anteriormente permitirá que a máquina continue a
funcionar mesmo quando uma referência de memória demorar muito. Assim durante
Machine Translated by Google

20 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 4

grande parte do longo tempo de busca de memória que a CPU ainda pode estar em execução. Com um
pequeno registrador de deslocamento no IFU, pode ser necessário parar muito mais cedo.

23. Lembre-se que devido à forma como a ramificação funciona, os endereços verdadeiros devem
ser exatamente 0x100 a mais que o endereço falso. Sempre emparelhando T e F, é fácil
garantir que eles estejam a uma distância de 0x100. Por outro lado, todas as ramificações
condicionais terminam em T se tomadas e depois vão para GOTO1, então se GOTO1
estivesse posicionado exatamente 0x100 acima de F, teria funcionado. Fazer isso economizaria
1 palavra de armazenamento de controle, mas não tornaria a máquina mais rápida.

24. O principal problema é que as micro-operações precisam estar em sequência para que possam
ser lidas com eficiência. O opcode IJVM para POP é 0x57, então sua sequência teria que
começar aí. O problema é que essa sequência tem três micro-operações, então elas iriam
nos slots 0x57, 0x58 e 0x59. No entanto, o DUP deve começar em 0x59, então há um conflito.
Além disso, o esquema usado no Mic-4 permite que as micro-operações sejam compactadas.
Se houver k micro-operações ao todo, apenas k entradas de tabela serão necessárias. Em
um esquema como o do Mic-1, são necessárias pelo menos 256 entradas.

25. Não, não seria. O cache L1 é pequeno, mas muito rápido. O cache L2 é maior, mas mais lento.
Fazer um cache do tamanho do cache L2, mas a velocidade do cache L1 seria proibitivamente
caro.

26. O tempo médio de acesso é 0,6 × 5 + 0,35 × 20 + 0,05 × 80. Isso dá 14 ns.

27. Na verdade não. Se o cache for alocado para gravação, a linha será trazida no momento da
gravação, para que as leituras subsequentes sejam gratuitas. Se o cache não for write allo
cate, a escrita passará para a memória, mas a primeira leitura trará a linha e as demais
leituras estarão livres. O único ganho aqui é salvar uma gravação na memória. A desvantagem
da alocação de gravação é que, se não houver leituras subsequentes, a linha será trazida
para nada. Assim, escrever alocar é uma aposta de que a linha será escrita novamente em
breve.

28. O revisor estava errado. Em um cache associativo de n vias, há um hardware para comparar
todas as tags em paralelo com a parte da tag do endereço que está sendo pesquisado. Não
importa se há três, quatro ou 19 comparações sendo feitas em paralelo. Muitas máquinas
comerciais têm caches associativos de 3 vias.

29. Muitos estágios em um pipeline significam menos processamento por estágio. Isso significa
que cada estágio é mais rápido. Ter um tempo curto por estágio é crítico, pois após cada
tempo de estágio, uma instrução é concluída. Assim, um tempo menor por estágio significa
mais instruções concluídas por segundo, portanto, uma máquina mais rápida.

30. Uma ramificação condicional amarra a unidade de busca por 4 ciclos – uma busca e três ciclos
mortos depois dela. O número médio de ciclos gastos usando a unidade de busca é 0. 8 × 1
+ 0. 2 × 4 = 1,6 ciclos de busca/instrução. Sem esse problema
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 4 21

teria sido 1,0 ciclos de busca por instrução. Assim, a instrução média leva 60% mais tempo e a
máquina funciona a 1/1,6 ou 5/8 da velocidade máxima.

31. A pré-busca estará no caminho certo somente se todas as quatro ramificações estiverem corretas,
previsto. A chance de que isso aconteça é 0,94 , o que é cerca de 0,66.

32. Aqui está o que acontece:


Ciclo 6: I6 e I7 são emitidos
Ciclo 7: I4 é aposentado
Ciclo 8: I5, I6 e I7 são retirados
Ciclo 9: I8 é emitido
Ciclo 11: I8 é aposentado

33. Uma dependência WAW ocorre quando um registrador que está sendo escrito é sobrescrito
antes que a primeira operação termine. Se não houver leituras intermediárias do registrador e
nenhum efeito colateral, a primeira operação é desperdiçada, podendo ser removida, abortada
antecipadamente ou ter seu resultado sobrescrito.
Machine Translated by Google

22 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 5

SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 5

1. O valor é 3 × 224 ou 50331648.

2. O sistema operacional teve seu programa mapeado no espaço de instrução, mas todos
o restante da memória mapeado em seu espaço de dados. Então, o que era "programa" para
programas de usuário, era apenas mais dados para o sistema operacional.

3. Isso pode ser feito alocando os 4 bits de ordem superior como o opcode principal. 15 instruções usam
0000 a 1110 nesses bits, deixando 28 bits para os dois endereços
e o registro. Opcode 1111 usa o primeiro campo de endereço de 12 bits para distinguir
as 650 instruções Com 4096 slots de opcode disponíveis, há muito espaço.
As instruções de endereço zero são codificadas com 1111 no opcode principal e
um dos 4096 - 650 = 3446 números não utilizados no primeiro campo de endereço.

4. Cada instrução de dois endereços usa combinações de 4096 bits. Com n deles,
opcodes 4096n são necessários. O número de opcodes restantes para as instruções de um anúncio é
então 65536 ÿ 4096n. Cada instrução de um endereço usa
64 slots, portanto, no máximo (65536 ÿ 4096n)/ 64 = 1024 ÿ 64n estão disponíveis.

5. Não. Os três requisitos levam 4 × 8 × 8 × 8 = 2048 opcodes, 255 × 8 =


2040 opcodes e 16 opcodes, respectivamente, para um total de 4104 opcodes. UMA
A palavra de 12 bits tem espaço para apenas 4096, então não há como fazer isso.

6. As instruções carregam 20, 40, 60, 30, 50 e 70, respectivamente.

7. O código ideal para as três máquinas é o seguinte:

PRESSIONE A CARGA E MOV R0,E MUL R0,E,F


EMPURRAR B MUL F MUL R0,F SUBR0,D,R0
PRESSIONE C LOJA T MOV R1,D MUL R1,B,C
EU TENHO CARGA D SUB R1,R0 ADICIONE R1,A,R1
ADICIONAR SUBT MOV R0,B DIV X,R0,R1
PRESSIONE D LOJA T MUL R0,C
PRESSIONE E CARGA B ADICIONAR R0,A
PRESSIONE F MUL C DIV R0,R1
EU TENHO ADICIONAR UM MOV X,R0
SUB DIV T
DIV LOJA X
POP X

A máquina de endereço 0 possui 12 opcodes e 7 endereços, totalizando 208 bits.


A máquina de 1 endereço tem 11 opcodes e 11 endereços, para um total de 264
bits. A máquina de 2 endereços tem 9 opcodes, 7 endereços e 11 registradores para um
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 5 23

total de 228 bits. A máquina de 3 endereços possui 5 opcodes, 7 endereços e 8 registradores,


totalizando 184 bits.

8. A máquina precisa de 64 registradores base, cada um com largura suficiente para referenciar
toda a memória. Um número de 6 bits seleciona um registrador base. Ao carregar os
registradores adequadamente, uma coleção arbitrária de 64 endereços pode ser acessada.

9. Se a instrução modificada estiver em um procedimento que é chamado uma segunda vez, ela
estará errada na entrada pela segunda vez. Assim, um mecanismo de inicialização é necessário
para cada chamada.

10. As fórmulas de notação polonesa reversa são:

uma. AB + C + D + E ÿ
b. AB ÿ CD + × E + c.
AB × CD × + E + d. AB
ÿ CDE × ÿ F/G/ × H ×

11. Convertendo para infixo, vemos:

uma. (A + B ) + C = A + (B + C )
b. (A ÿ B ) ÿ C ÿ A ÿ (B ÿ C ) c. (A
× B ) + C ÿ A × (B + C )

12. As fórmulas infixas correspondentes são:

uma. (A ÿ B + C ) × D
b. (A/B) + (C/D) c. A/
(B × C × (D + E)) d. A + (B
× ((C + (D × E)/F) ÿ G)/H)

13. Obviamente, há muitas respostas para essa pergunta. Três exemplos são A + + BC e ABCD +
AB + + , .

14. As fórmulas de notação polonesa reversa são as seguintes:

uma. AB E C OU b. AB
OU AC OU E c. AB E CD E OU

15. A fórmula de notação polonesa reversa é 52 × 7 + 42/1 + ÿ . O código gerado


é:

BIPUSH 5
BIPUSH 2
IMUL
BIPUSH 7
EU ADICIONO

BIPUSH 4
BIPUSH 2
Machine Translated by Google

24 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 5

IDIV
BIPUSH 1
EU ADICIONO

SUB

16. São 5 bits por registrador, podendo haver até 32 registradores. Teoricamente, uma escolha para
menos de 32 é possível, mas seria uma escolha muito peculiar.

17. O uso do formato 3 é inerente ao opcode. Uma instrução como ADD usa o formato 1 ou o
formato 2, dependendo do bit 23, mas uma instrução como BEQ sempre usa o formato 3. Não
precisa ser instruído a fazê-lo.

18. Existem cinco resultados possíveis: X < A, X = A, A < X < B, X = B e X > B.


Para gravar todas as possibilidades, são necessários 3 bits. Das oito combinações, apenas
cinco seriam utilizadas.

19. A vantagem do endereçamento relativo ao PC é que o código é independente da posição.


Uma ramificação relativa ao PC funcionará corretamente mesmo quando o código for realocado.
A desvantagem é que, como o deslocamento é um valor com sinal, alguns endereços de destino
não podem ser alcançados usando o deslocamento.

20. É necessário ao adicionar números decimais (BCD). Se adicionarmos o inteiro hexadecimal de 16


bits 0008H a 0008H usando a adição binária, obteremos 0010H. Este resultado é incorreto para
números decimais, pois 8 mais 8 é 16, e 16 é representado em BCD como 0016H. O carry out
do bit 3 permite que a instrução AAA descubra o que aconteceu e corrija o resultado.

21. A ideia é inútil, pois tudo o que importa é o número de bits. Não faz diferença como eles estão
posicionados na palavra ou se escolhemos considerá-los como um, dois ou mais campos. Diga
ao seu amigo para ter uma boa noite de sono e começar tudo de novo no dia seguinte.

22. São necessários quatro campos: dois operandos, uma condição e um endereço de ramificação.
Com este quadro geral, há muitas soluções possíveis. Um número de 3 bits é suficiente para a
condição. O campo de ramificação pode ser absoluto (um endereço de máquina), relativo (um
deslocamento) ou um operando geral com modo e registrador.

23. Os cinco números são os seguintes:

uma. 0000 1001 0101 1100


b. 1111 1001 0101 1100 c.
0101 1100 0011 0000 d.
0101 1100 0011 1001 e.
0011 1001 0101 1100
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 5 25

24. Obviamente depende da máquina, mas normalmente você geraria um zero em um


registrador e então o armazenaria na memória. Você pode gerar um zero em um
registrador carregando-o da memória, subtraindo um número dele mesmo ou fazendo OR
EXCLUSIVO de um número consigo mesmo.
25. A resposta é 1101 0000 0010 0011.

26. A solução fica clara quando você percebe que A XOR A = 0 para qualquer A, então XOR
fazer qualquer coisa em uma variável duas vezes não altera a variável. As três etapas a
seguir executadas em sequência fazem o trabalho.

(1) B = A XOR B
(2) A = A XOR B
(3) B = A XOR B

27. A constante deve ter no máximo dois bits 1 (por exemplo, 11000000 ou 00100010, mas
não 00100011).
28. Para o Core i7 temos:

uma. MOV EAX,4; MOV [EBP+i],EAX (5 bytes)


b. MOV EAX,[EBP+j]; MOV [EBP+i],EAX (6 bytes) c.
MOV EAX,[EBP+j]; DEC EAX; MOV [EBP+i],EAX (7 bytes)

Para IJVM temos:

uma. ÍCONST 4; ISTORE 0 (2 bytes)


b. ILOAD 1; ISTORE 0 (2 bytes) c.
ILOAD 1; ÍCONST 1; ISUB; ISTORE 0 (4 bytes)

29. A instrução pode conter dois números de registro, um campo de condição de 3 bits e um
desvio de desvio. As condições poderiam ser menores que, menores ou iguais, iguais,
etc. Se a condição se mantivesse entre os dois registros, a ramificação seria tomada.
Caso contrário, a instrução não faria nada. Muitos loops while simples podem usar essa
instrução.

30. Para resolver isso, precisamos saber quantos movimentos são necessários para resolver o
problema de n discos. Seja Sn o número de movimentos necessários para n discos .
Então, pela inspeção do código, temos

Sn = Sn ÿ 1 + 1 + Sn ÿ 1

porque para resolver o problema para n, temos que resolvê-lo duas vezes para n ÿ 1 mais
um movimento extra. Assim, agora sabemos que Sn = 2Sn ÿ 1 + 1. Para n = 1, sabemos
que Sn é 1. Assim, para valores sucessivos de n temos Sn = 3, 7, 15, 31, 63, 127, 255,
511 , 1023, etc. Assim, fica claro que Sn = 2n ÿ 1. Para 64 discos, precisamos de 264 ÿ 1
movimentos. Em 60 segundos por movimento, isso é cerca de 1,1 × 1021 segundos. Um ano
Machine Translated by Google

26 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 5

tem cerca de 3,15 × 107 segundos, então estamos olhando para cerca de 3,5 × 1013 anos. Isso é
cerca de 3500 vezes a idade estimada do universo.

31. Quando um dispositivo de E/S deseja sinalizar uma interrupção, ele ativa a linha de interrupção. Em
alguns casos, também pode afirmar linhas que dão prioridade. Se o dispositivo não fornecesse
informações de vetor, como a CPU saberia qual vetor usar? Se os dados de prioridade também
estiverem presentes, isso ajudaria um pouco, mas o que aconteceria se houvesse mais dispositivos
do que níveis de prioridade? As informações vetoriais são essenciais e não podem ser substituídas
por uma tabela.

32. O disco tem 32 KB por faixa, o que equivale a 16K palavras. A transferência de dados é executada
em transferências de 16K por 16 ms, o que requer 8,192 ms de tempo de ciclo de barramento por
16 ms em tempo real. Isso deixa 7,808 ms por 16 ms para a CPU, reduzindo assim para 7,808/16
ou 48,8 por cento de sua velocidade (ou seja, é desacelerado em 51,2 por cento). O número de
ciclos de barramento por instrução é irrelevante.

33. Por ter barramentos separados para E/S e memória, um controlador DMA integrado ao controlador
de barramento na Figura 3-35 e inicia uma transferência direta de barramento entre os barramentos
de E/S e memória ou tem transferências de barramento paralelas em cada um dos dois ônibus
simultaneamente. Ambos os métodos podem melhorar o desempenho do controlador DMA.

34. Com procedimentos normais, na ausência de interrupções, as chamadas são feitas na ordem ditada
pelo fluxo do programa. Cada procedimento é executado até ser concluído e, em seguida, retorna.
O problema de ''Devo parar de executar este procedimento e começar a executar outro?'' não
ocorre. Com interrupções, é necessário algum modo de responder à pergunta e as prioridades são
uma maneira de fazer isso.

35. O valor de muitos registros não está diretamente relacionado à predicação. Está relacionado à
necessidade de evitar dependências e assim evitar a renomeação de registros. Se houver muitos
registros sobressalentes, o compilador pode evitar algumas dependências usando apenas novos
registros o tempo todo.

36. Eles não existem. Uma instrução especulativa é aquela que é executada antes que se saiba que a
variável que está sendo carregada será realmente necessária. Para um LOAD , na pior das
hipóteses, algum tempo é perdido para buscá-lo, mas nenhum dano é causado. Com um STORE
especulativo , uma palavra de memória está sendo substituída. Se o caminho em que se encontra
não for percorrido, não há como recuperar o conteúdo da palavra de memória perdida.

37. A ponte pode lidar com 4.000 pacotes por segundo, 2.000 de cada rede. A 1 KB por pacote, nenhuma
rede pode operar acima de 2 MB/s.

38. Ele precisa saber quantos bytes de armazenamento estão ocupados pelos parâmetros para que
possa encontrar o endereço de retorno armazenado e o ponteiro de quadro antigo. Em uma
linguagem fortemente tipada, como Java, essa informação é conhecida em tempo de compilação.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 6 27

SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 6

1. Seria um desperdício ter o sistema operacional interpretando instruções como ADD que
o microprograma pode manipular perfeitamente. O nível adicional de interpretação é
omitido por razões de eficiência.

2. O espaço de endereçamento é de 232 bytes. Cada página tem 4 KB, portanto, o número de
páginas é 232/4096 ou 220, que é 1.048.576.

3. Em teoria, a memória virtual é apenas um mapeamento entre endereços virtuais e físicos,


de modo que qualquer tamanho de página pode ser usado. No entanto, o hardware MMU
normal usa alguns dos bits de endereço virtual como um índice na tabela de páginas.
Com páginas cujo tamanho não era uma potência de dois, isso não poderia ser feito.
Assim, é teoricamente possível, mas não prático.

4. a. Esses endereços causam falhas: 2048 a 4095, 5120 a 6143, 7168 a 8191.
b. 3072, falha, 4095, 1024, 1025, falha, 2048.

5. a. Com LRU, a memória se parece com isso (* indica uma falha de página):

, , ,0* ,
, 0, 7 * ,
0, 7, 2 * ,
0, 2, 7 0,
2, 7, 5 * 2,
7, 5, 8 * 7,
5, 8, 9 * 5,
8, 9, 2 * 8,
9, 2, 4 *

b. Com FIFO, a memória se parece com isso (* indica uma falha de página):

, , ,0* ,
, 0, 7 * ,
0, 7, 2 * ,
0, 7, 2 0,
7, 2, 5 * 7,
2, 5, 8 * 2,
5, 8, 9 * 2,
5, 8, 9 5, 8,
9, 4 *
Machine Translated by Google

28 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 6

6. Mantenha um contador global que é incrementado a cada falha de página. Quando uma nova
página é trazida, associe a ela o valor atual do contador. A página com o número mais baixo é
então a mais antiga. Observe que o wraparound deve ser evitado, portanto, números de 32
bits devem ser usados.

7. Se o manipulador de falha de página não estiver presente, uma tentativa de acessá-lo causaria
uma falha de página (recursiva). O tratamento dessa falha causaria outra falha e assim por
diante. A máquina faria um loop para sempre. Para evitar isso, o manipulador de falhas de
página deve ser marcado de alguma forma para evitar sua remoção.

8. Quando uma página é carregada, ela deve ser configurada para ler + executar. Qualquer
tentativa de gravar nele causará uma armadilha. O sistema operacional então observa que a
página está suja, ativa a permissão de gravação para a página e reinicia a instrução anterior.

9. Os 10 acessos dão os seguintes resultados: (1) 6145, (2) 10, (3) falha de página, (4) falha de
proteção, (5) 2050, (6) 28686, (7) 16484, (8) falha de página, (9) falha de segmento, (10) falha
de proteção. Observe que, se ocorrer uma falha de proteção, não importa se a tabela de
páginas e a página estão na memória.

10. Sim. Se uma transferência de disco estiver no meio do caminho e, de repente, o programa for
movido, o restante da transferência provavelmente irá para o lugar errado e causará estragos.
Se o dispositivo de E/S usa endereços virtuais em vez de endereços reais, há alguma
esperança (embora seja muito complicado), mas se a E/S usa endereços físicos, é impossível
acertar.

11. Se um arquivo pudesse ser mapeado no meio da página, uma única página virtual precisaria de
duas páginas parciais no disco para mapeá-lo. A primeira página, em particular, seria mapeada
para uma página de rascunho e também para uma página de arquivo. Lidar com uma falha de
página seria uma operação complexa e cara, exigindo a cópia de dados.
Além disso, não haveria como interceptar referências a partes não utilizadas de páginas. Por
esses motivos, é evitado.

12. O padrão de uso do Core i7 é tal que a maioria das referências usa um dos registradores de
segmento. Quando um registrador de segmento é carregado, este é um sinal para o
processador de que o segmento correspondente será usado em breve, então buscar o
descritor em um registrador e mantê-lo lá significa que em referências subsequentes, o LDT
ou GDT não tem para ser acessado.

13. O endereço linear é 18000. Isso significa que a entrada de diretório de página 0 é usada, com
página 4 e deslocamento 18000 ÿ 4 × 4096 = 1616.

14. FIFO e LRU podem ser usados, mas também existem outras possibilidades. Por exemplo, cada
segmento pode ser delimitado por dois furos (exceto possivelmente o primeiro e o último
segmentos). Quando um segmento é removido, os dois furos adjacentes e o espaço
anteriormente ocupado pelo segmento são mesclados em um único furo. Um algoritmo
inspecionaria cada segmento e determinaria o tamanho do buraco criado
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 6 29

por sua remoção, escolhendo o segmento a ser removido com base nisso, por exemplo, o maior
furo novo ou a maior proporção de furo novo para segmento removido.

15. A fragmentação interna ocorre quando a última página de um segmento não está cheia. A
fragmentação externa é o fenômeno de buracos intercalados entre segmentos. A fragmentação
interna pode ser ajudada usando páginas pequenas. A fragmentação externa pode ser ajudada
por um melhor posicionamento ou compactação do segmento.

16. LRU provavelmente funcionaria bem. Se a loja não vende algum item há alguns anos,
provavelmente é seguro abandoná-lo. O FIFO, por outro lado, provavelmente seria muito pior,
já que o produto mais antigo do sortimento provavelmente seria um alimento básico, como
farinha, sal, açúcar ou café – algo que começou a ser vendido em 1875.

17. Não há tempo de inicialização para buscar um bloco de cache, portanto, dobrar o tamanho do
bloco de cache dobra o tempo de acesso. Leva duas vezes mais tempo para buscar 128 bytes
do que buscar 64 bytes. Colocado em outros termos, não há vantagem em buscar 128 bytes
sobre buscar 64 bytes duas vezes. Com a paginação, há um longo tempo de inicialização antes
de acessar uma página, geralmente 20 ms ou mais, dependendo do disco. Aqui, buscar 2 KB
duas vezes é muito mais lento do que buscar 4 KB uma vez. Assim, há uma grande vantagem
em buscar grandes unidades de uma só vez para amortizar o tempo de inicialização. Essa
vantagem aumenta o tamanho da página. Nenhum efeito comparável aumenta o tamanho do
bloco de cache, e tornar os blocos de cache muito grandes pode ser um desperdício, pois os
dados obtidos podem nunca ser usados.

18. Quando uma chamada de sistema aberto é feita, o sistema operacional busca informações do
disco informando onde encontrar os blocos do arquivo. Essas informações (por exemplo, o i-
node UNIX ) são mantidas na memória principal até que o arquivo seja fechado. Além disso, o
controle de acesso é feito apenas uma vez, não em cada referência ao arquivo.

19. O disco tem 800 × 5 × 32 = 128.000 setores. Com um mapa de bits, são necessários 128.000 bits
ou 4.000 palavras, independente do número atual de setores livres.
Com menos de 4.000 buracos, a lista livre ganha, mas com mais de 4.000 buracos, o bitmap
ganha.

20. O pior ajuste limita o número de pequenos orifícios, o que contribui para o problema de
fragmentação externa.

21. Muitas vezes um arquivo, ou a informação necessária para acessar um arquivo, que um processo
usa durante a execução não está disponível quando o código do processo é escrito ou mesmo
quando o processo inicia a execução. Abrir um arquivo executa uma ligação dinâmica entre uma
representação interna de um arquivo no código do processo e o arquivo real em tempo de
execução.

22. O tamanho médio de um bloco de dados ou de um buraco pode ser encontrado calculando a
ÿi 2ÿi , soma em que i vai de 1 a infinito. A soma pode ser feita a partir do
fórmula bem conhecida para a soma de uma série geométrica:
Machine Translated by Google

30 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 6

1
infinito 0 xk =
S=
k 1ÿx

Se derivarmos cada lado da equação em relação a x, obtemos


1
infinito 0 kxk =
-1
S=
k (1 ÿ x)2

Se agora multiplicarmos ambos os lados por x, obteremos uma soma que é quase o que
precisamos, exceto que o limite inferior é 0 em vez de 1. No entanto, o termo zero não
contribui para a soma, então o limite inferior pode ser substituído por 1 sem alterar o resultado.
Para x = 1/2, descobrimos que o bloco ou buraco de dados médio é de dois setores, então o
par bloco de dados + buraco médio é de quatro setores. O número de tais pares e, portanto,
o número de buracos, é então N/4.

23. É muito improvável. O problema é: a que distância o sistema operacional deve colocar os
arquivos à medida que são criados? Não tem como saber.

24. Como o volume total ocupado por todos os arquivos pequenos é uma pequena fração do
disco, duplicá-lo ou mais terá pouco efeito sobre a quantidade de espaço em disco usado.
Mas blocos de disco grandes aumentarão muito o desempenho, especialmente em arquivos
grandes. Assim, esses dados sugerem o uso de um grande bloco de disco, digamos 8 KB.

25. (a) Se houver uma CPU, a desativação das interrupções funciona. (b) Se houver duas CPUs,
ele falha, porque uma CPU pode desabilitar apenas suas próprias interrupções, não as da
outra CPU.

26. O uso de uma fila garante acesso justo para processos adormecidos no semáforo. Embora
seja estatisticamente improvável, o esquema de ativação aleatória usado com um grupo de
processos que circulam em um semáforo pode fazer com que um ou mais processos
adormecidos nunca acordem. O uso da fila garante que, quando um processo entrar em
suspensão, ele será acordado.

27. Com três ou mais processos claramente falha. Se P1 inspecionar o semáforo e encontrá-lo 1,
antes que ele possa fazer um down , P2 ou P3 podem entrar e fazer um down primeiro. Com
apenas dois processos é um pouco mais complicado. Em princípio, existe a mesma raça. P1
pode inspecionar o semáforo e encontrá-lo 1, mas antes de fazer um down P2 pode fazer um
down. No entanto, esta situação ocorre apenas quando P1 e P2 querem fazer um down
simultaneamente. Se essa situação ocorrer, ambos os processos ficarão inativos para sempre
(um deadlock). Em outras palavras, a corrida ocorre apenas quando os programas estão
logicamente incorretos. Com três processos, não há perigo se P1 e P2 quiserem dormir ao
mesmo tempo, porque P3 sempre pode acordá-los mais tarde.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 6 31

28. O comportamento do semáforo (S) e os processos (P1, P2 e P3) são


dado na tabela a seguir.

Tempo S P1 P2 P3

0 ÿ 100 1 RRR
100 ÿ 200 0 RRR
200 ÿ 300 0 SRR
300 ÿ 400 0 RRR
400 ÿ 500 0 RRS
500 ÿ 600 0 SRS
600 ÿ 700 0 RRS
700 - 800 0 RSS
800 ÿ 900 0 RRS
900 ÿ1000 0 RRR

29. Uma forma de resolver o problema é associar a cada arquivo um semáforo, OCUPADO,
inicialmente 1. Quando um processo quer usar um arquivo, ele faz um down no
semáforo. O primeiro processo que estiver inativo receberá acessos, mas os processos
subsequentes serão bloqueados. Quando o processo bem-sucedido é concluído, ele
faz um up, disponibilizando o arquivo novamente.

30. O bloqueio do procedimento é

BLOQUEIO: TSL X

BLOQUEIO JMP

CERTO

Em outras palavras, continue verificando até que seja desbloqueado e retorne. unlock(x)
apenas armazena um zero em X.

31. Os ponteiros de entrada e saída após cada operação são os seguintes:

em fora
a. 22 0 b. 22
9 C. 62 9 d.
62 26 9 26 f.
9 6g. 17 6h.
e. 17 17

32. Os primeiros 10 endereços de disco estão no i-node. O único bloco indireto comporta mais 512. Os
blocos indiretos duplos e triplos possuem 262.144 e 134.217.728 blocos, respectivamente. O
número total de blocos é assim
Machine Translated by Google

32 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 6

134.480.394. Com blocos de dados de 2 KB, isso fornece um tamanho máximo de arquivo de
274.877.906.944 bytes.

33. A única mudança é que a entrada game3 no diretório /usr/ ast/ bin é excluída.
O arquivo ainda está acessível via /usr/ jim/ jotto, no entanto.

34. O redirecionamento de E/S não envolve pipes, apenas o fato de que os arquivos abertos são herdados
entre fork e exec, então não há problema aqui. Os pipelines usam pipe, mas o shell pode ser facilmente
modificado para executar os filtros sequencialmente em vez de em paralelo, com os arquivos
intermediários sendo armazenados em buffer no disco, supondo que haja espaço em disco suficiente
disponível.

35. Esta proposta fará com que o redirecionamento deixe de funcionar. Atualmente, o processo filho
bifurcado pelo shell fecha 0 ou 1 se o redirecionamento for necessário e, em seguida, abre o arquivo
redirecionado. Se o novo descritor de arquivo fosse diferente do antigo, o redirecionamento não seria
transparente e falharia.

36. As entradas da lista de controle de acesso são processadas em ordem. Assim que uma correspondência
é encontrada, a pesquisa é interrompida. Neste exemplo, o ACL diria: Roberta: sem acesso; *: acesso
total. Assim que o sistema descobrisse que a primeira entrada correspondia, ele pararia de pesquisar
e nunca mais veria a segunda entrada concedendo acesso total a todos.

37. (1) Threads dentro de um processo; (2) dois processos compartilhando um arquivo mapeado.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 7 33

SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 7

1. Os três casos são os seguintes:

uma. Programação = 100 meses, tempo de execução = T. b.


Programação = 1000 meses, tempo de execução = T/6 c.
Programação = 100 + 40 = 140 meses, tempo de execução = T/2 + (0,5/6) T = 7T/12.

2. Se os compiladores produzem módulos de objeto, os compiladores têm os mesmos problemas


que os montadores: ou seja, se a primeira instrução de um procedimento for um GOTO, o
compilador ainda não conhece o endereço absoluto do rótulo. Por outro lado, se o código
assembly for produzido, o compilador não terá que lidar com o problema. Ele é empurrado para o
montador.

3. Teria de ser encontrada uma maneira de pacificar muitos usuários irritados que estavam
acostumados com a outra convenção. No entanto, tecnicamente, a ordem é completamente arbitrária.
A própria arquitetura da máquina não dita, ou mesmo sugere vagamente, uma sintaxe de
linguagem assembly sobre a outra. É o mesmo que dividir a hora em 60 partes em vez de 100
(hora métrica). Alguém fez essa escolha 6.000 anos atrás, e agora estamos todos presos a ela.

4. Não. Na passagem um S é definido; na passagem dois R é definido. Seriam necessárias mais


duas passagens para definir P.

5. Os símbolos podem ter até 10 caracteres, codificados na base 25. Seja o símbolo
de 10 caracteres C9 C8 C7 C6 C5 C4 C3 C2 C1 C0. O valor da palavra que
representa o símbolo é ÿ 25i Ci, onde i vai de 0 a 9 e os Cs são codificados com
A = 0, B = 1, ..., Z = 24. Oque
é menor maior
248símbolo
- 1. que pode ser produzido neste caminho

6. Uma instrução é algo traduzido para um número binário e colocado no programa objeto para
execução pela máquina. Uma pseudoinstrução é um comando para o montador e não gera uma
instrução executável.

7. O contador de programa é usado em tempo de execução para acompanhar qual instrução executar
em seguida. O contador de localização de instrução é usado em tempo de montagem para
rastrear a localização da memória para colocar a próxima instrução.

8. Os valores dos símbolos são: EVEREST = 1000, K2 = 1001, WHITNEY =


1002, MCKINLEY = 1004, FUJI = 1007 e KIBO = 1008.

9. Depende de como o montador é implementado. Se a tabela de símbolos e a tabela de opcodes


forem diferentes, não há problema com a reutilização de nomes.
No entanto, se uma única tabela for usada para todos os símbolos, duplicatas podem ter que ser
Machine Translated by Google

34 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 7

proibido. Um montador pode permitir que um rótulo duplique um opcode, pois


normalmente fica claro no contexto qual é qual, mas isso requer trabalho.

10. Se numerarmos as cidades de 1 a 12, a primeira sonda é a de número 6, New Haven.


Berkeley < New Haven, então a nova lista a ser pesquisada é de 1 a 5. A próxima
sonda é a de número 3, Cambridge. Berkeley < Cambridge, então a nova lista é de 1
a 2. A terceira sonda é a de número 1, Ann Arbor. Como Berkeley > Ann Arbor, agora
ficamos com uma lista começando e terminando na entrada 2, Berkeley. Na sonda 4,
encontramos.

11. Claro, sem problemas.

12. O cálculo é o seguinte:

els = (5 + 12 + 19) mod 19 = 17


jan = (10 + 1 + 14) mod 19 = 6 jelle
= (10 + 5 + 12 + 12 + 5) mod 19 = 6 maaike
= (13 + 1 + 1 + 9 + 11 + 5) contra 19 = 2

jan e jelle hash para o mesmo valor, 6, por acidente. Colisões como essa podem ser
acomodadas encadeando todas as entradas com o mesmo código de hash em uma
lista vinculada.

13. A probabilidade de sucesso em qualquer tentativa é 1 ÿ r. A probabilidade, P(k), de


exigir exatamente k tentativas é a probabilidade de k ÿ 1 falhas, r vezeska- 1probabilidade
, de
sucesso, 1 ÿ r. O número médio de sondas é encontrado somando kP(k) de 1 a n. O
resultado é

1-r n+1
número médio de sondas =
1-r

14. Cada CPU deve conter um símbolo e o valor correspondente em sua memória local.
Quando o processador principal quer procurar um símbolo, ele coloca o símbolo no
primeiro dos registradores compartilhados e define um segundo registrador como 1,
indicando que uma busca é desejada. Todas as CPUs então verificam se possuem o
símbolo necessário. Se algum deles encontrar o símbolo, ele coloca o valor no terceiro
registro e limpa o 1 no segundo registro. Após um tempo de pesquisa, o processador
principal inspeciona os três registros para ver o que aconteceu.

15. São necessários vários ILCs, um para cada segmento. Cada um começa em 0. Eles
são mantidos e incrementados independentemente um do outro.

16. Se este é o único programa que usa as DLLs e sempre precisa de todas elas, sim,
seria mais eficiente combiná-las. No entanto, se muitos programas usarem as DLLs,
como costuma ser o caso, e programas diferentes precisarem de
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 7 35

combinações, dividi-los pode fazer sentido para que nem todos os procedimentos precisem
estar na memória ao mesmo tempo se não forem todos necessários.

17. Se uma DLL iniciar com a instrução BR 100 e esta DLL for mapeada para o endereço 1000
em um processo e endereço 2000 em outro processo, ela falhará em ambos. Uma saída é
garantir que todo o código em todas as DLLs seja independente de posição. Outra maneira
é dar a cada DLL um endereço virtual único e sempre mapeá-lo lá. Finalmente, em uma
arquitetura segmentada, cada DLL pode ser colocada em um segmento separado.

18. Pode falhar se um procedimento retirado da própria biblioteca precisar de outro procedimento
na biblioteca e o procedimento necessário já tiver sido aprovado. Uma solução é fazer
várias passagens pela biblioteca. Outra é exigir que ele seja classificado para que não haja
referências anteriores. Finalmente, uma terceira solução é colocar um índice na frente da
biblioteca informando o que cada procedimento precisa, para que a lista completa seja
conhecida antes do início da varredura.

19. Claro. O montador de macro está apenas fazendo a substituição de strings. Não importa se
os parâmetros são variáveis, registradores ou qualquer outra coisa. Durante a expansão
de macro, ele está apenas movendo os personagens. Se o código assembly resultante for
legal, tudo funcionará bem.

20. Isso significa que você precisará de três passos: um para coletar as definições de macro,
um para expandir as macros e construir a tabela de símbolos e outro para gerar o código.

21. Defina uma macro, LOOP, e dentro do corpo da macro chame LOOP. Cada expansão leva
a outra, em um ciclo sem fim. O assembly terminará somente quando o assembly ficar sem
memória para manter o controle de onde ele está.

22. As constantes são 0, 200, 1000, 1600 e 2100, respectivamente.


Machine Translated by Google

36 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 8

SOLUÇÕES PARA PROBLEMAS DO CAPÍTULO 8

1. Não. A essência de uma instrução VLIW é que existem várias operações que podem ser iniciadas
independentemente. O Pentium não tem isso.

2. Sim, eles poderiam ter usado os transistores extras para aumentar muito o tamanho dos caches L1 e
L2. Eles não fizeram isso devido à lei dos retornos decrescentes. Dobrar o tamanho do cache L1
melhora o desempenho, mas o ganho é bastante pequeno, considerando quantos transistores estão
sendo dedicados a ele.

3. Os valores recortados são 96, 0, 255 e 255.

4. (a) Não, pois as cargas são proibidas no slot 3. (b) Sim. (c)
Não, porque adições flutuantes não podem ser feitas no
slot 2.

5. No primeiro (multithreading de granulação fina), a rotação continua, então obtemos A4, B4 e C4. No
segundo (multithreading de granulação grossa), obtemos B2 C5 e C6.

6. Se são necessários k ciclos ao todo para lidar com uma falha de cache de nível 1, precisamos (pelo
menos) k threads para que sejam necessários k ciclos para percorrer todos eles. Depois que k ciclos
tiverem decorrido, o encadeamento perdido será executado novamente e, agora, a palavra de
memória necessária estará presente.

7. É muito parecido com o ILLIAC IV, já que os SMs funcionam melhor em sincronia.

8. É MIMD. Embora a ordem geral de trabalho seja a mesma, cada abelha procura suas próprias flores
(tem seu próprio fluxo de instruções). Não há nenhuma coordenação de bloqueio.

9. Se um programa espera uma memória sequencialmente consistente e não pode viver com nada
menos, a memória deve fornecer consistência sequencial. No entanto, para melhorar o desempenho,
alguns sistemas de memória fornecem um modelo mais fraco. É então essencial que o software
concorde em cumprir as regras impostas por este modelo. Geralmente, isso significa que os
programas que obedecem às regras perceberão o que parece ser uma memória sequencialmente
consistente.

10. Não é grande coisa. Vimos muitos esquemas de arbitragem de barramento no Cap. 3. O árbitro do
ônibus decide quem vai primeiro. Então temos acesso sequencial.

11. Não é grande coisa. Vimos muitos esquemas de arbitragem de barramento no Cap. 3. O árbitro do
ônibus decide quem vai primeiro. Então temos acesso sequencial.

12. Write-through não seria afetado, pois snoops apenas nas linhas de endereço.

13. Em 64 tempos de instrução, cada CPU pega o barramento uma vez, permitindo que ela execute cerca
de quatro instruções, então o número total de instruções executadas em 64 tempos de instrução é
256. Uma única CPU poderia pegar o barramento 16 vezes nesse período
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 8 37

e assim executar 64 instruções. O sistema de 64 CPU é apenas quatro vezes mais rápido que o sistema
de 1 CPU.

14. O estado I é essencial, pois o cache está vazio quando a CPU é inicializada. O estado M é necessário se
dados sujos devem ser permitidos no cache; caso contrário, o protocolo não seria mais um protocolo de
write-back. O estado S poderia ser sacrificado, caso em que um bloco poderia estar em apenas uma
cache por vez, ou seja, sempre em estado exclusivo. A eliminação de S significaria que, quando uma
segunda CPU lesse um bloco, a primeira teria que abandoná-lo. Isso é possível, mas prejudica o
desempenho de dados somente leitura. Alternativamente, o estado E poderia ser sacrificado.

Isso significaria que mesmo dados limpos localizados em apenas um único cache estariam no estado S.
Uma gravação nesses dados exigiria uma transação de barramento informando a outros caches para
invalidar o bloco. Uma gravação em um bloco E não precisa de uma transação de barramento. Em suma,
o MSI é provavelmente um negócio melhor do que o MEI porque o compartilhamento ocorre muito, e o
custo de uma transação extra de ônibus de vez em quando é suportável.

15. Para ocorrências de leitura, nenhuma transação de barramento é necessária, mas para uma ocorrência de
gravação em um bloco no estado S, uma transação de barramento é necessária para invalidar outros
caches para converter o bloco local do estado S para o estado M.

16. a. A probabilidade de que qualquer máquina esteja silenciosa é 1 ÿ p, então a probabilidade de que todas
n
n são silenciosos é apenas (1 ÿ p) .

b. A probabilidade de que a máquina 0 seja a única solicitante é p(1 ÿ p) todas as n nÿ1 . Desde
máquinas têm a mesma probabilidade de transmitir, a probabilidade de que qualquer uma delas o faça é
nÿ1
np(1 ÿ p) .

c. A probabilidade de dois ou mais é apenas 1 menos as duas expressões acima, ou 1 ÿ p(1 ÿ p) ÿ (1 ÿ p)


nÿ1 n
.

17. Os interruptores da barra transversal não bloqueiam, o que proporciona um bom desempenho. No entanto,
eles não escalam bem e são muito caros quando há muitos processadores e muitas memórias para
conectar.

18. Há cinco por conjunto de placas, portanto, com 18 conjuntos de placas, o total é 90.

19. As CPUs 000, 010, 100 e 110 são cortadas das memórias 010 e 011.

20. Depende da velocidade da memória. Se a memória for rápida e todas as solicitações forem tratadas sem
que a CPU solicitante libere o barramento, então não importa qual endereço é acessado e não há pontos
de acesso. Por outro lado, se a memória for lenta e houver muitos módulos de memória que podem atuar
em paralelo (ou seja, uma CPU libera o barramento após fazer uma requisição), então ter muitas
requisições para o mesmo módulo é um problema
Machine Translated by Google

38 SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 8

21. Existem 12 estágios a serem cruzados em cada direção, para um atraso total de 120 ns. Assim,
dois slots de atraso são necessários.

22. Basta conectar o processador i e a memória i com um fio. Dessa forma, essas solicitações não
precisam usar a rede de comutação. Topologicamente, pode-se pensar em toda a rede ômega
como sendo enrolada na parte externa de um cilindro, de modo que o processador i e a
memória i agora são adjacentes. Um processador pode emitir uma requisição para a direita,
ou seja, usando a rede de comutação, ou para a esquerda, diretamente para sua própria
memória. A desvantagem é que as memórias agora devem ser capazes de lidar com duas
solicitações simultâneas, uma de cada lado. Como resultado, os circuitos de memória tornam-
se mais complicados e caros.

23. Se a página permanecer remota durante a execução, as referências N/100 levarão 1,2N ns. Se
for local, o tempo de acesso será C + 0. 2N ns, incluindo o tempo para copiá-lo. Assim se C +
0. 2N < 1. 2N, a página deve ser copiada; caso contrário, o tempo para copiá-lo é demais para
fazer a cópia valer a pena. Para C < N vale a pena copiar.

24. Cada nó possui 217 entradas de diretório. Como existem 512 nós, uma entrada de diretório
agora tem 10 bits, 1 bit para marcar um bloco como armazenado em cache ou não e 9 bits
para dizer onde ele está. Assim, o tamanho total do diretório em cada nó é de 1.310.720 bits.
A memória nesse nó é de 8 MB ou 67.108.864 bits. A sobrecarga percentual é, portanto, de
cerca de 1,95%. Essa sobrecarga é um pouco maior do que na figura devido ao campo maior
necessário para especificar um nó.

25. As máquinas NC NUMA não possuem cache. Isso resolve o problema de coerência de cache
de uma maneira simples, mas tem um grande impacto no desempenho porque todas as
referências à memória remota precisam se propagar para a máquina remota.
O CC-NUMA armazena dados em cache localmente, melhorando muito o desempenho, mas
apresenta o problema de manter os caches coerentes.

26. (a) 2. (b) 1. (c) 6. (d) 4. (e) 6. (f) 4. (g) 3 (h) 4.

27. (a) 0. (b) 6. (c) 0. (d) 1. (e) 1. (f) 3. (g) 2. (h) 3.

28. Em uma grade, o pior caso são os nós em cantos opostos tentando se comunicar.
No entanto, com um toro, os cantos opostos estão separados por apenas dois saltos. O pior
caso é um canto tentando falar com um nó no meio. Para k ímpar , são necessários (k ÿ 1)/2
saltos para ir de um canto para o meio horizontalmente e outro (k ÿ 1)/2 saltos para ir para o
meio verticalmente, para um total de k ÿ 1. k, o meio é um quadrado de quatro pontos no meio,
então o pior caso é de um canto até o ponto mais distante nesse quadrado de quatro pontos.
Leva k/2 saltos para chegar lá horizontalmente e também k/2 verticalmente, então o diâmetro
é k.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O CAPÍTULO 8 39

29. A rede pode ser dividida em dois por um plano no meio, dando dois sistemas, cada um com
uma geometria de 8 × 8 × 4. Há 64 links rodando entre as duas metades, para largura de
banda de bissecção de 64 GB/s .

30. A lei de Amdahl afirma: aceleração = n/[1 + (n ÿ 1) f ]. Como n ÿ infinito, os 1s no denominador


tornam-se desprezíveis, e a aceleração torna-se n/ nf que é 1/f .
Se f = 0.1, não importa quantas CPUs você use, você não conseguirá fazer o programa
rodar mais de 10 vezes mais rápido. Por exemplo, se o programa se inicializar por 6
segundos, depois funcionar por 54 segundos, mesmo que você reduza o tempo de trabalho
para 0 segundos, não poderá obter o tempo de execução abaixo de 6 segundos, ou seja, 10
segundos velocidade de dobra.

31. A largura de banda média por CPU para os dois sistemas baseados em barramento é de b/4
bps e b/16 bps, respectivamente. Para um sistema de 64 CPU, cai para b/64 bps. Para um
número infinito de CPUs, cai para 0. Para os dois sistemas baseados em grade mostrados
na figura, a largura de banda média por CPU é de b bps e 1,5 bps, respectivamente.
Para um sistema de 64 CPUs em uma grade 8 × 8, existem 2 × 7 × 8 links, fornecendo 112b/
64 bps. À medida que o número de CPUs vai para o infinito, a largura de banda por CPU
tende a 2b porque adicionar cada nova CPU também adiciona dois novos links.

32. Uma variante é fazer com que o sistema copie o buffer de mensagem no kernel e libere o
remetente. Quando a mensagem é realmente enviada, torna-se irrelevante.
Esse esquema permite que o remetente continue antes da transmissão real, o que pode ser
importante se houver uma longa fila esperando pela rede. Por outro lado, envolve cópia extra
(para o kernel), e cada cópia extra custa desempenho. Na variante original, pode ser possível
fazer a transmissão real do buffer do usuário, eliminando a cópia.

33. As leituras em objetos replicados são feitas localmente, sem tráfego de rede, portanto, ter um
grande número deles é muito eficiente. As gravações exigem tráfego de rede, portanto, são
lentas quando os objetos são replicados.
Machine Translated by Google

40 SOLUÇÕES DE PROBLEMAS PARA O APÊNDICE A

SOLUÇÕES PARA APÊNDICE A PROBLEMAS

1. Os números são: 11111000000, 111110100000 e 10000000000000,


respectivamente.

2. Em decimal é 617, em octal é 1151 e em hexadecimal é 269.

3. Todas as strings contendo apenas os 10 dígitos e as letras A, B, C, D, E e F são números


hexadecimais válidos. Todos os exemplos dados são válidos, exceto BAG.

4. As respostas são: 1100100, 10201, 1210, 400, 244, 202, 144 e 121.

5. O número de strings válidas de comprimento k com r possibilidades em cada posição é


kr.

6. Com apenas suas mãos você tem 10 bits, então você pode contar até 1023. Com mãos e
pés o limite se torna 220 ÿ 1 = 1, 048, 575. Em complemento de dois o intervalo é -524,
288 a +524, 287 .

7. Os resultados são: 10011100, 11111110, 00000001 e 00000000. O primeiro cálculo


resulta em estouro. As subtrações são feitas formando o complemento de dois do
subtraendo e adicionando-o ao minuendo.

8. Os resultados são: 10011100, 11111111, 000000000 e 11111111. Novamente, o primeiro


cálculo fornece um estouro. A subtração é feita formando o complemento de um do
subtraendo e adicionando-o ao minuendo.

9. As cinco somas são: 001, 111, 101, 011 e 000, respectivamente. Os bits do código de
condição NZV são 000, 100, 100, 000 e 011, respectivamente.

10. Os números são: 006, 997, 100, 985, 998 e 000.

11. A regra para adição de números de complemento de nove é análoga à de adição de


números de complemento de um: o carry é adicionado ao número.
As somas são: 0001, 9999, 9994 e 0044.

12. É semelhante ao complemento de dois: basta fazer a adição e ignorar o carry.

13. As tabelas são: 0 × 0 = 0, 0 × 1 = 0, 0 × 2 = 0, 1 × 0 = 0, 1 × 1 = 1, 1 × 2 = 2, 1 × 3 = 3, 2 ×


1 = 1 e 2 × 2 = 11

14. A resposta é 10101 (7 × 3 = 21).


Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA O APÊNDICE B 41


SOLUÇÕES PARA PROBLEMAS DO APÊNDICE B

1. O número 9 pode ser escrito como 1. 001 × 23 . Adicionando o viés de 127 ao expoente,
obtemos

0 10000010 00100000000000000000000

Em hexadecimal, isso é 41100000H. Da mesma forma, 5/32 é 3E200000H, ÿ5/32 é BE200000H


e 6,125 é 40C40000H.

2. Escrevendo 42E48000 em binário, obtemos

0 10000101 11001001000000000000000

Subtraindo o viés de 127 do expoente, vemos que o expoente não viciado é 6, então temos 1.
, ÿ122.880,
11001001 × 26 que é 114,25. Da mesma forma, as partes (b) a (d) produzem 1,0625, 2ÿ126 e
respectivamente.

3. Para converter para o formato de ponto flutuante, primeiro converta 7/64 para binário: 0,000111.
Uma representação é

0 1000000 000111000000000000000000

Como a raiz da exponenciação é 16, os deslocamentos da fração devem ser feitos 4 bits por
vez. Não são possíveis tais deslocamentos, portanto o número acima já está normalizado. Em
hexadecimal é 401C0000H.

4. Para normalizar, desloque para a esquerda 1 bit de cada vez, adicionando 1 ao expoente em cada etapa,
até que o bit mais à esquerda da fração seja 1. Os resultados são

(a) 0 1000011 1010100000001000 (b) 0


1000101 1111111111000000 (c) 0
1000011 1000000000000000

O terceiro já está normalizado.

5. Escrevendo os dois operandos em binário, obtemos

0 01111101 1100000000000000000000 ( = 7/16) 0 01111011


00000000000000000000000 ( = 1/16)

Tornando o 1 implícito e o ponto binário explícito, obtemos 1. 11 × 2ÿ2

1. 00 × 2ÿ4

Ajustando os expoentes, obtemos

1. 11 × 2ÿ2

0. 01 × 2ÿ2
Machine Translated by Google

42 SOLUÇÕES DE PROBLEMAS PARA O APÊNDICE B

Como os expoentes agora são os mesmos, podemos somar as duas frações. O resultado
tem o mesmo expoente dos operandos. O resultado é: 10. 00 × 2ÿ2 Quando normalizado .
para o formato IEEE, isso se torna 1. 00 × 2ÿ1 (1/2), que em hexadecimal
é 3F000000H.

6. Os números menores e maiores são


Modelo 0,001: 0 0000000 10000000 0 1111111 11111111 0
Modelo 0,002: 0 00000 1000000000 11111 1111111111

Em decimal, os limites do Modelo 0,001 são cerca de 2,7 × 10ÿ20 e 9,2 × 1018.
Os limites do Modelo 0,002 são cerca de 7,6 × 10ÿ6 a 3,3 × 104 . O número de dígitos
decimais em uma fração de n bits pode ser encontrado resolvendo a equação 2n = 10x para
x. Para o Modelo 0,001, n = 8 e aproximadamente x = 2. 4. Para o Modelo 0,002, n = 10 e
aproximadamente x = 3. 0. No que diz respeito à compra de qualquer um, é difícil imaginar
um aplicativo que possa viver com 32768 como o maior número de ponto flutuante, então o
Modelo 0,002 é muito difícil de engolir. Mas com apenas 2,4 dígitos, o Modelo 0,001 também
não serve para muita coisa. Eu compraria uma máquina com pelo menos 32 bits para
números de ponto flutuante.

7. Subtração de dois números quase iguais. Considere números decimais com 5 dígitos de
significância. Se subtrairmos 0,21345 de 0,21347, obtemos 0,00002. Mesmo representando
isso como 0. 2 × 104 não posso dígito do resultado. , ainda temos apenas um significado

8. Uma aproximação da raiz quadrada pode ser feita dividindo o expoente pela metade, por
exemplo, deslocando-o 1 bit para a direita. Por exemplo, em decimal uma raiz quadrada
aproximada de 4 × 108 é 4 × 104 . O mesmo vale para números binários.
Machine Translated by Google

SOLUÇÕES DE PROBLEMAS PARA APÊNDICE C 43

SOLUÇÕES PARA PROBLEMAS DO APÊNDICE C

1. Os valores de AH e AL são 2 e 190, respectivamente.

2. O endereço de 20 bits implícito por CS é 64. Assim, o segmento de código é executado a partir de 64
através e incluindo 65.599.

3. O maior valor possível em um registro de segmento é 65.535, que corresponde a um endereço base
de segmento de 1.048.560. Um segmento de tamanho máximo começando lá terminaria em
1.114.095. Observe que esse endereço é, na verdade, mais de 220.

4. a. O segmento de código começa no endereço 640, então a próxima instrução está em 660. b.
A palavra referenciada está em 8000 × 16 + 2, ou 128.002.

5. O endereço de retorno está em BP + 2 e o primeiro argumento é como BP + 4 , então o


instrução é MOV AX,4(BP).

6. Não. A diferença entre dois rótulos na mesma seção é uma constante, independente de onde
ocorram na seção. Adicionar linhas antes delas não faz diferença. A diferença entre dois rótulos
permanece inalterada.
Adicionar dois rótulos é uma história totalmente diferente. Se, digamos, n bytes de dados forem
incluídos antes do primeiro rótulo, a soma de + hw aumentará em 2n. É difícil imaginar um programa
em que esse comportamento seja aceitável.

7. O código é

MOV AX, a
ADICIONAR AX, b

ADICIONAR EIXO, 2

MOV x,AX

8. O código é

PRESSIONE y

PRESSIONE x

CALL foobar

Você também pode gostar