Free Ram - O arquivo de paginação

Started by Dark_Side, 11 de November , 2006, 05:27:51 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,

Sabemos que quando declaramos um buffer e armazenamos algo neste, o programa tenta obter um determinado espaço na memória livre para armazenar a quantidade suficente de dados. Esta região é denominada Heap. Muitos já ouviram falar em arquivo de paginação. Quando a memória física disponível é insuficiente ou está muito baixa, o sistema operacional utiliza este arquivo como memória virtual. Como é isso? Basicamente, o sistema utiliza um determinando espaço no HD como se fosse a memória.

Um exemplo:

Temos 100 MB de memória livre. Considere que um programa precise utilizar 80% dessa quantidade, portanto, 80 Megabytes. Provavelmente, o sistema operacional irá utilizar o recurso do arquivo de paginação a fim de conservar a memória física. O uso HD como memória RAM, pode ser chamado de SWAP.

Onde quero chegar? Por lógica, quando o HD é utilizado como memória RAM, esta última tem um determinado espaço conservado.  O objetivo deste tópico é demonstrar como podemos fazer um programa que forçe o SWAP a fim de conservamos a memória física disponível.

Utilizei a linguagem Visual Basic para facilitar o processo e pelo fato de estar meio noob em VB ;)


Segue abaixo o código completo do projeto:

' API para obter informações sobre a memória
Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)

Private Type MEMORYSTATUS ' Estrutura que contém membros sobre informações da memória
        dwLength As Long
        dwMemoryLoad As Long
        dwTotalPhys As Long
        dwAvailPhys As Long
        dwTotalPageFile As Long
        dwAvailPageFile As Long
        dwTotalVirtual As Long
        dwAvailVirtual As Long
End Type

Dim mem_stats As MEMORYSTATUS ' Variável da estrutura MEMORYSTATYS
Dim var_memtotal As Long ' Quantidade total de memória em Kbytes
Dim var_memlivre As Long ' Quantidade livre de memória em Kbytes
Dim buffer As String ' Buffer que irá armazenar uma quantidade determinada de dados -> espaço na memória

Private Sub Form_Load()
Call mostra_status 'Chama pela função que mostra status da memória
End Sub

Private Sub gogo_Click() 'Botão OK
If modo.ListIndex = -1 Then 'Verifica se há algum item escolhido
MsgBox "Escolha um modo!", vbInformation, "..."
Exit Sub
End If

Select Case modo.ListIndex
Case 0 ' Otimização básica
buffer = String((var_memlivre * 1024) / 4, 0) ' Ocupa 1/4 da memória livre
buffer = "" ' Libera buffer
Case 1 ' Otimização intermediária
buffer = String((var_memlivre * 1024) / 3, 0) ' Ocupa 1/3 da memória
buffer = ""
Case 2 ' Otimização avançada
buffer = String((var_memlivre * 1024) / 2, 0) ' Ocupa metade da memória livre
buffer = ""
End Select
End Sub

Private Sub Timer1_Timer()
mostra_status 'Timer = 2 segundos = mostra status
End Sub

Sub mostra_status()
GlobalMemoryStatus mem_stats ' Obtém informações da memória
var_memtotal = mem_stats.dwTotalPhys / 1024 ' Quantidade total em Kbytes
var_memlivre = mem_stats.dwAvailPhys / 1024 ' Quantidade livre em Kbytes

' Mostra status
mem_total.Caption = "Memória física total: " + CStr(var_memtotal) + "KB"
mem_livre.Caption = "Memória física livre: " + CStr(var_memlivre) + "KB"
End Sub



Existe uma função na API que nos permite obter informações sobre a memória RAM - GlobalMemoryStatus. Com esta função, pode-se, por exemplo, obter a quantidade total de memória física, quantidade livre, etc.

A declaração da função é feita da seguinte forma:


Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)

Private Type MEMORYSTATUS
        dwLength As Long
        dwMemoryLoad As Long
        dwTotalPhys As Long
        dwAvailPhys As Long
        dwTotalPageFile As Long
        dwAvailPageFile As Long
        dwTotalVirtual As Long
        dwAvailVirtual As Long
End Type

A estrutura MEMORYSTATUS contém membros que nos fornece as informações sobre a memória.

A parte mais importante do programa está no seguinte trecho:

Select Case modo.ListIndex
Case 0 ' Otimização básica
buffer = String((var_memlivre * 1024) / 4, 0) ' Ocupa 1/4 da memória livre
buffer = "" ' Libera buffer
Case 1 ' Otimização intermediária
buffer = String((var_memlivre * 1024) / 3, 0) ' Ocupa 1/3 da memória
buffer = ""
Case 2 ' Otimização avançada
buffer = String((var_memlivre * 1024) / 2, 0) ' Ocupa metade da memória livre
buffer = ""
End Select

Temos um ComboBox com opções. O trecho acima verifica a opção escolhida e executa determinadas instruções para cada uma.

Case 0 ' Otimização básica
buffer = String((var_memlivre * 1024) / 4, 0) ' Ocupa 1/4 da memória livre
buffer = "" ' Libera buffer

Caso seja a primeira opção, o programa armazena no buffer o equivalente a 1/4 da memória física livre. Retomando o exemplo de 100 MB livres, 25 MB seriam ocupados. De acordo com as configurações do arquivo de paginação, determinada quantidade de dados poderiam ser armazenados diretamente neste arquivo, "liberando" assim, certa quantidade de espaço na memória física.
A função String() armazena uma determinada quantidade de caracteres em um buffer. No exemplo, armazenamos o caractere NULO (código ASCII 0).

O mesmo ocorre com as outras opção. A diferença está apenas na quantidade de dados a ser armazenada no buffer. Quanto maior for o espaço ocupado pelo buffer, mais memória é necessária, e conseqüentemente, maiores são as chances do arquivo de paginação entrar em atuação, conservando um maior espaço na memória física.

É comum o computador apresentar uma certa lentidão quando este faz o uso do SWAP. Isso ocorre pois uma vez em que o HD está desevolvendo o papel da memória RAM, e esta é muito mais rápida, o desempenho pode cair.

De qualquer forma, termino aqui meu pequeno tópico para tentar explicar um pouco o funcionamento do SWAP.

Caso tenham interesse no programa compilado + source no formato VB:

Arquivo Anexo - Security Darkers - wWw.darkers.com.br

É isso...

Bye.