GNU/Linux >> Znalost Linux >  >> Linux

Jaký je rozdíl mezi Nepreemptivním, Preemptivním a Selektivním Preemptivním jádrem?

Na preemptivním jádře může být proces běžící v režimu jádra nahrazen jiným procesem uprostřed funkce jádra.

To platí pouze pro procesy běžící v režimu jádra, CPU provádějící procesy v uživatelském režimu je považováno za „nečinné“. Pokud chce proces uživatelského režimu požádat jádro o službu, musí vydat výjimku, kterou jádro zvládne.

Jako příklad:

Proces A spustí obsluhu výjimky Proces B se probudí požadavkem IRQ, jádro nahradí proces A s B (vynucený přepínač procesu). Zpracujte A zůstává nedokončená. Plánovač poté rozhodne, zda proces A získá čas CPU nebo ne.

Na nepreemptivním jádře zpracujte A jen by využil veškerý čas procesoru, dokud by neskončil, nebo by se dobrovolně rozhodl umožnit jiným procesům, aby ho přerušily (plánované přepnutí procesu).

Dnešní operační systémy založené na Linuxu obecně neobsahují plně preemptivní jádro, stále existují kritické funkce, které musí běžet bez přerušení. Takže si myslím, že byste to mohli nazvat "selektivním preemptivním jádrem".

Kromě toho existují způsoby, jak učinit linuxové jádro (téměř) plně preemptivní.

  • Linuxová Wiki v reálném čase
  • Článek LWN

preempce je -> Schopnost operačního systému zabránit nebo zastavit aktuálně naplánovanou úlohu ve prospěch úlohy s vyšší prioritou. Plánování může být jedním z, nikoli však výhradně, plánováním procesů nebo I/O atd.

Pod Linuxem byly programy v uživatelském prostoru vždy preemptovatelné:jádro přeruší programy v uživatelském prostoru, aby se přepnuly ​​na jiná vlákna, pomocí běžného tikání hodin. Jádro tedy nečeká, až programy v uživatelském prostoru explicitně uvolní procesor (což je případ kooperativního multitaskingu). To znamená, že nekonečná smyčka v programu v uživatelském prostoru nemůže blokovat systém.

Avšak až do jádra 2.6 nebylo jádro samo o sobě preemptivní:jakmile jedno vlákno vstoupilo do jádra, nebylo možné mu zabránit spustit další vlákno. Tato absence preempce v jádře však způsobila několik problémů s ohledem na latenci a škálovatelnost. Preempce jádra byla tedy zavedena v jádrech 2.6 a lze ji povolit nebo zakázat pomocí volby CONFIG_PREEMPT. Pokud je povoleno CONFIG_PREEMPT, pak kód jádra může být preemptován všude, kromě případů, kdy má kód zakázána místní přerušení. Nekonečná smyčka v kódu již nemůže blokovat celý systém. Pokud je CONFIG_PREEMPT zakázáno, pak se chování verze 2.4 obnoví.

Recitováno a formátováno z:http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/


Linux
  1. Jaký je rozdíl mezi module_init a init_module v modulu jádra Linuxu?

  2. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  3. Jaký je rozdíl mezi fsck a e2fsck?

  1. Jaký je rozdíl mezi adduser a useradd?

  2. Jaký je rozdíl mezi ls a l?

  3. Jaký je rozdíl mezi pravděpodobnými a nepravděpodobnými voláními v jádře?

  1. Jaký je rozdíl mezi kill , pkill a killall?

  2. Jaký je rozdíl mezi partx a kpartx?

  3. Jaký je rozdíl mezi $(CC) a $CC?