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.
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ší
Související témata
- Linux
- Linuxové jádro
- Správa systému
O autorovi
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.
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