GNU/Linux >> Znalost Linux >  >> Linux

Co to znamená, když se řekne linuxové jádro je preemptivní?

Tradiční unixová jádra měla jeden zámek, který byl držen vláknem, když byl spuštěn kód jádra. Proto žádný jiný kód jádra nemůže toto vlákno přerušit.

Díky tomu bylo navrhování jádra snazší, protože jste věděli, že zatímco jedno vlákno používá prostředky jádra, žádné jiné vlákno je nepoužívá. Různá vlákna si proto nemohou vzájemně zkazit práci.

V systémech s jedním procesorem to nezpůsobuje příliš mnoho problémů.

Ve víceprocesorových systémech však můžete nastat situaci, kdy několik vláken na různých procesorech nebo jádrech chtělo spouštět kód jádra současně. To znamená, že v závislosti na typu zátěže můžete mít spoustu procesorů, ale všechny tráví většinu času čekáním na sebe.

V Linuxu 2.6 byly prostředky jádra rozděleny do mnohem menších jednotek, chráněných jednotlivými zámky, a kód jádra byl zkontrolován, aby bylo zajištěno, že zámky jsou drženy pouze tehdy, když se používají odpovídající prostředky. Nyní tedy musí různé procesory na sebe čekat, pouze pokud chtějí mít přístup ke stejnému prostředku (například hardwarovému prostředku).


Před linuxovým jádrem verze 2.5.4 nebylo linuxové jádro preemptivní, což znamená, že proces běžící v režimu jádra nelze přesunout z procesoru, dokud sám neopustí procesor nebo nezačne čekat na dokončení nějaké vstupní výstupní operace.

Obecně může proces v uživatelském režimu vstoupit do režimu jádra pomocí systémových volání. Dříve, když jádro nebylo preemptivní, mohl proces s nižší prioritou převrátit prioritu procesu s vyšší prioritou tím, že mu odepřel přístup k procesoru opakovaným voláním systémových volání a zůstal v režimu jádra. I kdyby vypršel časový úsek procesu s nižší prioritou, pokračoval by v běhu, dokud nedokončí svou práci v jádře nebo se dobrovolně nevzdá řízení. Pokud je procesem s vyšší prioritou, který čeká na spuštění, textový editor, ve kterém uživatel píše, nebo MP3 přehrávač připravený k doplnění zvukové vyrovnávací paměti, výsledkem je slabý interaktivní výkon. Nepreemptivní jádro bylo v té době hlavní nevýhodou.


Představte si jednoduchý pohled na preemptivní multi-tasking. Máme dvě uživatelské úlohy, z nichž obě běží neustále bez použití jakéhokoli I/O nebo provádění volání jádra. Tyto dvě úlohy nemusí dělat nic zvláštního, aby mohly běžet na víceúlohovém operačním systému. Jádro, obvykle založené na přerušení časovačem, jednoduše rozhodne, že je čas, aby se jedna úloha pozastavila a nechala běžet jinou. Dotyčný úkol si vůbec neuvědomuje, že se něco stalo.

Většina úloh však občas žádá jádro prostřednictvím systémových volání. Když k tomu dojde, existuje stejný uživatelský kontext, ale CPU spouští kód jádra jménem této úlohy.

Starší linuxová jádra by nikdy neumožňovala preempci úlohy, když byla zaneprázdněna spouštěním kódu jádra. (Všimněte si, že I/O operace se vždy dobrovolně přeplánují. Mluvím o případu, kdy kód jádra má nějakou operaci náročnou na CPU, jako je řazení seznamu.)

Pokud systém umožňuje, aby byla tato úloha preemptována za běhu kódu jádra pak máme to, čemu se říká "preemptivní jádro." Takový systém je imunní vůči nepředvídatelným zpožděním, ke kterým může dojít během systémových volání, takže by mohl být vhodnější pro vestavěné úkoly nebo úkoly v reálném čase.

Pokud jsou například na konkrétním procesoru k dispozici dvě úlohy a jedna vyžaduje systémové volání, jehož dokončení trvá 5 ms, a druhá je aplikace MP3 přehrávače, která potřebuje napájet audio potrubí každé 2 ms, můžete slyšet zadrhávání zvuku.

Argumentem proti preempci je, že veškerý kód jádra, který by mohl být volán v kontextu úlohy, musí být schopen přežít preempci – například existuje mnoho špatných kódů ovladače zařízení, což by mohlo být lepší, pokud je vždy schopno dokončit operaci před umožnit spuštění nějaké jiné úlohy na tomto procesoru. (U víceprocesorových systémů je v dnešní době spíše pravidlem než výjimkou, veškerý kód jádra musí být znovu přístupný, takže tento argument dnes není tak relevantní.) Navíc, pokud by stejného cíle bylo možné dosáhnout zlepšením systémových volání se špatným latence, možná je preempce zbytečná.

Kompromisem je CONFIG_PREEMPT_VOLUNTARY, který umožňuje přepínání úloh v určitých bodech uvnitř jádra, ale ne všude. Pokud existuje jen malý počet míst, kde by mohl kód jádra uvíznout, je to levný způsob, jak snížit latenci a zároveň zachovat zvládnutelnou složitost.


Preempce umožňuje jádru poskytnout DOJEM paralelismu:máte pouze jeden procesor (řekněme před deseti lety), ale máte pocit, že všechny vaše procesy běží současně. Je to proto, že jádro předjímá (tj. vyjímá provádění) provádění z jednoho procesu, aby je předalo dalšímu (možná podle jejich priority).

UPRAVIT Ne preemptivní jádra čekají, až procesy vrátí ruku (tj. během systémových volání), takže pokud váš proces počítá velké množství dat a nevolá žádný typ yield ostatní procesy nebudou moci provést svá volání. O takových systémech se říká, že jsou kooperativní protože požadují součinnost procesů k zajištění spravedlnosti doby provedení

ÚPRAVA 2 Hlavním cílem preempce je zlepšit reaktivitu systému mezi více úlohami, což je dobré pro koncové uživatele, zatímco na druhou stranu servery chtějí dosáhnout nejvyšší propustnosti, takže ji nepotřebují:(od konfigurace linuxového jádra)

  • Preemptibilní jádro (počítač s nízkou latencí)
  • Dobrovolná preempce jádra (desktop)
  • Žádná vynucená preempce (server)

Linux
  1. Co znamená __init v kódu jádra Linuxu?

  2. Co znamená EXPORT_SYMBOL v kódu jádra Linuxu?

  3. Co je lepší int 0x80 nebo syscall v 32bitovém kódu na Linuxu?

  1. Jak kódovat modul jádra Linuxu?

  2. Co znamená &na konci linuxového příkazu?

  3. Co znamená - v tomto linuxovém příkazu?

  1. Co znamená průměrná zátěž na Unix/Linux?

  2. Co je to poskvrněné jádro v Linuxu?

  3. Co znamená písmeno 'u' v /dev/urandom?