ITKA203 Käyttöjärjestelmät, luento 10/14, Ti 21.6.2011 ====================================================== Tämän päivän aihe: I/O, tiedostonhallinta ----------------------------------------- Laitteiston piirteitä """"""""""""""""""""" I/O (input/output) eli syöttö ja tulostus: - Liitetty prosessoriin ja muistiin väylän kautta - Toimintajakso erilainen kuin tietokoneen, jopa satunnainen - Monenlaisia laitteita eri tarkoituksiin (kategorisoitavissa esim. tiedonsiirtotavan mukaan merkki- / lohkolaitteisiin) - häiriöalttius - tarkkailu ja korjaus tarpeen. Väylän päässä ovat laiteohjaimet (device controller) tai sovittimet (adapter), laajemmissa järjestelmissä myös "kanavat" (channel). Laiteohjaimessa on jokin "kontrollilogiikka", jolla ohjain kommunikoi yhdelle tai useammalle fyysiselle laitteelle. Prosessorilta voi antaa laiteohjaimen kontrollilogiikalle väylän kautta komentoja, jotka ovat numeeriseksi koodattuja toimenpidepyyntöjä sekä näiden parametreja. Riippuu laitteen suunnittelusta, kuinka korkean tai matalan tason operaatioita siltä voidaan pyytää, ja paljonko taas jää toteutettavaksi ohjelmallisesti. Esimerkiksi joissain ääniohjaimissa on mukana mikseri tai syntetisaattori, kun taas joissain äänisignaali on laskettava ohjelmallisesti ja lähetettävä lopullisena ääniohjaimelle. Tyypillisesti I/O -laitteelle annettavat komennot ovat pyyntöjä kirjoittaa tai lukea jotakin ("merkkilaitteissa" tavu kerrallaan, "lohkolaitteissa" lohko kerrallaan) Lohkoja siirtää usein DMA-järjestelmä (Direct memory access), joka osaa käyttää väylää bittijonon kopioimiseksi puskurista toiseen muistin ja I/O-laitteiden välillä. DMA on näppärä, huolimatta "kellojaksovarkauksista" (cycle stealing) operoinnin aikana, eli siitä että DMA käyttää väylää siirtoon eikä prosessori välttämättä pääse käyttämään muistia väylän kautta aina tarvitessaan. Prosessorin välimuistit luonnollisesti auttavat pienentämään väylän ruuhkaa. Idea I/O:ssa ohjelmiston ja prosessorin kannalta: - käyttöjärjestelmän I/O:ta hoitava ohjelmakoodi antaa I/O -laitteen kontrollilogiikalle käskyn (tyypillisesti lue/kirjoita + lähteen ja kohteen tiedot) - koska fyysisen I/O:n kestoa ei tiedetä, I/O:ta tarvinneen ohjelman prosessi kannattanee laittaa odottelemaan (blocked-tilaan) ja päästää jokin muu prosessi suoritusvuoroon. - I/O -laite tekee fyysisen toimenpiteensä - Valmistuttuaan I/O -laite antaa prosessorille keskeytyksen, joten käyttöjärjestelmän I/O -koodi voi jatkaa tarvittavilla toimenpiteillä (eli mm. siirrellä odottavan prosessin taas blocked-tilasta suoritusvalmiiksi ja valmistella sille tiedon operaation onnistumisesta) Kovalevyn rakenne: - magnetoituva kalvo, jonka pienen alueen magneettikentän suunta tulkitaan bittinä; voidaan lukea (tulkita bitit kalvon alueista) ja kirjoittaa (vaihtaa kentän suuntaa) - ura, sektorit, sylinterit. - Sektori on pienin kerrallaan kirjoitettava tai luettava alue (esim. 512 tavua) - Sektori sisältää tarkistetietoa virheiden havaitsemista ja korjaamista varten - Fyysisen levyn osoitteet ovat sektorikohtaisia - Tyypillisesti ohjelmisto (esim. käyttöjärjestelmän tiedostonhallinta) niputtaa muutamia sektoreita lohkoiksi (block) - (RAID-järjestelmissä on useita kovalevyjä, joita "juovitetaan", "peilataan" ja "tarkistussummataan" jotta saadaan nopeampi ja toimintavarmempi tietovarasto; voi olla toteutettu laitteistotasolla tai ohjelmallisesti) Hakuaikaan vaikuttavat: - lukupään siirtoaika uralta uralle - pyörähdysviive sektorille - siirtoaika sisäiseen puskurimuistiin Laitteesta mitattavissa keskimääräinen siirtoaika (seek), pyörähdysaika (rotation) sekä sektorien määrä uralla (sectors). Keskimääräinen sektorin lukuaika on tällöin:: seek + rotation/2 + rotation/sectors (Sektorien määrä voi vaihdella levyn eri osien välillä) Käyttöjärjestelmän I/O:ta hoitavan ohjelmakoodin tyypillinen kerrosmainen rakenne: Käyttäjän prosessi -- järjestelmäkutsut rajapintana -- Laitteistoriippumaton ohjelmisto -- ajurirajapinta rajapintana -- Laiteriippuva ohjelmisto (ajurit) Keskeytyskäsittelijät Laitteisto Edellä kuvattu suoritus kulkee ohjelmistokerrosten läpi: Käyttäjän prosessi käyttää käyttöjärjestelmän kutsurajapintaa, joka abstrahoi alla olevat laitteet. Ne ovat "vain jotakin" johon voi kirjoittaa tai josta lukea. Tämä ns. laitteistoriippumaton ohjelmiston osa delegoi sitten pyynnöt ajureille, joiden täytyy tuntea laitteiston rajapinta. Tämä ns. laiteriippuva ohjelmiston osa täytyy olla siis laitteen valmistajan tukemaa (joko he kirjoittavat ajurinsa tai julkaisevat laitteen rajapinnasta riittävän dokumentaation avoimien ajurien tekemiseksi). Laitteistoriippumaton ohjelmisto """""""""""""""""""""""""""""""" Laitteistoriippumattoman ohjelmiston tehtävä on luoda yhtenäinen tapa käyttää laitteita (uniform interfacing). Mitä vaatimuksia tällaiselle tavalle asetetaan: - tiedostojärjestelmä (file system; datan looginen organisointi tiedostoiksi ja hakemistoiksi) - laitteiden nimeäminen (device naming; millä tavoin käyttäjän prosessi voi tietää fyysisesti asennettuna olevat I/O-laitteet ja päästä niihin käsiksi) - käyttöoikeudet (protection; käyttäjillä oltava omat tietonsa joita muut eivät pääse sotkemaan, ja käyttäjillä voi olla eri valtuuksia lukea/kirjoittaa/suorittaa toimenpiteitä tietokoneella ja sen I/O-laitteiden osajoukolla) - varaus ja vapauttaminen (allocating and releasing; tyypillinen I/O-laite on voitava varata yksinoikeudella prosessin käyttöön, jotta sen toiminnassa on järkeä) - virheraportointi (error reporting; virheitä tapahtuu fyysisen maailman pakottamana ja niiden raportointi ja toipumiskeinot on tarjottava) - laitteistoriippumaton lohkokoko (block size; erilaisten kovalevyjen ym. tallennusvälineiden käyttö yhtenäisen kokoisiin datamöykkyihin jaoteltuna) - puskurointi (buffering; esim. peräkkäisten näppäinpainallusten tallennus tai yhden tavun lukeminen kovalevyltä, joka antaa kuitenkin sektorin kerrallaan) - yhtenäinen ajuriliitäntä (device driver interface; erilaisten laitteiden valmistajien, tai ainakin ajurien tekijöiden, täytyy tietää millaisen rajapinnan toteuttamista käyttöjärjestelmä vaatii ajuriohjelmistolta) Tiedostojärjestelmä """"""""""""""""""" Esimerkkinä Unix-tiedostojärjestelmä. - Tiedostolla on i-numero (i-number), indeksi i-solmujen (i-node) taulukkoon. I-solmutaulukko on tiedostojärjestelmän tietorakenne, joka sisältää per tiedosto (tai tarkemmin per i-solmu): * tyyppi eli tavallinen/hakemisto/linkki/erikoistiedosto * suojaustiedot eli omistava käyttäjä (UID, user ID) ja ryhmä (GID, group ID). * aikaleimat (käyttö, tiedoston sisällön muutos, i-solmun muutos) * koko (size; tavuina) * lohkojen määrä (block count) * lohkojen suorat osoitteet (direct blocks; esim. 12 kpl, pienille tiedostoille riittävä) * yksinkertainen epäsuora osoite (single indirect; viittaa yhteen lisätaulukkoon lohkojen osoitteita) * kaksinkertainen epäsuora osoite (double indirect; viittaa taulukkoon, jonka alkiot viittaavat taulukkoihin lohkojen osoitteista) * kolminkertainen epäsuora osoite (triple indirect; taulukko, josta taulukoihin, joista taulukoihin, joissa lohkojen osoitteita) - Tiedostojen tyypit: * tavallinen (esim. tekstitiedosto kuten lähdekoodi, valokuva, videotiedosto, ...; olennaisesti bittijono jossa i-solmujen ilmoittamien lohkojen fyysinen sisältö peräkkäin) * hakemisto (idea järjestellä tiedot hierarkkisesti; hakemisto on taulukko, jossa on per hakemiston sisältämä tiedosto: + tiedoston nimi + i-solmun numero Huomaa, että tässä järjestelmässä tiedoston nimi määräytyy hakemistotiedon perusteella, itse "tiedosto" on lohkoissa lojuva bittijono, jolla on tietyt i-solmun metatiedot muttei mm. nimeä. * linkki (uusi viite fyysiseen tiedostoon, jolla on toinenkin sijaintipaikka; käytännössä nimi, jota kautta pääsee käsiksi tiedostoon jolla on vähintään yksi toinenkin nimi) * erikoistiedosto (vastaa laitetta tai muuta käyttöjärjestelmän tarjoamaa rajapintaa) - Tiedostojen (perinteiset) oikeudet Unixeissa ja vastaavissa: * oikeudet: kirjoitus / luku / suoritus (read / write / execute) * tasot: omistaja / ryhmä / muut (user / group / other) * oikeuksien ja tasojen kombinaatioita on 2^9 = 512. Nämä on tyypillistä kirjoittaa oktaalilukuna, joka vastaa kolmiosaista (omistaja-ryhmä-muut) kolmijakoista (kirjoitus-luku-suoritus) bittijonoa. esim. 0755 on ohjelmatiedostolle sopiva: kaikki voivat lukea ja suorittaa tiedoston mutta vain omistava käyttäjä voi tehdä ohjelmatiedostoon muutoksia. * setuid - bitti: jos tämä bitti on asetettu ohjelmatiedostossa, käynnistetyn prosessin omistajaksi tulkitaan (ns. effective user) tiedoston omistaja, ei se käyttäjä joka varsinaisesti ajaa ohjelman * setgid - bitti: jos tämä bitti on asetettu ohjelmatiedostossa, käynnistetyn prosessin omistavaksi ryhmäksi (ns. effective group) tulkitaan tiedoston omistava ryhmä, ei siis ajavan käyttäjän oletusryhmä. * sticky - bitti: alkuperäisessä ideassa, jos tämä bitti on asetettu ohjelmatiedostossa, ohjelmaa ei poisteta muistista sen suorituksen loputtua (nopeampi käynnistää uudelleen). Nykyvariaatioissa kuitenkin eri käyttötarkoitukset -- erityisesti esim. Linuxissa jos tämä bitti on asetettu hakemistolle, rajoittuu sisällön poisto ja uudelleennimeäminen vain kunkin tiedoston omistajalle tai pääkäyttäjälle, riippumatta kunkin tiedoston asetuksista. Tämä on siis yksi esimerkki tiedostojärjestelmästä. Muitakin on paljon, ja toteutuksen yksityiskohdista riippuu mm. tiedostojen maksimikoko, oikeuksien asetuksen tarkkuus ym. seikat. Tiedostojen käyttöön liittyviä tietorakenteita: - Prosessin deskriptoritaulu osana kunkin prosessin prosessielementtiä (siis yhtä monta kuin on prosesseja): * prosessi käyttää deskriptoritaulun indeksejä avaamiensa tiedostojen yksilöintiin * deskriptoritaulussa on avatun / varatun tiedoston osalta viite käyttöjärjestelmän tiedostotauluun - Järjestelmän tiedostotaulu (yksi kpl) jossa tiedot per jonkin prosessin avaama tiedosto: * todellisen avatun tiedoston i-numero (unix-järjestelmässä) * tiedosto-osoitin (ts. missä kohtaa tiedostoa luku/kirjoitus on menossa) * millaiset oikeudet prosessi on saanut avatessa tiedostoa Laajennos NFS: - NFS (Network file system): i-solmu voidaan laajentaa osoitteksi toisen tietokoneen tiedostojärjestelmässä. Apuna ovat käyttöjärjestelmän verkkoyhteyspalvelut (networking) ja prosessien välisen kommunikoinnin palvelut (ipc) sekä asiakaspäässä että palvelijapäässä. - Yhteys perustuu määriteltyihin kommunikaatioprotokolliin, joten NFS:llä kytketyillä tietokoneilla voi olla eri käyttöjärjestelmät, kunhan molemmissa on tuki NFS:lle. Tiedostojärjestelmän käyttöjärjestelmäkutsuja: create() - luo tiedoston open() - avaa tiedoston ja tarvittaessa lukitsee read() - lukee tiedostosta nykyisen tiedosto-osoittimen kohdalta close() - "sulkee" tiedoston, ts. vapauttaa lukituksen Esimerkki hakemiston käytöstä: prosessi haluaa avata tiedoston nimeltä grillikuvat/2011/nakit.jpg 1. Nykyisestä hakemistosta (esim. /home/ktunnus/Pictures/) käyttöjärjestelmä etsii rivin, jonka nimi on seuraavaksi etsittävä ``grillikuvat``. 2. Jos nimi ``grillikuvat`` löytyy, rivillä on uuden i-solmun osoite, jonka pitäisi nyt olla hakemistotyyppinen; käytetään tätä uutta hakemistoa etsimään taas seuraava nimi. (Jos ei nimeä löydy, tulkitaan pyyntö virheelliseksi ja hoidetaan tieto epäonnistumisesta eteenpäin.) 3. Toistetaan muillekin mahdollisille hakemistonimille. Lopulta vastaan tulee viimeinen osio, eli varsinaisen tiedoston nimi, tässä tapauksessa ``nakit.jpg``. Tiedostoa vastaava i-solmu on nyt löytynyt.