Signalizācijas mehānisms Linux kodolā ļauj palaistām lietojumprogrammām asinhroni paziņot sistēmai, kad notiek jauns notikums. Tā būtības dēļ šis signalizācijas mehānisms parasti ir pazīstams kā programmatūras pārtraukumi. Tāpat kā aparatūras pārtraukumi, signāli pārtrauc lietojumprogrammas normālu plūsmu, un nav iespējams paredzēt, kad lietojumprogramma saņems signālu.
Iedziļināsimies Linux signalizācijas mehānismā un sapratīsim, kas notiek aizkulisēs.
Signāla pamatjēdzieni operētājsistēmā Linux
Operētājsistēmā Linux procesi ģenerē signālus trīs pamatsituācijās:
- Ja aparatūras pusē rodas ārkārtēja situācija. Piemēram, varat iedomāties tādus notikumus kā lietojumprogramma, kas mēģina piekļūt reģionam ārpus atļautā adreses telpa (segmentācijas kļūda) vai mašīnas koda ģenerēšana, kas ietver dalījumu ar nulli darbība.
- Situācijas, piemēram, taustiņu kombināciju izmantošana, piemēram Ctrl+C vai Ctrl+Z konsolē lietotājs, mainot konsoles ekrāna izmērus vai nosūtot iznīcināšanas signālu.
- Lietojumprogrammā iestatītais taimeris beidzas, lietojumprogrammai piešķirtais CPU limits ir augsts, dati nonāk atvērtā faila deskriptorā utt.
Signālu jēdziens ir pastāvējis kopš Unix agrīnajām versijām. Iepriekš starp Unix versijām bija vairākas atšķirības attiecībā uz signālu apstrādi. Vēlāk, ar POSIX standartizācija izstrādāti signālu pārvaldībai, Linux un citi Unix atvasinājumi sāka ievērot šos standartus. Šī iemesla dēļ Unix signālu un POSIX signālu jēdzieni, ar kuriem jūs varat saskarties dažos dokumentos, norāda uz atšķirībām.
Signālu numuri
Signāliem ir dažādas skaitliskās vērtības, sākot ar vienu. Piemēram, signāls 1 ir a HUP signāls gandrīz katrā sistēmā vai signāls 9 ir a NOGALINĀT signāls.
Tomēr šo skaitļu izmantošana nav ieteicama, ja lietojumprogrammās izmantojat signālus. POSIX signāliem, signāls.h failam jābūt lietojumprogrammā, un izstrādātājam ir jāizmanto nemainīgas saistīto skaitļu definīcijas, piemēram, NOGŪP, SIGKILLutt. vietā.
Ja pārbaudīsiet /usr/include/signal.h failu savā sistēmā, varat skatīt papildu darbības un citus iekļautos failus, apskatot vērtību definīcijas, piemēram, __USE_POSIX, __USE_XOPEN, __USE_POSIX199309utt. failā. Linux sistēmās pieejamos signālu numurus varat atrast vietnē /usr/include/asm-generic/signal.h failu, kas jums nav jāiekļauj tieši lietojumprogrammas kodā.
Signāla ģenerēšana un sūtīšana
Signāla ģenerēšana notiek notikuma dēļ. Tomēr signāla nosūtīšana (piegādāšana) attiecīgajai lietojumprogrammai nenotiek vienlaikus ar signāla ģenerēšanu.
Lai signāls tiktu nosūtīts uz lietojumprogrammu, lietojumprogrammai pašlaik ir jādarbojas un tai ir jābūt CPU resursiem. Tāpēc signāla nosūtīšana uz konkrētu lietojumprogrammu notiek, kad attiecīgā lietojumprogramma atsāk darboties pēc konteksta pārslēgšanas.
Gaidīšanas signāla koncepcija
Laikā no ģenerēšanas līdz signāla pārraidei signāli ir gaidīšanas režīmā. Varat piekļūt neapstiprināto signālu skaitam un procesam atļauto gaidošo signālu skaitam no /proc/PID/status failu.
# Procesam ar PID: 2299
cat /proc/2299/status
# Izvade
...
SigQ: 2/31630
...
Signālu maskas un bloķēšana
Lietojumprogrammai bieži vien nav iespējams paredzēt precīzu signālu saņemšanas laiku. Tāpēc jebkuras darbības laikā var rasties daži kritiski pārtraukumi. Tas var radīt lielas problēmas liela mēroga lietojumprogrammām.
Lai novērstu šādas nevēlamas situācijas, ir jāizmanto signālmaskas. Tādējādi ir iespējams bloķēt dažus signālus pirms kritiskas darbības. Šajā posmā ir svarīgi pabeigt kritisko daļu un noņemt definētos blokus. Šim procesam lietojumprogrammu izstrādātājam vajadzētu pievērst uzmanību.
Kad lietojumprogramma bloķē signālu, citi ģenerētie tāda paša veida signāli būs gaidīšanas stāvoklī, līdz tie tiks atbloķēti. Lietojumprogrammā tiek nodrošināta arī gaidošo signālu nosūtīšana, tiklīdz bloks ir noņemts.
Tādā veidā tāda paša veida signāli, kas tika aizturēti bloķēšanas brīdī, tiek nosūtīti uz lietojumprogrammu tikai vienu reizi pēc bloka noņemšanas parastajā lietošanā. Situācija ir atšķirīga attiecībā uz reāllaika signāliem.
Linux signālu veidi
Noklusējuma darbības var atšķirties atkarībā no signālu veidiem. Ja lietojumprogrammai, kas saņem atbilstošo signālu, nav signāla apstrādātāja funkcijas, tiek veikta noklusējuma darbība. Dažreiz tas nozīmē lietojumprogrammas pārtraukšanu un dažreiz signāla ignorēšanu.
Dažus signālus nevar uztvert lietojumprogrammas slānī, šie signāli vienmēr veic noklusējuma darbību (piemēram, KILL signālu).
Papildus dažām darbībām, kas izraisa lietojumprogrammas darbības pārtraukšanu, tiek izveidots arī pamata izgāztuves fails. Galvenie izgāztuves faili, kas izveidoti, ierakstot saistītā procesa virtuālās atmiņas tabulu diskā, palīdz lietotājam ir jāpārbauda stāvokļa informācija, pirms process beidzas, nākamajos posmos izmantojot atkļūdošanas rīkus.
Tālāk norādītās vērtības ir balstītas uz an priekšzīmīga MIPS arhitektūra:
Signāls | Numurs | Noklusējuma darbība | Vai to var noķert? |
---|---|---|---|
NOGŪP | 1 | Pārtraukt lietojumprogrammu | Jā |
SIGINT | 2 | Pārtraukt lietojumprogrammu | Jā |
SIGQUIT | 3 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGILL | 4 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGTRAP | 5 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGABRT | 6 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGFPE | 8 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGKILL | 9 | Pārtraukt lietojumprogrammu | Nē |
SIGBUS | 10 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGSEGV | 11 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGSYS | 12 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGPIPE | 13 | Pārtraukt lietojumprogrammu | Jā |
SIGALRM | 14 | Pārtraukt lietojumprogrammu | Jā |
SIGTERM | 15 | Pārtraukt lietojumprogrammu | Jā |
SIGUSR1 | 16 | Pārtraukt lietojumprogrammu | Jā |
SIGUSR2 | 17 | Pārtraukt lietojumprogrammu | Jā |
SIGCHLD | 18 | Ignorēt | Jā |
SIGTSTP | 20 | Stop | Jā |
SIGURG | 21 | Ignorēt | Jā |
SIGPOLL | 22 | Pārtraukt lietojumprogrammu | Jā |
SIGSTOP | 23 | Stop | Nē |
SIGCONT | 25 | Turpiniet, ja esat apstājies | Jā |
SIGTINS | 26 | Stop | Jā |
SIGTTOU | 27 | Stop | Jā |
SIGVTALRM | 28 | Pārtraukt lietojumprogrammu | Jā |
SIGPROF | 29 | Pārtraukt lietojumprogrammu | Jā |
SIGXCPU | 30 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
SIGXFSZ | 31 | Pārtraukt lietojumprogrammu (pamata izgāztuves) | Jā |
Signālu dzīves cikls operētājsistēmā Linux
Signāli iziet trīs posmus. Tos galvenokārt ražo ražošanas fāzē, izmantojot kodolu vai jebkuru procesu, un tos apzīmē ar skaitli. Tie strādā viegli un ātri, jo tiem nav nekādas papildu slodzes. Bet, ja paskatās uz POSIX pusi, jūs redzēsit, ka reāllaika signāli var pārraidīt papildu datus.
Signālu piegādes fāze notiek pēc ražošanas fāzes. Parasti signāli no kodola sasniedz lietojumprogrammu pēc iespējas ātrāk. Tomēr dažreiz lietojumprogrammas var bloķēt signālus, veicot kritiskas darbības. Šādos gadījumos signāls paliek gaidīts līdz darījuma veikšanai.
Tāpat kā signāli, arī procesi ir Linux ekosistēmas neatņemama sastāvdaļa. Ja plānojat kļūt par Linux sistēmas administratoru, ir ļoti svarīgi saprast, kas ir procesi un kā tie darbojas.
Kas ir process operētājsistēmā Linux?
Lasiet Tālāk
Saistītās tēmas
- Linux
- Linux kodols
- Sistēmas administrēšana
Par autoru
Inženieris un programmatūras izstrādātājs, kurš ir matemātikas un tehnoloģiju cienītājs. Viņam vienmēr ir patikuši datori, matemātika un fizika. Viņš ir izstrādājis spēļu dzinēju projektus, kā arī mašīnmācīšanos, mākslīgos neironu tīklus un lineārās algebras bibliotēkas. Turklāt turpina strādāt pie mašīnmācības un lineārām matricām.
Abonējiet mūsu biļetenu
Pievienojieties mūsu informatīvajam izdevumam, lai saņemtu tehniskos padomus, pārskatus, bezmaksas e-grāmatas un ekskluzīvus piedāvājumus!
Noklikšķiniet šeit, lai abonētu