\subsubsection{Simulación}

Un simulador es un software que crea un escenario virtual entre el sistema real y el usuario final,
permitiendo que éste ejecute un software determinado.
Los tres modos de simulación más utilizados son {\bf emulación}, {\bf paravirtualización} y {\bf virtualización nativa} 

La {\bf emulación} permite ejecutar programas creados originalmente para una plataforma y/o arquitectura diferentes.
La máquina virtual del emulador simula el hardware por completo, interpretando un sistema operativo diferente al de la CPU original, de manera que se pueda ejecutar el software deseado.
La diferencia con otras técnicas de simulación es que la emulación no reproduce el programa si no que modela de forma precisa el dispositivo que se está emulando.
Uno de los usos más extendidos de la emulación son los emuladores de videojuegos para ordenador, a partir de los cuales se puede jugar desde el ordenador a juegos de videoconsolas.
Un ejemplo de un emulador de videojuegos es {\it MAME}, un software multiplataforma que emula juegos de máquinas recreativas.
La máquina virtual de {\it MAME} genera una CPU para interpretar las instrucciones máquina originales,
un dispositivo de entrada para traducir los eventos de la palanca de control
y un dispositivo de sonido que interpreta el sonido original y lo traduce para la tarjeta de sonido del ordenador.
Otro uso de la emulación está relacionada con los emuladores de sistemas operativos.
En el caso de Linux hay dos emuladores destacables como {\it EmuDOS} y {\it Wine}.
El primero permite ejecutar programas de DOS y el segundo de Windows.
Para utilizar un programa a partir de un emulador, únicamente necesitamos una imagen ROM, que es el software original pasado a un fichero inteligible por el emulador.
A partir de un emulador, fijamos la arquitectura, sin embargo, la velocidad de la ejecución sigue siendo dependiente de la velocidad de la máquina virtual, con lo cual, aunque se aproxima a la solución que estamos buscando, no se adapta por completo a nuestras pretensiones.

La {\bf paravirtualización} es una técnica de simulación que crea una interfaz de software a partir de una máquina virtual, la cual adapta el software simulado a la CPU original.
La paravirtualización es usada generalmente para poder simular un sistema operativo diferente al sistema operativo instalado en el ordenador.
Un ejemplo es {\it User Mode Linux} (UML).
UML es un núcleo Linux completamente funcional que permite ejecutar múltiples sistemas virtuales,
donde cada uno de ellos será tratado como un proceso diferente.
De esta forma el usuario puede trabajar sobre un sistema operativo completo sin comprometer la estabilidad ni la configuración de la base.
Para ello, la máquina virtual está provista de dispositivos virtuales que dan acceso al hardware,
como soporte para sistemas de bloques, consolas, puestos de serie, interfaces de red,
dispositivos SCSI, USB y sistema de sonido entre otros.

Como hemos comprobado, con un simulador podemos independizar los resultados de un profiler de factores  relacionados con el hardware y el software en el que se ejecuta.
De esta manera, hemos llegado a la conclusión que la mejor forma de medir el tiempo de manera que las diferentes mediciones puedan ser comparables entre sí y que, además, nos aporte un alto grado de detalle en el resultado, es poder correr un profiler bajo un escenario virtual.
Para ello existen herramientas con las cuales se pueden obtener resultados fiables.
Una de estas herramientas es {\it Valgrind}



