# Frame Table

![](https://media.giphy.com/media/87aGjYaSZj6TR5KXlP/giphy.gif)

## Un poco de Explicación...

En la fase 2 estabas en un mundo ideal, bello y hermoso... todo era de color rosa porque los procesos no tenían la capacidad de crecer. Pero ahora que llegas a esta fase, esa premisa se vuelve falsa.

*Un OS le permite a un proceso crecer, pero limita hasta cuánto debe crecer.*&#x20;

La premisa anterior resume toda la fase 3 de memoria virtual y debemos comenzar desde 0.

Dado que la RAM es limitada, necesitamos saber qué frames están en uso y cuáles no.\
El objetivo de esta tabla es mantener un registro sobre qué frames el OS le ha prestado a los distintos procesos que están corriendo concurrentemente.

La Frame Table (resumido a FT) debe ser la primera implementación en la que debes enfocarte.

## Objetivo

Implementar una forma de administrar qué frames están en uso y cuáles no.

## Archivos

No encontrarás en ninguna parte algún archivo que haga referencia a esta tabla. ***Tú*** debes implementarla desde 0 y el primer paso es creando el archivo.

{% hint style="info" %}
**SUGERENCIA:** crea los archivos dentro del directorio ***vm***.
{% endhint %}

PintOS require que exista un archivo **.h** y un archivo **.c**. Crea los archivos ***frame.h*** y ***frame.c***.\
Dentro del archivo ***frame.h*** estarás colocando la definición de estructuras que necesites y la declaración de métodos y funciones.\
Y dentro del archivo ***frame.c*** estarás implementando todas aquellas funciones que declaraste en el archivo anterior.

Además, existe un archivo llamado ***Makefile.build***, en este archivo debes de ir añadiendo las referencias a todos los archivos que estés creando a lo largo de esta fase.

## Código

La forma de cómo quieres construir la Frame Table dependerá mucho de ti. Puedes utilizar una **lista**, un **hashmap** o cualquier otra estructura que desees, pero el mejor consejo que puedo darte es que utilices aquella estructura con la que estás muy familiarizado así te ahorras un par de días.

El código base que te estaré proporcionando es sobre las entradas de la Frame Table, es decir, lo que estarás guardando dentro de dicha tabla.

```c
struct frame_table_entry {
    void * frame_address;
    struct thread * owner;
    
    // Decide cómo quieres guardar esta entrada
};
```

Este ***struct*** lo estarás modificando conforme a las necesidades que surjan a lo largo de esta fase.

{% hint style="info" %}
Para no estar escribiendo mucho, se resumirá **"Frame Table Entry"** a **FTE**.
{% endhint %}

## FAQ

* ¿En dónde puedo inicializar la Frame Table?

  Te daré una pista: busca dentro del directorio de ***threads***/
* ¿Tiene alguna ventaja utilizar algún tipo de estructura de datos?

  No, queda a tu discreción cuál utilizar.
* ¿Estaré utilizando esta Tabla frecuentemente o en toda la parte de VM?

  En toda la parte de VM.

{% hint style="danger" %}
Debes tener mucho cuidado con la Frame Table. Existe la posibilidad que muchos procesos estén consultándola o modificándola.&#x20;
{% endhint %}
