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.
Esse exemplo é específico para ser compilado em Linux, podendo ser adaptado para qualquer sistema que suporte a linguagem C, substituindo a linha - system("./a.out"); - pelo arquivo gerado no compilador para seu sistema operacional.
Quando você compilar esse arquivo usando o gcc ou cc do Linux, ele irá gerar por default um arquivo executável chamado "a.out".
Mas o que o programa faz é chamar a si mesmo 10 mil vezes. E o que o programa chamado faz? Chama a si mesmo mais 10 mil vezes! 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.
É isso aí pessoal, espero que tenham entendido o conceito através da explicação e do exemplo.
[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!
[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. ;-)
*/
[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.
[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.
[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.