30
Variáveis Dinâmicas Caixas de Nós Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense [email protected]

Variáveis Dinâmicas Caixas de Nós

  • Upload
    kiri

  • View
    30

  • Download
    3

Embed Size (px)

DESCRIPTION

Variáveis Dinâmicas Caixas de Nós. Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade F ederal 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Variáveis Dinâmicas  Caixas de Nós

Variáveis Dinâmicas Caixas de Nós

Inhaúma Neves FerrazDepartamento de Ciência da Computação

Universidade Federal Fluminense

[email protected]

Page 2: Variáveis Dinâmicas  Caixas de Nós

2

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

Page 3: Variáveis Dinâmicas  Caixas de Nós

Variáveis Dinâmicas Caixas de Nós

Page 4: Variáveis Dinâmicas  Caixas de Nós

4

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âmicosNo primeiro caso a alocação de espaço de memória é feita uma só vez e é imutávelPara 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

Page 5: Variáveis Dinâmicas  Caixas de Nós

5

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 registroIsto é 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

Page 6: Variáveis Dinâmicas  Caixas de Nós

6

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 registrosOs programas só tem acesso à caixa de nós através das operações getnode e freenodeA criação de uma lista de nós disponíveis ou caixa de nós é feita pelo procedimento create_availOs nós são obtidos de um “array” quando se utiliza a memória principalO procedimento é o mesmo em memória secundária quando os nós são obtidos seqüencialmente de um arquivo de acesso direto

Page 7: Variáveis Dinâmicas  Caixas de Nós

7

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”

Page 8: Variáveis Dinâmicas  Caixas de Nós

8

Caixa de nós (3)

Page 9: Variáveis Dinâmicas  Caixas de Nós

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

Page 10: Variáveis Dinâmicas  Caixas de Nós

Liberação de um nó

Procedimento Freenode(Q) (a) Next(Q) := Avail (b) Info(Q) := Null (c) Avail := Q

QINFO NEXT

*

* * * ^. . . . .Avail

Q

NEXT

*

* * * ^. . . . .

Avail

Page 11: Variáveis Dinâmicas  Caixas de Nós

Algoritmos

Page 12: Variáveis Dinâmicas  Caixas de Nós

12

FUNÇÕES QUE TRATAM DAS CAIXAS DE NÓS

Implementação por ponteiros inteiros sobre um “array”

 

Definição de dados

 

Constantes

Page 13: Variáveis Dinâmicas  Caixas de Nós

13

Tipo de registro

Tipo de dado

t_caixa array[0..NUMNODES - 1] de reg

Page 14: Variáveis Dinâmicas  Caixas de Nós

14

Algoritmos

Page 15: Variáveis Dinâmicas  Caixas de Nós

15

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;

}

Page 16: Variáveis Dinâmicas  Caixas de Nós

16

Método getnode()

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

Page 17: Variáveis Dinâmicas  Caixas de Nós

17

Getnode (2)

int getNode(void){ int p; if (avail==-1){ std::cout<<"Overflow\n"; exit(1); } p=avail; avail=node[avail].next; return p;}

Page 18: Variáveis Dinâmicas  Caixas de Nós

18

Freenode (1)

Início caixa[p].next avail avail p retorneFim do procedimento

Procedimento tipo inteiro freenode (tipo inteiro p) Símbolo Tipo Escopo Descrição p inteiro Par valor ponteiro para o nó a ser desalocado avail inteiro global ponteiro para o primeiro registro

disponível caixa t_caixa global “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.

Page 19: Variáveis Dinâmicas  Caixas de Nós

19

Freenode (2)

void freenode(int p)

{

node[p].next = avail;

avail = p;

return;

} /* end freenode */

Page 20: Variáveis Dinâmicas  Caixas de Nós

Implementação em memória

Page 21: Variáveis Dinâmicas  Caixas de Nós

Caixa de nós em memória

Linguagem Alocação de memória Desalocação de memóriaPascal new disposeC malloc freeC++ new deleteJava new --------

Gerência Dinâmica de Memória

Page 22: Variáveis Dinâmicas  Caixas de Nós

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

Page 23: Variáveis Dinâmicas  Caixas de Nós

Implementação em memória secundária

Page 24: Variáveis Dinâmicas  Caixas de Nós

24

Getnode em C++

//Retorna um nó (Registro) disponível do arquivo de acesso diretoInt 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;}

Page 25: Variáveis Dinâmicas  Caixas de Nós

25

Freenode em C++

//Libera um registro e o coloca de volta na caixa de nós disponíveisVoid 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);}

Page 26: Variáveis Dinâmicas  Caixas de Nós

26

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ívelendereco = header.proximo;if (header.proximo == -1) {

System.out.println("Nao ha mais nos!");// - Arquivo lotado

}

Page 27: Variáveis Dinâmicas  Caixas de Nós

27

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;}}

Page 28: Variáveis Dinâmicas  Caixas de Nós

28

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

Page 29: Variáveis Dinâmicas  Caixas de Nós

29

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 nosCisao.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);

}

Page 30: Variáveis Dinâmicas  Caixas de Nós

30

Freenode em Java (3)

catch (IOException ex)

{

ex.printStackTrace();

}

}