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 artigo é apenas um teste para aqueles que querem ver como funciona a memória virtual no Linux/Windows. Não me responsabilizo por quaisquer danos no seu computador, nem recomendo essa prática para atos de vandalismo.
Tanto no Linux quanto no Windows o conceito de memória virtual está presente. A memória virtual foi criada porque, obrigatoriamente, um programa necessita passar pela memória principal para ser executado, e como quase sempre não é possível ter memória RAM suficiente para executar todo o programa da memória, é necessário executar esse programa em partes.
A memória virtual é uma área de troca de dados que serve como uma extensão da memória principal, ou seja, a memória RAM. Por exemplo, se você possui 64 mb de RAM livre e quer rodar um programa que ocupa 70 mb de RAM, deverá carregar os primeiros 64 mb para rodar o início do programa e os 6 mb restantes serão armazenados na memória virtual, para depois serem copiados para a memória principal a fim de serem executados. Isso ocorre, é claro, à medida que a execução do programa for se desenrolando e o programa em questão (ou outros programas) liberarem a memória que ocupavam para o uso de outro programa. Dessa forma, temos um contínuo fluxo de dados entre o disco rígido (onde se localiza a memória virtual) e a memória RAM.
Como o disco rígido possui uma movimentação mecânica de cabeças de leitura e gravação, ele é considerado lento se comparado à dispositivos de memória, cujo acesso às informações é totalmente eletrônico. É por isso que pouca memória RAM implica em usar muita memória virtual, que por sua vez, implica em usar muita leitura/escrita no disco rígido, que por sua vez implica em lentidão geral no sistema.
[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.