Wikiproiektu:Informatika/Sistema-dei

Artikulu hau "Kalitatezko 2.000 artikulu 12-16 urteko ikasleentzat" proiektuaren parte da
Wikipedia, Entziklopedia askea

Konputazioan, sistema-dei bat programa informatiko batek uneko sistema eragilearen kernelari zerbitzu eskaera bat egiteko balio duen errutina bat da. Zerbitzu hauen artean: hardwarearekin lotutako zerbitzuak (adibidez, disko gogorraren atzipena), prozesuen exekuzioa eta sorrera edota kernelaren barneko zerbitzuen komunikazioa, esate baterako, prozesuen planifikazioa.

Sistema-deiek prozesuen eta sistema eragileen artean nahitaezkoa den interfaze bat eskaintzen dute.

Funtzionamendu orokorra[aldatu iturburu kodea]

Baimenak[aldatu iturburu kodea]

Gaur egungo prozesadoreen arkitektura gehienek segurtasun neurri batzuk dituzte inplementatuak. Esaterako, programa bat, dagokion helbide espaziora egoten da mugatua, horrela, ezingo ditu atzitu exekuzioan dauden beste programak edota sistema eragilea. Horretaz gain, ezingo luke hardwareko gailurik zuzenean erabili.

Nolanahi ere, aplikazio arrunt askok zerbitzu mota horiek behar dituzte. Horretarako, sistema eragileak ondo definitutako inplementazio fidagarriez osatutako sistema-deiak eskaintzen ditu behar diren eragiketak betetzeko.

Sistema eragilea baimen guztiekin exekutatzen da eta aplikazioei zerbitzu eskaerak egiteko baimena ematen die sistema-deien bidez, normalean eten bereziak erabiliz.

Etenek PUZa (CPU) baimen maila altuago batean jartzen dute modu automatikoan, ondoren kernelari exekuzioaren kontrola (ardura) emateko. Honek, eskaera egin duen programari eskatutako zerbitzua eman beharko litzaiokeen erabakitzen du. Zerbitzua onartzen bada, kernelak eskaera egin duen programak kontrolpean izan ezin dituen eragiketa zehatz batzuk exekutatuko ditu, jatorrizko programari dagozkion baimenak eta kontrola itzuliz.

Liburutegiak bitartekari moduan[aldatu iturburu kodea]

Orokorrean, sistemek programa arrunten eta sistema eragilearen artean egoten diren liburutegiak edo APIak eskaintzen dituzte. UNIX-moduko sistemetan, API horiek C liburutegietan (libc) daude inplementatuta.

Liburutegira egindako deiak soilik ez du eragiten kernel modura igarotzea (kernel moduan ez dagoen bitartean), azpi-errutina dei arrunt gisa hartu ohi da. Sistema-dei batek kernelera pasako lioke kontrola (eta deitu dion liburutegi-deiak baino inplementazio eta plataforma menpekotasun handiagoa du). Adibidez, Unix-moduko sistemetan, fork eta execve C liburutegiko funtzioek, hurrenez hurren, fork eta execve sistema-deiak erabiltzen dituzte. Sistema-deiak zuzenean aplikazioko kodean erabiltzeak konplexutasuna handiagotzen du eta txertatutako mihiztadura-lengoaia erabiltzea nahitaezkoa litzateke (C/C++). Gainera, sistema-deiek erabiltzen duten behe-mailako interfaze bitarren ezagutza eduki beharra dago erabiltzen den sistema-deirako, jakinik denborarekin aldaketak izatea posible litekeela. Arrazoi horrengatik erabiltzen da liburutegi-deien abstrakzioa.

Exokernel-ean oinarritutako sistemetan, liburutegiaren bitartekari funtzioa oso garrantzitsua da. Exokerneletan, liburutegiek erabiltzaileen aplikazioak behe-mailako kernel API-etaz babesten dituzte eta abstrakzioak nahiz baliabide kudeaketa eskaintzen dute.

Mekanismoa: Nola funtzionatzen du sistema-deiak[aldatu iturburu kodea]

Sistema-deiek, normalean, zera egiten duen CPUko agindu berezi bat erabiltzen dute: prozesadoreak kontrola aurretik zehaztutako kode pribilegiodun bati (ohikoena kernela izatea da) transferitzea. Honek kode pribilegiatuari prozesadorearen egoera eta non izango den konektatua zehaztea baimentzen dio.

Sistema-dei bat inbokatzen denean, hau egin duen programaren exekuzioa gelditu egiten da eta haren datuak gorde egiten dira (zehazki Process Control Block batean, PCB), geroago programa horren testuingurua berreskuratu nahi bada. Ondoren, prozesadoreak behe mailako kode pribilegioduna exekutatuko du, behar den zeregina betetzeko. Azkenik, programaren (deia egin duena) arabera, jarraitu egingo du edo ez.

Sistema-dei motak[aldatu iturburu kodea]

Linux kernelean oinarritzen diren sistema eragileek, sitema-dei mota ezberdinak dituzte zereginaren edo lortzen dutenaren arabera. Batez ere, 5 taldetan sailkatzen dira:

  1. Prozesuen Kontrol kudeaketarako
    • load
    • execute, exec, execv, execl
    • end, abort
    • create process
    • terminate process, kill, signal
    • get/set process attributes
    • wait, waitpid
    • sleep
    • allocate free memory
  2. Fitxategi kudeaketarakoak
    • create file, delete file
    • open, close
    • read, write, reposition
    • lseek, unlink
    • get/set file attributes
  3. Gailuen kudeaketarako
    • request device, release device
    • read, write, reposition
    • get/set device attributes
    • logically attach or detach devices
  4. Informazioaren mantenimendurako
    • get/set time or date
    • get/set system data
    • get/set process, file, or device attributes
  5. Komunikaziorako
    • create, delete communication connection
    • send, receive messages
    • transfer status information
    • attach or detach remote devices

Prozesuen kontrol kudeaketarako dei garrantzitsuenak[aldatu iturburu kodea]

Sistema-dei hauek, gehienetan, prozesuen arteko komunikazio eta konkurrentziaren arloetan erabiltzen dira. Prozesuak maneiatzeko, gelditzeko, bukatzeko eta abar erabiltzen dira. Garrantzitsuenak hauek dira:

  1. Oinarrizkoenak:
    • kill, killall
    • wait, waitpid
    • exec, execl
  2. Beste batzuk:
    • sleep


Kill deia (Seinale bidalketa)[aldatu iturburu kodea]

Sistemako prozesu bati edo prozesu multzo bati seinaleak bidaltzeko bidali du. Hurrengo forma du:

        int kill (pid_t identifikadorea, int seinale)

Non,

Parametroak

  • identifikadorea(pid): zein prozesuri bidaliko zaion identifikatzen duen PIDa.
  • seinale (sig): zein seinale bidaliko den.

Itzuli

  • 0: prozesua arazorik gabe amaitu bada.
  • -1: errore bat egon bada.

Prozesi batek seinale bat ailegatzean, ignoratu dezake edo seinale horri dagokion errutina bat abiarazi.

Seinaleak zera dira: prozesu bati bidaltzen zaion notifikazio asinkrono bat, gertaera batez informatzeko. Seinale mordoa dago (salbuespenekin erlazionatuta, erroreekin, terminalekin...), baina gehien erabiltzen direnak prozesua bukarazten dutenak dira, bereiziki SIGKILL eta SIGTERM. Lehenengoak, prozesua "seko" bukatzen du, ez dio ezer ordenatzeko aukerarik ematen eta ezin da ignoratu. Bigarrenak era kontrolatuagoan bukatzen du prozesua, informazioa berrordenatzeko aukera ematen dio eta "azken hitzak" esateko aukera.

Baina seinaleak pila bat dira:

Zenbakia (hemen azaltzen dena) edo izena idatzi daitezke kill deiean.

Lehenengo hamarrak:

1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1

Hurrengo hamarrak:

11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP

Hurrengoak:

21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR

Eta jarraitu:

31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8

Eta abar.

PIDa sartzeko tokian, sartzen dugunaren arabera prozesu bati edo gehiagori bidaliko zaio seinalea: >0 sartzen badugu, seinalea prozesu konkretu bati (PID hori duena) bidaliko zaio; 0 sartzen bada, seinalea bidali duen prozesuaren PID talde bera duten prozesuei; -1 edo txikiagoa sartuz gero, beste kasu batzuk.

Seinalearen tokian 0 sartuz gero, ez da ezer bidaliko. Hau PIDak errorerik ez duela ziurtatzeko egiten da; ziur bagaude PIDa zuzena dela, orduan bai benetako seinale bat bidaliko dugu. Hau probetarako soilik egiten da.

Sistema-dei honen generalizazio bat ere badago: killall. Honek, zehaztutako seinalea sistemako prozesu guztiei bidaltzen die.

Wait deia (Itxarotea)[aldatu iturburu kodea]

Sistema-dei honek uneko prozesua suspenditzen du, haren umeetako batek bukatu arte. Prozesu umeetako bat bukatu bada (hau da, zonbie egoeran badago), zuzenean jarraitu egingo da, bestela baten bat bukatu arte itxaroten jarraituko da. Hurrengo forma du:

        pid_t wait(int* egoera )

Non,

Parametroak

  • egoera (status): hildako umea zein egoeratan hil den jakin nahi badugu, bestela NULL jarri.

Itzuli

  • Arazorik egon ez bada, bukatu den prozesu umearen identifikatzailea itzuliko da.
  • Errorea egon bada, -1.

Wait-ek bukatutako umearen PIDa jasotzean, umea prozesu taulatik kentzen da eta wait-ek umearen PIDa eta status-a jasoko ditu.

Hain zuzen, wait-ek PID hori itzuliko du.

Honen generalizazio bat da waitpid() deia. Honek zehaztutako ume bati nahi dugun egoera gertatu arte itxarongo da, baina normalean bukatzea izango da itxarongo dena.

        pid_t waitpid ( pid_t identifikatzailea, int *egoera, int options )

Non,

Parametroak

  • identifikatzailea: itxarango den umea.
  • egoera (status): hildako umea zein egoeratan hil den jakin nahi badugu, bestela NULL jarri.
  • options: zein gertaera espero den zehaztuko da: hil, blokeo...

Itzuli

  • Arazorik egon ez bada, bukatu den prozesu umearen identifikatzailea itzuliko da.
  • Errorea egon bada, -1.

Exec deia (Beste programa bat abiatzea)[aldatu iturburu kodea]

Programa baten exekuzioa abiatzeko erabili ohi da, eta prozesu umeek egin izaten dute. Forma asko ditu, baina garrantzitsuenak:

        int execl ( char* bidea, char* lehen_argumentua, char* bigarren_argumentua, ... , char* n_argumentua )

Non,

Parametroak

  • bidea (path): exekutagarri berriaren kokapena.
  • argumentua (arg): programa berriak behar dituen argumentuak.

Itzuli

  • Errore bat egon bada bakarrik itzultzen da zerbait.

Honen bariantea, argumentu kopurua ezagutzen ez bada:

        int execv ( char* bidea, char* argv[] )

Edozein kasutan, exec guztietan programa berria abiatzen da eta ez da berriro jatorrizko kodera itzultzen. Hau da, prozesuak bide (kode) berri bat hartzen du. Hori bai, errorea baldin badago, -1 itzuliko du eta jatorrizko kodean geratuko da.

Fitxategi kudeaketarako dei garrantzitsuenak[aldatu iturburu kodea]

Zein dira[aldatu iturburu kodea]

Fitxategi kudeaketarako sistema-deiak, oro har, fitxategien jokatzeko erabiltzen dira; hauetan idazteko, hauengandik irakurtzeko eta abar. Sistema eragileetan gehien aztertzen diren sistema-dei motak dira, eta inplementazioetan sarritan azaltzen dira. Garrantzitsuenak:

  1. Oinarrizkoenak:
    • open
    • close
    • creat
    • read
    • write
  2. Beste batzuk:
    • unlink
    • lseek

Open deia (Irekiera)[aldatu iturburu kodea]

Dagoeneko existitzen den fitxategi bat irekitzen du, eta horren deskriptorea itzultzen du. Forma hau du:

        int open ( char* bidea, int modua, mode_t baimenak )

Non,

Parametroak

  • bidea (pathname): ireki nahi den fitxategiaren kokapena.
  • modua (flags): zein modutan irekiko den zehazten du (bakarrik irakurtzeko, idazteko...).
  • baimenak: soilik modua O_CREAT denean, sortutako fitxategiaren baimenak forma honekin zehaztuko dira: xxxx, hau da, "0666", "1234"...

Itzuli

  • Erabili gabe dagoen lehen fitxategi deskribatzailea den zenbaki oso bat. Lehenengo irekiera baldin bada orokorrean 3 izango da; 0, 1 eta 2 erreserbatuta baitaude- sarrera estandarra, irteera estandarra eta errore estandarra.
  • -1 errore bat egon bada.

Modua beti zehaztu behar da open egitean, eta modu asko daude. Hauek, zenbaki oso baten bidez edo karaktere sekuentzia konkretu baten bidez errepresentatu behar dira:

  1. Oinarrizkoenak:
    • O_RDONLY: Open deia irakurketarako soilik. 0 batekin ere errepresenta daiteke.
    • O_WDONLY: Idazketarako soilik. 1 batekin ere errepresenta daiteke.
    • O_RDONLY: Irakurketa eta idazketa. 2 batekin ere errepresenta daiteke.
    • O_CREAT: Sortu, existitzen ez bada. Komeni da hau beste moduren batekin konbinatzea, modua zehazteko.
  2. Beste batzuk:
    • O_TRUNC: Ezabatu edukia, existitzen bada.
    • O_APPEND: Eransketa modua, hau da, fitxategi bukaeran jardutea.

Eta beste hainbat.

Aipatu behar da, modu hauek erabiltzeko <fcntl.h> beharrezkoa dela, C kodearen gainean.

Moduak konbinatzeko OR logikoa aski da. Adibidez:

        O_CREAT |  O_WRONLY

Open deiak deskriptoren onargarri bat (fd>0) itzultzen du fitxategia ongi ireki bada, zehazki, ireki denarena. Errorea izan bada, -1.

Close deia (Itxiera)[aldatu iturburu kodea]

Aurrekoaren kontrako prozesua egiten du, hau da irekita dagoen fitxategi bat isteko balio du. Hurrengo forma du:

        int close ( int deskriptorea)

Non,

Parametroak

  • deskriptorea (fd): itxi nahi den fitxategiaren deskriptorea edo "file descriptor"-a.

Itzuli

  • 0: fitxategia arazorik gabe itxi da.
  • -1: errore bat egon bada.

Ongi funtzionatzen badu, haren lana egiteaz gain, 0 zenbakia itzuliko du. Errore kasuan, open deiaren antzera: -1.

Creat deia (Sortu)[aldatu iturburu kodea]

Espreski fitxategi bat sortu nahi bada (ez open deiaren ondorio bezala, baizik eta zuzenean sortzeko asmoa badago), sistema-dei hau erabili behar da. Hau da sintaxia:

        int creat ( char* izena, int baimenak )

Non,

Parametroak

  • izena (name): jarriko diogun izena
  • baimenak: open deiaren berdinak, 4 digitu.

Itzuli

  • Erabili gabe dagoen lehen fitxategi deskribatzailea.
  • -1: errore bat egon bada.

Gutxi gora behera, alde praktikoan, O_CREAT erabiltzen duen open deiaren ekibalentea dela esan genezake.

Sortu berri den fitxategiaren deskriptorea itzuliko du ongi funtzionatzen badu, bestela -1.

Read deia (Irakurri)[aldatu iturburu kodea]

Fitxategi bateko edukia irakurtzen du. Aurretik, noski, beharrezkoa da fitxategia open edo creat deien bidez ireki izana. Hurrengo forma du:

        int read ( int deskriptorea, char* buffer, size_t bytekopuru )

Non,

Parametroak

  • deskriptorea (fd): bertatik irakurri nahi dira datuak.
  • buffer (buff): bertan gorde nahi dira irakurritako byteak, buffer bat da.
  • bytekopuru (nbytes): zenbat byte transferituko diren,.

Itzuli

  • Arrakasta kasuan zenbat byte irakurri diren itzultzen du.
  • 0: fitxategi amaierara heltzean.
  • -1: errore bat egon bada.

Honek honela funtzionatzen du: Read-ek bufferrean gordeko ditu deskriptoreak erreferentziatutako fitxategiaren datuak.

Ongi funtzionatzen badu, irakurri egingo du eta zenbat byte transferitu (irakurri) diren itzultzen du; hau oso garrantzitsua da jakiteko fitxategi bukaerara heldu den. Bestela, errorea, -1.

Write deia (Idatzi)[aldatu iturburu kodea]

Dei honek aurrekoaren elementu berdinak ditu, alderantziz. Hau da, fitxategi konkretu batean idazten du. Baita ere, fitxategia aurretik irekitzea beharrezkoa. Hurrengo forma du:

        int write (int deskriptorea, char* buffer, size_t bytekopuru )

Non,

Parametroak

  • deskriptorea (fd): honek erreferentziatutako fitxategian idatziko dira datuak.
  • buffer (buff): idatziko den informazioa gordetzen dituen memoria espazioa
  • byte kopuru (nbytes): zenbat byte idatziko diren.

Itzuli

  • Arrakasta kasuan zenbat byte irakurri diren itzultzen du.
  • 0: fitxategi amaierara heltzean.
  • -1: errore bat egon bada.

Funtzionamendua, hortaz, erreferentziatutako fitxategian, buffer baten bidez n byte idaztea da.

Zuzen badoa, byte kopuru hori idatziko da, eta kopurua itzuliko du. Errore kasuan -1 itzuliko du.

Unlink deia (Ezabatzea)[aldatu iturburu kodea]

Ruta konkretu bati dagokion fitxategia ezabatzen du. Hurrengo forma du:

        int unlink ( char*bidea)

Non,

Parametroak

  • bidea (pathname): ezabatu nahi den fitxategiaren ruta.

Itzuli

  • 0: fitxategi arazorik gabe ezabatu badu.
  • -1: errore bat egon bada.

Lseek deia (Kokatzea)[aldatu iturburu kodea]

Fitxategi konkretu bateko edozein posizio atzitzeko aukera ematen du. Honek posizio zehatz batetik aurrera irakurri edo idazteko balio du, fitxategi osos ikusi beharrik gabe. Aurretik fitxategia ireki behar da, besteetan bezala. Hurrengo forma du:

        off_t lseek ( int deskriptorea, off_t desplazamendua, int jatorria )

Non,

Parametroak

  • deskriptorea (fd): irekita dagoen eta atzituko den fitxategiaren deskriptorea.
  • desplazamendua (desp edo offset): adierazitako kokapenetik zenbat desplazatu adierazten du. Zenbaki altu bat izan ohi da.
  • jatorria (src edo whence): nondik hasi.

Itzuli

  • Egindako desplazamendua

Azkeneko bi baliokin, zein puntu zehatzetara mugitu definitzen da hau eginez:

        jatorria+desplazamendua = nora_goaz

Batuketaren emaitza (nora_goaz) fitxategiarne tamaina baina hadiagoa bada ez da blokeatzen, hau egingo du: fitxategia automatikoki emaitzako zenbaki horrerarte handituko da.

Bi parametro hauei buruzko zenbait gehikuntza:

1) Jatorriak, balio hauek izan ditzake:

  1. Uneko posiziorako:
    • SEEK_CUR: Gauden toki zehatza. 1 ere jarri daiteke.
  2. Hasiera eta bukaerarako:
    • SEEK_SET: Fitxategiaren hasiera. 0 ere jarri daiteke.
    • SEEK_END: Fitxategiaren bukaera. 2 ere jarri daiteke.

Esan behar da, hauek erabiltzeko <stdlib.h> eta <unistd.h> gehitu behar direla kodean.

2) Desplamazamendu parametroak balio negatiboak ere har ditzake, zentzua baldin badute (adibidez, puntu batetik atzera desplazatzea).

Lseek sistema-deiak itzultzen duena zenbaki oso luze bat da, punteroa geratu den posizioa (nora_goaz) hain zuzen. Bestela, -1.

Ikus daitekeen bezala, desplazamentuan 0 jarrita eta jatorrian uneko egoera sartuta, uneko egoera zein den jakiteko ere erabili daiteke dei hau.


Bibliografia[aldatu iturburu kodea]