Laboratorio 0004: Gestión de la Memoria Intermedia

publicado a la‎(s)‎ 28 may 2012, 19:41 por Hernan Nina Hanco   [ actualizado el 4 jun 2013, 8:41 ]

I) Objetivo

  • Implementar una abstracción básica de la Gestión de la Memoria Intermedia como parte de la arquitectura de un Sistema de Gestión de Base de Datos.


II) Marco conceptual

Gestión de la memoria intermedia:

El sistema de base de datos fórmula solicitudes al gestor de la memoria intermedia cuando necesitan bloques de disco. Si el bloque ya esta en la memoria intermedia el gestor envía la dirección de memoria del bloque. Si el bloque no se halla en la memoria intermedia, el gestor de la memoria intermedia asigna en primer lugar espacio al bloque en la memoria intermedia, descartando algún otro bloque si hace falta para hacer sitio para el nuevo bloque. Sólo se vuelve a escribir en el disco el bloque que se descarta si se modificó desde la última vez que se escribió en el disco. A continuación, el gestor de la memoria intermedia lee el bloque del disco y lo escribe en la memoria intermedia, y pasa la dirección del bloque en la memoria principal al solicitante.


LRU:

Estrategía de sustitución en el que se vuelve a escribir en el disco y se elimina de la memoria intermedia el bloque al que se ha hecho referencia menos recientemente.

Página:

Representa un bloque de un disco, que corresponde a las unidades de asignación de almacenamiento en un proceso de acceso a disco. una Página puede contener varios datos o registros de una base de datos.


Más referencia de la teoría en el documento Guía Universitaria de Sistemas de Bases de Datos II sección 1.5 Acceso al almacenamiento.


III) Practicas


Práctica 1) Implementar un Gestor de la Memoria Intermedia.

Se presenta dos clases, la Clase Pagina que representa a un bloque de disco. Luego esta la clase GestorMemoriaIntermedia este representa al gestor de memoria intermedia basado en la estrategía de sustitución LRU.


Clase Pagina


/*

* Creado el 28 de mayo, 2012 por Hernán Nina Hanco

*

* Este trabajo es parte del proyecto Taqque, que corresponde a la

* implementación de un Sistema de Gestión de Base de Datos. Cualquier

* cambio es necesario declararlo en este apartado.

*

* Universidad Nacional de San Antonio Abad del Cusco

* Carrera Profesional de Ingeniería Informática y de Sistemas

* Asignatura: Sistemas de Bases de Datos II

*/


package org.taqque.memoriaintermedia;


/**

* Pagina: Representa un bloque de Disco donde se almacenan los archivos de

* la base de datos

*

* @author hernan

*/

public class Pagina<T> {

   /** Identidicador de la página en el disco. */

   private int numeroPagina;

   /** Datos almacenados en el bloque. */

   private T datos;

   

   /**

    * Crea una nueva pagina conociendo su id de pagina y los datos.

    *

    * @param numeroPagina el ID de esta página.

    * @param datos datos almacenados en esta página.

    */

   

   public Pagina(int numeroPagina, T datos) {

       this.numeroPagina = numeroPagina;

       this.datos = datos;

   }


   public T getDatos() {

       return datos;

   }


   public void setDatos(T datos) {

       this.datos = datos;

   }


   public int getNumeroPagina() {

       return numeroPagina;

   }


   public void setNumeroPagina(int numeroPagina) {

       this.numeroPagina = numeroPagina;

   }

   

   /**

    * Devuelde una representación textual de una página.

    *

    * @return representación textual de esta página.

    */

   @Override

   public String toString()

   {

       return "Numero de Pagina: "+this.numeroPagina + "\t" +

               "Dato de pagina: " + this.datos;

   }

}


Clase GestorMemoriaIntermedia

/*
* Creado el 28 de mayo, 2012 por Hernán Nina Hanco
*
* Este trabajo es parte del proyecto Taqque, que corresponde a la
* implementación de un Sistema de Gestión de Base de Datos. Cualquier
* cambio es necesario declararlo en este apartado.
*
* Universidad Nacional de San Antonio Abad del Cusco
* Carrera Profesional de Ingeniería Informática y de Sistemas
* Asignatura: Sistemas de Bases de Datos II
*/
package org.taqque.memoriaintermedia;

import java.util.LinkedList;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Representa una abstracción de un Gestor de la Memoria Intermedia
*
* @author hernan
*/
public class GestorMemoriaIntermedia {

   static final Logger logger = Logger.getLogger("Gestion de Buffer");
   /** Representa a los bloques de la memoria intermedia o buffer. */
   private Pagina[] buffer;
   /** Numero de paginas en total en el buffer. */
   private int numeroPaginas;
   /** Posición en el buffer de la ultima pagina colocada. */
   private int posicionUltimaPagina = -1;
   /** cola para el control de sustitución basada en LRU. */
   private Queue colaLRU;

   /**
    * Crea un nuevo Gestor de memoria intermedia.
    *
    * @param numeroPaginas cantidad de paginas en total en el buffer.
    */
   public GestorMemoriaIntermedia(int numeroPaginas) {
       this.numeroPaginas = numeroPaginas;
       // Crear el buffer con paginas vacias
       buffer = new Pagina[numeroPaginas];
       // Crear una cola FIFO
       colaLRU = new LinkedList<Integer>();
   }

   /**
    * Devuelve una pagina conociendo el numero de la página.
    *
    * @param numeroPagina el id de la pagina que queremos devolver
    * @return la página del id de pagina proporcionado.
    */
   public Pagina recuperarPaginaDelBuffer(int numeroPagina) {
       // Verificar si la pagina esta en el buffer
       int posicion = posicionDePaginaEnBuffer(numeroPagina);
       if (posicion >= 0) // la pagina esta en el buffer
       {
           // Marcar Pagina o bloque como recientemente referenciado
           colaLRU.remove(numeroPagina);
           colaLRU.add(numeroPagina);
           // devolver la pagina del buffer al solicitante
           return buffer[posicion];
       }
       return null;
   }

   /**
    * Poner una pagina en el buffer de la memoria intermedia.
    *
    * @param pagina la pagina a ser insertado en el buffer.
    * @return la pagina que sera descartada del buffer si es necesario.
    */
   public Pagina ponerPaginaEnBuffer(Pagina pagina) {
       // Si la pagina esta en el buffer
       if (estaPaginaEnBuffer(pagina)) {
           // no descartar ninguna pagina o bloque
           return null;
       } // Si la pagina no esta en el buffer, pero con espacio en el buffer
       else if (!bufferLLeno()) {
           // Asignar la nueva pagina al bloque o pagina libre del buffer
           posicionUltimaPagina++;
           buffer[posicionUltimaPagina] = pagina;
           // Actualizar la LRU
           colaLRU.remove(posicionUltimaPagina);
           colaLRU.add(posicionUltimaPagina);
           return null;
       } // Si la pagina no esta en el buffer, pero sin espacio en el buffer
       else {
           // recuperar la pagina a descartar
           int numeroPaginaDescartada = (Integer) colaLRU.remove();
           int posicion = posicionDePaginaEnBuffer(numeroPaginaDescartada);
           Pagina paginaDescartada = buffer[posicion];
           buffer[posicion] = pagina;
           colaLRU.add(pagina.getNumeroPagina());
           return paginaDescartada;
       }

   }

   private int posicionDePaginaEnBuffer(int numeroPagina) {
       int posicion = -1;
       for (int i = 0; i < buffer.length; i++) {
           if ((buffer[i] != null)
                   && (numeroPagina == buffer[i].getNumeroPagina())) {
               posicion = i;
               break;
           }
       }
       return posicion;

   }

   private boolean estaPaginaEnBuffer(Pagina pagina) {
       return (posicionDePaginaEnBuffer(pagina.getNumeroPagina()) != -1);
   }

   private boolean bufferLLeno() {
       return numeroPaginas - 1 == posicionUltimaPagina;
   }

   @Override
   public String toString() {
       String resultado = "";
       for (int i = 0; i < buffer.length; i++) {
           resultado += "Pagina[" + i + "]: " + buffer[i] + "\n";
       }
       return resultado + "\n" + this.colaLRU;
   }

   public static void main(String[] args) {
       // Crear un gestor de memoria
       GestorMemoriaIntermedia gestorBuffer = new GestorMemoriaIntermedia(6);
       // Paginas del Disco
       System.out.println("Paginas del Disco: ");
       Pagina[] paginas = new Pagina[10];
       for (int i = 0; i < paginas.length; i++) {
           Pagina pagina = new Pagina(i, "p" + i);
           paginas[i] = pagina;
           System.out.println(pagina);
       }

       System.out.println("Contenido del Gestor: ");
       System.out.println(gestorBuffer);


       for (int i = 0; i < paginas.length; i++) {
           gestorBuffer.ponerPaginaEnBuffer(paginas[i]);
       }

       System.out.println("Contenido del Gestor despues de poner bloques: ");
       System.out.println(gestorBuffer);

       System.out.println("Poner una página al Buffer: ");
       Pagina paginaN = new Pagina(10,"p10");
       Pagina paginaE = gestorBuffer.ponerPaginaEnBuffer(paginaN);
       System.out.println(paginaE);
       System.out.println(gestorBuffer);
       
       
       
       System.out.println("Recuperar una Pagina del Buffer: ");
       Pagina pagina1 = gestorBuffer.recuperarPaginaDelBuffer(7);
       System.out.println(pagina1);
       System.out.println(gestorBuffer);

       System.out.println("Recuperar otra Pagina del Buffer: ");
       Pagina pagina2 = gestorBuffer.recuperarPaginaDelBuffer(1);
       System.out.println(pagina2);
       System.out.println(gestorBuffer);
   }
}

El código del proyecto se encuentra en: 
http://code.google.com/p/taqque/


IV) Tarea

1. Modificar las implementaciones de la práctica, para poder conocer si una página fue modificada en la memoria intermedia y por lo tanto es necesario escribir en disco duro.

2. Modificar la implementación de la práctica para soportar bloques clavados.

3. Modificar las implementaciones de la práctica para resolver la operación:

prestatario |x| cliente

Utilizando las mejores estrategias de MRU y LRU.

Nota.- Para elaborar los trabajos crear un paquete tarea.memoriaintermedia en el trunk del proyecto de code google hosting.

V) Referencias

  • Guía universitaria Sistemas de Gestión de Bases de Datos II
Comments