A memória virtual é um esquema de alocação de armazenamento no qual a memória secundária pode ser endereçada como se fizesse parte da memória principal. Os endereços que um programa pode usar para fazer referência à memória são distintos dos endereços que o sistema de memória usa para identificar locais de armazenamento físico, e os endereços gerados pelo programa são traduzidos automaticamente para os endereços de máquina correspondentes. 

O tamanho do armazenamento virtual é limitado pelo esquema de endereçamento do sistema de computador e a quantidade de memória secundária não está disponível pelo número real dos locais de armazenamento principal. 

É uma técnica implementada usando hardware e software. Ele mapeia endereços de memória usados ​​por um programa, chamados endereços virtuais, em endereços físicos na memória do computador. 

  1. Todas as referências de memória dentro de um processo são endereços lógicos que são traduzidos dinamicamente em endereços físicos em tempo de execução. Isso significa que um processo pode ser trocado para dentro e para fora da memória principal de forma que ocupe diferentes lugares na memória principal em momentos diferentes durante o curso da execução.
  2. Um processo pode ser dividido em várias partes e essas partes não precisam ser continuamente localizadas na memória principal durante a execução. A combinação de tradução dinâmica de endereços em tempo de execução e uso de página ou tabela de segmento permite isso.

Se essas características estiverem presentes, não é necessário que todas as páginas ou segmentos estejam presentes na memória principal durante a execução. Isso significa que as páginas necessárias precisam ser carregadas na memória sempre que necessário. A memória virtual é implementada usando Paginação por Demanda ou Segmentação por Demanda. 

Paginação por demanda: 
o processo de carregar a página na memória sob demanda (sempre que ocorre falha de página) é conhecido como paginação por demanda. 
O processo inclui as seguintes etapas: 

virtual_mem

  1. Se a UCP tentar fazer referência a uma página que atualmente não está disponível na memória principal, é gerada uma interrupção indicando uma falha de acesso à memória.
  2. O SO coloca o processo interrompido em um estado de bloqueio. Para que a execução prossiga, o SO deve trazer a página necessária para a memória.
  3. O sistema operacional irá procurar a página necessária no espaço de endereço lógico.
  4. A página necessária será trazida do espaço de endereço lógico para o espaço de endereço físico. Os algoritmos de substituição de página são usados ​​para a tomada de decisão de substituição da página no espaço de endereço físico.
  5. A tabela da página será atualizada de acordo.
  6. O sinal será enviado à CPU para continuar a execução do programa e colocará o processo de volta no estado de pronto.

Portanto, sempre que ocorre uma falha de página, essas etapas são seguidas pelo sistema operacional e a página necessária é trazida para a memória. 

Vantagens:  

  • Mais processos podem ser mantidos na memória principal: Como vamos carregar apenas algumas das páginas de qualquer processo em particular, há espaço para mais processos. Isso leva a uma utilização mais eficiente do processador porque é mais provável que pelo menos um dos mais numerosos processos esteja pronto a qualquer momento.
  • Um processo pode ser maior do que toda a memória principal: uma das restrições mais fundamentais na programação foi levantada. Um processo maior do que a memória principal pode ser executado por causa da paginação sob demanda. O próprio SO carrega páginas de um processo na memória principal conforme necessário.
  • Ele permite maiores níveis de multiprogramação usando menos memória disponível (primária) para cada processo.

Tempo de serviço de falha de página: 
O tempo gasto para fazer a manutenção da falha de página é chamado de tempo de serviço de falha de página. O tempo de serviço de falha de página inclui o tempo necessário para executar todas as seis etapas acima. 

Let Main memory access time is: m
Page fault service time is: s
Page fault rate is : p
Then, Effective memory access time = (p*s) + (1-p)*m

Troca: 

Trocar um processo significa remover todas as suas páginas da memória ou marcá-las para que sejam removidas pelo processo normal de substituição de página. Suspender um processo garante que ele não possa ser executado durante a troca. Mais tarde, o sistema volta o processo do armazenamento secundário para a memória principal. Quando um processo está ocupado trocando páginas dentro e fora, essa situação é chamada de thrashing. 

trocando

Golpeando:  

virtual_mem_2

Em um determinado momento, apenas algumas páginas de qualquer processo estão na memória principal e, portanto, mais processos podem ser mantidos na memória. Além disso, economiza-se tempo porque as páginas não utilizadas não são trocadas para dentro e fora da memória. No entanto, o sistema operacional deve ser inteligente sobre como gerenciar esse esquema. Praticamente no estado estacionário, toda a memória principal será ocupada com páginas de processo, de forma que o processador e o SO tenham acesso direto ao maior número de processos possível. Portanto, quando o sistema operacional traz uma página, ele deve descartar outra. Se ele lançar uma página antes de ser usado, ele apenas terá que obter essa página novamente quase imediatamente. Muito disso leva a uma condição chamada Thrashing. O sistema passa a maior parte do tempo trocando páginas, em vez de executar instruções. Portanto, é necessário um bom algoritmo de substituição de página. 

No diagrama fornecido, o grau inicial de multiprogramação até certo ponto (lambda), a utilização da CPU é muito alta e os recursos do sistema são utilizados 100%. Mas se aumentarmos ainda mais o grau de multiprogramação, a utilização da CPU cairá drasticamente e o sistema gastará mais tempo apenas na substituição da página e o tempo necessário para concluir a execução do processo aumentará. Essa situação no sistema é chamada de thrashing. 

Causas do Thrashing:  

  1. Alto grau de multiprogramação : Se o número de processos continuar aumentando na memória, o número de frames alocados para cada processo diminuirá. Portanto, menos frames estarão disponíveis para cada processo. Devido a isso, uma falha de página ocorrerá com mais frequência e mais tempo de CPU será desperdiçado apenas em entrar e sair de páginas e a utilização continuará diminuindo. 

    Por exemplo: 
    Let free frames = 400 
    Case 1 : Number of process = 100 
    Então, cada processo terá 4 frames. 

    Caso 2 : Número de processos = 400 
    Cada processo terá 1 quadro. 
    O caso 2 é uma condição de thrashing, conforme o número de processos aumenta, os frames por processo diminuem. Conseqüentemente, o tempo da CPU será consumido apenas na troca de páginas. 
     

  2. Falta de quadros : Se um processo tiver menos quadros, menos páginas desse processo poderão residir na memória e, portanto, será necessária uma troca mais frequente de entrada e saída. Isso pode levar a uma surra. Portanto, uma quantidade suficiente de quadros deve ser alocada para cada processo para evitar o thrashing.

Recuperação de Thrashing:  

  • Não permita que o sistema entre em thrashing instruindo o planejador de longo prazo a não trazer os processos para a memória após o limite.
  • Se o sistema já estiver em thrashing, instrua o planejador de médio prazo a suspender alguns dos processos para que possamos recuperar o sistema do thrashing.