ITKA203 Käyttöjärjestelmät, luento 13/14, Ke 29.6.2011 ====================================================== (Mainitaanpa tuo: POSIX eli "Portable Operating System Interface for Unix") Tämän päivän toteuma: --------------------- Katsottiin havainnollisia esimerkkejä demovastauksista (liittyy eilen puheltuun palautteeseen): - demo1 erilaisia vastauksia. Johtopäätös: keskimäärin ei oltu kauhean tarkkoina merkkien ja kirjoitettujen komentojen suhteen, vaikka shell-demot alkoivat painokkailla varoituksilla... Eli jatkossa paremmin. - demo2 erilaisia tapoja kirjoittaa "Hello ktunnus" - demo2 erilaisia tapoja poistaa merkin esiintymä C:n merkkijonosta. Reaaliaikainen "animaatio". Kuten sanottu, nyt ilman muuta riitti tehdä mikä tahansa toimiva ratkaisu; tehtävien tarkoituksena oli hiukan miettiä ja toivottavasti myös ymmärtää C-kieltä ja osoittimen eli muistiosoitteen olemusta. Reunahuomautuksena todettiin, että liiallista operointia kannattaa välttää, jos se ei ole tarpeen. Muuten ohjelman suoritusaika voi räjähtää käsiin. Esim. miljoonan merkin merkkijono, jossa kaikki merkit ovat poistettavia tapauksia: yhdellä läpikäynnillä toimenpide vaatii miljoona operaatiota, kun toisenlainen ratkaisu vaatii 500 miljardia, eli 500 000 -kertainen määrä. Tämä huomiona heille, jotka eivät aio käydä Ohjelmointi 2 tai Algoritmit 1 -kurssia, joilla asioita pohditaan sekä teoreettisesti että käytännössä. Kurssi eteni (jos onnistuin sen läheskään sillä tavoin vetämään) nykyhetkestä ja arkihavainnosta lähtien: millaisia nykypäivän tietokoneet ovat, ja mitä ns. "ilmeisesti" täytyy konepellin alla tapahtua että koneita voi käyttää siten kuin niitä käytetään. Nyt on nähty käyttöjärjestelmältä edellytettäviä osioita, ja miten niitä esimerkiksi voidaan toteuttaa. Hyödyllistä (ja tarpeen yleissivistyksen kannalta) on myös ymmärtää jotakin käyttöjärjestelmien historiasta. Käyttöjärjestelmien historiaa (luonnollisesti liittyen tietokoneiden historiaan): 1940-luku, 1950-luku: Ensimmäiset tietokoneet, ei käyttöjärjestelmää. Ongelmia mm. ajankäytön kannalta: Miljoonien arvoista konetta varattiin kalenterista kuin Kortepohjan pyykkikonetta. Jos tunnin aikaikkunassa tehtiin vartin työ, jäi 45 minuuttia hukattua aikaa. Ongelmia: kallista hukka-aikaa, tarve jonkinlaiseen vuoronnukseen. 1950-luku: "monitoriohjelmat" - ensimmäiset koko ajan muistissa olevat proto-käyttöjärjestelmät. Yksi ns. "työ" (job) loppuun, minkä jälkeen seuraava työ automaattisesti sisään. 1960-luku: monitoriohjelmia sekä JCL, job control language, ideana "compile, load, and go" - erilaisia kääntäjäohjelmia (tarpeen ohjelmoinnin helpottamiseksi), jotka olivat käyttäjän valittavissa. Ohjelmat sisään massamuistista (nauhat, reikäkortit) ihmisen ymmärtämänä lähdekoodina, esim. FORTRAN-kielisenä. Lisäksi JCL-kielinen ohjausohjelma, jossa mm. ilmoitettiin seuraavalle ohjelmalle käytettävä kääntäjä. Käyttöjärjestelmä hoiti kääntäjän käytön. Edelleen mm. ei moniajoa, ei muistinsuojausta. Ongelmia: - muistin suojaus - käyttäjän ohjelma saattoi huolimattomalla muistiin sijoittamisella rikkoa monitoriohjelman ohjelmakoodin tai JCL-kieliset ohjeet. - tarve käyttöjärjestelmätilalle - esim. käyttäjän ohjelma ei saisi vahingossa(kaan) kajota suoritusvuorolistaan. - tasapuolisuus - pitäisi voida ajaa välillä yhtä ohjelmaa ja välillä toista. - keskeytykset - pitäisi voida jättää esim. I/O:ta tarvitseva ohjelma odottelemaan ja ajaa muita sillä välin. 1960-luku (edelleen): aikajakojärjestelmät (time-sharing systems), koneet olivat isoja ja kalliita, mutta moni työntekijä olisi pystynyt tekemään tehokasta työtä niiden avulla. Päätteet ja käyttäjien kesken jaetut aikaikkunat/aikaviipaleet. 1960-luku (edelleen): prosessin käsite, Multics -järjestelmä. Ongelmia: jaetuista resursseista johtuen synkronointi, poissulku, lukkiutuminen. Muistin, käyttäjien ja oikeuksien hallinta. 1970-luku: mm. Multics, UNIX, MS-DOS (kehitteillä). Käyttöjärjestelmästä monipuolisempi. Siis suurempi koodimassa, jota hankala hallita. Suunnittelulliset haasteet, tutkimusta ja jäsentämistä. Käyttöjärjestelmän piirteiden luettelointi ja kerroksittainen jäsennysmalli. 1980-luvulta alkaen: moniajon ja suojausten kehittämistä, moniydinprosessorit ja niiden asettamat haasteet, hajautetut käyttöjärjestelmät, oliopohjaisuus. 2000-luku: kännykät ym. sulautetut laitteet. Digikamerassakin on oltava vähintään tiedostojärjestelmä, jotta kuvat saadaan tallennettua muistikortille (joka itsessään osaa vain tallentaa pötkön bittejä). Tulevaisuus: ei voitane ennustaa? Suunnitteluyksityiskohtia: Tutustuttiin karkeaan moduulijakoon Unixissa, Linuxissa ja windowsissa. Havaintoja: - Kaikissa hierarkkinen rakentuminen ja kerrokset (kuten aikalailla kaikessa ohjelmoinnissa). - Kuitenkin erilaisia tapoja niputtaa moduulit. Jopa siinä määrin että jossain järjestelmässä graafinen käyttöliittymä ajatellaan kuuluvaksi käyttöjärjestelmään, ja joissain taas ei. - Windowsiin liittyvässä moduulijaossa nähtiin ero käyttäjätilassa ja käyttöjärjestelmätilassa toimiviin moduuleihin. Erityspohdintana monoliittinen ydin / microkernel, eli miten organisoida käyttöjärjestelmän osiot ajon aikana: - monoliittinen (monolithic) käyttöjärjestelmä on yksi kokonaisuus, joka sisältää kaikki ominaisuudet ja palvelut yhdessä koodiköntässä. Käyttöjärjestelmäkutsu vastaa jotakuinkin aliohjelman kutsumista. - microkernel-malli: * ydin mahdollisimman pieni, ts. vain vuoronnus (ym. prosessorin rajoittamatonta käskykantaa ja rekisterejä tarvitseva osuus) ja IPC-menettely jolla mahdollistuu prosessien kommunikointi ja synkronointi. * muu, ml. laiteajurit (tietenkään keskeytyskäsittelijöitä lukuunottamatta) ovat käyttäjätilassa toimivia prosesseja. * "Käyttöjärjestelmäkutsun" sijasta prosessit voivat lähettää viestejä käyttöjärjestelmän palveluprosesseille. * hyveitä mm. + modulaarisuus (mm. pakko eriyttää toiminnot rajapintojen taakse), + turvallisuus (käyttöoikeudet jaettavissa eri toimia hoitavien prosessien kesken), + vikasietoisuus (palveluprosessin kaatuminen ei kaada koko järjestelmää) - käytännössä microkernel-ominaisuuksia mukana nykyisissä järjestelmissä, mutta tehokkuussyistä ytimissä mukana suhteellisen paljon ominaisuuksia; ei siis täydellisen hyveellistä microkerneliä vaan kompromissiratkaisuja (jollaisia aina tarvitaan). Toivottavasti on tähän mennessä nähty, että vaikka tietokone pohjimmiltaan on (edelleenkin) yksinkertainan laite, on siihen aikojen saatossa kohdistunut uusia vaatimuksia ja ratkaistavia haasteita. Tuloksena on laaja ja monimutkainen järjestelmä, jonka kokonaisuuden ja yksittäiset osa-alueet voi toteuttaa erilaisin tavoin. Haasteet muuttuvat aikojen myötä, joten käyttöjärjestelmien piirteitä on jatkuvasti tutkittava: - konferensseja, lehtiä... voi selata internetistä hakusanalla "operating system journal" ja "operating system conference".