Vruntime je virtuální runtime procesu, který pomáhá sledovat, jak dlouho proces běží. Vruntime je členem struktury sched_entity definované v include/linux/sched.h
Min_vruntime představuje minimální dobu běhu cfs runqueue. Představuje minimum ze všech vruntime procesů, které jsou naplánovány v dané runqueue cfs. Min_vruntime je členem struktury cfs_rq definované v include/linux/sched.h
Účelem min_vruntime je vybrat další proces v runqueue cfs ke spuštění. Aby byl ke všem procesům spravedlivý, plánovač CFS vybere proces s minimálním časem běhu, který se má spustit jako první.
Odkaz na include/linux/sched.h je:https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h
vruntime je na vlákno; je to člen vnořený do task_struct.
Vruntime je v podstatě měřítkem "runtime" vlákna - množství času, které strávilo na procesoru. Smyslem CFS je být spravedlivý ke všem; proto se algo scvrkává na jednoduchou věc:(mezi úlohami v dané runqueue) úloha s nejnižším vruntime je úloha, která si nejvíce zaslouží spuštění, proto ji vyberte jako „další“. (Skutečná implementace se pro efektivitu provádí pomocí rbstromu).
Vezmeme-li v úvahu různé faktory – jako je priorita, nice value, cgroups atd. – výpočet vruntime není tak přímočarý jako jednoduchý přírůstek. Doporučuji přečíst si příslušnou sekci v "Professional Linux Kernel Architecture", Mauerer, Wrox Press - je to velmi podrobně vysvětleno.
Podívejte se níže na rychlý pokus o shrnutí některých z toho.
Jiný zdroj:Dokumentace/plánovač/sched-design-CFS.txt
Rychlé shrnutí – výpočet vruntime: (na základě knihy)
-
Většina práce se provádí v kernel/sched_fair.c:__update_curr()
-
Volání na časovači
-
Aktualizuje fyzický a virtuální čas, který „aktuální“ právě strávil na procesoru
-
U úloh, které běží s výchozí prioritou, tj. s nice hodnotou 0, je strávený fyzický a virtuální čas identický
-
Ne tak pro úkoly na jiných prioritních (pěkných) úrovních; takže výpočet doby běhu je ovlivněn prioritou proudu pomocí faktoru zátěže
delta_exec =(dlouhé bez znaménka)(nyní – curr->exec_start);// ...delta_exec_weighted =calc_delta_fair(delta_exec, curr);curr->vruntime +=delta_exec_weighted;
Když zanedbáváme některé kontroly zaokrouhlení a přetečení, calc_delta_fair vypočítá hodnotu danou následujícím vzorcem:
delta_exec_weighed = delta_exec * (NICE_0_LOAD / curr->load.weight)
Jde o to, že důležitější úkoly (ty s nižší hodnotou nice) budou mít větší váhu; takže podle výše uvedených rovnic bude jim zaúčtovaný vruntime menší (takže budou zařazeny více doleva na rbtree!).