Variáveis Dinâmicas
Caixas de Nós
Inhaúma Neves Ferraz
Departamento de Ciência da Computação
Universidade Federal Fluminense
[email protected]
Sumário
Dados estáticos e dinâmicos
Variáveis dinâmicas
Caixa de nós
Conceito
 Funções que tratam de caixas de nós

Implementação em memória
Implementação em memória secundária
2
Variáveis Dinâmicas
Caixas de Nós
Dados estáticos e dinâmicos
Os tipos de dados e as estruturas de dados
utilizados nos algoritmos e programas podem
ser estáticos e dinâmicos
No primeiro caso a alocação de espaço de
memória é feita uma só vez e é imutável
Para melhor aproveitar os espaços disponíveis
pode-se postergar as solicitações de memória
até a ocasião de sua necessidade real e liberar
espaços tornados desnecessários em processos
que evoluam dinamicamente
4
Variáveis Dinâmicas
Pode-se utilizar um processo de alocação de
memória de forma dinâmica, isto é, só
requisitar memória no momento de
utilização de cada registro
Isto é feito declarando uma variável como
sendo um ponteiro para um tipo específico
de objeto e criando dinamicamente objetos
desse tipo e atribuindo seu endereço à
variável ponteiro
5
Caixa de nós (1)
A alocação de espaços requeridos pelos algoritmos e programas
pode ser considerada como a manipulação de registros
originados em uma “CAIXA DE NÓS”
Esta caixa de nós contém, inicialmente, um número finito de
registros
Os programas só tem acesso à caixa de nós através das
operações getnode e freenode
A criação de uma lista de nós disponíveis ou caixa de nós é
feita pelo procedimento create_avail
Os nós são obtidos de um “array” quando se utiliza a memória
principal
O procedimento é o mesmo em memória secundária quando os
nós são obtidos seqüencialmente de um arquivo de acesso direto
6
Caixa de nós (2)
getnode remove um registro da caixa de nós e o
fornece ao programa
freenode devolve à caixa de nós um registro que
não mais esteja sendo utilizado pelo programa.
a operação getnode em uma caixa de nós vazia
mostra qeue a memória reservada para as
estruturas de dados do programa é insuficiente
Esta situação configura um transbordamento ou
“overflow”
7
Caixa de nós (3)
8
Gerenciamento de espaço disponível
(“available”)
Avail
*
 Alocação de um novo nó
*
. . . . .
*
^
If Avail = Null then sem-espaço
(a) else begin Getnode := Avail;
(b)
Avail := Next(Avail);
(c)
Next(Getnode) := Null
end;
Avail
*
*
Getnode
Getnode
*
. . . . .
*
*
. . . . .
*
^
^
Avail
Getnode
*
Avail
*
*
. .
^
Liberação de um nó
Procedimento Freenode(Q)
INFO
NEXT
Q
Avail
(a) Next(Q) := Avail
(b) Info(Q) := Null
(c) Avail := Q
*
*
*
*
. . . . .
^
Q
NEXT
Avail
*
*
*
*
. . . . .
^
Algoritmos
FUNÇÕES QUE TRATAM DAS
CAIXAS DE NÓS
Implementação por ponteiros inteiros sobre um “array”
Definição de dados
Constantes
símbolo
MENOS_UM
ZERO
NUMNODES
valor
-1
0
Descrição
Valor -1
Valor 0
número máximo de registros previstos para a caixa
12
Tipo de registro
reg
atributo
info
next
tipo
registro dependente da natureza do problema
inteiro
Tipo de dado
t_caixa  array[0..NUMNODES - 1] de reg
13
Algoritmos
Procedimento sem tipo create_avail (Sem parâmetros)
Símbolo
Tipo
Escopo
Descrição
avail
inteiro
global
ponteiro para o primeiro registro disponível
caixa
t_caixa
global
“array” que implementa a caixa de nós
NUMNODES constante
global
número máximo de registros disponíveis
ZERO
constante
global
0
MENOS_UM
constante
global
-1
i
inteiro
local
identificador de registro
Finalidade
Criação de uma lista de nós disponíveis ou caixa de nós. Os nós serão obtidos de um “array”. O
presente algoritmo tanbém serve para nós obtidos seqüêncialmente de um arquivo de acesso
direto.
Início
avail  ZERO
Para i variando de ZERO até NUMNODES - 2
caixa[i].next  i + 1
Fim do Para
caixa[NUMNODES - 1].next  MENOS_UM
Fim do procedimento
14
Método create_avail()
void create_avail(void){
int i;
avail = 0;
for(i=0; i<numNodes-1; i++){
node[i].next = i+1;
}
node[numNodes-1].next = -1;
}
15
Método getnode()
Procedimento tipo inteiro getnode (Sem parâmetros)
Símbolo
Tipo
Escopo
Descrição
avail
inteiro
global
ponteiro para o primeiro registro disponível
MENOS_UM
constante
global
-1
p
inteiro
local
endereço de nó alocado
Finalidade
Obtenção de um nó da lista de nós disponíveis ou caixa de nós. Os nós serão obtidos de um
“array”. O presente algoritmo tanbém serve para nós obtidos seqüêncialmente de um arquivo de
acesso direto.
Início
Se (avail = MENOS_UM)
então
retorne(MENOS_UM)
Fim do Se
p  avail
avail  caixa[avail].next
retorne(p)
Fim do procedimento
16
Getnode (2)
int getNode(void){
int p;
if (avail==-1){
std::cout<<"Overflow\n";
exit(1);
}
p=avail;
avail=node[avail].next;
return p;
}
17
Freenode (1)
Procedimento tipo inteiro freenode (tipo inteiro p)
Símbolo
Tipo
Escopo
p
inteiro
Par valor
avail
inteiro
global
caixa
t_caixa
global
Descrição
ponteiro para o nó a ser desalocado
ponteiro para o primeiro registro
disponível
“array” que implementa a caixa de nós
Finalidade
Devolução de um nó disponível, p, à lista de nós disponíveis ou caixa de nós. Os nós serão
obtidos de um “array”. O presente algoritmo tanbém serve para nós obtidos seqüêncialmente de
um arquivo de acesso direto.
Início
caixa[p].next  avail
avail  p
retorne
Fim do procedimento
18
Freenode (2)
void freenode(int p)
{
node[p].next = avail;
avail = p;
return;
} /* end freenode */
19
Implementação em memória
Caixa de nós em memória
Gerência Dinâmica de Memória
Linguagem
Pascal
C
C++
Java
Alocação de memória Desalocação de memória
new
dispose
malloc
free
new
delete
new
--------
Getnode em C++
template <class T>
Node<T> *GetNode(const T& item, Node<T> *nextPtr=NULL)
{
Node<T> *newNode; //declaração de ponteiro para nó
newNode=new Node<T>(item, nextPtr);
//alocação de memória
// passagem de item e nextptr para o construtor
// encerrar se a alocação falhar
if (newNode==NULL)
{cerr<<“A alocação de memória falhou"<<endl;
exit(1);
}
return newNode;
}
22
Implementação em memória
secundária
Getnode em C++
//Retorna um nó (Registro) disponível do arquivo de acesso direto
Int getNode()
{
Bucket *header;
Bucket *areaTrab;
int posicao;
header = new Bucket;
areaTrab = new Bucket;
header = &(lerBucket(0));
posicao = header->proximo;
if (posicao == 0)
cout << "Nao ha mais nos disponiveis";
else
{
//Atualiza o indicador do próximo registro disponível
areaTrab = &(lerBucket(posicao));
header->proximo = areaTrab->proximo;
gravarBucket(0,*header);
}
delete(header);
delete(areaTrab);
return posicao;
}
24
Freenode em C++
//Libera um registro e o coloca de volta na caixa de nós disponíveis
Void freeNode(int posicao)
{
Bucket *header;
Bucket *areaTrab;
header = new Bucket;
areaTrab = new Bucket;
header = &(lerBucket(0));
areaTrab = &(lerBucket(posicao));
areaTrab->proximo = header->proximo;
header->proximo = posicao;
gravarBucket(0,*header);
gravarBucket(posicao,*areaTrab);
delete(header);
delete(areaTrab);
}
25
Getnode em Java (1)
/* getnode
* Parametros:
* arq: arquivo de acesso direto da caixa de nós
*/
public static int getnode(RandomAccessFile arq)
{
Bucket header = new Bucket();
int endereco = 0;
try
{
arq.seek(0);
header.read(arq);
// Extrair de header o endereço do próximo registro disponível
endereco = header.proximo;
if (header.proximo == -1)
{
System.out.println("Nao ha mais nos!");// - Arquivo lotado
}
26
Getnode em Java (2)
else // Ainda ha nos
{
Bucket areaTrabalho = new Bucket();
arq.seek(endereco*Bucket.size());
areaTrabalho.read(arq);
header.proximo = areaTrabalho.proximo;
arq.seek(0);
header.write(arq);
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
finally
{
return endereco;
}
}
27
Freenode em Java (1)
/* Devolver a caixa de nos um bucket não mais
necessário.
* Parametros:
* endBucket: endereço do bucket a ser liberado
**/
public static void freenode(int endBucket)
{
Bucket areaDeTrabalho = new Bucket();
Bucket header = new Bucket();
//
int proxBucketDisponivel;
//endereço de bucket que pode ser alocado
28
Freenode em Java (2)
try
{
arqDireto.seek(endBucket*Bucket.size());
areaDeTrabalho.read(arqDireto);
arqDireto.seek(0);
header.read(arqDireto);
areaDeTrabalho.setProximo(header.proximo);
// Susbstitui em header o valor do antigo proximo bucket disponivel
// pelo endereco do bucket devolvido a caixa de nos.
header.setProximo(endBucket);
//Limpa o bucket devolvido a caixa de nos
Cisao.Inicializar(areaDeTrabalho);
//Grava o bucket devolvido a caixa de nos e o header atualizado.
arqDireto.seek(endBucket*Bucket.size());
areaDeTrabalho.write(arqDireto);
arqDireto.seek(0);
header.write(arqDireto);
}
29
Freenode em Java (3)
catch (IOException ex)
{
ex.printStackTrace();
}
}
30
Download

caixa de nós - Instituto de Computação - UFF