2013-08-31 2 views
0

Я пытаюсь написать диспетчер процессов, который планирует различные процессы с использованием политики планирования SCHED_FIFO в режиме реального времени. Я хочу установить приоритеты процессов и выполнить их в соответствии с приоритетом.Планировщик процессов Linux

У меня есть тестовые процессы, которые приостановлены и ждут, чтобы они были возобновлены диспетчером процессов, чтобы они выполняли свои задачи.

Вот часть кода для процесса тестирования:

while(1) { 
    kill(myPid, SIGTSTP); // pause process until resumed by scheduler 
    printf("Process %s with PID %d and priority %d\n", 
    argv[0], myPid, param.sched_priority); 
    printf("Process %s processing...\n", argv[0]); 
    k = 0; 

    for (i = 0; i < 10000; i++) // do random task 
    { 
    for (j = 0; j < 10000; j++) 
    { 
     k++; 
    } 
    } 
    printf("Process %s done. Going to sleep.\n", argv[0]); 
    sched_yield(); // yield the processor 
} 

Ниже приведен пример кода для менеджера процесса:

pid_t child[3]; // holds child processes 
while(1) 
{ 

    for (i = 0; i < num_child; i++) 
    { 
     kill(child[i], SIGCONT); // resume process 
     child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10; // set priority 
     sched_setscheduler(child[i], SCHED_FIFO, &child_param); // set policy 
    } 

} 

Хотя я могу получить самый высокий приоритет во-первых, процессы не полностью выполняют свою задачу до выхода процессора. Результат моей проблемы можно увидеть ниже.

Process 1 with PID 5975 and priority 79 
Process 1 processing... 
Process 2 with PID 5974 and priority 69 
Process 3 with PID 5973 and priority 59 
Process 2 processing... 
Process 3 processing... 
Process 1 done. Going to sleep. 
Process 2 done. Going to sleep. 
Process 3 done. Going to sleep. 

Почему процессы с политикой SCHED_FIFO не выполняют свою полную задачу перед запуском следующего процесса?

+1

Есть ли вероятность, что это работает на многоядерном процессоре? ... – TheCodeArtist

+0

Он работает на одном основном компьютере – Olivier

+0

Выход 'sysctl -a | grep sched_rt_'? – ninjalj

ответ

1

От человека странице sched_setscheduler(),

Для процессов, запланированных в рамках SCHED_FIFO политики, применяются следующие правила:

  1. SCHED_FIFO процесс, который был вытеснен другим процессом более высоким приоритетом будет оставайтесь во главе списка по приоритету и возобновите выполнение, как только все процессы с более высоким приоритетом будут снова заблокированы.

  2. Когда процесс SCHED_FIFO станет работоспособным, он будет вставлен в конец списка для его приоритета в .

  3. Вызов sched_setscheduler() или sched_setparam() поставит процесс SCHED_FIFO идентифицированной PID в начале списка, если он был работоспособным. Как следствие, он может упредить текущий выполняемый процесс , если он имеет тот же приоритет. (POSIX.1-2001 указывает, что этот процесс должен идти до конца списка.)

  4. Процесс вызова sched_yield() будет поставлен в конце списка.

Rule1 и Rule3 косвенно подразумевает, что поведение SCHED_FIFO гарантирует ФИФО только если другой процесс с более высоким приоритетом не получает запланированную.


Далее вниз по man page,

Процессы, запланированные в рамках одной из стратегий в реальном масштабе времени, имеют значение sched_priority в диапазоне от 1 (низкий) до 99 (высокий).

Следующая строка кода в сниппет

child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10; 

устанавливает более высокие приоритеты для последних процессов. Таким образом, они склонны вытеснять более ранние процессы.

Примечание: POSIX.1-2001 требует реализации поддержки только минимум 32 различных уровней приоритета для политики в реальное время, а некоторые поставки системы только этот минимум. Портативные программы должны использовать sched_get_priority_min() и sched_get_priority_max(), чтобы найти диапазон приоритетов, поддерживаемых определенной политикой.

+0

Последние процессы, как представляется, также вытесняются. Если вы посмотрите на результат, ни один из процессов не полностью выполнит свою задачу. – Olivier

+0

Можете ли вы попробовать, вызвав 'sched_setscheduler()' ** до того, как ** возобновить процесс с помощью 'SIGCONT'? – TheCodeArtist

+0

Я попробовал. Это дает мне тот же результат. Возможно ли, что есть другие процессы, которые вызывают мои тестовые процессы? – Olivier

Смежные вопросы