Apresentação
Vanilton Pinheiro
Formar profissionais que entendem a base física e arquitetural da computação, capazes de analisar gargalos, tomar decisões técnicas conscientes e dialogar com infraestrutura, cloud e desempenho com propriedade.
Aula 1 e 2
| Capítulo 1 - Introdução e Evolução OAC |
| Arquiteturas Clássicas |
Aula 3
| Capítulo 2 - Componentes do Computador |
| CPU, memória, E/S, barramentos. |
Arquitetura Básica do Computador
2. Componentes
O Cérebro da Máquina
2.1 CPU
2.2 Memória
2.2 Memória
2.2 Memória
2.2 Memória
2.2 Memória
2.2 Memória
2.2 Memória
2.2 Memória
BIOS (Basic Input/Output System) chip de memória não volátil.
Antigamente, a BIOS era gravada em chips ROM (Read-Only Memory), que não podiam ser alterados. Hoje, utilizamos a Memória Flash (uma evolução da EEPROM).
Por que Flash? Porque ela permite que você "atualize" a BIOS (o famoso flash de BIOS) para corrigir bugs ou aceitar processadores novos, mas ainda mantém os dados gravados mesmo sem energia.
2.2 Memória
A relação com a bateria (CMOS)
2.2 Memória
2.3 Barramentos
Comunicação dos componentes
Os barramentos são canais de comunicação que transferem dados, endereços e sinais de controle entre componentes. A largura do barramento determina a taxa de transferência de dados.
2.3 Barramentos
Comunicação dos componentes
2.3 Barramentos
Comunicação dos componentes
2.4 Dispositivos de Entrada e Saída
Comunicação dos componentes
Os dispositivos E/S permitem a comunicação entre o computador e o mundo externo, facilitando a interação do usuário com o sistema.
2.4 Dispositivos de Entrada e Saída
2.4 Dispositivos de Entrada e Saída
2.5 As pontes entre componentes
2.5 As pontes entre componentes
Do Start ao SO
Aula 4
| Capítulo 3 - ULA, UC e Registradores |
| A cozinha completa do Chef |
CPU
3. UC, ULA e Registradores
CPU
3. UC, ULA e Registradores
CPU
3. UC, ULA e Registradores
CPU
3. UC, ULA e Registradores
CPU
3. UC, ULA e Registradores
CPU
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
Instruction Register
Contador Programa
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
3. UC, ULA e Registradores
“A CPU sempre busca instruções na memória.
Os dados… só quando precisa.”
3. UC, ULA e Registradores
Cada grupo vira um componente:
🧠 UC (Unidade de Controle)
🧮 ULA
📦 Registradores (R1, R2, R3…)
💾 Memória
📍 PC (Program Counter)
📜 IR (Instruction Register)
Atividade
3. UC, ULA e Registradores
Etapa 1 — FETCH
“Quem sabe onde está a próxima instrução?”
Registrador Instrução
Contador Programa
PC -> Endereço Ex: 100 em memória
Memória RAM -> Instrução ADD R1, R2
IR -> Recebido e alocado
ADD R1, R2
Definido:
R1 = 2
R2 = 33. UC, ULA e Registradores
Etapa 1 — FETCH
Registrador Instrução
Contador Programa
ADD R1, R2
Definido:
R1 = 2
R2 = 3Quem incrementa o PC e quando isso acontece?
A própria CPU, sob controle da UC.
FETCH → (incrementa PC) → DECODE → EXECUTEO PC incrementa sempre sequencialmente?
O PC normalmente anda para frente, mas a UC pode mandar ele pular.
3. UC, ULA e Registradores
Etapa 1 — FETCH
Registrador Instrução
Contador Programa
int i = 0;
while (i < 3) {
i = i + 1;
}100: LOAD R1, 0 ; i = 0
104: CMP R1, 3 ; compara i < 3
108: JGE 120 ; se i >= 3, sai do loop
112: ADD R1, R1, 1 ; i = i + 1
116: JMP 104 ; volta pro loop
120: ENDPC = 100
R1 = ?
PC aponta 100
Memória entrega: LOAD R1, 0
IR recebe
➡️ UC manda executar
✔ Resultado:
R1 = 0
PC → 104
Instrução: CMP R1, 3
ULA:
Compara 0 com 3
➡️ Resultado: menor
✔ PC → 108
JGE 120
➡️ Não (0 < 3)
✔ PC → 112
💥 Aqui tu trava e pergunta:
“Por que não pulou?”
ADD R1, R1, 1
ULA:
0 + 1 = 1
✔ R1 = 1
✔ PC → 116
JMP 104
👉 Aqui quebra o padrão
✔ PC = 104 (não 120, não 120, nem 120 — reforça isso)
3. UC, ULA e Registradores
Etapa 2 — DECODE
“Quem decide isso?”
Registrador Instrução
Contador Programa
UC entra:
“Isso é um ADD”
“Preciso de R1 e R2”
ADD R1, R2
Definido:
R1 = 2
R2 = 33. UC, ULA e Registradores
Etapa 3 — EXECUTE
Registrador Instrução
Contador Programa
Registradores:
R1 → envia 2
R2 → envia 3
ULA:
“2 + 3 = 5”
ADD R1, R2
Definido:
R1 = 2
R2 = 33. UC, ULA e Registradores
Etapa 4 — WRITE BACK
Registrador Instrução
Contador Programa
UC:
“Resultado vai pra R1”
Registrador:
R1 = 5
ADD R1, R2
Definido:
R1 = 2
R2 = 3Aula 5
| Capítulo 4 - Paralelismo e Hazards |
| Desconstruindo a ilusão de processamento instantâneo |
4. Paralelismo e Hazards
Não. Cada núcleo tem seus próprios registradores.
4. Paralelismo e Hazards
Memória RAM
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
4. Paralelismo e Hazards
Aula 6
| Capítulo 5 - Cache, RAM, Armazenamento |
|
Hierarquia de Memória |
5. Cache, RAM e Armazenamento
SSD pode ser 1000× a 100.000× mais lento que a cache
5. Cache, RAM e Armazenamento
5. Cache, RAM e Armazenamento
5. Cache, RAM e Armazenamento
PC Gamer pro meu filho jogar o jogo do peixinho
5. Cache, RAM e Armazenamento
5. Cache, RAM e Armazenamento
Bit: 1 0 1 1 0 0 1 0
└───────┬───────┘
↓
1 BYTE (8 bits)5. Cache, RAM e Armazenamento
BYTE: [8 bits]
WORD: [byte][byte][byte][byte][byte][byte][byte][byte]
└───────────────────── 8 bytes ──────────────────┘
= 1 WORD (64 bits)Na arquitetura x64:
👉 1 palavra (word) = 64 bits = 8 bytes
| Arquitetura | Nome comum | Tamanho da palavra (word) | Bits | Bytes | Observação |
|---|---|---|---|---|---|
| x86 | 32 bits | dword (double word) | 32 | 4 | Muito usada em sistemas antigos |
| x64 | 64 bits | qword (quad word) | 64 | 8 | Padrão atual (seu caso) |
| ARM | 32 bits | word | 32 | 4 | ARM clássico (ARMv7) |
| ARM | 64 bits | word | 64 | 8 | ARM moderno (ARMv8+) |
5. Cache, RAM e Armazenamento
CACHE LINE (64 bytes):
[WORD][WORD][WORD][WORD][WORD][WORD][WORD][WORD]
→ 8 palavras (cada uma com 8 bytes)
→ Total: 64 bytesO cache não trabalha com palavras isoladas — ele trabalha com blocos maiores:
👉 Cache line (linha de cache)
5. Cache, RAM e Armazenamento
L1 CACHE (64 KB): 64*6(núcleos) = 384Kb
[LINE][LINE][LINE][LINE]...[LINE]
Cada LINE = 64 bytes
Total ≈ 1024 linhas
Detalhando:
64 KB = 64 × 1024 = 65.536 bytes
65.536 bytes ÷ 64 bytes = 1024 linhasAgora juntando várias linhas:
👉 Exemplo: L1 (por núcleo = 64 KB)
5. Cache, RAM e Armazenamento
MEMÓRIA (RAM):
[LINE][LINE][LINE][LINE]...[LINE][LINE][LINE]
(na prática: bilhões de bytes)A RAM é muito maior, organizada de forma linear:
5. Cache, RAM e Armazenamento
👉 Ou seja:
| Arquitetura | Palavra | Cache line (típico) | Nº de palavras por linha |
|---|---|---|---|
| x86-64 | 8 bytes | 64 bytes | 8 palavras |
| ARM 64 | 8 bytes | 64 bytes | 8 palavras |
5. Cache, RAM e Armazenamento
👉 “Se você usou um dado agora, provavelmente vai usar de novo em breve.”
5. Cache, RAM e Armazenamento
for (int i = 0; i < 1000; i++) {
soma += vetor[0];
}| RAM |
|---|
| 101011 |
| 101010 |
| 101110 |
| 101001 |
| 101111 |
| 100111 |
| 110111 |
Cache
5. Cache, RAM e Armazenamento
👉 “Se você acessou um endereço, provavelmente vai acessar os vizinhos.”
for (int i = 0; i < 8; i++) {
soma += vetor[i];
}👉 Acessos sequenciais na memória
5. Cache, RAM e Armazenamento
Quando você acessa vetor[0]:
👉 Exemplo:
Então ele já traz:
vetor[0], vetor[1], vetor[2], ..., vetor[7]| RAM |
|---|
| 101011 |
| 101010 |
| 101110 |
| 101001 |
| 101111 |
| 100111 |
| 110111 |
Cache
5. Cache, RAM e Armazenamento
Ocorre quando o processador busca uma
palavra da cache e a encontra
Ocorre quando o processador busca uma
palavra da cache e não a encontra
Ta = (Na)/(Na+Nf), em que:
Ta: taxa de acertos
Na: número de acertos
Nf: número de falhas
5. Cache, RAM e Armazenamento
5. Cache, RAM e Armazenamento
5. Cache, RAM e Armazenamento
Aula 7
| Simulado |
|
Conteúdos abordados até a Aula 6 |
Aula 8
| Capítulo 6 - Localidade e Desempenho |
|
Temporal e Espacial |
6. Localidade e Desempenho
6. Localidade e Desempenho
STALLINGS, W. Arquitetura e Organização de Computadores. 8. ed. São Paulo: Pearson, 2010.
6. Localidade e Desempenho
STALLINGS, W. Arquitetura e Organização de Computadores. 8. ed. São Paulo: Pearson, 2010.
6. Localidade e Desempenho
programa
{
funcao inicio()
{
inteiro vetor[1000]
inteiro i
inteiro soma = 0
para (i = 0; i < 1000; i++)
{
vetor[i] = i
}
para (i = 0; i < 20; i++)
{
escreva("Lendo vetor[0] = ", vetor[0], "\n")
soma = soma + vetor[0]
}
escreva("\nSoma = ", soma, "\n")
}
}6. Localidade e Desempenho
STALLINGS, W. Arquitetura e Organização de Computadores. 8. ed. São Paulo: Pearson, 2010.
6. Localidade e Desempenho
STALLINGS, W. Arquitetura e Organização de Computadores. 8. ed. São Paulo: Pearson, 2010.
6. Localidade e Desempenho
programa
{
funcao inicio()
{
inteiro vetor[1000]
inteiro i
inteiro soma = 0
para (i = 0; i < 1000; i++)
{
vetor[i] = i
}
para (i = 0; i < 20; i++)
{
escreva("Lendo vetor[", i, "] = ", vetor[i], "\n")
soma = soma + vetor[i]
}
escreva("\nSoma = ", soma, "\n")
}
}6. Localidade e Desempenho
programa
{
funcao inicio()
{
inteiro vetor[1000]
inteiro ordem[20]
inteiro i
inteiro soma = 0
para (i = 0; i < 1000; i++)
{
vetor[i] = i
}
ordem[0] = 10
ordem[1] = 500
ordem[2] = 3
ordem[3] = 700
ordem[4] = 25
ordem[5] = 900
ordem[6] = 1
ordem[7] = 450
ordem[8] = 100
ordem[9] = 800
ordem[10] = 2
ordem[11] = 600
ordem[12] = 30
ordem[13] = 950
ordem[14] = 4
ordem[15] = 300
ordem[16] = 50
ordem[17] = 750
ordem[18] = 5
ordem[19] = 999
para (i = 0; i < 20; i++)
{
escreva("Lendo vetor[", ordem[i], "] = ", vetor[ordem[i]], "\n")
soma = soma + vetor[ordem[i]]
}
escreva("\nSoma = ", soma, "\n")
}
}6. Localidade e Desempenho
6. Localidade e Desempenho
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TAM 10000000 //10 milhões de elementos
#define REP 20
int main() {
printf("Tamanho do int: %zu bytes\n", sizeof(int));
printf("Tamanho dos elementos: %d\n", TAM);
int *vetor = malloc(TAM * sizeof(int));
int *ordem = malloc(TAM * sizeof(int));
if (vetor == NULL || ordem == NULL) {
printf("Erro ao alocar memoria\n");
free(vetor);
free(ordem);
return 1;
}
printf("%p\n", vetor); // posições de memoria
printf("%p\n", ordem);
for (int i = 0; i < TAM; i++) {
vetor[i] = i;
ordem[i] = (i * 37) % TAM;
}
volatile long long soma = 0;
clock_t inicio, fim;
// SEQUENCIAL
inicio = clock();
for (int r = 0; r < REP; r++) {
for (int i = 0; i < TAM; i++) {
soma += vetor[i];
}
}
fim = clock();
double tempo_seq = (double)(fim - inicio) / CLOCKS_PER_SEC;
// ALEATORIO
soma = 0;
inicio = clock();
for (int r = 0; r < REP; r++) {
for (int i = 0; i < TAM; i++) {
soma += vetor[ordem[i]];
}
}
fim = clock();
double tempo_rand = (double)(fim - inicio) / CLOCKS_PER_SEC;
printf("Sequencial: %.6f s\n", tempo_seq);
printf("Aleatorio : %.6f s\n", tempo_rand);
free(vetor); //Liberar o espaço de memória
free(ordem);
return 0;
}6. Localidade e Desempenho
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TAM 10000000
#define REP 10
int main() {
printf("Tamanho do int: %zu bytes\n", sizeof(int));
double memoria_um_vetor = (TAM * sizeof(int)) / (1024.0 * 1024.0);
double memoria_total = (2 * TAM * sizeof(int)) / (1024.0 * 1024.0);
printf("Memoria de um vetor: %.2f MB\n", memoria_um_vetor);
printf("Memoria total estimada: %.2f MB\n\n", memoria_total);
int *vetor = malloc(TAM * sizeof(int));
int *ordem = malloc(TAM * sizeof(int));
if (vetor == NULL || ordem == NULL) {
printf("Erro ao alocar memoria.\n");
free(vetor);
free(ordem);
return 1;
}
printf("Endereco vetor: %p\n", (void *)vetor);
printf("Endereco ordem: %p\n\n", (void *)ordem);
clock_t inicio_init = clock();
for (int i = 0; i < TAM; i++) {
vetor[i] = i;
ordem[i] = (i * 37) % TAM;
}
clock_t fim_init = clock();
double tempo_init = (double)(fim_init - inicio_init) / CLOCKS_PER_SEC;
printf("Inicializacao concluida.\n");
printf("Tempo de inicializacao: %.6f s\n\n", tempo_init);
volatile long long soma = 0;
clock_t inicio, fim;
// -----------------------------
// FASE 1 - ACESSO SEQUENCIAL
// -----------------------------
printf("Iniciando fase sequencial...\n");
inicio = clock();
for (int r = 0; r < REP; r++) {
for (int i = 0; i < TAM; i++) {
soma += vetor[i];
}
printf(" Sequencial: repeticao %d de %d concluida\n", r + 1, REP);
}
fim = clock();
double tempo_seq = (double)(fim - inicio) / CLOCKS_PER_SEC;
printf("Fase sequencial concluida.\n");
printf("Soma sequencial: %lld\n", soma);
printf("Tempo sequencial: %.6f s\n\n", tempo_seq);
// -----------------------------
// FASE 2 - ACESSO ALEATORIO
// -----------------------------
soma = 0;
printf("Iniciando fase aleatoria...\n");
inicio = clock();
for (int r = 0; r < REP; r++) {
for (int i = 0; i < TAM; i++) {
soma += vetor[ordem[i]];
}
printf(" Aleatorio: repeticao %d de %d concluida\n", r + 1, REP);
}
fim = clock();
double tempo_rand = (double)(fim - inicio) / CLOCKS_PER_SEC;
printf("Fase aleatoria concluida.\n");
printf("Soma aleatoria: %lld\n", soma);
printf("Tempo aleatorio: %.6f s\n\n", tempo_rand);
// -----------------------------
// COMPARACAO FINAL
// -----------------------------
printf("Resumo final:\n");
printf("Tempo sequencial: %.6f s\n", tempo_seq);
printf("Tempo aleatorio : %.6f s\n", tempo_rand);
if (tempo_seq > 0) {
printf("Aleatorio / Sequencial = %.2f vezes\n", tempo_rand / tempo_seq);
}
free(vetor);
free(ordem);
return 0;
}Aula 9
| Capítulo 7 - Sistema Operacional |
|
Kernel e Modos de Execução |
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional
Resposta: O Kernel coleta os dados físicos e os entrega ao programa
7. Sistema Operacional
tasklist
Get-ProcessNo Windows vamos verificar processos:
Como salvar a saída de um programa em arquivo?
icacls arquivo.txt /deny Todos:R
type arquivo.txt (no CMD) ou Get-Content arquivo.txt (No PowerShell)Como alterar a permissão de um arquivo:
Agora experimente abrir o terminal no modo administrador e ler o arquivo.
icacls arquivo.txt /remove:d Todoscommando > arquivo7. Sistema Operacional
7. Sistema Operacional
7. Sistema Operacional