Você está na página 1de 6

Universidade do Vale do Itaja

CURSO: ENGENHAO DE COMPUTARIA

UNIVALI

DISCIPLINA: SISTEMAS OPERACIONAIS PROFESSOR: RAMICS DOS SANTOS SILVA

Relatrio 2: Gerenciamento de Memria

Pablo Tirloni Zandon Ivano da Silva Lobo Filho

So Jos, setembro de 2010

Sinais de processos
Os sinais so meios usados para que os processos possam se comunicar e para que o sistema possa interferir em seu funcionamento. Por exemplo, se o usurio executar o comando kill para interromper um processo, isso ser feito por meio de um sinal. Quando um processo recebe um determinado sinal e conta com instrues sobre o que fazer com ele, tal ao colocada em prtica. Se no houver instrues prprogramadas, o prprio Linux pode executar a ao de acordo com suas rotinas. Entre os sinais existentes, existe o KILL, que tem a funo de "matar" um processo e usado em momentos de criticidade. O kill tambm um comando que o usurio pode usar para enviar qualquer sinal, porm, se ele for usado de maneira isolada, ou seja, sem o parmetro de um sinal, o kill por padro executa o sinal TERM ( termina completamente o processo). Quando no se sabe qual o PID de um processo, pode-se usar o comando killall, desde que voc saiba o nome do processo. A sintaxe :
killall -SINAL processo

Onde nesse trabalho usamos o sinal USR. Abaixo segue o cdigo comentado do programa que foi desenvolvido.
#include <stdlib.h> #include <stdio.h> #include <signal.h> //varivel global para a contagem do tamanho da alocao int tamanhoGlobal=0; //funo que escreve no arquivo dados.txt o a quantidade de memria alocada void escreveEmArquivo(int tamanho) { FILE *arquivo = fopen("dados.txt", "a"); fprintf(arquivo,"%d\n",tamanho/1024); fclose(arquivo); } //funo que recebe o sinal e chama a funo que escreve no arquivo void handler_USR1(int sig) { psignal(sig,"USR1 Recebido"); escreveEmArquivo(tamanhoGlobal); }

int main(void){ int tamanhoHeap = 0; int total = 0; int *p; while(1) { tamanhoHeap=rand()%1000; //tamanho randomico p=(int*) malloc(tamanhoHeap); //aloca total += tamanhoHeap; //faz a soma das alocaes tamanhoGlobal=total; printf("\n%d alocados ",total/1024);

signal(SIGUSR1,handler_USR1); //fica aguardando um sinal } return 0; }

Verificando processos com o ps


O ps um comando de extrema importncia para o gerenciamento de processos. Por ele, possvel saber quais os processos em execuo atualmente, quais os UIDs e PIDs correspondentes, entre outros. Se somente ps for digitado na linha de comando, geralmente o sistema mostra quais os processos do usurio. preciso usar uma combinao de opes para obter mais detalhes. No trabalho foi usado a seguinte linha de comando para o ps:
ps -eo fname,vsize|grep trabalho >> dados.txt

Onde, o comando ps est filtrando os dados do processo trabalho, esses dados so o nome do processo (fname) e a quantidade de memria virtual que ele est ocupando no momento (vsize). Esses dados esto sendo gravados em um arquivo texto chamado dados.txt, o qual o mesmo arquivo que o programa trabalho grava a quantidade de memria que ele conta. Segue abaixo o script usado, onde alm de realizar o comando citado, ele manda o sinal para o processo (killall -USR1 trabalho):
#!/bin/bash ps -eo fname,vsize|grep trabalho >> dados.txt killall -USR1 trabalho

Para fazermos essa comparao de memria optamos por gravar no mesmo arquivo a quantidade de memria contada do sistema e do programa. Ento executamos em um terminal o nosso programa, e em outro o nosso script. Para termos vrios valores, com o comando watch -n1 ./script.sh conseguimos executar o script a cada 1 segundo. Em cada vez que o script executado, ele envia o sinal e grava no arquivo, e o programa recebe o sinal e grava no arquivo, havendo uma sincronia entre eles.

Figura 1 Terminais de execuo do Linux, onde o da esquerda esta em execuo o programa, e na direita o script em watch.

Depois de executarmos o script e o programa, basta apenas analisar a sada gerada, que foi o arquivo texto dados.txt, citada abaixo.

Figura 2 Visualizao do arquivo gerado dados.txt.

No arquivo, onde aparece trabalho na frente do nmero, quando o script com o comando ps, salvou. J nas linhas que possuem apenas o nmero, foi o programa que salvou. Os nmeros esto em KB (kilobytes) e possvel notar uma semelhana de valores. Abaixo faremos uma tabela com os primeiros valores para visualizarmos essa diferena.
Aumento 427 117 63 129 473 14 219 215 160 Mdia 201,89 Tabela 1 Tabela dos dados do arquivo texto, com o calculo de diferena das quantidades de memrias capturadas. Sistema 4908 17976 31572 44772 58368 72360 84900 98100 111564 124896 Programa 3136 15777 29256 42393 55860 69379 81905 94886 108135 121307 Diferena (S P) 1772 2199 2316 2379 2508 2981 2995 3214 3429 3589

Na primeira coluna est os valores captados do sistema, na segunda contados pelo programa, e na terceira a diferena entre eles. Na quarta coluna temos o aumento de memria a cada segundo, da coluna da diferena. Podemos perceber que h diferena significativa entre a que o sistema informa e o que nosso programa contou. Uma diferena est pelo fato de que o nosso programa no conta o tamanho o arquivo carregado em memria. Este desperdcio de memria chamado de fragmentao, espao de memria perdido dentro da rea alocada ao processo.

Referncias
http://www.vivaolinux.com.br/artigo/Processos-no-Linux?pagina=1, acessado em 12/09/2010. http://www.vivaolinux.com.br/script/signal.h-Um-exemplo, 12/09/2010. acessado em

http://ces33.wikidot.com/gerenciamento-de-memoria:jose-gerardo-e-diegoalvarez, acessado em 12/09/2010.

Você também pode gostar