Linuxi tuuma signaalimismehhanism võimaldab töötavatel rakendustel asünkroonselt teavitada süsteemi uue sündmuse toimumisest. Oma olemuse tõttu nimetatakse seda signaalimismehhanismi üldiselt tarkvarakatkestusteks. Nii nagu riistvarakatkestused, katkestavad signaalid rakenduse normaalse voo ja on ettearvamatu, millal rakendus signaali vastu võtab.

Sukeldume sügavale Linuxi signaalimismehhanismi ja mõistame, mis kulisside taga toimub.

Põhilised signaalikontseptsioonid Linuxis

Linuxis genereerivad protsessid signaale kolmes põhiolukorras:

  • Kui riistvara poolel tekib erandlik olukord. Näiteks võite mõelda sündmustele, nagu rakendus, mis üritab pääseda juurde väljaspool piirkonda lubatud aadressiruum (segmenteerimisviga) või masinkoodi genereerimine, mis sisaldab jagamist nulliga operatsiooni.
  • Olukorrad nagu klahvikombinatsioonide kasutamine nagu Ctrl + C või Ctrl + Z konsoolil kasutaja poolt, konsooliekraani suuruse muutmine või tapmissignaali saatmine.
  • Rakenduses seatud taimer aegub, rakendusele antud CPU limiit on kõrge, andmed tulevad avatud faili deskriptorisse jne.
instagram viewer

Signaalide kontseptsioon on olnud kasutusel alates Unixi esimestest versioonidest. Varem oli Unixi versioonide vahel signaalitöötluse osas mitmeid erinevusi. Hiljem koos POSIXi standardimine loodud signaalihalduse jaoks, hakkasid Linux ja teised Unixi tuletised neid standardeid järgima. Sel põhjusel viitavad Unixi signaalide ja POSIX-i signaalide mõisted, mida mõnes dokumendis võib kohata, erinevustele.

Signaali numbrid

Signaalidel on erinevad arvväärtused, alustades ühest. Näiteks signaal 1 on a HUP signaal peaaegu igas süsteemis või signaal 9 on a TAPA signaal.

Nende numbrite kasutamine ei ole aga tungivalt soovitatav, kui kasutate oma rakendustes signaale. POSIX-signaalide puhul signaal.h fail peaks olema rakenduses ja arendaja peaks kasutama seotud numbrite konstantseid määratlusi, näiteks OHA, SIGKILL, jne. selle asemel.

Kui uurite /usr/include/signal.h faili oma süsteemis, näete lisatoiminguid ja muid kaasatud faile, vaadates selliste väärtuste määratlusi nagu __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, jne. failis. Linuxi süsteemide saadaolevad signaalinumbrid leiate aadressilt /usr/include/asm-generic/signal.h faili, mida te ei pea otse oma rakenduse koodi lisama.

Signaali genereerimine ja saatmine

Signaali genereerimine toimub sündmuse tõttu. Signaali saatmine (edastus) vastavasse rakendusse ei toimu aga samaaegselt signaali genereerimisega.

Signaali saatmiseks rakendusele peab rakendus parajasti töötama ja sellel peab olema protsessori ressursse. Seetõttu toimub signaali saatmine konkreetsele rakendusele siis, kui vastav rakendus pärast kontekstivahetust uuesti tööle hakkab.

Ootel signaali kontseptsioon

Aja jooksul genereerimisest kuni signaali edastamiseni on signaalid ooterežiimis. Protsessi jaoks lubatud ootel signaalide arvule ja ootel signaalide arvule pääsete juurde aadressilt /proc/PID/status faili.

# PID-ga protsessi jaoks: 2299
kass /proc/2299/status

# Väljund
...
SigQ: 2/31630
...

Signaali maskid ja blokeerimine

Signaalide saabumise täpne aeg on rakendusele sageli ettearvamatu. Seetõttu võivad mis tahes toimingu ajal tekkida kriitilised katkestused. See võib suuremahulise rakenduse puhul põhjustada suuri probleeme.

Mõnede selliste soovimatute olukordade vältimiseks on vaja kasutada signaalmaske. Seega on võimalik mõned signaalid enne kriitilist toimingut blokeerida. Selles etapis on oluline lõpetada kriitiline osa ja eemaldada määratletud plokid. Rakenduse arendaja peaks sellele protsessile tähelepanu pöörama.

Kui rakendus blokeerib signaali, on teised genereeritud sama tüüpi signaalid ooteolekus kuni blokeeringu tühistamiseni. Rakenduses on ka ootel olevate signaalide saatmine kohe, kui blokeering on eemaldatud.

Sel viisil saadetakse blokeerimise ajal ootele pandud sama tüüpi signaalid rakendusele ainult üks kord pärast ploki eemaldamist tavakasutuses. Reaalajas signaalide puhul on olukord erinev.

Linuxi signaali tüübid

Vaiketoimingud võivad olenevalt signaalitüüpidest erineda. Kui vastavat signaali vastuvõtval rakendusel puudub signaalihalduri funktsioon, toimub vaiketoiming. Mõnikord tähendab see rakenduse lõpetamist ja mõnikord signaali ignoreerimist.

Mõningaid signaale ei saa rakenduskihis püüda, need signaalid sooritavad alati vaiketoimingu (nagu signaal KILL).

Lisaks mõnele toimingule, mis põhjustab rakenduse töö lõpetamise, luuakse ka põhitõmmisfail. Peamised dump-failid, mis on loodud seotud protsessi virtuaalse mälu tabeli kettale kirjutamisega, aitavad kasutajal on võimalik olekuteavet uurida enne protsessi lõppu järgmistes etappides silumistööriistadega.

Järgmised väärtused põhinevad an eeskujulik MIPS-arhitektuur:

Signaal Number Vaikimisi toiming Kas seda saab kinni püüda?
OHA 1 Lõpetage rakendus Jah
SIGINT 2 Lõpetage rakendus Jah
SIGQUIT 3 Lõpeta rakendus (tuuma tühjendus) Jah
SIGILL 4 Lõpeta rakendus (tuuma tühjendus) Jah
SIGTRAP 5 Lõpeta rakendus (tuuma tühjendus) Jah
SIGABRT 6 Lõpeta rakendus (tuuma tühjendus) Jah
SIGFPE 8 Lõpeta rakendus (tuuma tühjendus) Jah
SIGKILL 9 Lõpetage rakendus Ei
SIGBUS 10 Lõpeta rakendus (tuuma tühjendus) Jah
SIGSEGV 11 Lõpeta rakendus (tuuma tühjendus) Jah
SIGSYS 12 Lõpeta rakendus (tuuma tühjendus) Jah
SIGPIPE 13 Lõpetage rakendus Jah
SIGALRM 14 Lõpetage rakendus Jah
SIGTERM 15 Lõpetage rakendus Jah
SIGUSR1 16 Lõpetage rakendus Jah
SIGUSR2 17 Lõpetage rakendus Jah
SIGCHLD 18 Ignoreeri Jah
SIGTSTP 20 Peatus Jah
SIGURG 21 Ignoreeri Jah
SIGPOLL 22 Lõpetage rakendus Jah
SIGSTOP 23 Peatus Ei
SIGCONT 25 Jätkake, kui peatute Jah
SIGTTIN 26 Peatus Jah
SIGTTOU 27 Peatus Jah
SIGVTALRM 28 Lõpetage rakendus Jah
SIGPROF 29 Lõpetage rakendus Jah
SIGXCPU 30 Lõpeta rakendus (tuuma tühjendus) Jah
SIGXFSZ 31 Lõpeta rakendus (tuuma tühjendus) Jah

Signaalide elutsükkel Linuxis

Signaalid läbivad kolm etappi. Neid toodetakse peamiselt tootmisfaasis tuuma või mis tahes protsessi abil ja neid tähistatakse numbriga. Need töötavad kergelt ja kiiresti, kuna neil pole lisakoormust. Kuid kui vaatate POSIX-i poolt, näete, et reaalajas signaalid võivad edastada lisaandmeid.

Signaalide edastamise faas tuleb pärast tootmisfaasi. Tavaliselt jõuavad signaalid kernelist rakendusse nii kiiresti kui võimalik. Kuid mõnikord võivad rakendused kriitiliste toimingute tegemise ajal signaale blokeerida. Sellistel juhtudel jääb signaal ootele kuni tehingu toimumiseni.

Sarnaselt signaalidele on ka protsessid Linuxi ökosüsteemi lahutamatu osa. Kui plaanite saada Linuxi süsteemiadministraatoriks, on oluline mõista, mis on protsessid ja kuidas need töötavad.

Mis on protsess Linuxis?

Loe edasi

JagaSäutsJagaMeil

Seotud teemad

  • Linux
  • Linuxi kernel
  • Süsteemi administreerimine

Autori kohta

Fatih Küçükkarakurt (9 artiklit avaldatud)

Insener ja tarkvaraarendaja, kes on matemaatika ja tehnoloogia fänn. Talle on alati meeldinud arvutid, matemaatika ja füüsika. Ta on arendanud nii mängumootorite projekte kui ka masinõpet, tehisnärvivõrke ja lineaaralgebra teeke. Lisaks jätkab ta tööd masinõppe ja lineaarsete maatriksitega.

Veel Fatih Küçükkarakurtilt

Liituge meie uudiskirjaga

Liituge meie uudiskirjaga tehniliste näpunäidete, arvustuste, tasuta e-raamatute ja eksklusiivsete pakkumiste saamiseks!

Tellimiseks klõpsake siin