Planificador de procesos de THOS

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
/*
 * Main function: a welcome message and a simple scheduler
 * Alessandro Rubini, 2009 GNU GPL2 or later
 */
#include <bathos/bathos.h>
#include <bathos/jiffies.h>
#include <arch/hw.h>

void __attribute__((noreturn)) bathos_main(void)
{
	struct bathos_task *p;
	unsigned long now;

	printf("Hello, Bathos is speaking (built on %s)\n", __DATE__);

	now = jiffies;
	for (p = __task_begin; p < __task_end; p++)
		p->release += now + 2;

	while (1) {
		struct bathos_task *t;

		for (t = p = __task_begin; p < __task_end; p++)
			if (p->release < t->release)
				t = p;
		while (time_before(jiffies, t->release))
			;
		t->arg = t->job(t->arg);
		t->release += t->period;
	}
}

A priori, resulta difícil enteder el código, ya que se han declarado numerosas macros y constantes previamente. Cuando se ejecuta este código (main.c) en THOS se conmutan pequeños procesos que muestran en pantalla distintas cadenas de texto. A continuación se encuentra el código de dichos procesos (task-uart.c):

/*
 * A set of tasks that print timely messages to the serial port
 * Alessandro Rubini, 2009 GNU GPL2 or later
 */
#include <bathos/bathos.h>
#include <arch/hw.h>

static void *uart_out(void *arg)
{
	char *s = arg;
	puts(s);
	return arg;
}

static struct bathos_task __task t_quarter = {
	.name = "quarter", .period = HZ/4,
	.job = uart_out, .arg = "."
};

static struct bathos_task __task t_second = {
	.name = "second", .period = HZ,
	.job = uart_out, .arg = "S",
	.release = 1,
};

static struct bathos_task __task t_10second = {
	.name = "10second", .period = 10 * HZ,
	.job = uart_out, .arg = "\n",
	.release = 2,
};

static struct bathos_task __task t_minute = {
	.name = "minute", .period = 60 * HZ,
	.job = uart_out, .arg = "minute!\n",
	.release = 3,
};

Como se puede observar el parámetro .arg es la cadena de texto a la que accede uart_out para posteriormete mostrársela al usuario.

De esta forma al ejecutarse el código de main.c se producirá lo siguiente:

Por cada cuarto de segundo que pase se mostrará en pantalla ".", cuando pase un segundo "S", cuando pasen 10 segundos veremos un salto de línea y cuando pase un minuto se mostrará "minute!" y se producirá un salto de línea.

Visto esto, podemos deducir que el planificador conmutará entre los distintos procesos en función del tiempo que haya pasado para el usuario.