Vhodno - izhodni podsistem UNIX


Pri sistemu UNIX imamo takoimenovane posebne datoteke. Opisniki le-teh kažejo namesto na podatkovne bloke na  ustrezne krmilnike naprav, posredno preko takoimenovane stikalne tabele, ki se, tako kot sam gonilnik, nahaja v jedru.


 
 

LINUX: Podatkovna struktura o trdem disku

Samo jedro vsebuje pravzaprav dve podatkovni strukturi, ki predstavljata vmesnik proti posameznim gonilnikom. To sta stikalni tabeli blokovnih oziroma znakovnih naprav (device switch tables). Njuno vlogo ponazoruje spodnja slika:


 
 

UNIX pozna dva tipa naprav: blokovne (diski, trakovi) in znakovne (terminali in podobno). Dostop do naprav je preko datotečnega sistema. Vsaki napravi ustreza ime, podobno imenu datoteke. Kot vemo, pravimo takim "datotekam" posebne datoteke (special files).

LINUX: Registriranje blokovnih naprav za uporabo medpomnilnika

Posebne datoteke lahko vzpostavlja sistemski administrator z ukazom mknod. Na primer:

mknod /dev/tty12 c 2 12
Pri tem je /dev/tty12 datotečno ime za periferijo, c pomeni, da gre za znakovno posebno datoteko, 2 je veliko število (major number) in 12 je malo število (minor number). Veliko število pove tip naprave in ustreza indeksu v ustrezno stikalno tabelo (0, 1, 2,..). Z malim številom pa so oštevilčene naprave danega tipa (definiranega z velikim številom. Malo in veliko število dane periferne naprave je pomnjeno v ustreznem i_vozlu. V razliko i_vozlov navadnih datotek ne smejo biti i_vozli posebnih datotek nikoli zaklenjeni, saj procesi v gonilnikih pogosto "spijo".

Nek programski proces lahko na primer odpre in nato bere iz zahtevane periferne naprave. Pri sistemskem klicu uporabi veliko število za ugotovitev naslova iskane rutine v ustreznem gonilniku, malo število pa posreduje tej rutini kot argument (gonilnik namreč lahko streže več enakim perifernim napravam). Prvi sistemski klic je seveda open, ki inicializira privatne podatkovne strukture v gonilniku, v jedru pa tudi alocira pomnilniško kopijo i_vozla.

Metoda komunikacije med gonilnikom in periferno napravo se od primera do primera razlikuje. Gonilnik vpisuje v registre krmilnika periferne naprave ustrezne kotrolne podatke, med njimi pogosto tudi bit za omogočanje (in na koncu preprečevanje) prekinitvenih zahtevkov. V redkih primerih zelo hitrih perifernih naprav lahko pride do prenosa podatkov direktno v uporabnikov naslovni prostor (v podatkovne strukture uporabnikovih podatkov. Bolj običajen je prenos posredno preko vmesnih pomnilnih polj. Pri blokovnih napravah imamo med že omenjenimi rutinami medpomnilnika in rutinami gonilnika še rutine za strategijo razvrščanja bralno-pisalnih zahtevkov. Slednje dobivajo od medpomnilniških rutin naslove fizičnih diskovnih blokov, vrstni red le-teh pa prerazporedijo s ciljem čim večje propustnosti sistema.

Terminalski gonilniki so po funkcijah enaki drugim gonilnikom. Hkrati jim je posebnost to, da so del vmesnika človek-stroj in morajo podpirati interaktivno delo. Zato interno vsebujejo vmesnike, ki jim pravimo vrstične discipline (line disciplines). Tak modul pretvarja surove (tipkane) vhodne podatke v prečiščene izhodne (upoštevanje tipkanih korekcij, tipkovnih kombinacij za ukinjanje procesov itd). Pri izhodu pa pretvarjajo taki moduli podatke, ki jih pošiljajo programski procesi, v obliko, ki jo pričakuje uporabnik (na primer ekspanzija tabulatorskih znakov).

Linijske discipline seveda potrebujejo za svoje delo preprosta vmesna polja. To so takoimenovane c- liste (c-lists, znakovni seznami), ki povezujejo takoimenovane c-bloke. Koncept c-list je bolj podrobno ponazorjen v poglavju s primerom gonilnika.

Povezovanje računalnikov v mreže je z uvedbo večnivojskih komunikacijskih protokolov postavilo gonilnikom dodatne naloge. S ciljem večje fleksibilnosti in modularnosti so za vhodno-izhodni sistem uvedli shemo tokov (streams). Tok je polna dupleksna povezava med procesom in perifernim gonilnikom. Predstavlja ga množica linearno povezanih dvojnih vrst. Ena vrsta je za vhod, druga za izhod kot to ponazoruje spodnja slika:

Vsaka vrsta je podatkovna struktura, ki vsebuje naslednje elemente:

Proceduro open, ki je klicana ob sistemskem klicu open,
Proceduro close, ki je klicana ob sistemskem klicu close,
Proceduro put, ki je klicana, ko naj vrsta prejme obvestilo (message),
Strežno proceduro, ki je klicana, ko je vrsta izbrana (scheduled) za izvajanje,
Kazalec na naslednjo vrsto v toku,
Kazalec na seznam obvestil, ki čakajo na servisiranje,
Kazalec na privatne podatkovne strukture o stanju vrste,
Zastavice o stanju "visoka voda", "nizka voda" (uporabljamo jih pri razvrščanju)

Naprava, ki ima tokovni gonilnik (stream driver), je znakovna naprava. V stikalni tabeli ima posebno polje, ki kaže na iniciacijsko strukturo toka. Pri prvem odpiranju take naprave alocira jedro pare vrst, enega za glavo toka, drugega za sam gonilnik. Po potrebi pa tudi za linijske discipline.

Tokovni moduli niso posebni procesi (ker bi jih bilo preveč), vendar je za njihovo izvajanje vgrajen poseben razvrščevalni mehanizem, ki upošteva stanje v vsaki vrsti (nizek ali visok nivo "vodne gladine").