"Compreensão aprofundada de sistemas de computador" (CSAPP), lendo notas - Capítulo um Roaming de sistema de computador

Este capítulo começa a aprender o sistema de computador rastreando o ciclo de vida do programa Hello. Um programa de origem começa quando é criado pelo programador, é executado no sistema, gera uma mensagem simples e, em seguida, termina. Apresentaremos brevemente alguns conceitos-chave, termos técnicos e componentes que estão surgindo gradualmente ao longo do ciclo de vida deste programa.

  Não atualizo o blog há muito tempo. Desde o Dia Nacional até agora, tenho classificado algumas informações sobre recrutamento de outono, modelos de currículo, resumo de pontos de conhecimento de entrevista de software integrado, classificação de perguntas de exame escritas de recrutamento de outono e revisão de resumo face a face. Um total de quase 400 páginas, 16W palavras, foram classificadas. A propósito, também classifiquei as informações no Baidu Netdisk, e não foi concluído até 16/10 (se você precisar de informações, minhas informações de contato estão na página inicial). Devo dizer que organizar informações é realmente uma natureza humana.

  O próximo plano é complementar o conhecimento relacionado a sistemas operacionais e princípios de composição de computadores. Vamos começar com o livro "Compreensão em profundidade de sistemas de computador" e estudar o livro "Compreensão em profundidade de sistemas de computador" com o sistema de vídeo da CMU. Existem 9 laboratórios que podem ser usados ​​para aprofundar a compreensão. O plano inicial é ter um capítulo por semana (não sei se vai funcionar) e se esforçar para terminar isso antes das férias de inverno.

  Colocarei alguns pontos de conhecimento importantes no processo de leitura do livro, a compreensão de conceitos e o processo detalhado de fazer experimentos no blog, coluna de compreensão aprofundada de sistemas de computador . Bem-vindo a seguir meu blog para obter o conteúdo atualizado do artigo o mais rápido possível.

  Abaixo está um breve resumo do primeiro capítulo deste livro.

Como o programa fonte é armazenado

#include <stdio.h>
int main()
{
    
    
	printf("hello,world\n");
	return 0;
}

  O programa acima é um arquivo de texto criado por um editor de texto e salvo como hello.c. O programa de origem é na verdade uma sequência de bits (também chamados de bits) composta pelos valores 0 e 1. Os 8 bits são organizados em um grupo chamado byte. Cada byte representa algum caractere de texto no programa. Os computadores modernos usam o padrão ASCII para representar caracteres de texto. Os caracteres de texto ASCII do programa hello.c são mostrados abaixo.

image-20201019170810469

  O programa hello.c é armazenado no arquivo como uma sequência de bytes .

  O método de representação de hello.c ilustra uma ideia básica: todas as informações no sistema, incluindo arquivos de disco, programas na memória, dados do usuário armazenados na memória e dados transmitidos na rede, são representados por uma sequência de bits . A única maneira de distinguir diferentes objetos de dados é quando lemos o contexto desses objetos de dados .

O processo do programa de origem ao arquivo executável

  O driver do compilador GCC lê o arquivo fonte hello.c e o traduz em um arquivo executável hello. Esse processo de tradução pode ser dividido em quatro etapas: pré-compilação, compilação, montagem e vinculação.

image-20201019171458969

Pré-compilado

  No processo de pré-compilação, trata principalmente de instruções de pré-processamento no código-fonte, introduzindo arquivos de cabeçalho, removendo comentários, processando todas as instruções de compilação condicional (# ifdef, # ifndef, # else, # elif, # endif) e substituição de macro , Adicione o número da linha e mantenha todas as instruções do compilador .

Compilar

  Após o término do pré-processamento, ele é compilado. O que o processo de compilação faz é realizar análise gramatical, análise lexical, análise semântica, resumo de símbolo no arquivo pré-processado e, em seguida, gerar o código assembly .

compilação

  O processo de montagem converte o código de montagem em um arquivo binário, e o arquivo binário pode ser lido pela máquina . Cada instrução assembly produz uma frase em linguagem de máquina.

ligação

  O arquivo objeto gerado pelo montador não pode ser executado imediatamente e pode haver muitos problemas não resolvidos. Por exemplo, uma função em um arquivo de origem pode se referir a um símbolo definido em outro arquivo de origem (como uma variável ou chamada de função, etc.); uma função em um arquivo de biblioteca pode ser chamada no programa. Todos esses problemas só podem ser resolvidos pelo processamento do programa de link . A principal tarefa do vinculador é conectar os arquivos-objetos relacionados entre si, ou seja, conectar os símbolos referenciados em um arquivo com a definição do símbolo em outro arquivo, de modo que todos esses arquivos-objeto se tornem um que possa ser instalado pelo sistema operacional. No todo unificado de execução .

qual é a concha

  O shell é um interpretador de linha de comando. Ele exibe um prompt, espera que uma linha de comando seja inserida e, em seguida, executa o comando. Se a primeira palavra da linha de comando não for um comando shell embutido, o shell assumirá que este é o nome de um arquivo executável e irá carregar e executar o arquivo.

Composição de hardware de um sistema típico

ônibus

  Percorrendo todo o sistema está um conjunto de canais eletrônicos chamados de ônibus. Normalmente, um bloco de bytes de comprimento fixo é transmitido no barramento , ou seja, uma palavra. O número de bytes em uma palavra (comprimento da palavra) é um parâmetro básico do sistema . Sistemas diferentes têm comprimentos de palavras diferentes. Por exemplo, o comprimento da palavra de um sistema de 32 bits é 4 bytes, e o comprimento da palavra de um sistema de 64 bits é 8 bytes.

Dispositivo IO

  O equipamento de E / S (entrada / saída) é o canal de comunicação entre o sistema e o mundo externo . Nosso sistema de exemplo inclui quatro dispositivos de E / S: um teclado e mouse para entrada do usuário, um monitor para saída do usuário e uma unidade de disco (em suma, um disco) para armazenamento de longo prazo de dados e programas .

  Cada dispositivo IO é conectado ao barramento I / O por meio de um controlador ou adaptador . A principal diferença entre o controlador e o adaptador está na embalagem. O controlador é o chipset no próprio dispositivo de E / S ou a placa de circuito impresso principal (geralmente chamada de placa-mãe) do sistema. O adaptador é um cartão inserido no slot da placa-mãe. Em qualquer caso, a sua função é a permuta de informação entre o bus de E / S e dispositivos de I / O .

Memória principal

  A memória principal é um dispositivo de armazenamento temporário usado para armazenar o programa e os dados processados ​​pelo programa quando o processador o executa. Fisicamente falando, a memória principal é composta por um grupo de chips de memória dinâmica de acesso aleatório (DRAM) . Logicamente falando, a memória é um array linear de bytes , cada byte tem seu endereço único (índice do array), esses endereços começam do zero.

processador

  A unidade central de processamento (CPU), conhecida como processador, é um mecanismo que executa instruções armazenadas na memória principal. O núcleo do processador é um dispositivo de armazenamento (ou registro) com o tamanho de uma palavra, denominado contador de programa (PC). A qualquer momento, o PC aponta para uma determinada instrução em linguagem de máquina na memória principal (ou seja, o endereço que contém a instrução).

Execute o programa hello

  Depois que o shell lê o "./hello" que inserimos no teclado, o fluxo de informações no computador é mostrado pela linha vermelha na figura a seguir:

  Teclado-> Controlador USB-> Barramento de E / S-> Ponte de E / S-> Barramento de Sistema-> Registrar

  Registro-> Barramento de Sistema-> Ponte de E / S-> Barramento de Memória-> Memória Principal

  O programa shell precisa usar a entrada do usuário como uma variável, e essa variável deve ter um endereço na memória, para que eventualmente alcance a memória.

image-20201019191356753

  Quando pressionamos a tecla Enter do teclado, o programa shell sabe que completamos a entrada do comando. Em seguida, o shell executa uma série de instruções para carregar o arquivo executável Olá. Essas instruções copiam o código e os dados no arquivo de destino Olá do disco para a memória principal . Os dados incluem a cadeia de caracteres "hello, wor1d \ n" que eventualmente será gerada. O fluxo de informações é o seguinte.

  Disco-> Controlador de Disco-> Barramento de E / S-> Ponte de E / S-> Barramento de Memória-> Memória Principal

  Este método de acesso aos dados não passa pela CPU, mas diretamente do disco para a memória principal, é denominado DMA . O DMA (Direct Memory Access) ajuda a reduzir a carga na CPU, permitindo que a CPU execute outras tarefas durante a transferência de dados.

image-20201019191522808

  Após carregar o arquivo hello, a CPU começará a executar as instruções da função principal do programa hello. Estas instruções copiam os bytes na string "hello, world \ n" da memória principal para o arquivo de registro e, em seguida, do arquivo de registro para o dispositivo de exibição e, finalmente, são exibidos na tela. O fluxo de informações é mostrado na figura abaixo.

  Memória principal-> registro-> barramento do sistema-> ponte I / O-> barramento I / O-> adaptador gráfico-> display

image-20201019191644207

esconderijo

  Ao executar o programa hello, podemos saber que as instruções e os dados precisam ser copiados para frente e para trás entre os registradores, a memória principal e o disco muitas vezes. Essas cópias são, na verdade, sobrecarga, o que diminui a velocidade do programa. Desta vez, precisamos armazenar em cache a memória (memória cache) para resolver este problema.

image-20201019195237101

  A capacidade do cache L1 pode atingir dezenas de milhares de bytes , e a velocidade de acesso é quase tão rápida quanto o arquivo de registro.

  Capacidade de cache L2 de centenas de milhares a milhões de bytes , acoplada ao processador por meio de um barramento especial. O tempo para um processo acessar o cache L2 é 5 vezes maior do que o tempo para acessar o cache L1, mas ainda é 5 a 10 vezes mais rápido do que o tempo para acessar a memória principal.

  O cache L1 e L2 é chamado de técnicas de hardware de memória de acesso aleatório estática (SRAM) .

  O princípio da localidade do cache : os programas tendem a acessar dados e códigos em áreas locais. Portanto, a memória cache serve como uma área de teste temporária para armazenar informações de que o processador pode precisar em um futuro próximo .

Hierarquia de dispositivos de armazenamento

  De cima para baixo, a velocidade de acesso do dispositivo está ficando cada vez mais lenta, a capacidade está cada vez maior e o custo por byte está ficando mais barato. O arquivo de registro está no topo da estrutura hierárquica, que é o nível 0 ou denotado como L0.

image-20201019200335061

  A ideia principal da hierarquia da memória é que a memória superior é usada como cache da memória inferior . Portanto, o arquivo de registro é o cache L1, L1 é o cache L2, L2 é o cache L3, L3 é o cache de memória principal e a memória principal é o cache de disco.

Hardware de gerenciamento do sistema operacional

  O sistema operacional é uma camada de software inserida entre o aplicativo e o hardware. Todas as tentativas dos aplicativos de operar o hardware devem passar pelo sistema operacional.

  O sistema operacional tem duas funções básicas : (1) Evitar que o hardware seja abusado por aplicativos fora de controle; (2) Fornecer aos aplicativos um mecanismo simples e consistente para controlar dispositivos de hardware de baixo nível complexos e muitas vezes muito diferentes.

  O sistema operacional implementa essas duas funções por meio de vários conceitos abstratos básicos (processos, memória virtual e arquivos): um arquivo é uma representação abstrata dos dispositivos de E / S e a memória virtual é uma representação abstrata da memória principal e dos dispositivos de E / S do disco. , o processo é uma representação abstracta do processador, a memória principal e dispositivos I / o .

image-20201019201009252

Processo e discussão

  Um processo é uma abstração de um programa em execução pelo sistema operacional. Vários processos podem ser executados simultaneamente em um sistema , e cada processo parece estar usando hardware exclusivamente . Operação simultânea significa que as instruções de um processo e as instruções de outro processo são intercaladas.

  Contexto: O sistema operacional mantém e rastreia todas as informações de estado (valor do PC, conteúdo da memória principal etc.) necessárias para que o processo seja executado.

  Alternância de contexto: O sistema operacional controla o processador para alternar entre os processos para obter a execução intercalada.

  A transição de um processo para outro é gerenciada pelo kernel do sistema operacional. O kernel é a parte principal da memória do código do sistema operacional. O kernel não é um processo separado. Em vez disso, é uma coleção de códigos e estruturas de dados usados ​​pelo sistema para gerenciar todos os processos .

image-20201019203213287

Um processo é composto por várias unidades de execução chamadas threads.Cada thread é executada no contexto do processo e compartilha o mesmo código e dados globais . Multithreading é mais fácil de compartilhar dados do que vários processos, e a sobrecarga de alternar entre threads é muito menor do que a de alternar processos.

Memória virtual

  A memória virtual é um conceito abstrato, que fornece uma ilusão para cada processo, ou seja, cada processo está utilizando exclusivamente a memória principal . A memória que cada processo vê é consistente, o que é chamado de espaço de endereço virtual.

image-20201019203450101

  A figura acima divide o espaço de endereço virtual em várias partes e usa setas para indicar a direção de expansão dessa parte. O endereço mais baixo é 0 e o endereço para cima aumenta gradualmente. As funções de cada parte são as seguintes:

   Código e dados do programa: armazene o código do programa executável e as variáveis ​​globais no código.

  Heap: Variáveis ​​de memória usadas para aplicativos dinâmicos, como mallocespaço de memória dinâmico aplicado por funções, podem ser expandidas para cima.

  Biblioteca compartilhada: usada para armazenar o código e os dados das funções da biblioteca da linguagem C. O printfcódigo e os dados neste exemplo .

  Pilha: localizado no topo do espaço de endereço virtual, usado para chamadas de função, armazenamento de variáveis ​​locais, etc. Quando chamamos uma função, a pilha se expande para baixo e, quando retornamos, diminui para cima.

  Memória virtual do kernel: A área na parte superior do espaço de endereço é reservada para o kernel. Os aplicativos não têm permissão para ler ou gravar o conteúdo desta área ou chamar funções definidas pelo código do kernel. Em vez disso, eles devem chamar o kernel para realizar essas operações. Para um sistema operacional de 64 bits, o espaço do usuário é 0-3G e o espaço do kernel é 3G-4G. (Qual é a diferença entre o espaço do usuário e o espaço do kernel, consulte o resumo dos pontos de conhecimento das entrevistas escritas para engenheiros de software integrados nos materiais de recrutamento de outono)

Simultaneidade e paralela

  Concorrência : significa que, ao mesmo tempo, existem várias instruções executadas em vários processadores simultaneamente . Portanto, independentemente da visão micro ou macro, ambos são executados juntos.

img

  Paralelo : Significa que apenas uma instrução pode ser executada ao mesmo tempo, mas as instruções de vários processos são executadas em uma rotação rápida, fazendo com que vários processos sejam executados ao mesmo tempo no nível macro, mas não ao mesmo tempo no nível micro, apenas no tempo Divida em várias seções para permitir que vários processos sejam executados alternadamente com rapidez .

img

Processador multi-core e multi-thread

  Processador multi-core : Um processador multi-core integra várias CPUs (chamadas "núcleos") em um chip de circuito integrado. Conforme mostrado na figura abaixo, o chip do microprocessador tem 4 núcleos de CPU, cada um com seus próprios caches L1 e L2. O cache L1 é dividido em duas partes - uma contém as instruções obtidas mais recentemente, a outra Armazenamento de dados. Esses núcleos compartilham caches de nível superior e interfaces com a memória principal.

image-20201019212750093

  Hyper-threading : Hyper-threading, às vezes chamado de multi-threading simultâneo (multi-threading simultâneo), é uma tecnologia que permite que uma CPU execute múltiplos fluxos de controle . Por exemplo, o processador Intel Core i7 permite que cada núcleo execute dois threads, de modo que um sistema de 4 núcleos pode realmente executar 8 threads em paralelo.

  Desenvolva um hábito, goste primeiro e depois observe! Se você acha que a escrita é boa, bem-vindo, um clique de três links, obrigado!

Declaração de direitos autorais: este artigo é o artigo original do blogger e segue o contrato de direitos autorais CC 4.0 BY-SA. Anexe o link da fonte original e esta declaração para reimpressão.
Link para este artigo: https://blog.csdn.net/qq_16933601/article/details/109169750

Acho que você gosta

Origin blog.csdn.net/qq_16933601/article/details/109169750
Recomendado
Clasificación