Реализация pthread sched_get_priority_min/max для SCHED_OTHER/SCHED_FIFO

Я пытаюсь написать полупереносимый класс многопоточности для проекта, над которым я работаю, и, пытаясь установить приоритет потока, я столкнулся с загадкой в ​​мире pthread. .

Учитывая следующий код:

#include <stdio.h>
#include <unistd.h>
#include <sched.h>
main()
{
    printf("Valid priority range for SCHED_OTHER: %d - %d\n",
        sched_get_priority_min(SCHED_OTHER),
        sched_get_priority_max(SCHED_OTHER));
    printf("Valid priority range for SCHED_FIFO: %d - %d\n",
        sched_get_priority_min(SCHED_FIFO),
        sched_get_priority_max(SCHED_FIFO));
    printf("Valid priority range for SCHED_RR: %d - %d\n",
        sched_get_priority_min(SCHED_RR),
        sched_get_priority_max(SCHED_RR));
}

В OpenBSD это напечатает следующее:

Valid priority range for SCHED_OTHER: 0 - 31
Valid priority range for SCHED_FIFO: 0 - 31
Valid priority range for SCHED_RR: 0 - 31

В Ubuntu это выдаст:

Valid priority range for SCHED_OTHER: 0 - 0
Valid priority range for SCHED_FIFO: 1 - 99
Valid priority range for SCHED_RR: 1 - 99

Мой вопрос больше касается приоритета SCHED_OTHER. Согласно всей документации, которую мне удалось собрать (sched.h, google, SO, SE), я понимаю, что нужно попытаться получить приоритет текущего процесса и назначить приоритет на его основе. Это нормально, за исключением получения минимальных/максимальных значений для SCHED_OTHER. Поскольку планирование зависит от системы, если я получу приоритет текущего процесса как SCHED_OTHERи попытаюсь получить минимальные/максимальные значения в Ubuntu (или других Linux-системах, с которыми я сталкивался), мои значения будут быть 0-0, что не будет работать при попытке установить допустимый диапазон приоритетов. Однако я получаю допустимые значения для SCHED_OTHERв других unix-подобных системах (OpenBSD и т. д.).

Поскольку моей главной заботой является только попытка получить действительный диапазон значений приоритетов (чтобы убедиться, что пользователь не вводит слишком высокое или низкое значение), я должен даже не беспокоиться о приоритете текущего процесса и получить только минимальные/максимальные значения для SCHED_FFили SCHED_RR, поскольку эти значения, кажется, дают мне допустимые диапазоны для различных систем Linux/Unix, с которыми я сталкивался, или я полностью упускаю суть?

Заранее спасибо. Пожалуйста, дайте мне знать, если я что-то неясно или исказил.

РЕДАКТИРОВАТЬ 1: обратите внимание, что меня больше всего беспокоит «портативный» способ получить допустимые диапазоны больше, чем приоритет самого процесса.. спасибо!

5
задан txtechhelp 18 May 2012 в 18:39
поделиться