DEV Community

Cover image for Dia 12 - 1.2 Oito grandes ideias sobre arquitetura de computadores
Matheus Gomes
Matheus Gomes

Posted on

Dia 12 - 1.2 Oito grandes ideias sobre arquitetura de computadores

Esse post fala sobre o capítulo 1.2 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"

-

1 - Projete pensando na "Lei de Moore"

Lei de Moore é uma observação feita por Gordon Moore, cofundador da Intel, em 1965. Essa lei declara que os recursos do circuito integrado dobram a cada 18 a 24 meses. O livro nesse trecho alega: Como projetos de computador podem durar anos, os recursos disponíveis por chip podem facilmente dobrar ou quadruplicar entre o inicio e o final do projeto, então o ideal, é que antecipemos onde a tecnologia estará quando terminarmos o projeto.

Fazendo algumas pesquisas, achei uma matéria no Terra explicando que a Lei de Moore está desacelerando, pois os desafios físicos e de engenharia estão tornando cada vez mais difícil manter o ritmo de miniaturização dos transistores.

2 - Use a abstração para simplificar o projeto

Nesse trecho é dito como tivemos que inventar técnicas para nos tornar mais produtivos, se não, o tempo de projeto aumentaria de modo insustentável quando os recursos aumentassem pela Lei de Moore. Então, uma técnica de produtividade é a abstração, os detalhes de baixo nível são ocultados, enquanto oferece um modelo mais simples de alto nível. (Um exemplo para melhor entendimento, são as infinitas bibliotecas em Python escritas em C.)

3 - Torne o caso comum veloz

"Tornar o caso comum veloz costuma melhorar mais o desempenho do que otimizar o caso raro."
O caso comum é mais fácil de melhorar. Por ser comum, ele é mais simples. Saber o que é o "caso comum" será ensinado seções mais a frente no livro.

4 - Desempenho pelo paralelismo

Esse conceito também será aprofundado ao decorrer do livro, mas basicamente consiste em mais desempenho realizando operações em paralelo.

5 - Desempenho pelo pipelining

É um padrão de paralelismo. Darei um exemplo:
Imagine uma fábrica de carros com 5 estágios:

  • Chassis montado.
  • Motor instalado.
  • Pintura aplicada.
  • Interior montado.
  • Teste realizado.

Se a fábrica não utilizar pipelining, cada carro terá que passar por todos os cinco estágios antes que o próximo carro comece. Se cada estágio demorar uma hora, para montar o primeiro carro vai demorar cinco. Para otimizar isso, após o primeiro carro terminar o estágio um, será adicionado outro carro nesse estágio, enquanto o primeiro carro segue a pipeline, e assim funcionará sucessivamente.

6 - Desempenho pela predição

Esse é um conceito que honestamente não consegui entender pela definição do livro, então busquei outras fontes:

Um exemplo é a predição de desvio, técnica usada em processadores para melhorar o desempenho ao prever o caminho que o código seguirá em instruções condicionais (if, switch). Em vez de esperar pela avaliação da condição, o processador faz uma previsão e continua executando instruções antecipadamente. Se a previsão estiver correta, o desempenho melhora porque o processador não fica ocioso. Se errada, ele apenas descarta as instruções incorretas. Isso reduz o tempo ocioso e aumenta a eficiência do sistema, especialmente em loops e condições frequentes.

7 - Hierarquia de memórias

É um conceito que organiza diferentes tipos de memórias de um sistema em níveis com diferentes velocidades e capacidades. Utilizando memórias mais rápidas e menores (cache) para armazenar dados frequentemente acessados e memórias mais lentas (disco rígido/SSD) para armazenar grandes volumes de dados menos utilizados.

Um exemplo disso em sistemas web, é quando utilizamos o Redis para realizar o cache de uma listagem frequentemente acessada pelo client. Isso reduz o tempo de resposta e o overhead de buscar novamente os dados no banco de dados.

8 - Estabilidade pela redundância

"Além de rápidos, os computadores precisam ser estáveis."

Em um serviço web por exemplo, isso pode se assemelhar a redes de servidor em cluster, onde há vários servidores que hospedam o serviço, e se caso um deles falhe, outro servidor assume a função. Nesses clusters é possível inclusive adicionar balanceadores de carga que distribuem requisições entre servidores. Caso um servidor fique sobrecarregado ou inativo, as requisições são direcionados a outro servidor.

Top comments (0)