Scheduler -=-=-=-=-=- Once upon a time there was a DOS user who saw Unix, and saw that it was good. After typing cp on his DOS machine at home, he downloaded GNU's unix tools ported to DOS and installed them. He rm'd, cp'd, and mv'd happily for many days, and upon finding elvis, he vi'd and was happy. After a long day at work (on a Unix box) he came home, started editing a file, and couldn't figure out why he couldn't suspend vi (w/ ctrl-z) to do a compile. -- Erik Troan Scheduler (plánovač) se stará o přepínání úloh (procesů a threadů). Funguje přibližně tak, že má seznam všech úloch, které by chtěly běžet, jednu z nich vybere a spustí. Ze začátku byl scheduler aktivován procesem. Pokud měl proces pocit, že nechce nic dělat a rozhodl se na něco čekat, spustil se scheduler a ten vybral jiný štastný proces. To mělo ten nedostatek, že pokud se nějaký proces zadřel a nechtěl nikoho pustit ke slovu, ostatní měli smůlu. (nepreemtivní multitásking) Opravdové multitáskingové systémy ale mají scheduler aktivovaný automaticky s časovače (desetkrát a více do sekundy) ten potom procesy rychle přepíná a vytváří tak iluzi toho, že proesy běží zároveň. Na scheduler se klade několik poněkud protichůdných požadavků - měl by být co nejrychlejší, aby se mohl aktivovat často a multitasking byl plynulý - měl by být co nejspravedlivější a něpřidělovat nějaké aplikaci výrazně více času než jiné - měl by upřednostňovat interaktivní úlohy před těmy, co něco počítají na pozadí. UNIXový scheduler V UNIXu má každý proces dvě priority. Jedna priorita funguje tak, že pokaždé co proces dostane nějaký čas, jeho priorita stoupne. Pokud proces spí, jeho priorita klesá. Scheduler potom vybíra proces s nejnišší prioritou. Proto procesy co počítají svoji prioritu postupně snižují a naopak procesy co spí a čekají na uživatele svoji prioritu zvedají a tak v okamžiku, kdy uživatel něco zadá a proces se zbudí dostane se rychle ke slovu. Druhá priorita se nastavuje uživatelem pomocí volání nice. Určuje celkovou prioritu procesu. Procesy se stejnou prioritou se dělí o CPU půl na půl. Procesy s nejvyšší prioritou běží jen v případě, že žádný jiný nechce. A tak můžete snížit priotitu těm procesům, u kterých nechete, aby vás zdržovaly při práci. Stromový scheduler UNIXový scheduler má jednu základní nevýhodu. V případě, že jeden proces si vytvoří více threadů, jsou všechny thready brány jako rovnocené procesy. Proto proces mající 10 threadů dostane 10krát více času než proces s jedním threadem. Podobně uživatel, který nastartuje 10 procesů dostane více času, než jiný uživatel. Navíc v případě, že běží opravdu hodně procesů, je docela těžké je rychle seshedulovat. Tyto problémy řeší stromový scheduler. Zde jsou procesy rozděleny do skupin. Například na nejvyšší úrovni stromu jsou větve podle jendotlivých uživatelů, pod nimi jsou větve podle procesů a nakonec jsou jednotlivé thready. Schedulování pak běží po úrovních. Napřed se rozhodne, který uživatel dostane CPU. Potom to samé pro procesy a nakonec pro thready. Takže scheduler je spravedlivější a nikdy nemusí se probírat všemi procesy, ale jenom určitou úrovní stromu. Scheduler přes náhodná čísla Scheduler přes priority musí být velmi pečlivě doladěn tak, aby žádnému procesu nestoupla priorita příliš, nebo aby ji nejakým fíglem nemohl nahamounit (třeba tím, že bude proces neustále startovat a ukončovat). Jinak se může stát, že přepínaní nebude příliš plynulé. Toto lze řešit náhodným přepínáním. Napřed si vytvoříte koláč, kde každý proces zabírá tak velký kus, jakou má prioritu. Potom tam hodíte kuličku a kde se kulička zastaví, ten proces se spustí. A tak se někdy stane, že i procesy z hodně nízou prioritou se dostanou ke slovu a priority nemusí být tak vyrovnané jako v předhozím scheduleru. Takový scheduler (spolu se stromem) má například Vsta. Evoluční scheduler Protože scheduling patří mezi MP úplné úlohy a tedy není známý rozumně rychlý algoritmus podávající optimální výsledky, je možné nasadit i genetické algoritmy. Scheduler pak funguje podobně jako ten náhodný. výheň