# Memória do computador

A memória do computador armazena informações, como dados e programas para uso imediato no computador. O termo memória muitas vezes é sinônimo de armazenamento primário ou memória principal. Um sinônimo arcaico para memória é armazenamento.
A memória do computador opera em alta velocidade em comparação com o armazenamento, que é mais lento, mas mais barato e tem maior capacidade. Além de armazenar programas abertos, a memória do computador funciona como cache de disco e buffer de gravação para melhorar o desempenho de leitura e gravação. Sistemas operacionais utilizam a capacidade da RAM para fazer cache, desde que não seja necessária pelo software em execução. Se necessário, o conteúdo da memória do computador pode ser transferido para o armazenamento; uma maneira comum de fazer isso é por meio de uma técnica de gerenciamento de memória chamada memória virtual.
A memória do computador moderna é implementada como memória semicondutora, onde os dados são armazenados dentro de células de memória construídas a partir de transistor MOSFET e outros componentes em um circuito integrado. Existem dois tipos principais de memória semicondutora: volátil e não volátil. Exemplos de memória não volátil são memória flash e ROM, PROM, EPROM e memória EEPROM. Enquanto para memória volátil os exemplos são a memória dinâmica de acesso aleatório (DRAM) usada para armazenamento primário, e a memória de acesso aleatório (SRAM) usada para cache do processador.
A maioria da memória semicondutora é organizada em células de memória, cada uma armazenando um bit (0 ou 1). A organização da memória flash inclui tanto um bit por célula de memória quanto célula de vários níveis capaz de armazenar vários bits por célula. As células de memória são agrupadas em palavras de comprimento fixo, por exemplo, 1, 2, 4, 8, 16, 32, 64 ou 128 bits. Cada palavra pode ser acessada por um endereço binário de N bits, tornando possível armazenar 2$^N$ palavras na memória.

## História

No início da década de 1940, a tecnologia de memória frequentemente permitia uma capacidade de apenas alguns bytes. O primeiro computador digital eletrônico programável, o ENIAC, usando milhares de tubos de vácuo, podia realizar cálculos simples envolvendo 20 números de dez dígitos decimais armazenados nos tubos de vácuo.
O próximo avanço significativo na memória do computador veio com a memória de linha de atraso acústica, desenvolvida por J. Presper Eckert no início da década de 1940. Através da construção de um tubo de vidro cheio de mercúrio e tampado em cada extremidade com um cristal de quartzo, as linhas de atraso podiam armazenar unidades de informação na forma de ondas sonoras que se propagam através do mercúrio, com os cristais de quartzo atuando como transdutores para ler e gravar bits. A memória de linha de atraso era limitada a uma capacidade de até alguns milhares de bits.
Duas alternativas à linha de atraso, o tubo de Williams e o tubo Selectron, originaram-se em 1946, ambos usando feixes de elétrons em tubos de vidro como meio de armazenamento. Usando tubos de raios catódicos, Fred Williams inventou o tubo de Williams, que foi a primeira memória do computador de acesso aleatório. O tubo de Williams conseguia armazenar mais informações do que o tubo Selectron (o Selectron era limitado a 256 bits, enquanto o tubo de Williams podia armazenar milhares) e era menos caro. No entanto, o tubo de Williams era frustrantemente sensível a perturbações ambientais.
Os esforços começaram no final da década de 1940 para encontrar uma memória não volátil. A memória de núcleo magnético permitia a recuperação da memória após a perda de energia. Foi desenvolvida por Frederick W. Viehe e An Wang no final da década de 1940 e aprimorada por Jay Forrester e Jan A. Rajchman no início da década de 1950, antes de ser comercializada com o computador Whirlwind em 1953. A memória de núcleo magnético foi a forma dominante de memória até o desenvolvimento da memória de semicondutor MOS na década de 1960.
A primeira memória de semicondutor foi implementada como um circuito flip-flop no início da década de 1960 usando transistores de junção bipolar. A memória de semicondutor feita a partir de dispositivo discretos foi enviada pela primeira vez pela Texas Instruments para a Força Aérea dos Estados Unidos em 1961. No mesmo ano, o conceito de estado sólido de memória em um circuito integrado (CI) foi proposto pelo engenheiro de aplicações Bob Norman na Fairchild Semiconductor. O primeiro chip de CI de memória de semicondutor bipolar foi o SP95 introduzido pela IBM em 1965. Embora a memória de semicondutor oferecesse melhor desempenho em relação à memória de núcleo magnético, ela permanecia maior e mais cara e não substituiu a memória de núcleo magnético até o final da década de 1960.

### Memória MOS

A invenção do transistor de efeito de campo metal-óxido-semicondutor (MOSFET) permitiu o uso prático de transistores de metal-óxido-semicondutor (MOS) como elementos de armazenamento de células de memória. A memória MOS foi desenvolvida por John Schmidt na Fairchild Semiconductor em 1964. Além de maior desempenho, a memória semicondutor MOS era mais barata e consumia menos energia do que a memória de núcleo magnético. Em 1965, J. Wood e R. Ball da Royal Radar Establishment propuseram sistemas de armazenamento digital que usam células de memória CMOS (metal-óxido-semicondutor complementar), além de dispositivos de potência MOSFET para a fonte de alimentação semicondutora, acoplamento cruzado comutado, fontes de alimentação e armazenamento de linha de atraso. O desenvolvimento da tecnologia de porta de silício MOSFET (CI MOS) por Federico Faggin na Fairchild em 1968 permitiu a produção de chip de memória MOS. A memória NMOS foi comercializada pela IBM no início da década de 1970. A memória MOS ultrapassou a memória de núcleo magnético como a tecnologia de memória dominante no início da década de 1970.
Os dois principais tipos de memória de acesso aleatório volátil (RAM) são a de acesso aleatório (SRAM) e a memória dinâmica de acesso aleatório (DRAM). A SRAM bipolar foi inventada por Robert Norman na Fairchild Semiconductor em 1963, seguida pelo desenvolvimento da SRAM MOS por John Schmidt na Fairchild em 1964. A SRAM tornou-se uma alternativa à memória de núcleo magnético, mas requer seis transistores para cada bit de dados. O uso comercial da SRAM começou em 1965, quando a IBM introduziu seu chip SRAM SP95 para o System/360 Model 95.
A Toshiba introduziu células de memória DRAM bipolares para sua calculadora eletrônica Toscal BC-1411 em 1965. Embora tenha oferecido desempenho aprimorado, a DRAM bipolar não pôde competir com o preço mais baixo da então dominante memória de núcleo magnético. A tecnologia MOS é a base para a DRAM moderna. Em 1966, Robert H. Dennard no Thomas J. Watson Research Center do IBM estava trabalhando em memória MOS. Ao examinar as características da tecnologia MOS, ele descobriu que era possível construir capacitores e que armazenar uma carga ou nenhuma carga no capacitor poderia representar o 1 e o 0 de um bit, enquanto o transistor MOS poderia controlar a gravação da carga no capacitor. Isso levou ao desenvolvimento de uma célula de memória DRAM de um único transistor. Em 1967, Dennard registrou uma patente para uma célula de memória DRAM de um único transistor baseada na tecnologia MOS. Isso levou ao primeiro chip comercial de DRAM IC, o Intel 1103, em outubro de 1970. A memória dinâmica de acesso aleatório síncrona (SDRAM) estreou posteriormente com o chip Samsung KM48SL2000 em 1992.
O termo memória também é frequentemente usado para se referir à memória não volátil, incluindo a memória somente de leitura (ROM) até a moderna memória flash. A memória somente de leitura programável (PROM) foi inventada por Wen Tsing Chow em 1956, enquanto trabalhava para a Arma Division da American Bosch Arma Corporation. Em 1967, Dawon Kahng e Simon Sze da Bell Labs propuseram que a porta flutuante de um dispositivo semicondutor MOS poderia ser usada para a célula de uma ROM reprogramável, o que levou Dov Frohman da Intel a inventar a EPROM (PROM apagável) em 1971. A EEPROM (PROM apagável eletricamente) foi desenvolvida por Yasuo Tarui, Yutaka Hayashi e Kiyoko Naga no National Institute of Advanced Industrial Science and Technology em 1972. A memória flash foi inventada por Fujio Masuoka na Toshiba no início dos anos 1980. Masuoka e colegas apresentaram a invenção da memória NOR flash em 1984, e depois a memória NAND flash em 1987. A Toshiba comercializou a memória NAND flash em 1987.
Desenvolvimentos em tecnologia e economias de escala tornaram possíveis os chamados computadores de memória muito grande (VLM).

## Memória volátil

A memória volátil é a memória do computador que requer energia para manter as informações armazenadas. A maioria da memória volátil moderna semicondutor é composta por RAM estática (SRAM) ou RAM dinâmica (DRAM). A DRAM domina a memória do sistema desktop. A SRAM é usada para o cache do processador. A SRAM também é encontrada em pequenos sistemas embarcados que exigem pouca memória.
A SRAM retém seu conteúdo enquanto a energia está conectada e pode usar uma interface mais simples, mas requer seis transistores por bit. A DRAM é mais complicada para a interface e controle, exigindo ciclos de atualização regulares para evitar a perda de conteúdo, mas usa apenas um transistor e um capacitor por bit, permitindo alcançar densidades muito maiores e custos muito mais baixos por bit.

## Memória não volátil

A memória não volátil pode reter as informações armazenadas mesmo quando não está alimentada. Exemplos de memória não volátil incluem memória somente de leitura, memória flash, a maioria dos tipos de dispositivos de armazenamento de computador magnéticos (por exemplo, discos rígidos, disquetes e fita magnética), disco óptico e métodos de armazenamento de computador mais antigos, como fita de papel e cartão perfurado.
Tecnologias de memória não volátil em desenvolvimento incluem FRAM, célula de metalização programável, RAM magnética com torque de transferência de spin, SONOS, memória RAM resistiva, memória racetrack, Nano-RAM, 3D XPoint e memória milípede.

## Memória semi-volátil

Uma terceira categoria de memória é semi-volátil. O termo é usado para descrever uma memória que tem alguma duração não volátil limitada após a remoção da energia, mas depois os dados são perdidos. Um objetivo típico ao usar uma memória semi-volátil é fornecer o desempenho e durabilidade elevados associados à memória volátil, ao mesmo tempo em que oferece alguns benefícios da memória não volátil.
Por exemplo, alguns tipos de memória não volátil sofrem desgaste quando gravados. Uma célula "gasta" tem volatilidade aumentada, mas continua a funcionar. As localizações de dados que são gravadas com frequência podem ser direcionadas para usar circuitos desgastados. Contanto que a localização seja atualizada dentro de algum tempo de retenção conhecido, os dados permanecem válidos. Após um período sem atualização, o valor é copiado para um circuito menos desgastado com retenção mais longa. Gravar primeiro na área desgastada permite uma alta taxa de gravação, evitando o desgaste nos circuitos não desgastados.
Como segundo exemplo, um STT-RAM pode ser tornado não volátil construindo células grandes, mas isso aumenta o custo por bit e os requisitos de energia e reduz a velocidade de gravação. Usar células pequenas melhora o custo, energia e velocidade, mas leva a um comportamento semi-volátil. Em algumas aplicações, a volatilidade aumentada pode ser gerenciada para fornecer muitos benefícios de uma memória não volátil, por exemplo, removendo a energia mas forçando uma reinicialização antes que os dados sejam perdidos; ou armazenando em cache dados somente leitura e descartando os dados em cache se o tempo sem energia exceder o limiar não volátil.
O termo semi-volátil também é usado para descrever comportamento semi-volátil construído a partir de outros tipos de memória. Por exemplo, uma memória de acesso aleatório estática não volátil e uma memória de acesso aleatório estática podem ser combinadas, onde um sinal externo copia dados da memória volátil para a memória não volátil, mas se a energia for removida antes que a cópia ocorra, os dados são perdidos. Ou, uma memória volátil com backup de bateria, e se a energia externa for perdida, há algum período conhecido em que a bateria pode continuar a alimentar a memória volátil, mas se a energia ficar desligada por um período prolongado, a bateria se esgota e os dados são perdidos.

## Gerenciamento

O gerenciamento adequado da memória é vital para o funcionamento adequado de um sistema de computador. Sistemas operacionais modernos têm sistemas complexos para gerenciar adequadamente a memória. A falha em fazê-lo pode levar a bugs ou desempenho lento.

### Bugs

O gerenciamento inadequado da memória é uma causa comum de bugs, incluindo os seguintes tipos:
* Um vazamento de memória ocorre quando um programa solicita memória ao sistema operacional e nunca devolve a memória quando termina de usá-la. Um programa com esse bug gradualmente exigirá mais e mais memória até que o programa falhe, pois o sistema operacional fica sem memória.
* Uma falha de segmentação ocorre quando um programa tenta acessar memória para a qual não tem permissão de acesso. Geralmente, um programa que faz isso será encerrado pelo sistema operacional.
* Um estouro de buffer ocorre quando um programa escreve dados no final de seu espaço alocado e continua a escrever dados além disso na memória alocada para outros fins. Isso pode resultar em comportamento errático do programa, incluindo erros de acesso à memória, resultados incorretos, uma falha ou uma violação da segurança do sistema. Portanto, são a base de muitas vulnerabilidades de software e podem ser explorados maliciosamente.

### Memória virtual

A memória virtual é um sistema em que a memória física é gerenciada pelo sistema operacional, geralmente com a assistência de uma unidade de gerenciamento de memória, que faz parte de muitas CPUs modernas. Isso permite o uso de vários tipos de memória. Por exemplo, alguns dados podem ser armazenados na RAM, enquanto outros dados são armazenados em um disco rígido (por exemplo, em um arquivo de troca), funcionando como uma extensão da hierarquia de cache. Isso oferece várias vantagens. Os programadores de computadores não precisam mais se preocupar com onde seus dados estão fisicamente armazenados ou se o computador do usuário terá memória suficiente. O sistema operacional colocará dados usados ativamente na RAM, que é muito mais rápida que os discos rígidos. Quando a quantidade de RAM não é suficiente para executar todos os programas atuais, pode resultar em uma situação em que o computador gasta mais tempo movendo dados da RAM para o disco e vice-versa do que realizando tarefas; isso é conhecido como thrashing.

### Memória protegida

A memória protegida é um sistema em que cada programa recebe uma área de memória para usar e é impedido de sair desse intervalo. Se o sistema operacional detectar que um programa tentou alterar a memória que não pertence a ele, o programa será encerrado (ou restrito ou redirecionado de outra forma). Dessa forma, apenas o programa ofensivo trava, e outros programas não são afetados pelo mau comportamento (seja acidental ou intencional). O uso de memória protegida melhora significativamente a confiabilidade e a segurança de um sistema de computador.
Sem memória protegida, é possível que um bug em um programa altere a memória usada por outro programa. Isso fará com que o outro programa execute com memória corrompida e resultados imprevisíveis. Se a memória do sistema operacional estiver corrompida, o sistema de computador inteiro pode travar e precisar ser reinicializado. Às vezes, programas intencionalmente alteram a memória usada por outros programas. Isso é feito por vírus e malware para assumir o controle de computadores. Também pode ser usado benevolentemente por programas desejáveis que têm a intenção de modificar outros programas, depuradores, por exemplo, para inserir pontos de interrupção ou ganchos.