Mechanismus signalizace v jádře Linuxu umožňuje spuštěným aplikacím asynchronně upozornit systém, když nastane nová událost. Vzhledem ke své povaze je tento signalizační mechanismus obecně známý jako softwarová přerušení. Stejně jako hardwarová přerušení, signály přerušují normální tok aplikace a je nepředvídatelné, kdy aplikace přijme signál.

Pojďme se ponořit hluboko do mechanismu signalizace v Linuxu a pochopit, co se děje v zákulisí.

Základní koncepty signálu v Linuxu

V Linuxu procesy generují signály ve třech základních situacích:

  • Když dojde k výjimečné situaci na straně hardwaru. Můžete si například představit události, jako je pokus aplikace o přístup do oblasti mimo povolený adresní prostor (chyba segmentace) nebo generování strojového kódu, který obsahuje dělení nulou úkon.
  • Situace, jako je použití kombinací kláves jako Ctrl + C nebo Ctrl + Z na konzoli uživatelem, změnu velikosti obrazovky konzoly nebo odeslání signálu zabití.
  • Časovač nastavený v aplikaci vyprší, limit procesoru daný aplikaci je vysoký, data přicházejí do otevřeného deskriptoru souboru atd.
instagram viewer

Koncept signálů existuje již od raných verzí Unixu. Dříve bylo mezi verzemi Unixu několik rozdílů ohledně zpracování signálu. Později s standardizace POSIX vytvořený pro správu signálů, Linux a další unixové deriváty začaly následovat tyto standardy. Z tohoto důvodu koncepty signálů Unix a signály POSIX, se kterými se můžete setkat v některých dokumentech, poukazují na rozdíly.

Signální čísla

Signály mají různé číselné hodnoty, počínaje jedničkou. Například signál 1 je a HUP signál téměř v každém systému nebo signál 9 je a ZABÍT signál.

Používání těchto čísel se však důrazně nedoporučuje, pokud ve svých aplikacích používáte signály. Pro signály POSIX, signál.h soubor by měl být v aplikaci a vývojář by měl používat konstantní definice souvisejících čísel, jako je např VZDYCHNOUT, SIGKILL, atd. namísto.

Pokud prozkoumáte /usr/include/signal.h soubor ve vašem systému, můžete vidět další operace a další zahrnuté soubory, když se podíváte na definice hodnot, jako je např __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, atd. v souboru. Čísla dostupných signálů na systémech Linux naleznete v /usr/include/asm-generic/signal.h soubor, který nemusíte zahrnout přímo do kódu aplikace.

Generování a odesílání signálu

Ke generování signálu dochází v důsledku události. K odeslání (doručení) signálu do příslušné aplikace však nedochází současně s generováním signálu.

Aby byl signál odeslán do aplikace, musí být aplikace aktuálně spuštěna a musí mít prostředky CPU. K odeslání signálu konkrétní aplikaci tedy dochází v okamžiku, kdy po přepnutí kontextu začne příslušná aplikace opět pracovat.

Koncept čekajícího signálu

Během doby od generace do přenosu signálu jsou signály v pohotovostním stavu. K počtu čekajících signálů a počtu nevyřízených signálů povolených pro proces můžete získat přístup z /proc/PID/status soubor.

# Pro proces s PID: 2299
cat /proc/2299/status

# Výstup
...
SigQ: 2/31630
...

Masky a blokování signálu

Přesný čas, kdy signály dorazí, je často aplikací nepředvídatelný. Proto může během jakékoli operace dojít k určitým kritickým přerušením. To může způsobit velké problémy u rozsáhlých aplikací.

Aby se předešlo některým nežádoucím situacím, jako je tato, je nutné používat masky signálu. Je tak možné zablokovat některé signály před kritickou operací. V této fázi je důležité dokončit kritickou část a odstranit definované bloky. Tento proces je něco, čemu by měl vývojář aplikace věnovat pozornost.

Když aplikace zablokuje signál, ostatní generované signály stejného typu budou ve stavu čekání, dokud nebudou odblokovány. V aplikaci je zajištěno i odesílání čekajících signálů, jakmile je blokování odstraněno.

Tímto způsobem jsou stejné typy signálů, které byly pozastaveny v době blokování, odeslány do aplikace pouze jednou po odstranění bloku při normálním používání. U signálů v reálném čase je situace jiná.

Typy signálu Linux

Výchozí akce se mohou lišit podle typu signálu. Pokud aplikace, která přijímá odpovídající signál, nemá funkci zpracování signálu, proběhne výchozí akce. Někdy to znamená ukončení aplikace a někdy ignorování signálu.

Některé signály nelze zachytit na aplikační vrstvě, tyto signály vždy provedou výchozí akci (jako signál KILL).

Kromě některých akcí, které způsobí ukončení aplikace, se vytvoří také soubor výpisu paměti. Soubory s výpisem paměti, vytvořené zápisem tabulky virtuální paměti souvisejícího procesu na disk, pomáhají aby uživatel prozkoumal informace o stavu před ukončením procesu pomocí ladicích nástrojů v dalších fázích.

Následující hodnoty jsou založeny na an příkladná architektura MIPS:

Signál Číslo Výchozí akce Dá se to chytit?
VZDYCHNOUT 1 Ukončit aplikaci Ano
SIGINT 2 Ukončit aplikaci Ano
SIGQUIT 3 Ukončit aplikaci (výpis jádra) Ano
SIGILL 4 Ukončit aplikaci (výpis jádra) Ano
SIGTRAP 5 Ukončit aplikaci (výpis jádra) Ano
SIGABRT 6 Ukončit aplikaci (výpis jádra) Ano
SIGFPE 8 Ukončit aplikaci (výpis jádra) Ano
SIGKILL 9 Ukončit aplikaci Ne
SIGBUS 10 Ukončit aplikaci (výpis jádra) Ano
SIGSEGV 11 Ukončit aplikaci (výpis jádra) Ano
SIGSYS 12 Ukončit aplikaci (výpis jádra) Ano
SIGPIPE 13 Ukončit aplikaci Ano
SIGALRM 14 Ukončit aplikaci Ano
SIGTERM 15 Ukončit aplikaci Ano
SIGUSR1 16 Ukončit aplikaci Ano
SIGUSR2 17 Ukončit aplikaci Ano
SIGCHLD 18 Ignorovat Ano
SIGTSTP 20 Stop Ano
SIGURG 21 Ignorovat Ano
SIGPOLL 22 Ukončit aplikaci Ano
SIGSTOP 23 Stop Ne
SIGCONT 25 Pokračujte v případě zastavení Ano
SIGTTIN 26 Stop Ano
SIGTTOU 27 Stop Ano
SIGVTALRM 28 Ukončit aplikaci Ano
SIGPROF 29 Ukončit aplikaci Ano
SIGXCPU 30 Ukončit aplikaci (výpis jádra) Ano
SIGXFSZ 31 Ukončit aplikaci (výpis jádra) Ano

Životní cyklus signálů v Linuxu

Signály procházejí třemi fázemi. Vyrábějí se primárně ve fázi produkce, jádrem nebo jakýmkoli procesem a jsou reprezentovány číslem. Pracují lehce a rychle, protože nejsou nijak extra zatěžovány. Ale když se podíváte na stranu POSIX, uvidíte, že signály v reálném čase mohou přenášet data navíc.

Fáze dodání signálů přichází po fázi výroby. Normálně se signály dostanou do aplikace z jádra co nejrychleji. Někdy však aplikace mohou blokovat signály při provádění kritických operací. V takových případech zůstává signál nevyřízený, dokud transakce neproběhne.

Stejně jako signály jsou i procesy nedílnou součástí linuxového ekosystému. Pokud se plánujete stát správcem systému Linux, je důležité porozumět tomu, co jsou procesy a jak fungují.

Co je to proces v Linuxu?

Přečtěte si další

PodíltweetPodílE-mailem

Související témata

  • Linux
  • Linuxové jádro
  • Správa systému

O autorovi

Fatih Küçükkarakurt (9 publikovaných článků)

Inženýr a vývojář softwaru, který je fanouškem matematiky a technologií. Vždy měl rád počítače, matematiku a fyziku. Vyvinul projekty herních enginů a také strojové učení, umělé neuronové sítě a knihovny lineární algebry. Navíc pokračuje v práci na strojovém učení a lineárních maticích.

Více od Fatiha Küçükkarakurta

Přihlaste se k odběru našeho newsletteru

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné e-knihy a exkluzivní nabídky!

Chcete-li se přihlásit k odběru, klikněte sem