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.