Pintos: Guía Fase 1

Introducción

La siguiente guía, tiene como propósito ayudarle a comprender mejor la primera asignación y proporcionarle las ideas necesarias de forma que usted minimice la cantidad de tiempo que pasa confundido por la sintaxis en general de Pintos y pueda aprovechar este tiempo en el diseño y la implementación de las distintas tareas a realizar.

Esta guía es solamente una referencia, siempre es recomendable referirse a la documentación oficial de Pintos en el Sitio de Stanford y leer esta información antes de utilizar la presente guía.

Le quedarán distintos aspectos por descubrir por sí mismo, sin embargo, se espera poder proveerle distintas pistas y consejos que le sean de utilidad para comprender Pintos más a detalle.

Esta guía se enfoca más a cómo implementar distintas funcionalidades, por lo que no se preocupará de detallar tanto a nivel conceptual. Se espera que el lector domine diversos conceptos de sistemas operativos y entienda términos comúnmente usados leyendo previamente la documencación oficial. Cualquier detalle que quiera usted remarcar en la presente guía, ya sean posibles errores o recomendaciones, o incluso si desea realizar contribuciones a la mejora de está guía, puede hacernoslo saber dirigiéndose al área de contacto.

Vista General

En la primera fase, se proporciona un sistema de threads mínimo en funcionalidad. El trabajo consiste en extender la funcionalidad de este sistema y ganar entendimiento de problemas de sincronización.

La definición de la estructura thread se encuentra en src/threads/thread.hy se ve así:

thread.h
struct thread
  {
    /* Owned by thread.c. */
    tid_t tid;                          /* Thread identifier. */
    enum thread_status status;          /* Thread state. */
    char name[16];                      /* Name (for debugging purposes). */
    uint8_t *stack;                     /* Saved stack pointer. */
    int priority;                       /* Priority. */
    struct list_elem allelem;           /* List element for all threads list. */

    /* Shared between thread.c and synch.c. */
    struct list_elem elem;              /* List element. */

    //PUEDE DECLARARLO AQUI COMO UN UINT64_T

#ifdef USERPROG
    /* Owned by userprog/process.c. */
    uint32_t *pagedir;                  /* Page directory. */
#endif

    /* Owned by thread.c. */
    unsigned magic;                     /* Detects stack overflow. */
  };

Todos los elementos de esta estructura son sencillos de comprender, y son esos por defecto. A lo largo del proyecto, puede agregar más elementos libremente pero asegúrese de NO agregar lemeentos abajo de la declaración de unsigned magic ya que puede alterar el comportamiento del sistema.

Algunas de las funciones importantes de thread.h son:

Función

Descripción

thread_init

Inicializa las estructuras globales que todos los threads utilizan, como locks o semáforos.

thread_create

Crea un nuevo thread y lo coloca en un ready state.

thread_block

Bloquea al thread actual en ejecución

thread_unblock

Toma al thread que se pasa como argumento y lo desbloquea.

thread_current

Retorna un puntero al thread actual en ejecución.

thread_foreach

Toma la función pasada como argumento y la aplica sobre cada thread.

thread_get_priority

Retorna la prioridad del thread actual en ejecución (Implementada en la Priority Scheduling).

thread_set_priority

Toma el entero pasado como argumento, y cambia la prioridad del thread actual en ejecución al valor de este entero. (Implementada en la Priority Scheduling).

En el Kernel de Pintos hay un solo address space, pueden haber varios threads en ejecucion en el modo kernel y todos estos kernel threads comparten ese mismo address space.

El addresss space del Kernel de Pintos son poco más de 64MB de memoria física, y empieza a ser mapeada en PHYS_BASE (0xc0000000).

El Kernel mantiene un Thread Control Block para cada thread, el cual se representa con la estructura thread mostrada previamente.

El stack de cada thread es del tamaño de una página que en Pintos son 4KB. Los estados de un thread en Pintos son los siguientes:

Será importante comprender un poco la estructura, funcionamiento y manejo de la estructura lista, ya que serán frecuentemente utilizadas, estas puede encontrarlas en src/lib/kernel/list.h y list.c . En la primera tarea, Alarm Clock, veremos como hacer esto.

Esta información es la más general y considerablemente importante a entender previo a la implementaciónde las distintas tareas.

Last updated