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.
    instagram viewer

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
SIGINT 2 Pārtraukt lietojumprogrammu
SIGQUIT 3 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGILL 4 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGTRAP 5 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGABRT 6 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGFPE 8 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGKILL 9 Pārtraukt lietojumprogrammu
SIGBUS 10 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGSEGV 11 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGSYS 12 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGPIPE 13 Pārtraukt lietojumprogrammu
SIGALRM 14 Pārtraukt lietojumprogrammu
SIGTERM 15 Pārtraukt lietojumprogrammu
SIGUSR1 16 Pārtraukt lietojumprogrammu
SIGUSR2 17 Pārtraukt lietojumprogrammu
SIGCHLD 18 Ignorēt
SIGTSTP 20 Stop
SIGURG 21 Ignorēt
SIGPOLL 22 Pārtraukt lietojumprogrammu
SIGSTOP 23 Stop
SIGCONT 25 Turpiniet, ja esat apstājies
SIGTINS 26 Stop
SIGTTOU 27 Stop
SIGVTALRM 28 Pārtraukt lietojumprogrammu
SIGPROF 29 Pārtraukt lietojumprogrammu
SIGXCPU 30 Pārtraukt lietojumprogrammu (pamata izgāztuves)
SIGXFSZ 31 Pārtraukt lietojumprogrammu (pamata izgāztuves)

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

DalītiesČivinātDalītiesE-pasts

Saistītās tēmas

  • Linux
  • Linux kodols
  • Sistēmas administrēšana

Par autoru

Fatihs Küçükkarakurts (Publicēti 9 raksti)

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.

Vairāk no Fatih Küçükkarakurt

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