Variveis Dinmicas Caixas de Ns Inhama Neves Ferraz

  • Slides: 30
Download presentation
Variáveis Dinâmicas Caixas de Nós Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade

Variáveis Dinâmicas Caixas de Nós Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense ferraz@ic. uff. br

Sumário Dados estáticos e dinâmicos Variáveis dinâmicas Caixa de nós Conceito n Funções que

Sumário Dados estáticos e dinâmicos Variáveis dinâmicas Caixa de nós Conceito n Funções que tratam de caixas de nós n Implementação em memória secundária 2

Variáveis Dinâmicas Caixas de Nós

Variáveis Dinâmicas Caixas de Nós

Dados estáticos e dinâmicos Os tipos de dados e as estruturas de dados utilizados

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

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

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

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

Caixa de nós (3) 8

Gerenciamento de espaço disponível (“available”) Avail * § Alocação de um novo nó *

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 * . . * ^ ^ Avail Getnode * Avail * * . . ^

Liberação de um nó Procedimento Freenode(Q) INFO NEXT Q Avail (a) Next(Q) : =

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

Algoritmos

FUNÇÕES QUE TRATAM DAS CAIXAS DE NÓS Implementação por ponteiros inteiros sobre um “array”

FUNÇÕES QUE TRATAM DAS CAIXAS DE NÓS Implementação por ponteiros inteiros sobre um “array” Definição de dados Constantes 12

Tipo de registro Tipo de dado t_caixa array[0. . NUMNODES - 1] de reg

Tipo de registro Tipo de dado t_caixa array[0. . NUMNODES - 1] de reg 13

Algoritmos Início avail ZERO Para i variando de ZERO até NUMNODES - 2 caixa[i].

Algoritmos 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<num. Nodes-1; i++){ node[i].

Método create_avail() void create_avail(void){ int i; avail = 0; for(i=0; i<num. Nodes-1; i++){ node[i]. next = i+1; } node[num. Nodes-1]. next = -1; } 15

Método getnode() Início Se (avail = MENOS_UM) então retorne(MENOS_UM) Fim do Se p avail

Método getnode() Início Se (avail = MENOS_UM) então retorne(MENOS_UM) Fim do Se p avail caixa[avail]. next retorne(p) Fim do procedimento 16

Getnode (2) int get. Node(void){ int p; if (avail==-1){ std: : cout<<"Overflown"; exit(1); }

Getnode (2) int get. Node(void){ int p; if (avail==-1){ std: : cout<<"Overflown"; exit(1); } p=avail; avail=node[avail]. next; return p; } 17

Freenode (1) Início caixa[p]. next avail p retorne Fim do procedimento 18

Freenode (1) Início caixa[p]. next avail p retorne Fim do procedimento 18

Freenode (2) void freenode(int p) { node[p]. next = avail; avail = p; return;

Freenode (2) void freenode(int p) { node[p]. next = avail; avail = p; return; } /* end freenode */ 19

Implementação em memória

Implementação em memória

Caixa de nós em memória

Caixa de nós em memória

Getnode em C++ template <class T> Node<T> *Get. Node(const T& item, Node<T> *next. Ptr=NULL)

Getnode em C++ template <class T> Node<T> *Get. Node(const T& item, Node<T> *next. Ptr=NULL) { Node<T> *new. Node; //declaração de ponteiro para nó new. Node=new Node<T>(item, next. Ptr); //alocação de memória // passagem de item e nextptr para o construtor // encerrar se a alocação falhar if (new. Node==NULL) {cerr<<“A alocação de memória falhou"<<endl; exit(1); } return new. Node; } 22

Implementação em memória secundária

Implementação em memória secundária

Getnode em C++ //Retorna um nó (Registro) disponível do arquivo de acesso direto Int

Getnode em C++ //Retorna um nó (Registro) disponível do arquivo de acesso direto Int get. Node() { Bucket *header; Bucket *area. Trab; int posicao; header = new Bucket; area. Trab = new Bucket; header = &(ler. Bucket(0)); posicao = header->proximo; if (posicao == 0) cout << "Nao ha mais nos disponiveis"; else { //Atualiza o indicador do próximo registro disponível area. Trab = &(ler. Bucket(posicao)); header->proximo = area. Trab->proximo; gravar. Bucket(0, *header); } delete(header); delete(area. Trab); return posicao; } 24

Freenode em C++ //Libera um registro e o coloca de volta na caixa de

Freenode em C++ //Libera um registro e o coloca de volta na caixa de nós disponíveis Void free. Node(int posicao) { Bucket *header; Bucket *area. Trab; header = new Bucket; area. Trab = new Bucket; header = &(ler. Bucket(0)); area. Trab = &(ler. Bucket(posicao)); area. Trab->proximo = header->proximo; header->proximo = posicao; gravar. Bucket(0, *header); gravar. Bucket(posicao, *area. Trab); delete(header); delete(area. Trab); } 25

Getnode em Java (1) /* getnode * Parametros: * arq: arquivo de acesso direto

Getnode em Java (1) /* getnode * Parametros: * arq: arquivo de acesso direto da caixa de nós */ public static int getnode(Random. Access. File 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 area. Trabalho =

Getnode em Java (2) else // Ainda ha nos { Bucket area. Trabalho = new Bucket(); arq. seek(endereco*Bucket. size()); area. Trabalho. read(arq); header. proximo = area. Trabalho. proximo; arq. seek(0); header. write(arq); } } catch(IOException ex) { ex. print. Stack. Trace(); } finally { return endereco; } } 27

Freenode em Java (1) /* Devolver a caixa de nos um bucket não mais

Freenode em Java (1) /* Devolver a caixa de nos um bucket não mais necessário. * Parametros: * end. Bucket: endereço do bucket a ser liberado **/ public static void freenode(int end. Bucket) { Bucket area. De. Trabalho = new Bucket(); Bucket header = new Bucket(); // int prox. Bucket. Disponivel; //endereço de bucket que pode ser alocado 28

Freenode em Java (2) try { arq. Direto. seek(end. Bucket*Bucket. size()); area. De. Trabalho.

Freenode em Java (2) try { arq. Direto. seek(end. Bucket*Bucket. size()); area. De. Trabalho. read(arq. Direto); arq. Direto. seek(0); header. read(arq. Direto); area. De. Trabalho. set. Proximo(header. proximo); // Susbstitui em header o valor do antigo proximo bucket disponivel // pelo endereco do bucket devolvido a caixa de nos. header. set. Proximo(end. Bucket); //Limpa o bucket devolvido a caixa de nos Cisao. Inicializar(area. De. Trabalho); //Grava o bucket devolvido a caixa de nos e o header atualizado. arq. Direto. seek(end. Bucket*Bucket. size()); area. De. Trabalho. write(arq. Direto); arq. Direto. seek(0); header. write(arq. Direto); } 29

Freenode em Java (3) catch (IOException ex) { ex. print. Stack. Trace(); } }

Freenode em Java (3) catch (IOException ex) { ex. print. Stack. Trace(); } } 30