Funcionamento da memória virtual

Neste artigo iremos entender como funciona o conceito básico de memória virtual no Linux/Windows, dando uma descrição de como funciona e, posteriormente, implementando um exemplo para se ter uma idéia da velocidade na qual a memória principal pode ser preenchida caso seja executado um programa sobre si mesmo.

[ Hits: 67.194 ]

Por: tiago em 03/03/2006


Exemplo prático: Um programa simples



Este exemplo utiliza um pequeno programa escrito em C para mostrar como a memória RAM é ocupada e depois a memória virtual será usada. Você perceberá isso quando ver a luz de leitura/escrita em disco acesa constantemente no seu HD. Depois de um tempo o computador trava, restando a única possibilidade de resetar a máquina para voltar ao normal. Execute esse código sob sua responsabilidade! De preferência, salve todas as suas aplicações e feche-as. Vamos ao código, é muito simples:

#include <stdio.h>
int main()
{
     int i;
     for (i=0 ; i < 10000 ; i++)
     {
            system("./a.out &");  
     }
}
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Exemplo prático: Um programa simples
   3. Como funciona o programa
Outros artigos deste autor

Instalação do OpenGL em placas NVIDIA

Utilizando o aLink Creator do aMule

Leitura recomendada

Instalação do Docker no CentOS 7

Clonando discos utilizando o G4U ("Ghost para Unix")

VirtualBox

Zabbix 2.2 no CentOS 6 via repositório EPEL - Instalação e configuração

Conheça a distribuição FAN Nagios

  
Comentários
[1] Comentário enviado por chronos em 03/03/2006 - 13:39h

Belo artigo para explicar o que é a swap, foi explicado de uma formca clara e objetiva, e muito simples também :)

Parabéns.

[2] Comentário enviado por andrack em 03/03/2006 - 13:47h

Amigo...

O artigo está legal , tenho apenas um comentário:

"
Temos uma progressão geométrica absurda que em poucos segundos irá lotar a memória RAM e a memória virtual do computador, travando totalmente a máquina.
"

O comportamento do Linux é diferente... no kernel existe uma coisa chamada: "OOM Killer", que mata o processo xarope, caso não exista memória alocável disponível....

Com esse "loop" no código, vc também gasta processamento, na qual eu acredito ser a principal causa da "travada"....

Tem um outro macete que costumo usar para alocar TODA memória:

tail -f /dev/zero

Simple, prático e indolor nem tanto.... ehueheuhue!

Obrigado!

[3] Comentário enviado por pedemesa em 03/03/2006 - 17:24h

Muito bom artigo...

[4] Comentário enviado por _luks em 03/03/2006 - 22:20h

ae galera!
um dia eu fiz esse loop em shell script:

#!/bin/sh
while [ $RANDOM > 5 ]; do
./ram
done

ele carregou 95% da minha memoria.
Ai eu consegui matar o terminal e o shell (que tava executando o loop)
esquema:

Antes do Script: Livre 312 MB
Na hora do Script: Livre 17 MB
Depois do Script: Livre 390 MB

Percebeu-se que depois do script o pc ficou mais leve!!! e isso por causa do script! me expliquem esse fenomeno

[5] Comentário enviado por botinha em 03/03/2006 - 22:23h

Olha deu certo comigo e realmente o Linux sabe gerenciar memória.


Valeu........

[6] Comentário enviado por andrack em 04/03/2006 - 20:49h

Amigo _luks...

O que esse binario "ram" faz?

Como assim, o PC ficou mais leve?


falowz....


[7] Comentário enviado por alicornio em 04/03/2006 - 23:16h

Opa...

Ae o artigo não era sobre memória virtual? Vc falou de swapping, mas tudo bem...

O andrack tem razão ao falar que em alguns sistemas os usuários tem cotas limites de memória, quantidade de processos, threads, etc. Assim pode ser que não "funcione" em alguns sistemas. Ele tem razão tbm ao falar que sua máquina vai travar por usar mais cpu que memória. Isso pq um programinha como esse consome pouco espaço na memória.

Um clássico de DoS é o fork bomb:

/* funciona bem no linux */

#include<stdio.h>
#include<unistd.h>

int main(void) {
for (;;) {
fork();
}
}

Outro legal tbm é esse aqui:

/* funciona bem no windows */
/*
Copie e cole esse codigo em http://www.delorie.com/djgpp/compile/
Mande compilar. Abra o gerenciador de tarefas, aba desempenho e rode o danado.
Isso sim é que é usar memória swap. ;-)
*/

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(void) {
for (;;) {
int *p;
p = malloc(100000);
}
}

até

Thiago

[8] Comentário enviado por fdavid em 05/03/2006 - 01:44h

Infelizmente nos meus testes ficou
Linux 0 x 0 Windows 2k

Testei tudo que foi dito aqui mais nada travou ninguem ,o maximo que chegou foi ficar lento mais não impossibilitou matar o processo tanto no Windows quanto Linux.

Se alguem tiver algo que realmente trave um ou outro manda ai.
PS.: fins didaticos

[9] Comentário enviado por edivan em 05/03/2006 - 14:42h

Tambem acho que o artigo não explicou o "funcionamento da memoria virtual", só a do swap.

knancys:
cat /dev/urandom > /dev/mem
isso mata ou deixa inutilizavel(em alguns testes com X11 rodando) o linux(usei slack 10.0, udev, kernel 2.6.12.2), vc deve ser root para executar.

Nunca alguem ira encontrar algum programa que rode como usuario não root e quebre o linux(ou qualquer S.O. descente) sem se aproveiter de algum bug ou de uma configuração errada.

[10] Comentário enviado por andrack em 05/03/2006 - 14:47h

Amigo knancys!

Ninguem que postou comentarios sobre o artigo, comentou nenhuma formula para travar o sistema...

Talvez explorando algum bug, vc consiga tal feito...


falowz...

[11] Comentário enviado por removido em 08/03/2006 - 13:20h

Pra travar pode-se fazer um programinha em Java que cria infinitamente ojetos em uma lista encadeada. Eu tenho um em casa, se alguém quiser eu coloco ele à disposição. Na real eu nunca testei ele no Linux, pois na época que fiz essa experiência eu usava somente o rWindows.

Vlw

[12] Comentário enviado por agk em 13/03/2006 - 09:37h

Bacana o artigo. parabéns.

[13] Comentário enviado por daniellibanori em 13/03/2006 - 21:04h

Realmente difícil travar o linux através de um processo rodando por um simples usuário. Desconheço algum meio. Na verdade, acho teoricamente impossível de se fazer isso no Linux, já no Windows deve ser simples. Digo "deve" pois não conheço muito os mecanismos de proteção dele.
O programa em questão, na realidade, está tomando muito mais processamento do que espaço na memória.
Não o testei, mas já conversei com um professor as consequências de um programa que faça algo semelhante. Sei que o linux tem um limite máximo de processos que é basicamente determinado pelo tamanho do tipo definido PID (acho que não é exatemente esse o nome do tipo, deve ser algo parecido).
Não acho que esteja ocorrendo algum tipo de alto consumo de memória, visto que o linux usa um sistema de alocação sobre demanda e "copy on write". Acho que se você deseja fazer isso, seria melhor usar um programa que chama-se repetidamente malloc e escreva na memória alocada.
Para concluir, ao terminar de rodar um programa muito "pesado", às vezes pode-se notar uma maior quantidade de memória livre, mas você precisa se certificar se o cache está ou não incluido.

[14] Comentário enviado por filipe em 18/03/2006 - 09:37h

Este programa irá parar de executar assim que ele atingir o número máximo de processos configurado em seu linux, por padrão este número é em torno de 8100 processos, isto não chega a fazer cócegas em linux algum, notem que a única alocação de memória feita é para um int, que consome 4 bytes e mais alguma coisa que é utilizada pelo próprio kernel do linux para executar este programa...

No exemplo do alicornio realmente vemos a alocação de memória funcionando.

Seria interessante o pessoal fazer um pouco mais de pesquisa antes de sair escrevendo cada coisa que vem na cabeça.

[15] Comentário enviado por marcus (ere) em 12/06/2007 - 00:34h

galera eu sou novo nessa area da computaçao mas ja que vcs estao falando da memoria virtual , isso nao fas muito tempo que o meu pc informa:(sua memoria vrtual esta cheia) eu queria saber como esvasia ela ou se a outra coisa porque eu nao aguento mas esse aviso , e olha que ano fas muito tenpo que ele avisa. porfavor galera ajuda ae.

[16] Comentário enviado por Diellyvol em 25/07/2007 - 14:07h

Marcus

Quanto você têm de memória ram, adicione mais memória

[17] Comentário enviado por octaviob11 em 01/08/2011 - 16:28h

algo que trave??
execulte deste geito no shell: ~/ :(){ : | : & };:


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts