I) Objetivo
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
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
|
DOCENCIA UNIVERSITARIA > Sistemas de Bases de Datos II > Laboratorio de Sistemas de Bases de Datos II >