При создании операционной системы или реализации ее отдельных элементов во встраиваемом приложении важны знания о планировщике задач. Этот сервис позволяет запускать другие программы или задачи в зависимости от конкретных событий. К ним можно отнести, например, наступление определённого времени, переход операционной системы в определенное состояние, поступление запроса через пользовательский интерфейс.

Приведенный код планировщика задач полезен для знакомства с данным механизмом. Он представляет собой планировщик по методу round-robin, написан на языке C и удобен при отладке на ПК, поскольку содержит приличное количество команд вывода данных на экран printf.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_PROCESSES 32 /* максимальное количество процессов в системе */
#define MAX_NAME_LEN 32
/* Блок управления процессами -
* хранит всю необходимую информацию о процессах
*/
struct pcb{
int pid; /* ID процесса */
int prio; /* приоритет процесса */
int attached; /* 1 если в списке процессов, иначе 0 */
int *function; /* указатель на функцию процесса */
char name[MAX_NAME_LEN]; /* Наименование процесса */
};
static struct pcb processlist[MAX_PROCESSES];
int process0();
int process1();
int process_attach(char *name, int prio, void *function)
{
int i = 0;
int ret = -1;
printf("[dbg] process_attach\n");
while(i < MAX_PROCESSES) {
if(strlen(name) > MAX_NAME_LEN) {
printf("[err] wrong stringlen\n");
return ret;
}
if(processlist[i].attached != 1) {
printf("attach process at %d\n", i);
processlist[i].pid = i;
strcpy(processlist[i].name, name);
processlist[i].prio = prio;
processlist[i].function = function;
processlist[i].attached = 1;
ret = 0;
break;
}
printf("\n");
i++;
}
return ret;
}
int process_detach(int pid)
{
processlist[pid].attached = 0;
return 0;
}
/*
* реализация простого планировщика по алгоритму round robin
*/
int scheduler()
{
int i = 0;
void (*p)(void);
while(1) {
for(i = 0; i < MAX_PROCESSES; i++) {
if(processlist[i].attached == 1) {
p = (void *)processlist[i].function;
(*p)();
}
}
}
return 0;
}
/*** Блок тестирования ***/
int process0()
{
printf("0\n");
return 0;
}
int process1()
{
printf("1\n");
return 0;
}
int main()
{
/*
* запускаем тест здесь
* */
printf("basic_scheduler Demo\n");
process_attach("process0", 100, process0);
process_attach("process1", 50, process1);
scheduler();
return 0;
}