Signalizačný mechanizmus v jadre Linuxu umožňuje spusteným aplikáciám asynchrónne upozorniť systém, keď nastane nová udalosť. Pre svoju povahu je tento signalizačný mechanizmus všeobecne známy ako softvérové prerušenia. Rovnako ako hardvérové prerušenia, signály prerušujú normálny tok aplikácie a je nepredvídateľné, kedy aplikácia prijme signál.
Poďme sa ponoriť hlboko do signalizačného mechanizmu v Linuxe a pochopiť, čo sa deje v zákulisí.
Základné koncepty signálu v Linuxe
V systéme Linux procesy generujú signály v troch základných situáciách:
- Keď nastane výnimočná situácia na strane hardvéru. Môžete si napríklad predstaviť udalosti, ako je pokus aplikácie o prístup do regiónu mimo povolený adresný priestor (chyba segmentácie) alebo generovanie strojového kódu, ktorý obsahuje delenie nulou prevádzka.
- Situácie, ako je použitie kombinácií kláves ako Ctrl + C alebo Ctrl + Z na konzole používateľom, zmenou veľkosti obrazovky konzoly alebo odoslaním signálu zabíjania.
- Časovač nastavený v aplikácii vyprší, limit procesora daný aplikácii je vysoký, údaje prichádzajú do otvoreného deskriptora súboru atď.
Koncept signálov existuje už od raných verzií Unixu. Predtým existovalo niekoľko rozdielov medzi verziami Unixu, pokiaľ ide o spracovanie signálu. Neskôr s štandardizácia POSIX Linux a ďalšie deriváty Unixu sa začali riadiť týmito štandardmi. Z tohto dôvodu koncepty signálov Unix a signály POSIX, s ktorými sa môžete stretnúť v niektorých dokumentoch, poukazujú na rozdiely.
Signálne čísla
Signály majú rôzne číselné hodnoty, počnúc jednotkou. Napríklad signál 1 je a HUP signál takmer v každom systéme, alebo signál 9 je a ZABIŤ signál.
Používanie týchto čísel sa však dôrazne neodporúča, keď vo svojich aplikáciách používate signály. Pre signály POSIX, signál.h súbor by mal byť v aplikácii a vývojár by mal použiť konštantné definície súvisiacich čísel ako napr VZDYCHNUTIE, SIGKILL, atď. namiesto toho.
Ak preskúmate /usr/include/signal.h súbor vo vašom systéme, môžete vidieť ďalšie operácie a ďalšie zahrnuté súbory pohľadom na definície hodnôt, ako napr __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, atď. v súbore. Dostupné čísla signálov na systémoch Linux nájdete v /usr/include/asm-generic/signal.h súbor, ktorý nemusíte zahrnúť priamo do kódu aplikácie.
Generovanie a odosielanie signálu
Generovanie signálu nastáva v dôsledku udalosti. Odoslanie (doručenie) signálu do príslušnej aplikácie však nenastáva súčasne s generovaním signálu.
Na odoslanie signálu do aplikácie musí byť aplikácia aktuálne spustená a musí mať prostriedky CPU. K odoslaniu signálu konkrétnej aplikácii teda dochádza vtedy, keď po prepnutí kontextu začne príslušná aplikácia opäť pracovať.
Koncept čakajúci signál
Počas doby od generovania signálu po prenos signálu sú signály v pohotovostnom stave. Môžete získať prístup k počtu čakajúcich signálov a počtu čakajúcich signálov povolených pre proces z /proc/PID/status súbor.
# Pre proces s PID: 2299
cat /proc/2299/status
# Výkon
...
SigQ: 2/31630
...
Masky a blokovanie signálu
Presný čas, kedy signály dorazia, je často nepredvídateľný aplikáciou. Preto sa počas akejkoľvek operácie môžu vyskytnúť kritické prerušenia. To môže spôsobiť veľké problémy pri aplikácii vo veľkom meradle.
Aby sa predišlo niektorým nežiaducim situáciám, ako je táto, je potrebné použiť masky signálu. Takto je možné zablokovať niektoré signály pred kritickou operáciou. V tejto fáze je dôležité dokončiť kritickú časť a odstrániť definované bloky. Tento proces je niečo, čomu by mal vývojár aplikácie venovať pozornosť.
Keď aplikácia zablokuje signál, ostatné generované signály rovnakého typu budú v stave čakania, kým nebudú odblokované. V aplikácii je zabezpečené aj odosielanie čakajúcich signálov hneď po odstránení bloku.
Týmto spôsobom sa rovnaké typy signálov, ktoré boli pozastavené v čase blokovania, odosielajú do aplikácie iba raz po odstránení bloku pri bežnom používaní. Iná situácia je pri signáloch v reálnom čase.
Typy signálov systému Linux
Predvolené akcie sa môžu líšiť v závislosti od typu signálu. Ak aplikácia, ktorá prijíma príslušný signál, nemá funkciu obsluhy signálu, vykoná sa predvolená akcia. Niekedy to znamená ukončenie aplikácie a niekedy ignorovanie signálu.
Niektoré signály nie je možné zachytiť na aplikačnej vrstve, tieto signály vždy vykonajú predvolenú akciu (ako signál KILL).
Okrem niektorých akcií, ktoré spôsobia ukončenie aplikácie, sa vytvorí aj súbor výpisu jadra. Súbory s výpisom jadra, vytvorené zapísaním tabuľky virtuálnej pamäte súvisiaceho procesu na disk, pomáhajú aby používateľ preskúmal informácie o stave pred ukončením procesu pomocou nástrojov na ladenie v ďalších fázach.
Nasledujúce hodnoty sú založené na an príkladná architektúra MIPS:
Signál | číslo | Predvolená akcia | Dá sa to chytiť? |
---|---|---|---|
VZDYCHNUTIE | 1 | Ukončite aplikáciu | Áno |
SIGINT | 2 | Ukončite aplikáciu | Áno |
SIGQUIT | 3 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGILL | 4 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGTRAP | 5 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGABRT | 6 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGFPE | 8 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGKILL | 9 | Ukončite aplikáciu | nie |
SIGBUS | 10 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGSEGV | 11 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGSYS | 12 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGPIPE | 13 | Ukončite aplikáciu | Áno |
SIGALRM | 14 | Ukončite aplikáciu | Áno |
SIGTERM | 15 | Ukončite aplikáciu | Áno |
SIGUSR1 | 16 | Ukončite aplikáciu | Áno |
SIGUSR2 | 17 | Ukončite aplikáciu | Áno |
SIGCHLD | 18 | Ignorovať | Áno |
SIGTSTP | 20 | Stop | Áno |
SIGURG | 21 | Ignorovať | Áno |
SIGPOLL | 22 | Ukončite aplikáciu | Áno |
SIGSTOP | 23 | Stop | nie |
SIGCONT | 25 | Pokračujte, ak ste zastavili | Áno |
SIGTTIN | 26 | Stop | Áno |
SIGTTOU | 27 | Stop | Áno |
SIGVTALRM | 28 | Ukončite aplikáciu | Áno |
SIGPROF | 29 | Ukončite aplikáciu | Áno |
SIGXCPU | 30 | Ukončiť aplikáciu (výpis jadra) | Áno |
SIGXFSZ | 31 | Ukončiť aplikáciu (výpis jadra) | Áno |
Životný cyklus signálov v Linuxe
Signály prechádzajú tromi fázami. Vyrábajú sa predovšetkým vo fáze výroby, jadrom alebo akýmkoľvek procesom a sú reprezentované číslom. Pracujú ľahko a rýchlo, keďže nie sú nijako extra zaťažené. Ak sa však pozriete na stranu POSIX, uvidíte, že signály v reálnom čase môžu prenášať ďalšie údaje.
Fáza dodania signálov prichádza po produkčnej fáze. Za normálnych okolností sa signály dostanú do aplikácie z jadra čo najrýchlejšie. Niekedy však aplikácie môžu blokovať signály pri vykonávaní kritických operácií. V takýchto prípadoch zostáva signál nevybavený, kým sa transakcia neuskutoční.
Podobne ako signály, aj procesy sú neoddeliteľnou súčasťou ekosystému Linuxu. Pochopenie toho, čo sú procesy a ako fungujú, je kľúčové, ak sa plánujete stať správcom systému Linux.
Čo je to proces v Linuxe?
Prečítajte si ďalej
Súvisiace témy
- Linux
- Linuxové jadro
- Správa systému
O autorovi
Inžinier a vývojár softvéru, ktorý je fanúšikom matematiky a technológií. Vždy mal rád počítače, matematiku a fyziku. Vyvinul projekty herných motorov, ako aj strojové učenie, umelé neurónové siete a knižnice lineárnej algebry. Okrem toho pokračuje v práci na strojovom učení a lineárnych matriciach.
prihlásiť sa ku odberu noviniek
Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné e-knihy a exkluzívne ponuky!
Kliknutím sem sa prihlásite na odber