You are on page 1of 4

Universidade Federal de Minas Gerais

Instituto de Cincias Exatas


Departamento de Cincia da Computao

Algoritmos e Estruturas de Dados II


2 Semestre de 2014

Trabalho Prtico 1
Alocao de Memria
Valor: 15 pontos
Prazo: 09/10/2014
O objetivo do trabalho implementar um mecanismo de alocao dinmica de memria semelhante
ao oferecido pelo tradicional comando malloc, disponvel na biblioteca padro das linguagens C e
C++. Para fazer uma distino clara entre as funes deste trabalho e as da biblioteca padro, vamos
denominar a nova funo de alocao como valloc.
Em vez de alocar memria dinmica a partir do heap, o espao que ser gerenciado pela funo
valloc ser formado com base em um vetor global, dimensionado estaticamente. A partir disso, a
funo valloc dever alocar e liberar blocos de memria do vetor, respeitando a lgica de
funcionamento semelhante ao malloc e ainda dentro dos seguintes princpios:

Retornar um apontador para o bloco de memria reservado;


Gerenciar a reserva de blocos de memria, de modo a garantir que nenhuma chamada
subsequente a valloc oferea espao previamente alocado, a menos que o espao tenha
sido liberado;
Gerenciar a liberao de blocos de memria e sua reoferta para nova alocao;
Executar de forma eficiente, de modo a causar o menor impacto possvel sobre o
desempenho dos programas.

Naturalmente, sendo construda para funcionar baseada em um vetor global esttico, a funo valloc
no compartilhar o espao de memria com outros processos em execuo na mquina, como o
caso de malloc. A funo valloc ter a seguinte assinatura:
void *valloc(size_t size);

Quando um bloco de memria tem sua alocao solicitada, a funo valloc deve determinar se
existe algum segmento livre do vetor com a capacidade necessria. Se no houver, a funo
retornar NULL. Se houver, o bloco reservado, e seu endereo inicial retornado. A alocao
deve considerar blocos de 1 byte, no havendo alinhamento de endereos nem paginao de blocos.
Outras funes semelhantes s tradicionais sero necessrias (consultar a documentao de C para
ver o comportamento esperado). Criar as funes e inseri-las no header para uso pblico:
void vfree(void *p);
void *vcalloc(size_t nitems, size_t size);
void *vrealloc(void *p, size_t size);

O vetor global ter tamanho mximo igual a 1.024.576 bytes, podendo ser instanciado da seguinte
maneira:
#define MAX_MEM 1024576
extern unsigned char MEM[MAX_MEM];

Tipos Abstratos de Dados


A principal preocupao na construo de algoritmos e estruturas de dados para o valloc deve ser
com a fragmentao do espao disponvel no vetor. Para resolver isso eficientemente, defina um
TAD que represente os blocos de memria alocados e organize-os em uma lista, de modo a
gerenciar a ocupao e a disponibilidade de espao. Lembre-se, ao modularizar seu cdigo, que
necessrio (1) encontrar um bloco livre que possa conter o espao solicitado, (2) quando um bloco
liberado, o(s) bloco(s) livre(s) adjacente(s) dever(o) ser agrupado(s), formando um bloco maior, e
(3) na realocao de espao, pode ser necessrio mover o contedo anterior para uma nova posio.
Pr-configurao e Status
Para pr-configurar e verificar o status da memria, trs funes adicionais devero ser criadas:
void inicializa_gerencia_memoria(void) // aloca e inicializa TAD auxiliar
void finaliza_gerencia_memoria(void) // libera espao de memria da TAD auxiliar
void imprime_status_memoria(void)

A funo imprime_status_memoria dever ser a nica funo responsvel pela escrita na


sada padro em seu cdigo, seguindo o formato:
Status agora:
Pos: 0, Size: 20, Status: USED
Pos: 20, Size: 1024556, Status: FREE

Onde, na segunda linha, POS indica a posio do inicio do primeiro bloco de memria, que foi
alocado com tamanho 20 e est atualmente sendo utilizada. J a terceira linha indica que a partir da
posio 20 existe um bloco contiguo de tamanho 1.024.556 livre.
Testes e avaliao
Dever ser produzido obrigatoriamente um arquivo de header com o nome valloc.h contendo
a assinatura das funes indicadas, de modo que este possa ser integrado ao programa principal,
como pode ser visto no arquivo main.c fornecido.
As funes tero seu funcionamento avaliado pela execuo do conjunto de instrues interpretadas
pela funo main (ver anexo), que por sua vez far a chamada das funes fornecidas por sua
implementao. Dessa forma uma srie de alocaes, realocaes e liberaes de memria sero
realizadas, bem como o acompanhamento do status da memria. A sintaxe e o comportamento das
novas funes devero ser idnticos aos de malloc, free, calloc e realloc.
A sada ser comparada com a de uma implementao padro dentro do Prtico. Cada teste do
Prtico composto por uma sequncia de instrues, que tem seu formato e sintaxe descrita no
anexo. Sua sada ser correspondente a uma srie de chamadas da funo
imprime_status_memoria, mencionada anteriormente. Ser fornecido um exemplo de
entrada e sada no Moodle.

Comentrios Gerais:
1. Comece a fazer este trabalho logo, enquanto o problema est fresco na memria e o prazo
para termin-lo est to longe quanto jamais poder estar.
2. Clareza, indentao e comentrios no programa tambm sero avaliados.
3. O trabalho individual.
4. A submisso ser feita pelo Prtico (aeds.dcc.ufmg.br)
5. O Prtico desconsidera espaos, quebras de linha e tabulaes a mais de sua sada, portanto
no necessrio alinhar de forma exata estes itens sada padro fornecida.
6. Trabalhos copiados, comprados, doados, etc. sero penalizados conforme anunciado.
7. Penalizao por atraso: (2d 1) pontos, onde d o nmero de dias de atraso.
Referncias
[1] A malloc tutorial: documento que explica o funcionamento completo da funo malloc e
mostra sua implementao em C, para o caso real (memria dinmica).
www.inf.udec.cl/~leo/Malloc_tutorial.pdf
Anexo I Sintaxe interpretador
O interpretador utiliza as seguintes instrues:
VAR <numero de variveis>

Indica ao interpretador o nmero de variveis que devem ser alocadas pelo programa. Esse
comando obrigatrio para a execuo do programa.
VALLOC <tamanho do bloco> V<identificador da varivel>
VCALLOC <tamanho do bloco> V<identificador da varivel>
VREALLOC <tamanho do bloco> V<identificador da varivel>

Solicita ao interpretador chamadas respectivas funes: valloc, vcalloc, vrealloc. Onde


<tamanho de bloco> representa o tamanho do bloco a ser armazenado, e <identificador> o
identificador da varivel onde deve ser armazenada a primeira posio do bloco, retornada pela
funo.
VFREE V<identificador>

Solicita a chamada da funo vfree a varivel com <identificador> fornecido na instruo.


PRINT

Solicita a chamada da funo imprime_status_memoria.


Anexo II - Execuo do programa:
./tp1 <arquivo entrada>

Anexo III - Exemplo Entrada


VAR 2
PRINT
VALLOC 10 V0
PRINT
VCALLOC 10 V1
PRINT
VREALLOC 20 V0
PRINT
VFREE V0
VFREE V1
PRINT
Anexo IV Exemplo Sada
VAR 2
Status agora:
Pos: 0, Size: 1024576, Status: FREE
VALLOC 10 V0
Status agora:
Pos: 0, Size: 10, Status: USED
Pos: 10, Size: 1024566, Status: FREE
VCALLOC 10 V1
Status agora:
Pos: 0, Size: 10, Status: USED
Pos: 10, Size: 10, Status: USED
Pos: 20, Size: 1024556, Status: FREE
VREALLOC 20 V0
Status agora:
Pos: 0, Size: 10, Status: FREE
Pos: 10, Size: 10, Status: USED
Pos: 20, Size: 20, Status: USED
Pos: 40, Size: 1024536, Status: FREE
VFREE 0
VFREE 1
Status agora:
Pos: 0, Size: 1024576, Status: FREE

You might also like