Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 12801f336d9e363d2d56a08891cdf472 > files > 27

howto-text-sl-2006-5mdv2010.0.noarch.rpm

  Osnove Unixa in interneta
  Eric Raymond, esr@thyrsus.com
  v2.4, 12. junij 2001

  Na poljuden naèin so opisane osnove delovanja osebnih raèunalnikov,
  Unixu podobnih operacijskih sistemov in interneta.
  ______________________________________________________________________


  Kazalo


  1. Uvod

     1.1 Namen tega pisanja
     1.2 Nove izdaje
     1.3 Odzivi in popravki
     1.4 Podobni spisi

  2. Osnovna anatomija va¹ega raèunalnika

  3. Kaj se zgodi, ko raèunalnik vklopimo?

  4. Kaj se zgodi, ko se prijavimo v sistem?

  5. Kaj se zgodi, ko iz ukazne lupine po¾enemo program?

  6. Kako delujejo enote in prekinitve?

  7. Kako zmore raèunalnik opravljati veè stvari naenkrat?

  8. Kako prepreèimo, da bi procesi drug drugemu hodili v zelje?

     8.1 Virtualni pomnilnik: preprosta razlaga
     8.2 Virtualni pomnilnik: podrobnosti
     8.3 Enota za upravljanje pomnilnika

  9. Kako hrani raèunalnik podatke v pomnilniku?

     9.1 ©tevila
     9.2 Znaki

  10. Kako so shranjeni podatki na disku

     10.1 Nizkonivojska struktura diska in datoteènega sistema
     10.2 Imena datotek in imeniki

  11. Priklopne toèke

     11.1 Pot do datoteke na disku
     11.2 Lastni¹tvo datotek, dovolilnice in varnost
     11.3 Kako gredo stvari lahko narobe

  12. Kako delujejo programski jeziki?

     12.1 Prevajani programski jeziki
     12.2 Tolmaèeni programski jeziki
     12.3 Jeziki, prevajani v psevdokodo

  13. Kako deluje internet?

     13.1 Imena in naslovi
     13.2 Sistem domenskih imen
     13.3 Paketi in usmerjevalniki
     13.4 TCP in IP
     13.5 Uporabni¹ki protokol HTTP

  14. Dodatno branje


  ______________________________________________________________________

  1.  Uvod


  1.1.  Namen tega pisanja


  Ta spis je pisan za tiste uporabnike Linuxa in interneta, ki se uèijo
  s posku¹anjem. To je sicer neprekosljiv naèin, kako si pridobimo
  doloèene ve¹èine, vendar pa vèasih pusti nenavadne luknje v poznavanju
  osnov -- luknje, ki nam zato ote¾ujejo kreativno razmi¹ljanje in
  uèinkovito odpravljanje napak, saj nam manjka dober miselni model, kaj
  se pravzaprav dogaja.

  V preprostem in jasnem jeziku bomo poskusili opisati, kako stvari
  delujejo. Ta opis je prirejen za ljudi, ki uporabljajo Unix ali Linux
  na osebnih raèunalnikih (PC). Na sistem se bomo navadno sklicevali kot
  na Unix, saj je veèina opisanih stvari neodvisna tako od strojnega
  okolja, kot od posamiène izvedbe Unixa.

  Predpostavili bomo, da uporabljate osebni raèunalnik s procesorjem
  Intel ali z njim zdru¾ljiv. Podrobnosti so nekoliko drugaène pri
  raèunalnikih s procesorji Alpha, PowerPC ali katerimi drugimi, osnovni
  koncepti pa ostajajo enaki.

  ®e povedanih stvari ne bomo ponavljali. To po eni strani pomeni, da
  morate brati pazljivo, po drugi pa tudi, da bo vse prebrano nekaj
  novega. Dobra misel je, da prviè sestavek samo preletite, potem pa se
  vraèate in prebirate razdelke, dokler vam ni vse jasno.

  Sestavek je delo, ki se neprestano razvija in dopolnjuje. Na ¾eljo
  bralcev obèasno dodamo nove razdelke, tako da se splaèa vsake toliko
  èasa vrniti in pogledati, kaj je novega.


  1.2.  Nove izdaje

  Nove izdaje spisa so periodièno objavljene v novièarskih skupinah
  <news:comp.os.linux.help>,  <news:comp.os.linux.announce> in
  <news:news.answers>; a¾urirane izdaje pa so objavljene tudi na
  razliènih spleti¹èih in stre¾nikih FTP, med njimi tudi na stre¾niku
  Linux Documentation Project.

  Najbolj a¾urna izdaja je vedno na voljo na naslovu
  <http://www.linuxdoc.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html>.
  Ob slovenskem prevodu, ki ga ravnokar berete in je na voljo na
  naslovu
  <http://www.lugos.si/delo/slo/HOWTO-sl/Unix-and-Internet-Fundamentals-HOWTO-sl.html>,
  je spis preveden tudi v polj¹èino:
  <http://www.gszczepa.hg.pl/esr1iso2.htm>.


  1.3.  Odzivi in popravki


  Vpra¹anja in komentarje lahko naslovite na pisca, Erica S. Raymonda
  <esr@thyrsus.com>. Pripombe in kritike so vedno dobrodo¹le. ©e posebej
  dobrodo¹le so povezave na spletne strani, kjer so posamezni koncepti
  razlo¾eni bolj v podrobnosti. Èe mislite, da ste v besedilu na¹li
  napako, bomo veseli, èe jo javite, da jo bomo lahko v naslednji izdaji
  popravili. Vnaprej hvala!

  Pripombe na slovenski prevod naslovite na prevajalca: Primo¾ Peterlin,
  <primoz.peterlin@biofiz.mf.uni-lj.si>.


  1.4.  Podobni spisi


  Èe to berete z namenom, da bi se nauèili, kako postati heker, vas bo
  morda zanimal tudi spis ,,How To Become A Hacker FAQ``, dostopen na
  naslovu  <http://www.tuxedo.org/~esr/faqs/hacker-howto.html>. Med
  drugim vsebuje tudi nekaj povezav na druge uporabne vire.


  2.  Osnovna anatomija va¹ega raèunalnika


  Elektronsko vezje, s katerim raèunalnik dejansko raèuna, imenujemo
  procesor. Ob njem je v raèunalniku tudi notranji pomnilnik (v svetu
  DOS/Windows znan tudi kot ,,RAM``,  uporabniki Unixa pa ga dostikrat
  imenujejo tudi ,,core`` -- spomin na èase, ko je bil notranji
  pomnilnik dejansko sestavljen iz feritnih obroèkov). Procesor in
  pomnilnik sta nastanjena na matièni plo¹èi, ki je osrèje raèunalnika.

  Raèunalnik ima tudi zunanje enote: monitor in tipkovnico, disk in
  disketnik. Monitor, disk in disketnik imajo svoje krmilnike --
  elektronske kartice, ki so prikljuèene na matièno plo¹èo. Tipkovnica
  je tako enostavna enota, da ne potrebuje posebnega krmilnika, ampak je
  ta vgrajen kar v samo ohi¹je tipkovnice.

  Pozneje bomo bolj v podrobnosti opisali, kako te enote delujejo. Za
  zdaj pa nekaj osnovnih stvari:

  Vsi deli raèunalnika znotraj ohi¹ja so prikljuèeni na vodilo. Fizièno
  je vodilo tisto, na kar prikljuèimo krmilni¹ke kartice (grafièna
  kartica, krmilnik za disk, zvoèna kartica). Vodilo je podatkovna
  avtocesta med procesorjem, zaslonom, diskom, in vsem ostalim.

  Èe ste v povezavi z osebnimi raèunalniki naleteli na izraze ISA, PCI
  ali PCMCIA, in niste vedeli, kaj pomenijo: to so vrste vodil. Vodilo
  ISA je razen nekaj podrobnosti enako, kot je bilo v prvotnem
  raèunalniku IBM PC leta 1980, zdaj ga sreèamo èedalje bolj poredko.
  Vodilo PCI (Peripheral Component Interconnection) dandanes sreèamo v
  vseh sodobnih raèunalnikih, vkljuèno z novej¹imi raèunalniki
  Macintosh. PCMCIA je izvedba vodila ISA z drobnej¹imi prikljuèki, ki
  se uporablja v prenosnikih.

  Procesor, ki poganja vse v raèunalniku, ne more neposredno dostopati
  do drugih enot v raèunalniku -- z njimi se mora sporazumevati po
  vodilu. Edina izjema pri tem je pomnilnik, do katerega ima procesor
  takorekoè takoj¹en dostop. Programi lahko teèejo, èe so nalo¾eni v
  pomnilniku (core).

  Ko raèunalnik prebere program ali podatke z diska, to stori tako, da
  zahtevek za branje po vodilu po¹lje krmilniku diska. Nekaj pozneje
  krmilnik -- spet po vodilu -- sporoèi procesorju, da je podatke
  prebral z diska in jih shranil na zahtevano mesto v pomnilniku.
  Procesor lahko tedaj dostopa do podatkov v pomnilniku.

  Tudi tipkovnica in monitor se s procesorjem sporazumevata po vodilu,
  vendar je to bolj preprosto. Veè o tem bomo povedali pozneje. Za zdaj
  je dovolj, èe razumete, kaj se zgodi, ko vkljuèite raèunalnik.


  3.  Kaj se zgodi, ko raèunalnik vklopimo?


  Izklopljen raèunalnik, v katerem ne teèe noben program, je zgolj
  inerten kup elektronskih vezij. Prva stvar, ki jo mora raèunalnik ob
  vklopu opraviti, je pognati poseben program, ki se imenuje operacijski
  sistem. Njegova naloga je, da drugim programom pomaga tako, da nase
  prevzame umazane podrobnosti komuniciranja s strojno opremo.


  Angle¹ki izraz za zagon operacijskega sistema je ,,booting``, kar
  izvira iz besede ,,bootstrap`` (jermenèek na ¹kornju, denimo
  kavbojskem). Zagon raèunalnika iz zaèetnega mrtvila z lastno moèjo je
  namreè nekaj podobnega, kot èe bi se hoteli sami dvigniti v zrak, tako
  da bi se prijeli za jermenèke na ¹kornjih in vlekli navzgor. Ne bo
  ¹lo. Raèunalnik pa se lahko za¾ene z lastno moèjo, ker ima navodila za
  zagon zapisana v enem od svojih èipov, tako imenovanem BIOS (Basic
  Input/Output System, osnovni vhodno-izhodni sistem).

  BIOS naroèi procesorju, naj pogleda na dogovorjeno mesto, navadno na
  disk z najni¾jo ¹tevilko (tako imenovani zagonski disk), in na njem
  poi¹èe poseben program, zagonski nalagalnik. V Linuxu se ta imenuje
  LILO. Zagonski nalagalnik se nalo¾i v pomnilnik in po¾ene. Njegova
  naloga je, da po¾ene pravi operacijski sistem.

  Nalagalnik mora zato poiskati jedro operacijskega sistema, ga nalo¾iti
  v pomnilnik in pognati. Ob zagonu Linuxa vidite napis ,,LILO``, ki mu
  sledi vrsta pikic. Takrat LILO nalaga jedro operacijskega sistema.
  Vsaka pikica pomeni, da je nalo¾il en diskovni blok kode v pomnilnik.

  Zakaj je potreben vmesni korak z zagonskim nalagalnikom, namesto da bi
  BIOS kar sam nalo¾il jedro v pomnilnik? Dva razloga sta za to. Prviè,
  BIOS za osebne raèunalnike IBM PC in njim podobne je bil napisan pred
  veè kot dvajsetimi leti in v resnici ni sposoben uporabljati tako
  velikih diskov, kot so v rabi danes. In drugiè, vmesna stopnja z
  zagonskim nalagalnikom nam takrat, ko imamo na disku name¹èenih veè
  operacijskih sistemov, ponuja mo¾nost, da izberemo, katerega bomo
  zagnali.

  Ko je jedro nalo¾eno, se mora razgledati naokoli, poiskati preostanek
  strojne opreme in pripraviti na poganjanje programov.  Najprej se loti
  natanènej¹ega evidentiranja prikljuèenih naprav. Preèe¹e tisti del
  naslovnega prostora, ki se imenuje vhodno-izhodna vrata (angl. I/O
  port). To je dogovorjeni naèin sporazumevanja procesorja z vhodno-
  izhodnimi enotami. Iz odziva na V/I vratih jedro poskusi ugotoviti,
  katere naprave ima na voljo. Ta stopnja je znana kot ,,autoprobing``.
  Opazujemo jo lahko ob zagonu, ko jedro sproti izpisuje na zaslon,
  katere naprave je na¹lo.

  Jedro Linuxa je zelo dobro pri prepoznavanju strojne opreme, bolj¹e od
  veèine drugih Unixov in veliko bolj¹e od sistemov DOS ali Windows.
  Mnogi stari linuxovski maèki so celo mnenja, da je spretnost Linuxa
  pri prepoznavanju strojnega okolja -- kar posledièno pomeni relativno
  enostavnost namestitve -- bila kljuèna za to, da je od vseh prostih
  izvedb Unixa ravno Linux pridobil kritièno maso uporabnikov.

  S tem, ko se je jedro nalo¾ilo v pomnilnik in teèe, zagona ¹e ni
  konec. To je le prva raven delovanja (angl. run level 1). Po prvi
  stopnji, jedro preda nadzor posebnemu procesu, imenovanemu init, ki
  nadalje po¾ene ¹e veè stre¾ni¹kih procesov.

  Init najprej pregleda, ali je zapis na diskih videti normalen. Èe je,
  jih priklopi. Lahko pa se zgodi, da ni -- morda je z diskom v resnici
  kaj narobe ali pa samo sistem nazadnje ni bil pravilno ugasnjen in so
  podatki na disku ostali nekako napol zapisani. To se rado zgodi, èe
  sredi dela zmanjka elektrike. Jedro poskusi zapise na disku spraviti v
  red in èe misli, da je uspelo, disk priklopi. Pozneje si bomo v
  razdelku ``Kako gredo stvari narobe'' ogledali spravljanje zapisov v
  red bolj v podrobnosti.

  V naslednjem koraku init po¾ene vrsto specializiranih stre¾ni¹kih
  procesov. Angle¹ki izraz zanje je daemon. To so programi, ki teèejo,
  ne da bi karkoli brali s tipkovnice ali pisali na zaslon. Vsak od njih
  skrbi za svoje opravilo, na primer tiskanje, izvajanje periodiènih
  opravil in podobno. Vsak od njih mora koordinirati potencialno
  konfliktne zahtevke. Zakaj vsakega zahtevka ne obdeluje svoj proces?
  Zaradi enostavnosti. Bolj enostavno je napisati stre¾ni¹ki proces, ki
  ves èas teèe in ve vse o zahtevkih, kot pa skrbeti, da si cel trop
  procesov, ki obdelujejo vsak svoj zahtevek, teèejo pa lahko tudi vsi
  hkrati, ne hodi po prstih. Nabor stre¾ni¹kih procesov, ki se za¾enejo
  ob zagonu, se razlikuje od sistema do sistema; skoraj vedno pa je med
  njimi tiskalni¹ki stre¾nik.

  ©e en korak naprej se init pripravi na gostitev uporabnikov, in po¾ene
  program, imenovan getty. Ta pazi, kaj se dogaja na konzoli, torej
  tipkovnici. Dodatne kopije istega programa morda pazijo tudi na
  terminalske in telefonske linije. Getty je tisti, ki izpi¹e pozivnik
  login, ki ga sreèamo ob prijavi. Ko teèejo vsi stre¾ni¹ki procesi, in
  procesi getty pazijo na tipkovnico in vse terminalske linije, smo na
  drugi ravni delovanja (run level 2). Na tej toèki se lahko prijavimo v
  sistem in po¾enemo svoje programe.

  A nismo ¹e konèali. Ko sistem teèe, je naslednji korak zagon
  stre¾nikov za razliène omre¾ne storitve (sprejemanje in po¹iljanje
  po¹te, stre¾enje spletnim zahtevkom ipd.). Ko se za¾enejo ti, smo na
  tretji ravni delovanja (run level 3), sistem pa je v celoti
  pripravljen za delo.


  4.  Kaj se zgodi, ko se prijavimo v sistem?


  Ko vtipkamo uporabni¹ko ime pri pozivniku, ki ga izpi¹e getty, se s
  tem predstavimo raèunalniku. Getty na¹ primer br¾ preda naslednjemu
  programu z imenom login in umre. Proces login nas povpra¹a po geslu,
  in ko ga podamo, preveri, ali smo upravièeni do dostopa do
  raèunalnika. Èe nismo, bo poskus prijave zavrnjen. Èe smo, pa login
  postori ¹e nekaj administrativnih opravil, potem pa po¾ene ukazno
  lupino.  V resnici pravzaprav ni potrebno, da sta getty in login
  razlièna programa. To je ostalina iz nekdanjih èasov, vendar pa o
  razlogih tu ne bi izgubljali besed.

  ©e nekaj veè o tem, kaj sistem poène, preden po¾ene ukazno lupino --
  to bomo potrebovali pozneje, ko bomo govorili o dovolilnicah za
  datoteke. Raèunalniku se predstavimo z uporabni¹kim imenom in geslom.
  Ob prijavi login preveri, ali v datoteki /etc/passwd obstaja vrstica
  za podano uporabni¹ko ime. Vsakemu uporabni¹kemu raèunu ustreza zapis
  (fizièno ena vrstica) v tej datoteki.

  Zapis o posameznem uporabni¹kem raèunu je razdeljen na polja. Eno od
  teh polj vsebuje ¹ifrirano obliko gesla za uporabni¹ki raèun (ponekod
  so ¹ifrirana gesla hranjena loèeno, v datoteki /etc/shadow, ki ima
  stro¾je omejitve za branje -- to ¹e dodatno pripomore k veèji varnosti
  sistema). Geslo, ki ga vtipkate, se ¹ifrira z enakim postopkom, nato
  pa login preveri, ali se ¹ifrirano geslo ujema s ¹ifriranim geslom v
  datoteki /etc/passwd. Varnost tega postopka le¾i v ¹ifrirnem postopku
  -- gesla se ¹ifrirajo z algoritmom, s katerim je ¹ifriranje bistveno
  la¾je od de¹ifriranja. Zato nekomu, ki je izvedel na¹e ¹ifrirano
  geslo, to ¹e vedno ne omogoèa dostopa do sistema. Po drugi strani pa
  tudi mi sami, èe smo geslo sluèajno pozabili, nimamo praktièno nobene
  mo¾nosti, da bi ga izvedeli -- sistemski upravnik ga lahko kveèjemu
  spremeni v neko drugo geslo.

  Ko smo uspe¹no prijavljeni, nam pripadejo vse pravice, ki pritièejo
  na¹emu uporabni¹kemu raèunu. Poleg tega smo lahko tudi èlani ene ali
  veè skupin uporabnikov. Skupina uporabnikov -- ustvari jo lahko
  upravnik sistema -- ima pravice, neodvisne od pravic posameznih
  èlanov. Veè o ``pravicah'' do dela z datotekami bomo povedali pozneje.

  (Èeprav se na uporabni¹ka imena in skupine navadno sklicujemo z
  njihovimi imeni, so v resnici shranjena kot ¹tevilène identifikacijske
  vrednosti. Datoteka z gesli /etc/passwd vsebuje preslikavo med
  uporabni¹kimi imeni in identifikacijskimi ¹tevilkami (angl. user
  identification, UID), datoteka /etc/group pa preslikavo med imeni
  skupin in identifikacijskimi ¹tevilkami skupin (group identification,
  GID). Vsi ukazi, ki imajo opraviti z uporabni¹kimi raèuni ali
  skupinami, opravijo pretvorbo avtomatièno.)

  Zapis o uporabni¹kem raèunu v datoteki /etc/passwd vsebuje tudi
  podatke o domaèem imeniku posameznega uporabnika. To je prostor v
  strukturi imenikov, namenjen na¹im osebnim datotekam. In, ne nazadnje,
  zapis o uporabni¹kem raèunu vsebuje tudi podatek o tem, katero ukazno
  lupino uporabljamo, in ta se bo pognala vedno, ko se prijavimo v
  sistem.


  5.  Kaj se zgodi, ko iz ukazne lupine po¾enemo program?


  Ukazna lupina je tolmaè, ki ga Unix uporablja za ukaze, ki jih
  vtipkamo. Lupina ji pravimo zato, ker ovija in skriva jedro
  operacijskega sistema. Pomembna lastnost Unixa je, da sta jedro in
  ukazna lupina dva loèena programa, ki se sporazumevata prek razmeroma
  majhnega ¹tevila sistemskih klicev. To omogoèa obstoj veè razliènih
  ukaznih lupin, od katerih vsaka ustreza svojemu okusu glede
  uporabni¹kih vmesnikov.

  Obièajno se nam ukazna lupina po prijavi oglasi s pozivnikom $ (razen
  èe tega nismo ukrojili po svoje). Tu ne bomo izgubljali besed o
  skladnji ukazne lupine in enostavnih trikih, ki jih lahko prièaramo na
  zaslon -- namesto tega si bomo s stali¹èa raèunalnika ogledali, kaj se
  dogaja v ozadju.

  Po zagonu, in preden po¾enemo kak program, si lahko raèunalnik
  predstavljamo kot cel zverinjak procesov, ki vsi èakajo, da se bo
  zgodilo nekaj, na kar se bodo odzvali. Èakajo na dogodke (angl.
  event). Dogodek je lahko pritisk tipke ali premik mi¹ke. Èe je
  raèunalnik vkljuèen v omre¾je, je dogodek lahko tudi podatkovni paket,
  ki je prispel iz omre¾ja.

  Eden teh procesov je tudi jedro. Jedro je poseben proces, saj doloèa,
  kdaj lahko teèejo uporabni¹ki procesi, navadno pa je tudi edini
  proces, ki lahko dostopa do strojne opreme. Uporabni¹ki procesi morajo
  zato nasloviti zahtevek jedru, èe ¾elijo prebrati vnos s tipkovnice,
  izpisati znak na zaslon, zapisati ali prebrati podatke z diska, in
  bolj ali manj karkoli razen mletja podatkov v pomnilniku. Takim
  zahtevkom jedru pravimo sistemski klici.

  Praviloma gredo vse vhodno-izhodne operacije prek jedra, tako da lahko
  to razporedi zahtevke in prepreèi, da bi ti drug drugemu hodili v
  zelje. Izjemoma je procesu dovoljeno, da zaobide jedro in neposredno
  komunicira z vhodno-izhodnimi vrati. Stre¾nik X (program, ki v veèini
  sistemov Unix obravnava zahtevke drugih programov za pisanje po
  zaslonu) je ena takih izjem. A nismo ¹e pri stre¾nikih X -- za zdaj se
  ukvarjamo s pozivnikom ukazne lupine v tekstovnem naèinu.

  Ukazna lupina je zgolj uporabni¹ki proces, in niè kaj posebno
  odlikovan. Èaka na pritisk tipk, tako da (prek jedra) bere vhodno-
  izhodna vrata tipkovnice. Ko jedro zazna pritisk tipke, ga izpi¹e na
  zaslon. Èe je to tipka Enter, jedro poda celotno natipkano vrstico
  ukazni lupini. Ta jo zatem poskusi raztolmaèiti kot niz ukazov.

  Denimo, da smo z namenom, da bi pognali program, ki izpi¹e seznam
  datotek, vtipkali ls. Ukazna lupina uporabi vgrajena pravila in z
  njihovo pomoèjo ugotovi, da ¾elimo izvesti datoteko /bin/ls. Zato s
  sistemskim klicem posreduje jedru zahtevek, naj po¾ene datoteko
  /bin/ls. To ga po¾ene kot proces potomec ukazne lupine (ki je
  zahtevala njegovo ustvarjenje), in na potomca prestavi pravice ua
  dostop do tipkovnice in zaslona. Dokler /bin/ls ne opravi svojega,
  ukazna lupina spi, na zaslon pa se izpisuje izhod procesa potomca.

  Ko /bin/ls konèa, novico o zakljuèku s sistemskim klicem exit sporoèi
  jedru. Jedro prebudi speèega roditelja in mu vrne pristojnosti za
  dostop do tipkovnice in zaslona. Ukazna lupina izpi¹e pozivnik in spet
  èaka na novo vrstico ukazov.

  Medtem, ko se ukaz ls izvaja, se lahko dogajajo ¹e druge reèi
  (predpostavimo, da gre za zelo dolg seznam datotek):  po¾enemo lahko
  drugo virtualno konzolo, se prijavimo, po¾enemo igrico, in podobno.
  Ali, èe je raèunalnik vkljuèen v omre¾je, lahko medtem, ko se izvaja
  /bin/ls, po¹ilja ali sprejema po¹to.


  6.  Kako delujejo enote in prekinitve?


  Tipkovnica je zelo enostavna vhodna enota: enostavna, ker generira
  majhne kolièine podatkov, in to zelo poèasi (za raèunalni¹ke pojme).
  Ko pritisnemo tipko, elektronika v tipkovnici po kablu sporoèi
  zahtevek po strojni prekinitvi.

  Naloga operacijskega sistema je, da pazi na tak¹ne zahtevke. Za vsako
  vrsto prekinitve obstoja prekinitveni servisni program, ki je del
  jedra operacijskega sistema, ki prebere in vse potrebne podatke o
  prekinitvi -- v tem primeru kodo pritisnjene ali spu¹èene tipke -- in
  jih shrani, dokler ne pridejo na vrsto za obdelavo.

  Prekinitveni servisni program za tipkovnico ima razmeroma lahko delo
  -- kode tipk prepi¹e na sistemsko obmoèje v pomnilniku. Tam bodo
  poèakale, da jih pregleda program, ki ga je jedro trenutno pooblastilo
  za branje s tipkovnice.

  Tudi bolj zapletene vhodne enote, denimo disk ali omre¾na kartica,
  delujejo podobno. Prej smo omenili, da diskovni krmilnik po vodilu
  sporoèi, ko je zahtevek za branje z diska izveden.  V resnici diskovni
  krmilnik spro¾i zahtevek za prekinitev. Prekinitev prestre¾e ustrezni
  servisni program, ta pa prepi¹e podatke v pomnilnik in poskrbi, da bo
  program, ki je spro¾il zahtevo po prebiranju diska, podatke tudi
  na¹el.

  Prekinitve so razvr¹èene po prednostnih ravneh, s èimer je doloèen
  vrstni red obdelave prekinitev. Prekinitve z nizko pomembnostjo
  (denimo tipkovnica) morajo poèakati, da se najprej obdelajo morebitne
  prekinitve z visoko pomembnostjo (ura, disk). Unix daje prednost
  dogodkom, ki morajo biti obdelani hitro, da lahko sistem teèe èim bolj
  gladko.

  Med sporoèili ob zagonu ste morda opazili oznake IRQ, ki so jim
  sledile razliène ¹tevilke. Morda veste tudi, da je eden od pogostih
  naèinov, kako raèunalnik slabo nastavimo, ta, da dvema enotama
  doloèite, naj uporabljata isti IRQ -- ne veste pa povsem, zakaj je
  tako.

  Tu je odgovor. IRQ je kratica za ,,interrupt request`` (angl. zahtevek
  za prekinitev). Operacijski sistem ob zagonu ugotovi, katera enota bo
  uporabljala prekinitev s katero ¹tevilko, in ji priredi ustrezni
  prekinitveni servisni program. Èe bi dve napravi nenadzorovano
  uporabljali isti signal IRQ, bi zahtevke z ene od naprav obdelal
  napaèen servisni program. V najbolj¹em primeru to pomeni vsaj to, da
  je enota blokirana, nekatere operacijske sisteme pa lahko tak odziv
  vèasih zmede tako hudo, da se zru¹ijo.


  7.  Kako zmore raèunalnik opravljati veè stvari naenkrat?


  Saj jih v resnici ne. Raèunalnik lahko obenem opravlja le eno opravilo
  (ali proces) naenkrat. Paè pa lahko raèunalnik izjemno hitro
  preklaplja med opravili, tako da mnogo poèasnej¹im ljudem ustvari
  privid hkratnega izvajanja. Temu pravimo tudi sistem z dodeljevanjem
  èasa.

  Eno od opravil jedra je tudi dodeljevanje procesorskega èasa procesom.
  Ta del jedra se imenuje razporejevalnik opravil (angl. scheduler), in
  v sebi hrani vse potrebne podatke za vse uporabni¹ke procese v
  zverinjaku. Vsako stotinko sekunde se v jedru spro¾i prekinitev;
  prestre¾e jo razporejevalnik in zaèasno ustavi proces, ki trenutno
  teèe, ter po¾ene naslednji proces s seznama.

  Stotinka sekunde se morda ne sli¹i dosti, vendar pa dana¹nji
  mikroprocesorji v tem èasu izvedejo na tisoèe strojnih ukazov, ki
  lahko postorijo kar nekaj. Tako da, tudi èe obenem teèe veliko
  procesov, lahko vsak od njih vseeno opravi kar nekaj v dodeljenem mu
  èasu.

  V praksi program ni vedno dele¾en vsega razpolo¾ljivega èasa. Èe med
  izvajanjem prispe zahtevek za prekinitev, jedro ustavi trenutno
  opravilo in po¾ene prekinitveni servisni program. ©ele ko ta opravi
  svoje, se zaène tekoèe opravilo spet izvajati. Plaz prekinitev visoke
  pomembnosti lahko tako povsem zaustavi normalno obdelavo -- na sreèo
  pa pri sodobnih Unixih redko pride do tega.

  Hitrost, s katero se program izvaja, je v resnici zelo redko omejena s
  procesorskim èasom, ki mu je na voljo (izjema so seveda raèunsko
  intenzivne operacije, denimo generiranje zvoka ali tridimenionalne
  grafike). Dosti pogosteje so zastoji pogojeni s tem, da program èaka
  na podatke z diska ali omre¾ja.

  Operacijski sistem, ki podpira veè hkratnih procesov imenujemo
  veèopravilni sistem. Dru¾ina operacijskih sistemov Unix je bila
  zasnovana z mislijo na veèopravilnost in je v tem pogledu zelo dobra
  -- dosti bolj uèinkovita kot Windows ali Mac OS, pri katerih so
  veèopravilnost dodali pozneje, in je izvedena slab¹e. Uèinkovita in
  zanesljiva veèopravilnost je v veliki meri zaslu¾na za uspeh Linuxa
  kot omre¾nega stre¾nika.


  8.  Kako prepreèimo, da bi procesi drug drugemu hodili v zelje?


  Razporejevalnik opravil skrbi za èasovno loèitev procesov, torej za
  to, da si naenkrat lasti procesor le en proces. Poleg tega moramo
  procese loèiti tudi prostorsko, tako da procesi uporabljajo le kos
  pomnilnika, ki jim je dodeljen, ne pa tudi prostora, dodeljenega
  drugim procesom. Celo èe predpostavimo, da bi programi posku¹ali biti
  kooperativni, ne moremo dopustiti, da bi napaka v enem od njih
  po¹kodovala druge. Naloge operacijskega sistema v zvezi z
  dodeljevanjem prostora so znane pod imenom upravljanje pomnilnika
  (angl. memory management).

  Vsak proces v zverinjaku potrebuje svoj kos pomnilnika, torej prostor,
  v katerem bo izvajal svojo kodo ter hranil spremenljivke in rezultate.
  Lahko si zamislimo, da del tega prostora zaseda programski segment, ki
  hrani programske ukaze v strojnem jeziku in iz katerega lahko samo
  beremo, ter podatkovni segment, ki vsebuje vse spremenljivke,
  uporabljene v programu, in v katerega je mogoèe tudi pisati.
  Podatkovni segment se res razlikuje od enega procesa do drugega;
  programski pa ne nujno: èe dva procesa poganjata isto programsko kodo,
  Unix varèuje s prostorom in samodejno poskrbi, da je programski
  segment nalo¾en v pomnilnik samo enkrat.


  8.1.  Virtualni pomnilnik: preprosta razlaga


  Uèinkovitost ravnanja s prostorom je pomembna, saj je pomnilnik drag.
  Vèasih ga nimamo dovolj, da bi naenkrat dr¾ali v pomnilniku vse
  programe, ki se izvajajo, ¹e posebej, èe je med njimi kak velik
  program, denimo stre¾nik X. Unix te¾avo zaobide s tehniko, ki je znana
  kot virtualni pomnilnik. Jedro ne posku¹a dr¾ati v pomnilniku celotne
  kode in podatkov za posamezni proces, ampak samo relativni manj¹i
  delovni nabor. Preostanek pomnilni¹ke slike procesa je shranjen na
  posebnem prostoru na disku (tako imenovani izmenjalni prostor).

  V preteklosti, ko so imeli raèunalniki malo pomnilnika, je ,,vèasih``
  iz prej¹njega odstavka pomenilo ,,skoraj vedno``. Dandanes pomnilnik
  ni veè tako drag, kot je bil vèasih, in celo raèunalniki s spodnjega
  konca lestvice ga premorejo kar precej. Na sodobnih enouporabni¹kih
  raèunalnikih, ki imajo 64 ali veè megabajtov pomnilnika, je mogoèe
  poganjati okna X in obièajno paleto opravil, ne da bi bilo treba
  uporabiti izmenjalni prostor.


  8.2.  Virtualni pomnilnik: podrobnosti


  V prej¹njem razdelku smo stvari namenoma poenostavili. Dr¾i, da
  programi obravnavajo pomnilnik kot dolgo vrsto pomnilni¹kih naslovov,
  ki lahko presega fizièni pomnilnik, in da to iluzijo vzdr¾ujemo z
  diskovnim izmenjavanjem. Vendar pa premore obièajni raèunalnik niè
  manj kot pet razliènih vrst pomnilnika, in razlike med njimi so
  pomembne, kadar moramo iz raèunalnika iztisniti kar najveè. Da bi
  resnièno razumeli, kaj se dogaja v raèunalniku, moramo razumeti tudi,
  kako delujejo posamezne vrste pomnilnika.

  Pet vrst pomnilnika je: procesorski registri, notranji predpomnilnik
  (na samem èipu), zunanji predpomnilnik (na loèenem èipu), glavni
  pomnilnik, ter disk. Razlog za toliko razliènih vrst pomnilnika je en
  sam: hitrost se plaèa. Na¹teli smo jih od najhitrej¹ega do
  najpoèasnej¹ega, oziroma od najdra¾jega do najcenej¹ega. Registri so
  najhitrej¹a in najdra¾ja oblika pomnilnika, do njih pa lahko dostopamo
  pribli¾no milijardokrat na sekundo. Disk je najpoèasnej¹a in
  najcenej¹a oblika; do podatkov na njem lahko dostopamo pribli¾no
  stokrat na sekundo.

  Sledi seznam z vrednostmi za obièajni namizni raèunalnik, kot so bile
  aktualne spomladi leta 2000.  Hitrost in velikost bosta s èasom
  nara¹èali, cene pa padale, vendar pa lahko prièakujete, da bodo
  razmerja med njimi ostala bolj ali manj enaka. In ta razmerja doloèajo
  pomnilni¹ko hierarhijo.


     Disk
        Velikost 13.000 MB  Hitrost:  100 KB/s

     Pomnilnik
        Velikost    256 MB  Hitrost:  100 MB/s

     Zunanji predpomnilnik
        Velikost    512 KB  Hitrost:  250 KB/s

     Notranji predpomnilnik
        Velikost     32 KB  Hitrost:  500 KB/s

     Register
        Velikost     28 B   Hitrost: 1000 KB/s

  Celotnega raèunalnika ne moremo zgraditi iz najhitrej¹e vrste
  pomnilnika. Dosti predrago bi bilo -- in celo èe to ne bi bilo res,
  hitri pomnilnik ni trajen. Br¾ ko izkljuèimo napajanje, izgubi svojo
  vrednost. Zato morajo raèunalniki imeti tudi neko vrsto trajnega
  pomnilnika -- npr. disk -- ki ohrani svojo vrednost tudi, ko izklopimo
  napajanje. Med hitrostjo procesorjev in hitrostjo diskov pa zeva
  ogromna vrzel. Srednje tri ravni v hierarhiji procesorjev -- notranji
  predpomnilnik, zunanji predpomnilnik in glavni pomnilnik -- obstajajo
  zgolj, da premostijo to vrzel.

  Linux in drugi Unixi uporabljajo virtualni pomnilnik. To pomeni, da se
  operacijski sistem vede, kot da bi imel na razpolago dosti veè
  pomnilnika, kot pa ga je dejansko na voljo. Fizièni pomnilnik se
  obna¹a kot vrsta ,,oken`` na mnogo veèjem ,,virtualnem`` pomnilniku,
  katerega veèina je v katerem koli trenutku shranjena na disku, na
  posebnem prostoru, imenovanem izmenjalni prostor. Ne da bi se
  uporabni¹ki procesi tega zavedali, operacijski sistem sproti prena¹a
  bloke podatkov (takemu bloku pravimo tudi page, slov. stran) iz
  pomnilnika na disk in nazaj, in tako ustvarja iluzijo velikega
  pomnilnika. Konèni rezultat je, da je tak virtualni pomnilnik dosti
  veèji, pa niti ne dosti poèasnej¹i od fiziènega.

  Koliko poèasnej¹i je virtualni pomnilnik od fiziènega je odvisno od
  tega kako dobro algoritmi za izmenjevanje v operacijskem sistemu
  predvidijo porabo pomnilnika. Na sreèo veèina sklicev na pomnilni¹ke
  lokacije, ki si sledijo v kratkem èasu, bere oziroma pi¹e v
  pomnilni¹ke lokacije, ki so tudi prostorsko blizu skupaj. Ta lepa
  lastnost je znana kot lokalnost, oziroma lokalnost sklicevanja. Èe bi,
  nasprotno, bili pomnilni¹ki sklici nakljuèno raztreseni po celotnem
  pomnilni¹kem prostoru, bi morali ob vsakem sklicu na pomnilni¹ko
  lokacijo prebrati podatke z diska, in virtualni pomnilnik bi bil enako
  poèasen kot disk. Ker pa programi ka¾ejo lokalnost, lahko operacijski
  sistem opravi pomnilni¹ka sklicevanja z razmeroma malo branja z diska.

  Izkustveno je bilo ugotovljeno, da je najuèinkovitej¹a metoda za
  ¹iroko paleto vzorcev rabe pomnilnika nadvse preprosta: algoritem se
  imenuje LRU (angl. Least Recently Used, ,,tisti, ki najdlje ni bil
  rabljen``). Mehanizem za virtualni pomnilnik nalo¾i diskovni blok v
  svoj delovni nabor, ko se za to poka¾e potreba. Èe fiziènega
  pomnilnika ni veè na voljo, iz njega zbri¹e blok, ki najdlje ni bil
  rabljen. Vse razlièice Unixa, kot tudi veèina drugih operacijskih
  sistemov, ki uporabljajo virtualni pomnilnik, uporablja to ali ono
  razlièico algoritma LRU.

  Virtualni pomnilnik je prvi èlen v premostitvi vrzeli v hitrostih
  diska in procesorja, in ga izrecno upravlja operacijski sistem.
  Podobna, èeprav nekaj manj¹a vrzel zeva tudi med hitrostjo glavnega
  pomnilnika in hitrostjo procesorja. Notranji in zunanji predpomnilnik
  re¹ujeta ta problem s tehniko, ki je podobna pravkar opisani.

  Tako kot se fizièni glavni pomnilnik obna¹a kot vrsta oken v
  izmenjalnem prostoru na disku, se tudi zunanji predpomnilnik obna¹a
  kot okna v glavnem pomnilniku. Zunanji predpomnilnik je hitrej¹i od
  glavnega (250 milijonov dostopov na sekundo proti 100 milijonom), a
  manj¹i. Raèunalnik - natanèneje, upravljalnik pomnilnika - izvaja v
  njem algoritem LRU na blokih podatkov iz glavnega pomnilnika. Iz
  zgodovinskih razlogov se tu pomnilni¹ka enota imenuje ,,vrstica``
  (angl. line) namesto ,,stran`` (angl. page).

  Nismo ¹e konèali. ©e zadnji korak v pospe¹itvi je notranji
  predpomnilnik. Ta izvaja algoritem LRU na blokih podatkov iz zunanjega
  pomnilnika. Je ¹e hitrej¹i in ¹e manj¹i - tako majhen pravzaprav, da
  je kar del mikroprocesorskega èipa.
  Èe bi radi napisali èim hitrej¹e programe, je dobro, da vemo te
  podrobnosti. Programi teèejo tem hitreje, èim veèjo lokalnost imajo,
  saj je tedaj algoritem LRU bolj uèinkovit. Najenostavnej¹i naèin, da
  dose¾emo, da so programi hitri, je, da so majhni. Èe programa ne
  zavira kopica branj in pisanj z diska ali omre¾ja, bo navadno tekel s
  hitrostjo najmanj¹ega predpomnilnika, v katerega ga lahko shranimo.

  Èe ne moremo napraviti celotnega programa tako majhnega, se vèasih
  splaèa potruditi in èasovno kritiène dele napisati tako, da so èim
  bolj lokalni. Podrobnosti tehnik za tak¹na fina ugla¹evanja presegajo
  ta navodila; do takrat, ko jih boste potrebovali, boste verjetno ¾e
  dovolj domaèi s prevajalnikom, da boste mnoge od njih odkrili sami.


  8.3.  Enota za upravljanje pomnilnika


  Celo èe imamo na voljo dovolj fiziènega pomnilnika, da diskovno
  izmenjevanje ni potrebno, ima del operacijskega sistema, zadol¾en za
  upravljanje pomnilnika, ¹e vedno pomembno nalogo. Paziti mora na to,
  da lahko vsak program spreminja le svoj podatkovni segment --
  prepreèiti mora torej, da bi okvarjen ali zlonameren program
  po¹kodoval podatke, ki pripadajo drugemu programu. Zato vodi
  knjigovodstvo o uporabljenih podatkovnih in programskih segmentih.
  Vsakiè, ko program zahteva dodatni pomnilnik, ali pa ko sprosti
  pomnilnik (slednje se navadno zgodi, ko program zakljuèi z delom),
  mora a¾urirati tabelo.

  Tabela se uporablja za posredovanje ukazov specializiranemu kosu
  strojne opreme, imenovanem MMU (angl. memory management unit, enota za
  upravljanje pomnilnika). Sodobni mikroprocesorji imajo enoto MMU ¾e
  integrirano na sam procesorski èip. Enota MMU ima mo¾nost, da
  ,,ogradi`` posamezna obmoèja pomnilnika, tako da so poskusi poseganja
  izven tega obmoèja zavrnjeni in izzovejo posebno vrsto prekinitve.

  Èe ste v Unixu ¾e kdaj naleteli na napako ,,Segmentation fault, core
  dumped`` ali kaj podobnega -- to je to. Proces je poskusil poseèi po
  delu pomnilnika izven svojega podatkovnega segmenta, kar mu je
  operacijski sistem prepreèil in ga prisilno zakljuèil. Tak¹no
  obna¹anje je posledica napake v programu -- datoteka core s
  pomnilni¹ko sliko procesa ob smrti, ki jo operacijski sistem ob tej
  priliki zapi¹e na disk, je diagnostièna informacija, ki naj bi bila v
  pomoè programerju pri iskanju napake.

  Poleg omejitve pomnilnika obstaja ¹e en vidik varovanja procesov pred
  drugimi procesi. Nadzor ¾elimo imeti tudi nad dostopom do datotek,
  tako da okvarjen ali zlonameren program ne more po¹kodovati katere od
  kljuènih datotek na disku. Zato pozna Unix ``dovolilnice za
  datoteke'', o katerih bomo veè povedali pozneje.


  9.  Kako hrani raèunalnik podatke v pomnilniku?


  Verjetno veste, da je v raèunalniku vse shranjeno kot zaporedje bitov
  (angl. binary digit, dvoji¹ka ¹tevka - mislimo si jih lahko kot
  stikala, ki so lahko vkljuèena ali izkljuèena). Tu bomo razlo¾ili,
  kako lahko z biti predstavimo v raèunalniku ¹tevilke in èrke.

  Preden se spustimo v razlago, si moramo razjasniti ¹e pojem velikosti
  strojne besede. Velikost strojne besede je najprimernej¹a velikost za
  premikanje informacije sem ter tja. Tehnièno je enaka velikosti
  registrov - pomnilnih celic procesorja, ki slu¾ijo za aritmetiène in
  logiène operacije. Ko govorimo o 32- ali 64-bitnih raèunalnikih,
  mislimo na to.

  Veèina raèunalnikov - vkljuèno z osebnimi raèunalniki s procesorji
  386, 486, Pentium ipd. - uporablja 32-bitno strojno besedo. Starej¹i
  osebni raèunalniki (286) so uporabljali 16-bitno strojno besedo. Stari
  veliki raèunalniki so pogosto uporabljali 36-bitno strojno besedo.
  Nekaj procesorjev, kot denimo Alpha dru¾be DEC (ki jo je medtem kupil
  Compaq), uporablja 64-bitno strojno besedo. Uporaba te bo postala v
  prihodnjih letih ¹e pogostej¹a: pri Intelu naèrtujejo nadomestitev
  sedanje serije Pentium z novimi 64-bitnimi procesorji Itanium.

  Raèunalnik si predstavlja pomnilnik kot zaporedje besed, o¹tevilèenih
  od niè do neke velike vrednosti, doloèene s kolièino pomnilnika, ki jo
  imamo na voljo. Tudi kolièina pomnilnika, ki jo lahko procesor
  naslavlja, je povezana z velikostjo strojne besede - to je bil vzrok,
  da je bil na starej¹ih raèunalnikih 286 dostop do veèjih kolièin
  pomnilnika izjemno zapleten. Teh te¾av tukaj ne bomo obnavljali, saj
  starej¹ih programerjev ne ¾elimo spominjati na te more.


  9.1.  ©tevila


  Cela ¹tevila so predstaljena bodisi kot strojne besede, bodisi kot
  pari strojnih besed, odvisno od velikosti strojne besede. Najbolj
  obièajna predstavitev celih ¹tevil je 32-bitna strojna beseda.

  Celo¹tevilèna aritmetika je podobna, ne pa povsem enaka dvoji¹ki
  aritmetiki v matematiki. Bit z najni¾jo vrednostjo pomeni enico,
  naslednji dvojko, ¹e naslednji ¹tirico in tako dalje, kot v dvoji¹kem
  sistemu. Predznaèena cela ¹tevila pa so predstavljena kot dvoji¹ki
  komplementi. Negativno celo ¹tevilo dobimo iz ustreznega pozitivnega
  celega ¹tevila tako, da invertiramo vse bite le-tega in pri¹tejemo
  ena. Obseg celih ¹tevil na 32-bitnih raèunalnikih je zato od -2^31 do
  2^31 -1. Z oznako ^ smo oznaèili potenciranje: npr. 2^3 = 8.
  Dvaintrideseti bit se uporablja za oznako predznaka.

  Nekateri programski jeziki pu¹èajo tudi mo¾nost nepredznaèene
  aritmetike, kar pomeni navaden dvoji¹ki sistem, pri katerem imamo na
  razpolago naravna ¹tevila in niè.

  Veèina procesorjev in programskih jezikov zmore tudi aritmetiène
  operacije s plavajoèo vejico. V vse novej¹e mikroprocesorje je
  sposobnost za tak¹no raèunanje ¾e vgrajena. ©tevila s plavajoèo vejico
  ponujajo mnogo ¹ir¹i razpon od celih ¹tevil, z njimi pa lahko izrazimo
  tudi ulomke. Naèini, kako raèunamo z njimi, se med seboj nekoliko
  razlikujejo, vsi pa so preveè zapleteni, da bi o njihovih podrobnostih
  razpravljali na tem mestu. Njihova skupna znaèilnost je, da so podobna
  takoimenovanemu znanstvenemu zapisu, pri katerem ¹tevilo zapi¹emo kot,
  denimo 6,022 * 10^26. Pri tem smo ¹tevilo razdelili na mantiso (6,022)
  in eksponent (26) z osnovo 10 (10^26 je ¹tevilo s ¹estindvajsetimi
  nièlami).


  9.2.  Znaki


  Znaki so navadno predstavljeni kot nizi sedmih bitov, kodirani po
  kodnem razporedu ISO 646/ASCII (American Standard Code for Information
  Interchange, ameri¹ki standardni kod za izmenjavo informacij). V
  sodobnih raèunalnikih je 128 znakov, ki jih kodira standard ASCII,
  kodiranih s spodnjimi sedmimi biti okteta (osembitnega zloga oz.
  bajta). Oktete lahko zlagamo v strojne besede - beseda s ¹estimi
  èrkami tako zavzema dve strojni besedi v pomnilniku. Razpored kodnega
  standarda ASCII dobimo z ukazom man 7 ascii.

  Prej¹nji odstavek vsebuje dve nepopolnosti. Manj¹a od njiju je uporaba
  izraza oktet - èeravno je tehnièno toèen, ga skoraj nihèe ne
  uporablja, ampak oktetom kratkomalo pravijo bajt ali zlog in
  predpostavljajo, da so bajti osembitni. Strogo vzeto je bajt sicer
  ¹ir¹i pojem - starej¹i 36-bitni raèunalniki so denimo raèunali z
  devetbitnimi bajti, vendar pa danes - in verjetno nikoli veè -
  praktièno ni v rabi raèunalnikov, ki ne bi uporabljali osembitnih
  bajtov.

  Veèja nepopolnost se nana¹a na izbor kodnega nabora ASCII. V resnici
  si namreè veèina sveta z njim ne more kaj dosti pomagati. V naboru
  ASCII, ki je sicer povsem dober za angle¹ko rabo v ZDA, manjkajo mnoge
  èrke, ki jih uporabljajo drugi narodi. Celo v Veliki Britaniji je
  njegova raba omejena, saj ne pozna znaka za funt.

  Te¾avo so posku¹ali odpraviti na veè naèinov. Veèina uporablja osmi
  bit, ki ga ASCII ne uporablja, in tako pride do nabora z 256 znaki,
  katerega spodnjo polovico predstavlja ASCII. Najpogosteje uporabljan
  med temi nabori je tako imenovan Latin-1 (formalno ISO 8859-1). Ta je
  tudi privzeti nabor znakov v Linuxu, HTML in oknih X. Microsoft
  Windows uporablja mutirano izvedenko nabora Latin-1, v kateri so na
  mestih, ki jih Latin-1 iz zgodovinskih razlogov pu¹èa prosta, dodani
  znaki kot na primer levi in desni dvojni narekovaji. Nekaj o te¾avah,
  ki jih to povzroèa, lahko preberemo na strani
  <http://www.fourmilab.ch/webtools/demoroniser/>.

  Latin-1 je povsem primeren za veèino zahodnoevropskih jezikov, ne pa
  tudi za sloven¹èino. Ta si skupaj z drugimi srednje- in vzhodno-
  evropskimi jeziki (bo¹nja¹èina, èe¹èina, hrva¹èina, lu¾i¹ka srb¹èina,
  mad¾ar¹èina, moldav¹èina, polj¹èina, romun¹èina, slova¹èina in
  srb¹èina) deli nabor Latin-2 (ISO 8859-2). ©e drugi jeziki in pisave
  (cirilica, gr¹èina, hebrej¹èina, arab¹èina) uporabljajo ostale nabore
  iz dru¾ine ISO 8859. Veè o tem na strani
  <http://czyborra.com/charsets/iso8859.html>.

  Konèno re¹itev predstavlja 16-bitni standard Unicode oziroma ISO/IEC
  10646-1:1993. V prvih 256 znakih se Unicode ujema s standardom ISO
  8859-1. Naslednji znaki kodirajo pismenke, potrebne za zapis gr¹èine,
  cirilice, armen¹èine, hebrej¹èine, arab¹èine, devanagarija,
  bengal¹èine, gurmuk¹èine, orij¹èine, tamil¹èine, taj¹èine, lao¹èine,
  gruzij¹èine, tibetan¹èine, japonske katakane, celotnen nabor korejskih
  hangulskih pismenk in unificiranih kitajsko/japonsko/korejskih (CJK)
  pismenk. Veè podrobnosti na strani  <http://www.unicode.org/>.


  10.  Kako so shranjeni podatki na disku


  Èe si v Unixu pogledamo disk, vidimo drevo poimenovanih imenikov in
  datotek. Navadno nas globlji pogled ne zanima, vèasih - denimo, ko se
  nam zru¹i disk in bi radi re¹ili podatke na njem - pa je uporabno
  vedeti tudi, kaj se skriva za tem. Na ¾alost ni nobenega dobrega
  naèina, kako opisati organizacijo diska od ravni datotek navzdol, tako
  da bomo ubrali obratno smer, od strojne opreme navzgor.


  10.1.  Nizkonivojska struktura diska in datoteènega sistema


  Povr¹ina diska je razdeljena pribli¾no tako, kot si sledijo polja pri
  tarèi za pikado: na koncentriène steze, vsaka od njih pa ¹e naprej,
  radialno, na odseke. Ker so steze na zunanjem robu diska dalj¹e kot
  tiste bli¾je osi, so navadno razdeljene na veè odsekov kot notranje.
  Odseki ali diskovni bloki so enako veliki - pri sodobnih Unixih
  navadno 1 kB (1024 osembitnih besed). Vsak diskovni blok ima svoj
  naslov, ¹tevilko diskovnega bloka.


  V Unixu je disk razdeljen na razdelke. Vsak razdelek vsebuje zaporedje
  diskovnih blokov, ki ga uporabljamo neodvisno od drugih razdelkov na
  disku. Razdelke lahko uporabimo bodisi kot datoteèni sistem, bodisi
  kot izmenjalni prostor.  Razlogi za razdelitev diska na razdelke
  segajo ¹e v èase diskov, ki so bili mnogo poèasnej¹i in so se
  pogosteje kvarili. Meje med razdelki so morebitno napako omejile na
  posamezni razdelek, tako da je preostanek diska ostal dostopen.
  Dandanes so pomembnej¹e druge lastnosti razdelkov. Na posameznem
  razdelku lahko dovolimo samo branje, pisanja pa ne, in tako
  prepreèimo, da bi morebitni vsiljivci spreminjali kritiène sistemske
  datoteke. Posamezne razdelke lahko tudi po krajevnem omre¾ju delimo z
  drugimi raèunalniki, èesar pa tu ne bomo opisovali v podrobnosti.
  Razdelek z najni¾jo zaporedno ¹tevilko je posebej odlikovan. To je
  zagonski razdelek. Ob zagonu se z njega prebere jedro.

  Posamezni razdelek lahko uporabimo bodisi kot izmenjalni prostor (ki
  se uporablja za virtualni pomnilnik), bodisi za datoteèni sistem, kjer
  so shranjene datoteke. Izmenjalni prostor jedro obravnava kot linearno
  zaporedje blokov, pri datoteènem sistemu pa je vse skupaj nekoliko
  bolj zapleteno, saj potrebujemo evidenco o tem, kateri diskovni bloki
  pripadajo posamezni datoteki. Ker se datoteke s èasom dalj¹ajo,
  kraj¹ajo in spreminjajo, je malo verjetno, da bo datoteki dodeljeni
  zaporedje diskovnih blokov. Bolj verjetno je, da bodo razpr¹eni po
  celotnem razdelku, kjer bo paè operacijski sistem na¹el prostor.
  Takemu pojavu razpr¹enosti blokov pravimo tudi fragmentacija.


  10.2.  Imena datotek in imeniki


  Vsaka datoteka in vsak imenik v datoteènem sistemu je opisan s
  podatkovno strukturo, imenovano inod (angl. inode). Kazalo inodov
  najdemo pri ,,dnu`` (diskovni bloki z ni¾jimi ¹tevilkami) datoteènega
  sistema (èisto najni¾ji bloki se uporabljajo za oznake in
  administrativne zadeve, o katerih tu ne bomo razpravljali). Podatkom
  (datotekam in imenikom) so namenjani diskovni bloki z vi¹jimi
  ¹tevilkami.

  Vsak inod vsebuje seznam diskovnih blokov, ki pripadajo posamezni
  datoteki (kar sicer ni èisto res, oziroma je res samo za majhne
  datoteke, ampak s takimi podrobnostmi se tu ne bomo ukvarjali).
  Posebej bi poudarili, da inod ne vsebuje imena datoteke ali imenika.

  Ime datoteke (ali imenika) je shranjeno v imeni¹ki strukturi. To
  kazalo je enostavnej¹e od kazala inodov, saj obsega le preslikavo iz
  imen na ¹tevilko inoda. Zdaj razumemo, zakaj imajo lahko v Unixu
  datoteke veè pravih imen (ali trdih povezav), saj ni nobenega razloga,
  zakaj ne bi moglo veè imen kazati na isti inod.


  11.  Priklopne toèke


  V najpreprostej¹em primeru je celotni datoteèni sistem Unixa shranjen
  na enem samem razdelku. Èeprav na tako situacijo naletimo vèasih na
  majhnih sistemih za osebno rabo, ni obièajna. Navadno se sistem
  razteza prek veè razdelkov, vèasih celo prek veè diskov. Tako imamo
  lahko na primer en èisto majhen razdelek za jedro, veèji razdelek za
  druge datoteke, ki spadajo k operacijskemu sistemu, in ogromen
  razdelek z uporabni¹kimi datotekami.

  Edini razdelek, do katerega imamo dostop takoj ob zagonu raèunalnika,
  je korenski razdelek. Ta je skoraj vedno tisti razdelek, s katerega
  smo zagnali sistem. Vsebuje korenski imenik datoteènega sistema - vrh
  razvejene drevesne strukture imenikov.

  Da lahko dostopamo do podatkov na ostalih razdelkih, morajo biti ti
  pridru¾eni korenskemu. Unix omogoèi dostop do njih nekje sredi
  zagonskega postopka z operacijo, ki ji pravimo priklop (angl. mount).
  Razdelke priklopimo na obstojeèi imenik na korenskem razdelku.

  Èe imamo, denimo, imenik /usr, je to verjetno priklopna toèka za
  razdelek, ki vsebuje ¹tevilne programe Unixa, vendar pa noben od njih
  ni nujno potreben ob zagonu.


  11.1.  Pot do datoteke na disku


  Zdaj lahko na datoteèni sistem spet pogledamo od vrha. Ko odpremo
  datoteko, denimo /home/esr/WWW/ldp/fundamentals.sgml, se zgodi
  naslednje.

  Jedro zaène iskati pri korenu datoteènega sistema (ta le¾i vedno na
  korenskem razdelku), in i¹èe imenik /home. Navadno je /home le
  priklopna toèka za velik razdelek z uporabni¹kimi programi, ki le¾i
  kje drugje, zato jedro sledi na ta razdelek. V vrhnji imeni¹ki
  strukturi razdelka z uporabni¹kimi podatki jedro poi¹èe vnos esr in
  prebere ¹tevilko pripadajoèega inoda. Ko inodu sledi, ugotovi, da gre
  za imeni¹ko strukturo, in v njej poi¹èe vnos WWW. Ko sledi temu inodu,
  pride spet do podimenika in v njem poi¹èe ldp, kar ga privede do ¹e
  enega imeni¹kega inoda.  Odpre ga in v njem poi¹èe inod za
  fundamentals.sgml. Ta inod ni imenik, ampak vsebuje seznam diskovnih
  blokov, ki pripadajo datoteki s podanim imenom.


  11.2.  Lastni¹tvo datotek, dovolilnice in varnost


  Da programi namerno ali nenamerno ne bi po¹kodovali podatkov, katerih
  ne smejo po¹kodovati, ima Unix urejen sistem dovolilnic. Prvotno - v
  èasu, ko je Unix tekel predvsem na velikih in dragih miniraèunalnikih
  - so se uporabljale na sistemih z dodeljevanjem èasa, na katerih so
  uporabnike varovale pred drugimi uporabniki.

  Da bi razumeli dovolilnice za datoteke, se moramo spomniti opisa
  uporabnikov in skupin v razdelku ``Kaj se zgodi, ko se prijavimo v
  sistem''. Vsaka datoteka pripada doloèenemu lastniku in doloèeni
  skupini. Na zaèetku ti zavzameta vrednosti, kot ju ima tisti, ki je
  datoteko ustvaril, pozneje pa ju lahko spremenimo z ukazoma chown(1)
  in chgrp(1).

  Osnovna dovoljenja, ki jih lahko vsebuje dovolilnica, so dovoljenje za
  branje, dovoljenje za pisanje (tudi brisanje ali spreminjanje) in
  dovoljenje za izvajanje (èe je datoteka program). Dovolilnica vsebuje
  tri nabore dovoljenj: za lastnika; za kogarkoli drugega v skupini, ki
  ji datoteka pripada; ter za kogarkoli drugega. Pravice, ki jih
  pridobimo ob prijavi v sistem, so pravice do branja, pisanja in
  izvajanja tistih datotek, katerih dovolilnice se ujemajo z na¹o
  identifikacijsko ¹tevilko ali katero od identifikacijskih ¹tevilk
  skupin, ki jim pripadamo, ali pa datotek, ki so dostopne vsem.

  Oglejmo si izpis hipotetiènega sistema, da vidimo, kako stvari
  delujejo in kako Unix prika¾e dovolilnice:

       snark:~$ ls -l notes
       -rw-r--r--   1 esr      users         2993 Jun 17 11:00 notes

  To je navadna podatkovna datoteka. Izpis seznama ka¾e, da je njen
  lastnik esr, skupina, ki ji pripada, pa users. Najverjetneje sistem, v
  katerem je bila ustvarjena, privzeto postavi vsakega uporabnika v to
  skupino. Druge skupine, na katere tudi naletimo na veèuporabni¹kih
  sistemih, so staff (osebje), admin (uprava) in wheel (sistem). Na
  enouporabni¹kih sistemih skupine nimajo posebnega pomena. Na nekaterih
  sistemih je privzeta skupina lahko drugaèna - dostikrat je kar enaka
  uporabni¹kemu imenu.

  Niz znakov -rw-r--r-- je dovolilnica za dano datoteko. Prvi minus ka¾e
  imeni¹ki bit. Èe bi bil namesto datoteke imenik, bi tam pisalo d.
  Sledijo mu tri mesta, ki ka¾ejo dovoljenja lastnika (rw-); sledijo tri
  mesta, ki ka¾ejo dovoljenja skupine (r--) in nazadnje so tri mesta z
  dovoljenji za vse ostale (r--). To datoteko lahko bere in spreminja
  samo lastnik (esr); berejo jo lahko vsi èlani skupine users, in berejo
  jo lahko tudi vsi ostali. Tak¹na dovolilnica je precej obièajna za
  navadne datoteke.

  Zdaj pa ¹e zgled datoteke z nekaj drugaèno dovolilnico. Ta datoteka je
  GCC, prevajalnik GNU C.

       snark:~$ ls -l /usr/bin/gcc
       -rwxr-xr-x   3 root     bin         64796 Mar 21 16:41 /usr/bin/gcc

  Datoteka pripada uporabniku root in skupini bin. Spreminja jo lahko
  samo lastnik, bere in izvaja pa kdorkoli. Tak¹na dovolilnica je
  obièajna za privzeto name¹èene sistemske ukaze. Skupina bin je na
  nekaterih Unixih lastnica sistemskih ukazov (bin je okraj¹ava od
  ,,binaren``, kar naj bi namigovalo, da gre za programe). Na va¹em
  sistemu morda ta datoteka pripada skupini root (razlikovati moramo med
  uporabnikom root in istoimensko skupino!).

  Uporabnik root z identifikacijsko ¹tevilko 0 je poseben uporabni¹ki
  raèun s pravico, da zaobide vse varnostne mehanizme. To je obenem zelo
  uporabno in zelo nevarno. Napaka pri tipkanju, ko smo prijavljeni kot
  root, lahko po¹koduje kritiène sistemske datoteke, ki se jih isti
  ukaz, pognan z navadnega uporabni¹kega raèuna, ne bi dotaknil.

  Ker je raèun root tako moèan, mora biti dostop do njega varovan zelo
  skrbno. Geslo za uporabnika root je najbolj kritièen element varnosti
  sistema, in zatorej informacija, ki jo bodo morebitni vlomilci najprej
  iskali.

  Ko smo ¾e pri geslih - ne zapisujte si jih nikamor, in ne izbirajte
  gesel, ki jih je enostavno uganiti, kot denimo ime dekleta, fanta,
  ¾ene... To je osupljivo pogosta slaba navada, ki vlomilcem izjemno
  olaj¹a delo. V splo¹nem se izogibajte besedam iz slovarja - obstajajo
  programi, ki si pri ugibanju gesel pomagajo s slovarji. Dobra so gesla
  sestavljena iz besede, ki ji sledi ¹tevka, in ¹e ena beseda, denimo
  ,shark6cider` ali ,jump3joy`. S tem raz¹irimo prostor mo¾nih besed
  toliko, da navadno ugibanje z iskanjem po slovarju ni veè uporabno.
  Seveda ne uporabite podanih zgledov - vlomilci so jih zdaj verjetno ¾e
  dodali v svoje slovarèke. Zelo uporabna navodila za spisal tudi Mark
  Martinec z IJS, najdemo jih na naslovu
  <http://www.ijs.si/dobro_geslo.html>.

  Pa ¹e tretji zgled.

    snark:~$ ls -ld ~
    drwxr-xr-x  89 esr      users        9216 Jun 27 11:29 /home2/esr
    snark:~$

  Ta datoteka je imenik, kar spoznamo po oznaki  d, s katero se zaène
  dovolilnica. Vidimo tudi, da lahko nanj pi¹e le lastnik (esr) berejo
  in izvajajo pa vsi.

  Dovoljenje za branje nam dovoljuje, da izpi¹emo seznam datotek (in
  podimenikov) v danem imeniku. Dovoljenje za pisanje pomeni, da lahko v
  danem imeniku ustvarjamo in bri¹emo datoteke - slednje le, èe imamo
  tudi dovoljenje za pisanje izbrane datoteke. Èe se spomnimo, da je
  imenik seznam imen datotek in podimenikov, se nam bodo ta pravila
  zdela smiselna.

  Dovoljenje za izvajanje pri imenikih pomeni, da lahko pose¾emo v
  imenik in v njem odpiramo datoteke in podimenike. Dejansko nam dovoli
  dostop do inodov v tem imeniku. V imeniku, ki nima dovoljenja za
  izvajanje, ne moremo poèeti niè.

  Obèasno sreèamo imenike, ki jih lahko vsi ,,izvajajo``, ne pa tudi
  berejo. To pomeni, da lahko kdorkoli dostopa do datotek in podimenikov
  v tem imeniku, vendar le, èe pozna njihovo celotno ime, saj izpis
  seznama datotek ni dovoljen.

  Pomembno je, da se zavedamo, da so dovolilnice za dani imenik povsem
  neodvisne od dovolilnic za datoteke, ki jih ta imenik vsebuje. Tako
  nam dovoljenje za pisanje dovoljuje ustvarjanje novih datotek in
  spreminjanje obstojeèih, vendar slednje le, èe ni v nasprotju z
  dovolilnicami za te datoteke. Nikakor pa z dovoljenjem za pisanje v
  imenik ne dobimo avtomatièno tudi dovoljenja za pisanje v vse datoteke
  v njem.

  Za konec si poglejmo dovolilnico za sam program login.

       snark:~$ ls -l /bin/login
       -rwsr-xr-x   1 root     bin         20164 Apr 17 12:57 /bin/login

  Datoteka ima dovolilnico, kot jo prièakujemo za programe - z edino
  razliko, da na mestu, kjer bi prièakovali  dovoljenje, da jo lastnik
  izvaja (torej x), stoji s. Tako v seznamu datotek izgledajo datoteke,
  ki imajo posebno dovoljenje, imenovano ,,set-user-id`` ali na kratko
  setuid.

  Dovoljenje setuid navadno izdamo programom, ki morajo navadnim
  uporabnikom izjemoma dovoliti katero od pravic uporabnika root, vendar
  seveda nadzorovano. Ko po¾enemo program, program teèe s pravicami
  lastnika programa in ne s pravicami tistega, ki je program pognal, kot
  je obièajno.

  Kot uporabni¹ki raèun root so tudi programi setuid uporabni, a
  nevarni. Kdorkoli, ki si lahko podvr¾e ali spremeni program setuid,
  katerega lastnik je root, lahko po¾ene novo ukazno lupino s pravicami
  uporabnika root. Zato vsi sodobni sistemi Unix pobri¹ejo bit setuid
  tisti trenutek, ko datoteko odpremo za pisanje.  Veliko vdorov v
  sisteme Unix je povezanih z izkori¹èanjem varnostnih vrzeli v
  programih setuid. Sistemski skrbniki, ki se zavedajo teh te¾av, so
  zato pri njih posebej previdni in neradi name¹èajo nove.
  Povr¹no smo pri razpravi o dovolilnicah preskoèili nekaj pomembnih
  podrobnosti, namreè, kako se novo ustvarjeni datoteki doloèi
  dovolilnica, lastnik in skupina. Lastnik je tisti, ki je datoteko
  ustvaril, pri skupini pa stvari niso tako jasne, saj je uporabnik
  lahko èlan veè skupin. Vendar pa je med njimi le ena privzeta skupina
  (tista, ki je navedena v /etc/passwd), in vse novo ustvarjene datoteke
  bodo pripadale tej skupini.

  Zgodba z zaèetnimi dovolilnicami je nekoliko bolj zapletena. Privzeta
  dovoljenja lahko spreminjamo s spremenljivko umask v okolju.
  Spremenljivka umask doloèa, kateri biti naj bodo izkljuèeni, ko
  ustvarimo novo datoteko. Obièajna vrednost na veèini sistemov je
  -------w- oziroma 002, ki uporabnikom izven privzete skupine ne
  dovoljuje spreminjanja datoteke. Veè o spremenljivki umask lahko
  preberete v priroèniku za ukazno lupino.

  Tudi izbira skupine pri imeniku je nekoliko zapletena. Na nekaterih
  Unixih vsak novo ustvarjeni imenik postane èlan privzete skupine
  tistega, ki je imenik ustvaril (dogovor izvira iz sistemov Unix System
  V), na drugih pa podeduje skupino od nadrejenega imenika (kot v
  sistemih BSD). V sodobnih sistemih Unix, vkljuèno z Linuxom, je
  privzeta prva mo¾nost, drugo pa lahko vklopimo z nastavitvojo bita
  set-group-ID, kar storimo z ukazom chmod g+s.


  11.3.  Kako gredo stvari lahko narobe


  ®e prej smo povedali, da so datoteèni sistemi obèutljive zadeve. Zdaj
  vemo, da moramo vèasih prehoditi precej dolgo pot prek vnosov v
  imenikih in tabelah inodov, da pridemo do datoteke. Zdaj pa si
  predstavljajmo, da kak¹en od sektorjev na disku postane slab.

  Èe imamo sreèo, je napaka nastala na podatkovnem delu, kar pomeni samo
  nekaj izgubljenih podatkov v datoteki. Èe je nimamo, je lahko napaka
  nastala v imeni¹ki strukturi ali pa v tabeli inodov. To pomeni, da je
  cel podimenik sicer ostal na disku, vendar ne moremo do njega. Ali ¹e
  slab¹e, struktura lahko ostane okvarjena, tako da ka¾e na napaène
  inode ali diskovne bloke. Tak¹na vrsta okvare je zoprna, ker se zaradi
  napaène evidence ¹iri tudi izven prvotnega obmoèja in kvari podatke na
  disku.

  Na sreèo so tovrstne te¾ave s tem, ko diski postajajo vse bolj
  zanesljivi, vse redkej¹e. Vseeno pa Unix vsake toliko èasa preveri
  integriteto datoteènega sistema, da bi odkril morebitne te¾ave.
  Sodobni sistemi Unix opravijo hiter preizkus integritete sistema ob
  zagonu vsakiè, preden priklopijo razdelek. Vsakih nekaj ponovnih
  zagonov pa opravijo temeljitej¹i preizkus, ki traja nekaj minut.

  Èe vse to daje vtis, da je Unix strahotno zapleten in nagnjen k
  napakam, bo morda v majhno tola¾bo to, da ti preizkusi ob zagonu
  navadno ujamejo in popravijo napake, ¹e preden te zadobijo
  katastrofalne razse¾nosti. Drugi operacijski sistemi navadno tega ne
  poènejo, s èimer je zagon sicer nekoliko hitrej¹i, vendar pa se lahko
  naenkrat znajdete pred dosti bolj zavo¾enim sistemom, ko ga morate
  roèno popraviti (èe sploh imate pri roki Norton Utilities ali kaj
  podobnega).

  Eden od trendov v trenutnih zasnovah Unixa so datoteèni sistemi z
  dnevnikom (angl. journalling file system).  Ti vse diskovne
  transakcije organizirajo tako, da je sistem v zajamèeno konsistentnem
  stanju, ki ga je mogoèe restavrirati ob zagonu. To bo preizkuse
  integritete ob zagonu znatno skraj¹alo.


  12.  Kako delujejo programski jeziki?


  Ogledali smo si ¾e, ``kaj se zgodi, ko po¾enemo program?''. Vsak
  program se na koncu izvede kot zaporedje bajtov, ki so ukazi v
  strojnem jeziku procesorja. Vendar pa se ljudje ne znajdemo najbolje v
  strojnem jeziku - zadnje èase je to postalo redko celo med hekerji.

  Skoraj vsi programi, pisani za Unix, so dandanes napisani v enem od
  vi¹jih programskih jezikov. Izjema je le nekaj malega programov v
  jedru, napisanih za podporo strojni opremi. (Izraz vi¹ji programski
  jezik je bolj ali manj zgodovinska ostalina - poudaril naj bi razliko
  od ni¾jih programskih jezikov. Slednjo skupino sestavljajo izkljuèno
  zbirni jeziki za razliène procesorje. Zbirni jezik predstavlja zgolj
  èloveku razumljiv zapis strojnega jezika.)

  Vi¹jih programskih jezikov je veè vrst. Da bi razumeli razlike med
  njimi, se moramo najprej zavedati, da mora biti izvorna koda programa,
  torej tisto, kar programer napi¹e in je mogoèe popravljati, na tak ali
  drugaèen naèin prevedena v strojni jezik, ki ga lahko raèunalnik
  edinega izvaja.


  12.1.  Prevajani programski jeziki


  Najpogostej¹i so prevajani programski jeziki. Izvorno kodo prevede v
  strojni jezik poseben program, ki mu pravimo - logièno - prevajalnik.
  Ko ta enkrat ustvari ustrezno strojno kodo, ne prevajalnika, niti
  izvorne kode ne potrebujemo veè. Program lahko poganjamo na drugem
  raèunalniku, kjer ne eden ne drugi nista na voljo.  Veèina programja
  se razpeèuje kot prevedeni programi, in izvorne kode zanje nikoli ne
  vidite.

  Prevedeni programi teèejo zelo hitro in navadno ponujajo najpopolnej¹i
  dostop do operacijskega sistema, je pa relativno te¾ko programirati v
  njih.

  Programski jezik C, v katerem je napisan tudi Unix sam, je skupaj s
  svojo izpeljanko C++ brez dvoma najpomembnej¹i med prevajanimi
  programskimi jeziki. Fortran, programski jezik, ki se uporablja
  predvsem v znanosti in tehniki, spada tudi med prevajane jezike,
  vendar pa je dosti starej¹i in manj popoln od C. Drugih prevajanih
  jezikov v Unixu takorekoè ne sreèamo, drugod pa je ponekod za finanène
  in banène programe zelo priljubljen cobol.

  Svojèas so bili prevajani jeziki pogostej¹i, vendar pa jih je veèina
  zamrla, ali pa so ostali omejeni na raziskovalna okolja. Èe ste
  novopeèeni programer v Unixu in uporabljate prevajan programski jezik,
  je dandanes to zelo verjetno C ali C++.


  12.2.  Tolmaèeni programski jeziki


  Tolmaèeni programski jeziki med svojim tekom potrebujejo poseben
  program, tolmaè, ki izvorno kodo programa sproti prevaja v izraèune in
  sistemske klice. Koda je tako raztolmaèena vsakiè znova, ko program
  po¾enemo, za delovanje programa pa potrebujemo tudi tolmaèa.

  Tolmaèeni jeziki teèejo poèasneje kot prevedeni, in so pri dostopu do
  funkcij operacijskega sistema in strojne opreme pogosto omejeni. Po
  drugi strani pa je v njih la¾je programirati, in so do napak v
  programu navadno bolj prizanesljivi od prevajanih jezikov.

  Veliko pripomoèkov v Unixu, vkljuèno z ukazno lupino, bc(1), sed(1) in
  awk(1) so manj¹i tolmaèeni jeziki. Tudi basic je navadno tolmaèen, in
  TCL tudi. Zgodovinsko gledano je bil najpomembnej¹i tolmaèeni jezik
  lisp, ki je uvedel mnoge nove zamisli in izbolj¹ave. Dandanes sta
  verjetno najpomembnej¹a èista tolmaèena jezika v Unixu ukazna lupina
  in v urejevalnik Emacs vgrajeni lisp.


  12.3.  Jeziki, prevajani v psevdokodo


  Po letu 1990 se èedalje bolj uveljavlja hibridna oblika jezikov, ki so
  tako prevajani kot tolmaèeni. Izvorna koda programov, napisanih v enem
  od teh jezikov, je prevedena, vendar ne v strojni jezik, temveè v
  kompakten strojno berljiv zapis, imenovan psevdokoda ali p-koda. Ko
  program po¾enemo, po¾enemo tolmaè za psevdokodo, ki tolmaèi program.

  Psevdokoda je tolmaèena skoraj tako hitro kot program, preveden v
  strojni jezik, obenem pa ti jeziki ohranjajo pro¾nost in moè, ki jo
  dajejo tolmaèeni jeziki.

  Med jezike, prevajane v psevdokodo, spadajo python, perl in java.


  13.  Kako deluje internet?


  Da bi la¾je razumeli, kako deluje internet, si oglejmo, kaj se dogaja
  pri tipièni internetni operaciji - denimo takrat, ko brskalnik
  usmerimo na spletno stran dokumentacijskega projekta Linuxa. Angle¹ki
  izvirnik spisa, ki ga berete, dobimo na naslovu:

  http://www.linuxdoc.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html

  Interno gre v resnici za datoteko
  HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html v imeniku s
  spletnimi stranmi na raèunalniku www.linuxdoc.org.


  13.1.  Imena in naslovi


  Da bi prebrali spletno stran, mora brskalnik vzpostaviti povezavo s
  spletnim stre¾nikom, torej z gostiteljskim raèunalnikom, ki hrani
  omenjeno stran. Prvi korak pri tem je, da ugotovi, kje se sploh nahaja
  raèunalnik z internetnim imenom www.linuxdoc.org. Lokacija
  gostiteljskega raèunalnika je podana z njegovim naslovom IP (kaj je
  IP, bomo razlo¾ili pozneje).

  Naslov IP ugotovi brskalnik tako, da najprej poklièe drug program,
  imenski stre¾nik. Ta lahko teèe na na¹em raèunalniku, bolj verjetno pa
  je, da na kakem drugem raèunalniku v omre¾ju. Ko ste raèunalnik
  pripravljali za delo z va¹im ponudnikom internetnih storitev, ste
  skoraj gotovo morali nekje vpisati tudi naslov imenskega stre¾nika, ki
  teèe v omre¾ju va¹ega ponudnika internetnih storitev.

  Imenski stre¾niki med seboj komunicirajo, ter izmenjujejo in a¾urirajo
  vse podatke, potrebne za pretvorbo internetnih imen v naslove IP.
  Imenski stre¾nik, na katerega smo naslovili zahtevek za naslov IP
  raèunalnika www.linuxdoc.org, je morda moral zahtevek posredovati
  naprej trem ali ¹tirim drugim imenskim stre¾nike, vendar pa se to
  zgodi zelo hitro, navadno prej kot v sekundi. V naslednjem razdelku si
  bomo ogledali podrobnosti imenskih stre¾nikov.

  Na koncu imenski stre¾nik vrne brskalniku podatek, da je ¹tevilka IP
  za raèunalnik www.linuxdoc.org enaka 152.19.254.81. Opremljeni s tem
  podatkom lahko na¹ raèunalnik neposredno izmenjuje podatke z
  raèunalnikom www.linuxdoc.org.


  13.2.  Sistem domenskih imen


  Celotno omre¾je programov in zbirk podatkov, ki sodelujejo pri
  pretvarjanju internetnih imen raèunalnikov v naslove IP se imenuje
  sistem domenskih imen (angl. Domain Name System, DNS). Kratica DNS je
  precej pogosta - dostikrat se za imenske stre¾nike uporablja izraz
  ,,stre¾nik DNS``. Ogledali si bomo, kako sistem deluje.

  Internetna imena raèunalnikov sestavljajo besede, loèene s pikami.
  Domena je skupina raèunalnikov, ki si delijo skupno pripono
  internetnega imena. Domene so lahko del ¹ir¹ih domen. Raèunalnik
  www.linuxdoc.org je denimo del domene .linuxdoc.org, ta pa je del
  domene .org.

  Za vsako domeno je doloèen primarni imenski stre¾nik, ki pozna naslove
  IP za vse raèunalnike v dani domeni. Za primer okvare primarnega
  imenskega stre¾nika so lahko doloèeni rezervni ali sekundarni imenski
  stre¾niki, ki vskoèijo, èe je potrebno. Sekundarni stre¾niki
  avtomatièno usklajujejo podatke v svojih tabelah s podatki na
  primarnem stre¾niku vsakih nekaj ur. Tako se spremembe v tabelah, ki
  jih izvedemo na primarnem stre¾niku, samodejno prenesejo naprej.

  Zdaj pa k pomembnemu delu. Imenski stre¾nik za dano domeno ne pozna
  naslovov raèunalnikov v drugih domenah, niti ne v lastnih poddomenah.
  Kar mora poznati, so naslovi imenskih stre¾nikov za te domene. V na¹em
  zgledu  primarni imenski stre¾nik za domeno .org ne pozna naslova
  raèunalnika www.linuxdoc.org, niti nobenega drugega raèunalnika v
  domeni .linuxdoc.org, pozna pa naslov imenskega stre¾nika za domeno
  .linuxdoc.org, in tega lahko vpra¹a za naslov kateregakoli raèunalnika
  v tej poddomeni.

  Sistem domenskih imen je drevesno urejen. Povsem pri vrhu so korenski
  stre¾niki. Vsakdo pozna naslove IP korenskih stre¾nikov - vgrajeni so
  ¾e v programje DNS. Korenski imenski stre¾niki poznajo naslove
  imenskih stre¾nikov za vrhnje domene, kot denimo .com, .org ali .si,
  ne pa naslovov vseh raèunalnikov v teh domenah. Imenski stre¾niki za
  vrhnje domene poznajo naslove imenskih stre¾nikov za domene neposredno
  pod njimi, in tako naprej.

  Sistem domenskih imen je bil zasnovan z zamislijo, da minimiziramo
  kolièino podatkov o obliki drevesa, ki ga mora poznati vsak raèunalnik
  v omre¾ju. Po drugi strani lahko spremembe v pod-drevesih izvedemo
  enostavno s spremembami v tabelah primarnega stre¾nika za to
  poddomeno.

  Ko izdamo zahtevek za naslov raèunalnika z imenom www.linuxdoc.org, se
  zgodi naslednje. Lokalni imenski stre¾nik, kateremu smo izdali
  zahtevek, povpra¹a korenski stre¾nik za naslov stre¾nika za domeno
  .org. Ko ga izve, tega povpra¹a za naslov stre¾nika za domeno
  .linuxdoc.org, in tega, ko ga izve, povpra¹a za naslov raèunalnik
  www.linuxdoc.org.

  Veèinoma pa tako dolga pot ni potrebna. Ko je enkrat izvedel naslov,
  imenski stre¾nik nekaj èasa lokalno hrani tabelo preslikav med
  internetnimi imeni in naslovi IP, in ga ob naslednjih poizvedbah
  postre¾e kar iz lokalne tabele. Zato, ko obi¹èemo novo spleti¹èe,
  navadno samo na zaèetku dobimo sporoèilo ,,Looking up host``, pri
  naslednjih dostopih do strani na istem stre¾niku pa gre hitreje.
  Imenski stre¾nik zbranih tabel ne hrani za vse veène èase, ampak imajo
  podatki omejen rok trajanja. Ko ta preteèe, mora ponovno opraviti
  celotno pot poizvedbe. To je pomembno, da imenski stre¾nik ne hrani
  napaènih podatkov za naslove, ki so se medtem morda spremenili. Naslov
  je takoj vr¾en iz tabele tudi v primeru, ko je raèunalnik na tem
  naslovu nedosegljiv.


  13.3.  Paketi in usmerjevalniki


  Brskalnik bi rad na koncu spletnemu stre¾niku posredoval ukaz, s
  katerim bi prebral spletno stran:

   GET /HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html HTTP/1.0

  Zgodi se naslenje. Ukaz se zapre v paket - blok bitov, ki je analogen
  telegramu, in ki vsebuje tri pomembne podatke: naslov po¹iljatelja
  (torej naslov IP na¹ega raèunalnika), naslov prejemnika (v danem
  zgledu 152.19.254.81) in pa ¹tevilko storitve oziroma ¹tevilko vrat.
  Slednja je v na¹em zgledu enaka 80, ki je dogovorjena vrednost za vse
  spletne poizvedbe.

  Raèunalnik po¹lje paket po omre¾ju (krajevnem omre¾ju ali
  telefonskem vodu do ponudnika internetnih storitev), dokler ne pride
  do specializiranega raèunalnika, ki mu pravimo usmerjevalnik.
  Usmerjevalnik hrani v pomnilniku zemljevid interneta - ne celotnega,
  ampak del, ki opisuje omre¾no okolico - in pozna poti do
  usmerjevalnikov za druge omre¾ne okolice v internetu.

  Paket bo verjetno na svoji poti do cilja potoval prek veè
  usmerjevalnikov. Ti so premeteni - hranijo tudi podatke o tem, po kako
  dolgem èasu drugi usmerjevalniki potrdijo sprejem paketa, in pakete
  usmerjajo po tistih linijah, ki so hitrej¹e. Opazijo tudi, kadar
  kak¹en usmerjevalnik ali kabel odpove, in v takih primerih poi¹èejo
  alternativne poti.

  Urbano izroèilo pravi, da je bil internet zasnovan tako, da bi
  pre¾ivel jedrsko vojno. To sicer ni res, vendar pa je zasnova
  interneta izjemno dobra v tem, da ob nezanesljivi strojni opremi in
  povezavah zagotavlja zanesljivo komunikacijsko pot. To je zato, ker
  so podatki, potrebni za delovanje omre¾ja, razpr¹eni po tisoèih
  usmerjevalnikih, namesto da bi bili skoncentrirani le v nekaj
  ogromnih in ranljivih centralah (tako kot denimo telefonsko
  omre¾je). Zato napake ostanejo lokalizirane, omre¾je pa se prilagodi
  tako, da poi¹èe obvoze.

  Ko paket prispe do naslovnega raèunalnika, ta uporabi podatek o
  ¹tevilki vrat, in posreduje paket spletnemu stre¾niku. Ta ve, komu
  poslati odgovor, saj je na paketu oznaèen tudi naslov po¹iljatelja.
  Ko spletni stre¾nik kot odgovor vrne zahtevani spis, se tudi ta
  razdeli na pakete. Velikost paketov je odvisna od prenosnega
  sredstva v omre¾ju in vrste storitve.


  13.4.  TCP in IP


  Da bi razumeli, kako delujejo prenosi veè paketov, moramo vedeti, da
  internet dejansko uporablja za prenos dva protokola, enega vrh
  drugega.

  Na spodnji ravni, IP (angl. Internet Protocol, internetni protokol),
  je re¹eno, kako posamezni paket prenesti od po¹iljateljevega naslova
  do naslovnikovega - zato so ti naslovi znani tudi kot naslovi IP.
  Vendar pa IP ni zanesljiv protokol - èe se paket na poti sluèajno
  izgubi, tega ne po¹iljatelj, ne naslovnik morda nikoli ne bosta
  izvedela. V omre¾ni terminologiji pravimo takim protokolom
  brezpovezavni protokoli: po¹iljatelj enostavno po¹lje paket
  naslovniku in ne prièakuje potrditve prejema.

  IP je hiter in cenen. Vèasih je hitra in cenena, pa èeprav
  nezanesljiva komunikacija èisto v redu. Èe po omre¾ju igramo igro
  Doom ali Quake, je vsaka krogla predstavljena s paketom IP. Èe se
  sem ter tja kak¹na izgubi, ni prevelike ¹kode.

  Zanesljivost zagotavlja, zgornja raven, TCP (angl. Transmission
  Control Protocol, protokol za nadzor prenosa). Ko se raèunalnika
  dogovorita za povezavo TCP (kar opravita s paketi IP), prejemnik ve,
  da mora v dogovorjenem èasu po¹iljatelju poslati potrdilo o prejetem
  paketu. Èe po¹iljatelj potrdila ne prejme, ta paket po¹lje ¹e enkrat.
  Nadalje, po¹iljatelj pakete TCP o¹tevilèi, tako da jih lahko prejemnik
  sestavi v pravilnem vrstnem redu, èeprav so morda prispeli pome¹ani
  (kar se rado zgodi, kadar se omre¾na povezava med prenosom prekine).

  Paketi TCP/IP vsebujejo tudi nadzorno vsoto, s katero lahko
  prejemnik ugotovi, ali so paketi prispeli nepo¹kodovani. Nadzorna
  vsota se izraèuna tako, da èe je po¹kodovana bodisi sama nadzorna
  vsota, bodisi preostanek paketa, bo ponoven izraèun le-te zelo
  verjetno izkazal napako. S stali¹èa nekoga, ki uporablja imenske
  stre¾nike in TCP/IP, so internetne povezave videti kot zanesljiva
  oblika povezave med vrati na po¹iljateljevem raèunalniku in vrati na
  naslovnikovem raèunalniku, in se mu ni treba ukvarjati z
  razdelitvijo sporoèil na pakete in sestavljanjem le-teh, nadzornimi
  vsotami in ponovnim po¹iljanjem okvarjenih paketov. Za vse to
  poskrbijo ¾e ravni pod njim.


  13.5.  Uporabni¹ki protokol HTTP


  Vrnimo se k na¹emu zgledu. Brskalniki in spletni stre¾niki se
  sporazumevajo v uporabni¹kem protokolu, ki teèe nad TCP/IP. Slednjega
  uporablja za enostavno po¹iljanje podatkovnih nizov tja in nazaj.
  Protokol se imenuje HTTP (angl. Hyper-Text Transfer Protocol, protokol
  za prenos nadbesedila), in pri zgledu GET malo prej smo ¾e videli,
  kako je videti ukaz.

  Ko ukaz GET prispe do vrat ¹tevilka 80 raèunalnika www.linuxdoc.org,
  bo posredovan spletnemu stre¾ni¹kemu programu, ki stre¾e vratom 80.
  Veèina internetnih storitev je izvedenih s stre¾ni¹kimi programi,
  katerih vsak stre¾e svoja vrata - èaka na promet na danih vratih in
  izvaja prispele ukaze.

  Èe je pri zasnovi interneta kak¹no splo¹no pravilo, je to, da so vsi
  deli èim bolj enostavni in èim bolj dostopni ljudem. HTTP, kot tudi
  sorodni protokoli, denimo SMTP (angl. Simple Mail Transfer Protocol,
  preprost protokol za prenos po¹te), uporablja preproste besedilne
  ukaze, ki jih zakljuèi z znakom za novo vrstico.

  To je sicer nekoliko neuèinkovito - v nekaterih okoli¹èinah bi bila
  uporaba gosto kodiranega binarnega protokola hitrej¹a. Vendar pa so
  izku¹nje pokazale, da prednosti ukazov, ki jih èlovek enostavno
  razume, odtehtajo malenkosten prihranek pri uèinkovitosti, ki bi ga
  pridobili z binarnimi protokoli.
  Zatorej  je tudi odgovor, ki ga stre¾nik vrne po protokolu TCP/IP,
  besedilo. Zaèetek odgovora bo nekaj podobnega kot to (nekaj vrstic
  zaglavja je izpu¹èenih):

       HTTP/1.1 200 OK
       Date: Sat, 10 Oct 1998 18:43:35 GMT
       Server: Apache/1.2.6 Red Hat
       Last-Modified: Thu, 27 Aug 1998 17:55:15 GMT
       Content-Length: 2982
       Content-Type: text/html

  Glavi sledi prazna vrstica, tej pa besedilo spletne strani. Ko je
  celotno besedilo poslano, se zveza prekine, brskalnik pa izri¹e stran.
  Podatki v glavi mu pri tem pomagajo - vrstica Content-Type pove, da
  gre za nadbesedilni spis v obliki HTML.


  14.  Dodatno branje

  Na naslovu  <http://www.linuxdoc.org/HOWTO/Reading-List-HOWTO/> je
  seznam knjig, ki obravnavajo teme, ki smo se jih tu dotaknili, bolj v
  podrobnosti. Morda si boste ¾eleli ogledati tudi spis  How To Become A
  Hacker na naslovu <http://www.tuxedo.org/~esr/faqs/hacker-howto.html>.