Sistema-dei

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 programen eta sistema eragileen artean nahitaezkoa den interfazea eskaintzen dute. Sistema eragile bat definitzen denean sistema-deia definitzea da zeregin nagusietako bat, eta sistema eragilea programatzean besteak beste sistema-deiak inplementatzen dira.

## Funtzionamendu orokorra 
### Sistema deiek baimen bereziak dituzte 
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. Bide batez programen edo liburutegiko errutinak trinkotzea, memoria gutxiago hartzea, lortzen da.

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 
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 gainera sistema-deiek erabiltzen duten behe-mailako interfazearen ezagutza eskatzen du. 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: sistema-deien funtzionamendua 
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 erreferentziatzen denean, deia egin duen programaren exekuzioa gelditu egiten da eta haren testuingurua (hardware-ko erregistroak esaterako) gorde egiten da sistema eragileak memorian dituen egituretan (prozesuen kontrol-blokeak), geroago programa horren testuingurua berreskuratu ahal izateko. 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 
Unix eta antzeko sistema eragiletan sistema-dei nagusiak bost multzotan banatzen dira:

### Prozesuen kudeaketarako deia 
* Prozesuak sortzea eta programa kargatzea: *fork* eta exec multzoa (*exec*, *execv*, *execl*...)
* Prozesuak amaitzea: *exit*, *kill*
* Seinaleak eta barne sinkronizazioa: *signal*, *wait*, *sleep*
* Memoria dinamikoa eskuratzea: *mmap, brk, sbrk*

### Fitxategien kudeaketarako deiak 
* fitxategiak irekitzeko, ixteko, sortzeko: *open*, *close*, *creat*
* irakurketa eta idazketarako: *read*, *write*
* zuzeneko atzipena: *lseek*
* estekak sortu eta kentzeko (eta fitxategiak ezabatzeko): *link*, *unlink*
* katalogoak (direktorioak) sortzeko eta ezabatzeko: *mkdir*, *rmdir*

### Gailuen kudeaketarako deiak 
* fitxategietako gehienak: *open*, *close*, *read*, *write*
* barne kontrolerako deia: *ioctl*
* gailuen zenbaki logikoak kudeatzeko: *mknod*

### Komunikaziorako deiak: pipeak, buzoiak, sareko socket-ak 
* sortzeko: *mknod*
* bidali eta jasotzeko: *write*, *read*

### Sistemaren informazioaren mantenimendurako deiak 
* baliabideen informazioa lortzea/ezartzea: *get*, *set*

## Bibliografia 
* *Sistema eragileen deskribapen funtzionala*. Julio Abascal Gonzalez, Iñaki Alegria Loinaz, Alberto Lafuente Rojo, Elena Lazkano Ortega, Clemente Rodriguez Lafuente. UPV/EHU. 1995
* *Sistema eragileak. Barnekoak eta diseinuko printzipioak.* William Stallings. UPV/EHU. 2008. ISBN: 978-84-9860-167-1
* EHU-ko informazioa
* die.net
* man7.org
* codewiki.wikidot.com
* www.geeksforgeeks.org