# Persistência (ciência da computação)

Em ciência da computação, persistência se refere à característica de um estado que sobrevive ao processo que o criou. Sem essa capacidade, o estado só existiria na RAM, e seria perdido quando a RAM parasse (desligando-se o computador por exemplo).
Isso é conseguido na prática armazenando o estado como dados em armazenamento não volátil (como em um disco rígido ou memória flash), ou seja, via serialização dos dados para um formato armazenável e depois os salvando em um arquivo.
Editores de imagens ou processadores de texto, por exemplo, alcançam a persistência do estado salvando seus documentos para arquivos.

## Persistência ortogonal ou transparente

Diz-se que a persistência é “ortogonal” ou “transparente” quando é implementada como uma propriedade intrínseca do ambiente de execução de um programa. Um ambiente de persistência ortogonal não requisita nenhuma ação específica de programas rodando nele para recuperar ou salvar seu estado.
Persistência não ortogonal requer que os dados sejam escritos e lidos do armazenamento usando instruções específicas num programa, resultando no uso de persistir como um verbo transitivo: Ao final, o programa persiste o dado.
A vantagem do ambiente de persistência ortogonal é a simplicidade e menor propensão a erros nos programas.

### Adoção

Persistência ortogonal é amplamente adotada em sistemas operacionais para hibernação e em sistemas de virtualização de plataforma como VMware e VirtualBox para salvar o estado.
Línguagens de pesquisa tais como PS-algol, Napier88, Fibonacci e pJama, demonstraram as vantagens desses conceitos para programadores.

## Técnicas de persistência
### Imagem de Sistema

Artigo Principal: System Image
A imagem de sistema é a mais simples estratégia de persistência. Um exemplo de persistência ortogonal usando uma imagem de sistema é a hibernação de um notebook, por quê ela não requer nenhuma ação dos programas rodando na máquina. Um exemplo de persistência não ortogonal usando uma imagem de sistema é um simples programa editor de texto executando instruções específicas para salvar todo um documento num arquivo.
Deficiências: Mudanças de estado feitas em um sistema após a sua última imagem for salva são perdidos no caso de uma falha no sistema ou desligamento. Salvar uma imagem pra cada alteração seria demorado demais para a maioria dos sistemas, então imagens não são usadas como a única técnica de persistência para sistemas críticos.

### Journaling

Artigo principal: Journaling
Usar registros é a segunda mais simples técnica de persistência. Journaling é o processo de armazenamento de eventos em um log antes de cada um ser aplicado para um sistema. Tais registros são chamados journals.
Na inicialização o journal é lido e cada evento é aplicado ao sistema, evitando perda de dados em caso de falha do sistema ou desligamento.
Todo o “Desfazer/Refazer” histórico de comandos do usuário em um programa de edição de imagem, por exemplo, quando gravado em um arquivo, constitui um journal capaz de recuperar o estado de uma imagem editada em qualquer ponto no tempo.
Journals são usados por journaling file systems, sistemas prevalentes e sistemas de gerenciamento de banco de dados onde eles também são chamados de “logs de transação” ou “redo logs”.
Deficiências: Journals são frequentemente combinados com outras técnicas de persistência para que todo o histórico – que pode ser potencialmente grande – dos eventos do sistema não precisem ser reaplicados na inicialização.

### Dirty Writes

Essa técnica é escrita apenas para o armazenamento de porções do estado do sistema que tenham sido modificados (que estão sujas) desde a sua ultima escrita. Aplicações de edição de documentos sofisticados, por exemplo, usarão dirty writes para salvar somente aquelas porções de um documento que foram realmente alterados desde a última salvação.
Deficiências: Esta técnica requer mudanças de estado para ser interceptada em um programa. É arquivada de um jeito não ortogonal requerendo específicas chamadas de pacotes de armazenamento ou ortogonalmente com programas automáticos de transformação, resultando em um código que é mais lento que o código nativo e mais complicado para depurar.

## Camadas de persistência

Qualquer camada de software que torna mais fácil para um programa persistir seu estado é genericamente chamada de camada de persistência. A maioria das camadas de persistência não provê a persistência dos dados diretamente, mas usam um sistema de gerenciamento de banco de dados auxiliar.

## Sistemas Prevalentes

Artigo principal: System Prevalence
Um sistema prevalente é um simples padrão de arquitetura de software que combina system images e transaction journaling, para fornecer velocidade, escalabilidade na performance, persistência transparente e espelhamento transparente do estado do sistema do computador.
Deficiências: Um sistema prevalente precisa ter RAM suficiente para manter todo o estado do sistema.

## Sistemas de gerenciamento de banco de dados (SGBD)

Artigo Principal: SGBD
SGBD usa uma combinação de dirty writes e transaction journaling, mencionados anteriormente. Eles não fornecem só a persistência mas também outros serviços, tais como buscas, auditoria e controle de acesso.

## Sistemas operacionais persistentes

Sistemas operacionais persistentes são sistemas operacionais que mantém o estado do sistema mesmo depois de uma falha ou desligamento inesperado. Sistemas operacionais que empregam essa capacidade incluem:
* CapROS, revisões do EROS
* Coyotos, sucessor to EROS
* EROS, o sucessor do KeyKOS
* KeyKOS
* Multics
* Phantom
* IBM System/38
* Grasshopper OS
* Lua OS