DEV Community

Yuri
Yuri

Posted on • Edited on

Subsistema de memória

A memória é um elemento do sistema de computação cujo tem como objetivo armazenar informação que são (ou serão) manipuladas por este sistema. Elas armazenam estas informações (dados ou instruções) para que seja prontamente recuperadas, quando necessário.

Como as informações são representadas na memória??

Em um sistema de computação a memória tem como elemento básico de armazenamento físico, o bit. Fisicamente ela é construída de modo a representar bit por bit. A forma pelo qual cada bit é identificado na memória é variado: pode ser um sinal elétrico, por campo magnético ou por presença/ausência de luz.

Gerenciamento de memória

O gerenciamento de memória é uma parte essencial do sistema operacional, que controla e coordena o uso da memória em um sistema computacional. Ele permite que múltiplos programas e processos sejam executados simultaneamente, sendo responsável por alocar, liberar e monitorar o uso eficiente e seguro da memória. A gestão adequada da memória é crucial para aumentar o grau de multiprogramação e otimizar o uso desse recurso.

Por que o gerenciamento de memória é importante??

A memória principal é uma parte essencial de um sistema de computação. Ela permite que a CPU (ou UCP - Unidade Central de Processamento - o que chamamos de processador) acesse os dados necessários para a execução dos processos. No entanto, operações frequentes de leitura e gravação podem desacelerar o sistema. Portanto, para melhorar o uso da CPU e o desempenho do computador, vários processos residem na memória simultaneamente. O gerenciamento de memória é importante para que ele realize a divisão da memória entre os processos em execução de maneira mais eficiente possível.

Hierarquia de memória

A hierarquia de memória tem como objetivo organizar os componentes de memória com base em seu tempo de acesso e resposta. O tempo de acesso e resposta refere-se ao intervalo entre o momento em que a CPU solicita um dado a uma memória e o momento em que o dado é localizado, recuperado e entregue à CPU. Esse tempo engloba todas as etapas do processo, desde a solicitação até a devolução do dado.

Por que a hierarquia de memória é importante??

A memória principal de um sistema de computação moderno é baseada em DRAM, memória esta muito lenta para que a CPU possa operar a toda velocidade. Mas há um tipo de RAM capaz de fazê-lo, sendo esta, a SRAM. Porém, o custo é maior para uso como memória principal. A SRAM, então, é integrada no próprio processador (ou perto dele) e é usado alguns mecanismos de hardware inteligente para garantir que os dados que nossa CPU necessita, esteja nesta memória o mais rápido possível. Isso é chamado de cache.
A hierarquia de memória então, organiza separadamente essas memórias (e mais algumas outras) visando esses dispositivos de armazenamentos com base em seu tamanho, custo, velocidade de acesso, etc...
A hierarquia de memória simplifica a gestão de memória e facilita também a distribuição de dados.

Image description

Registradores

Os registradores são a memória de acesso mais rápido em um sistema de computação, mas, consequentemente, a de menor capacidade de tamanho. Eles são usados como dispositivos de armazenamento temporário. Existem vários registradores de uso geral ou específico. Como exemplo de um, temos o registrador PC (Program Counter), este indica a próxima instrução que o processador deve buscar para execução.

Os registradores estão localizados internamente dentro da CPU, e a quantidade pode variar conforme a arquitetura do sistema. Por exemplo, na arquitetura x86 há 8 registradores de uso geral. O limite de armazenamento depende da arquitetura do processador. Se seu sistema é 64 bits, então cada registrador é capaz de armazenar 64 bits. Já em sistema de 32 bits, o limite para cada registrador são 32 bits.

Registradores de uso geral:

Os nomes destes serão escritos em inglês porque na grande maioria das vezes nós vemos os nomes nesta língua.

Accumulator Register (AX): Usado em operações aritméticas.

Counter Register (CX): Usado em instruções e loops de deslocamentos/rotações.

Data Register (DX): Usado para armazenar dados de operações aritméticas e também operações de entrada/saída (Input/Output - I/O).

Base Register (BX): Usado como um ponteiro para dados.

Stack Pointer Register (SP): Usado como um ponteiro para o topo da pilha.

Stack Base Pointer Register (BP): Usado como um ponteiro para a base da pilha.

Source Index Register (SI): Usado como um ponteiro para o endereço de origem em operações de manipulação de strings e memória.

Destination Index (DI): Usado como um ponteiro para o endereço de destino em operações de manipulação de strings e memória.

Um detalhe é que essas abreviações como AX, CX, DX são usadas para se referir aos 16 bits menos significativos do registrador. Para se referir aos seus 32 bits, é estendido uma letra "E" no começo do nome de cada registrador, essa letra vem justamente de "extended", em inglês. Ficaria então, da seguinte forma: EAX, ECX, EDX... Para se referir aos seus 64 bits, nós substituímos a letra "E" pela letra "R", ficando da seguinte forma: RAX, RCX, RDX...
Nos registradores de 16 bits, nós também podemos acessar seus 8 bits mais significativos e menos significativos. Os 8 bits mais significativos podem ser acessados como AH (High) e os 8 bits menos significativos podem ser acessados como AL (Low).

Cache

Abaixo dos registradores na hierarquia de memória, nós temos a memória cache. A memória cache é uma memória intermediária que fica entre a UCP e a memória principal, esta é acessada pela UCP antes da memória principal para verificar se os dados que a UCP necessita, já estão na memória cache. Se estiver, então temos um cache hit, isso quer dizer que os dados necessários já estão de prontidão em nossa memória cache. Caso contrário, se não houver os dados que precisamos, então temos um cache miss, o que quer dizer que não foi possível encontrar os dados em nossa memória cache.

Um dos obstáculos para um avanço maior de velocidade de processamento por parte da UCP, é a diferença de velocidade entre o ciclo de tempo da UCP e o ciclo de tempo da memória principal. Isso quer dizer que a memória principal transfere bits em velocidade inferior à da UCP, o que faz com que seja necessário, adicionar um tempo de espera para a UCP - wait state, estado de espera em inglês.
Isso se dá pelo fato de que, em média, o desempenho das UCPs dobram a cada 18 a 24 meses, mas é diferente para a velocidade de transferência das memórias DRAMs (Dynamic RAMs) - memórias estas que são utilizadas como memória principal. A velocidade de transferência aumenta, em média, de ano para ano, mas cerca de 10% apenas.
Caso haja interesse de sua parte sobre o assunto, procure sobre "Gargalo de Von Neumann".

Localidade temporal e espacial

A execução dos programas em nossos computadores se realiza, em média, em pequenos grupos de instruções. Este fato nos dá o sentido do conceito de localidade. Observe que se um programa acessa uma palavra da memória, há uma alta probabilidade de que ele necessite acessa-la novamente futuramente, isto é a localidade temporal. E se o programa realiza um acesso a uma palavra da memória, há uma alta probabilidade de que o programa acesse uma palavra subsequente ou até mesmo um endereço anterior ao que ele acabou de acessar, este é o princípio da localidade espacial.
Para quem desenvolve, aqui vai uma explicação em nossa linguagem:
Localidade temporal: Se um programa acessa uma variável diversas vezes em um loop, essa variável então, tende a permanecer na memória cache.
Localidade espacial: Ao ler dados de um array, provavelmente elementos próximos no array também serão acessados.

Acesso a memória com uma cache

Com uma memória cache em nosso sistema de computação, como já citado anteriormente, sempre que a UCP necessitar de dados/instruções, ela primeiro irá acessar a memória cache antes da memória principal.
Costuma-se, hoje em dia, haver 3 níveis de cache no sistema:

  • Cache de nível 1 (Level 1) ou L1: Localizada no interior do processador. Uma velocidade de acesso equivalente à da UCP, mas com menor capacidade de armazenamento.

  • Cache de nível 2 (Level 2) ou L2: Em sistemas modernos, esta também é localizada internamente ao processador, com maior latência e capacidade de armazenamento que a L1. Em sistemas mais antigos, esta era localizada na placa-mãe do computador, isto é, externa ao processador.

  • Cache de nível 3 (Level 3) ou L3: Também localizada internamente ao processador em muitos sistemas modernos, esta possui a maior capacidade de armazenamento entre os três níveis de cache, mas consequentemente, a de latência maior.

A busca se inicia primeiramente pela cache L1, conhecida também como cache primária. Se houver um cache hit, o tempo de acesso será quase instantâneo, visto que esta é localizada internamente ao processador e consequentemente, sua velocidade de transferência se equivale a velocidade da UCP. Caso houver um cache miss, buscará na L2; desta para a memória L3 (se houver uma); da memória L3 para a memória DRAM (memória principal); da memória DRAM para o disco.
Aplicando o conceito de localidade, se a instrução/dado não for encontrado na memória cache e houver a necessidade de se buscar na memória principal, será então, transferido um bloco de palavras para a memória cache. Obviamente, o bloco transferido irá conter a instrução desejada. Com o bloco transferido para a cache, se o processador necessitar a instrução seguinte, esta já estará presente em nossa memória cache.

Encerrarei aqui sobre a memória cache, mas há muito mais para se ver, como por exemplo, mapeamento de dados, algoritmos de substituição de dados, política de escrita da memória cache, etc...

Memória Principal

...

Top comments (0)