W jądrze 2.6 usprawniono mechanizm wyliczania priorytetów dynamicznych dla procesów użytkownika - procesy interaktywne są nagradzane bonusem, a procesy zachłanne są karane. Maksymalny bonus wynosi -5, maksymalna kara +5. Wartości te są dodawane do statycznego priorytetu (nice). Zależność od priorytetu statycznego pozwala użytkownikowi kontrolować przydział procesora pomimo bonusów. (Np. zachłanny proces o wartości nice=0 nigdy nie będzie wywłaszczony przez proces interaktywny z nice=+19.)
effective_prio()
, bierze pod uwagę następujące parametry procesu:
int prio, static_prio; /* priorytet dynamiczny i statyczny */ unsigned long sleep_avg; /* średni czas spania/aktywności */ long interactive_credit; /* kredyt interaktywności (0..200)
sleep_avg
: Gdy proces zostaje obudzony ze snu, czas jego spania jest dodawany do tej wartości. Natomiast gdy proces po okresie aktywności odda procesor (dobrowolnie lub nie), jego czas działania jest od sleep_avg
odejmowany. Wartość ta zatem określa pewien stosunek między czasem działania i spania procesu. Dzięki temu proces, który przez długi czas spał, a później dużo korzystał z procesora, nie będzie potraktowany jako proces-śpioch, ani jako złodziej procesora.
Z wartości sleep_avg
jest bezpośrednio wyliczany bonus przez linowe jej przeskalowywanie na zakres -5..+5.
interactivity_credit
: Ten parametr zapewnia swego rodzaju relaksację. W sytuacji, gdy procesowi bardzo często zdarza się czekać na kliknięcie myszy, ale zdarza mu się też od czasu do czasu intensywnie wykorzystywać procesor, chcielibyśmy, żeby generalnie był on traktowany jako interaktywny. Kredyt interaktywności na to pozwala: gdy proces długo śpi, dostaje 1 punkt kredytu; natomiast traci 1 punkt, gdy długo używa procesora. Dzięki temu proces generalnie interaktywny, który czasem pożera moc procesora, nie straci swojego statusu interaktywności zbyt szybko.
Wartość interactive_credit
jest brana pod uwagę przy odejmowaniu/dodawaniu czasu do sleep_avg
, co ma potem wpływ na obliczenie bonusu, i całego priorytetu.
Priorytet, ale statyczny, ma też (oczywiście) wpływ na długość kwantu czasu przydzielonego procesowi na czas epoki. Dozwolona długość kwantu mieści się w zakresie 10ms..200ms, i na ten zakres jest liniowo skalowany zakres priorytetu -10..+19.
#define MIN_TIMESLICE( 10 * HZ / 1000) #define MAX_TIMESLICE(200 * HZ / 1000)
wszelako aby zapobiec zagłodzeniu przez proces o długim kwancie czasu, każdy proces jest wywłaszczany (i przerzucany na koniec listy) gdy minie czas pracy określony wartością TIMESLICE_GRANULARITY
.