La importancia de la memoria cache (III)

La importancia de la memoria cache (III)

Continuando el artículo anterior en el que definíamos, a groso modo, el sistema de memoria de un computador, fijándonos sobre todo en la memoria cache, nuestro siguiente paso es comprobar que todo esto de lo que hemos hablado es verdad, para ello vamos a utilizar unos programas diseñados sobre el lenguaje de programación C.

Slow Work Progress

Este ejemplo de uso es algo difícil de simular, así que solo recomiendo realizarlo a gente que sepa bien lo que hace. Por razones un poco de seguridad, no pondré como público el código que utilizo para deshabilitar el bloque de direcciones que contiene la cache, no por mi, si no porque un mal uso puede inutilizar por completo el ordenador y forzar que se tenga que formatear. Además dar soporte a este tipo de elementos es algo complicado y probablemente si ocurre un fallo no pueda ayudar a solventarlo.

Con el siguiente ejemplo vamos a darle sentido a la imagen de cabecera. Vamos a suponer el siguiente código escrito en C (ejemplo1.c):

#include <stdlib.h>#include <stdio.h>#define NVECES 50000 // Repite 50000 veceschar pagina[4096]; // 4096 bytesint main(void) {    int rep, i;    for (rep = 0; rep < NVECES; rep++) {         if (rep % 1000 == 0) {         printf("N= %dn", rep);         fflush(stdout);    }   for(i = 0; i < 4096; i++)        pagina[i] = 'A';    }   exit(0);}

Vamos a ejecutarlo en una distribución de Linux. Primero compilamos y enlazamos el programa anterior

gcc ejemplo1.c-o ejemplo1

A continuación lo ejecutamos con:

time ./ejemplo1

tiempo_ejecucion_con_cache

Con esto tendremos un tiempo. Vamos a compararlo con el tiempo que nos daría si no tuviésemos cache en nuestro ordenador.

Lo primero es desactivar la cache. En el momento que la desactivemos notaremos como todo el sistema empieza a ir muy, muy lento.

Desactivando la cache

Consideramos que trabajamos sobre Ubuntu y que hemos podido desactivar nuestra cache. Supongamos que como mi caso tenemos una función en C que nos permite poder desactivar nuestra cache, básicamente lo que hacemos es deshabilitar unas direcciones asociadas a nuestra memoria cache y a nuestro programa para que al no poder guardar información en esta. Esta función cachedis(...) funcionará de la siguiente manera: cuando hagamos una llamada, por ejemplo cachedis(0x12345678); se desactiva la caché para el rango de direcciones 0x12345000-0x12345FFF.

Luego con el siguiente código comprobamos los tiempos (ejemplo2.c):

#include <stdlib.h>#include <stdio.h>#include <atc/lincache.h>#define NVECES 50000 // Repite 50000 veceschar pagina[4096]; // 4096 bytesint main(void) {    int rep, i;    if (cachedis((unsigned int)&rep) < 0) {        fprintf(stderr, "Error deshabilitando la cachen");        exit(-1);    }    for (rep = 0; rep < NVECES; rep++) {    // Mensaje por pantalla cada 1000 repeticiones    if (rep % 1000 == 0) {        printf("N= %dn", rep);        fflush(stdout);    }     // Accede a todas las posiciones de la página de datos    for(i = 0; i < 4096; i++)        pagina[i] = 'A';}    exit(0);}

Primero compilamos y enlazamos el programa anterior:

gcc ejemplo2.c-o ejemplo2 -lcache 

A continuación lo ejecutamos con:

time ./ejemplo2

tiempo_ejecucion_sin_cache

El tiempo no es muy real ya que el sistema operativo realiza por debajo nuestra ciertas operaciones que pueden variarlo, pero la idea esta clara, un sistema sin cache es inasumible, haría que hasta el programa más simple tardase muchísimo más.

Estos artículos puramente teóricos son esenciales para poder continuar con nuestro tutorial de programación y así explicar las necesidades de determinadas estructuras de datos y los beneficios que obtendremos, y que repercutirán en todo el sistema, al utilizar una u otra estructura.

Bibliografía utilizada:

Organización de computadores | ORGANIZACION Y ARQUITECTURA DE COMPUTADORES (7ª ED.) WILLIAM STALLINGS y apuntes departamento arquitectura y tecnología de computadores, universidad de Oviedo

Biografía recomendada:

Organización de computadores | ORGANIZACION Y ARQUITECTURA DE COMPUTADORES (7ª ED.) WILLIAM STALLINGS

Sistemas operativos | SISTEMAS OPERATIVOS, JESUS CARRETERO PEREZ

Para ti
Queremos saber tu opinión. ¡Comenta!