ITKA203 Käyttöjärjestelmät, luento 6/14, Ti 7.6.2011 ==================================================== Info: - Demo 1 palautukset tulee Korppiin keskitetysti piakkoin. - Demo 2 julkaistaan iltaan mennessä. - Kurssimateriaalia päivitetty hiukan, ja lisää on tulossa. Paikkaus edelliseen aiheeseen eli aliohjelman suoritukseen: - Paluuarvon välitys x86-64:ssä jäi mainitsematta. Näytettiin esimerkkikoodin kera yksittäinen paluuarvon palauttaminen: on sovittu että aliohjelman koodi laittaa paluuarvon rekisteriin RAX (tai osioihin EAX tai AX, jos paluuarvon koko on 32 tai 16 bittiä) Tämän päivän kulku ================== Tutustuttiin prosessinhallinnan käsitteisiin lähtemällä liikkeelle asioista, joiden nähdään selvästi tapahtuvan tai joiden selvästi haluttaisiin tapahtuvan. Sitten mietittiin, mitä nämä tapahtumiset ilmeisesti edellyttävät käyttöjärjestelmältä. Prosessin tilat, osa 1: running (ilmeisesti prosessi on joskus käynnissä...) FLIH: Jos käskyn suorituksen jälkeen tapahtuu keskeytyspyyntö: - Prosessori siirtyy suorittamaan käyttöjärjestelmän ohjelmaa, esim. vuorontajaa (scheduler / dispatcher) Tämä on ylimalkaisesti sanottu; käsittelemme myöhemmin joitain keinoja joilla tämä käytännössä tapahtuu.. lähtee sitten mystisyys tästäkin. Toistaiseksi oli tavoitteena vain nähdä, mikä on keskeytyksen päätehtävä: keskeyttää prosessi ja siirtää prosessorin suoritus käyttöjärjestelmän koodiin. On myös yksi toinen asia, jota ei ole vielä käsitelty, nimittäin: mitäs jos vaikkapa näppäintä painetaan sattumalta juuri silloin kun vuorontaja on miettimässä seuraavaksi suoritettavaa ohjelmaa? Eli voiko keskeytyksen käsittelyn keskeyttää? Palaamme tähän kysymykseen vielä. Esimerkkinä kellokeskeytys ja vuorontajaan siirtyminen tilanteessa, jossa prosessi muuten laskisi koko ajan. Esimerkkiohjelmaan päätyi ikuinen silmukka, jonka sisällä tehtiin turhaa yhteenlaskua. Se osoittautui ihan hyväksi esimerkiksi, koska päästiin käsiksi muutamiin käsitteisiin kuiten running ja ready -tilojen vaihteluun. Prosessin pitää voida olla tilassa: Ready (eli valmis suorittamaan) Käyttöjärjestelmän tietorakenteet: - todettiin että tähän saakka nähdyn perusteella käyttöjärjestelmän täytyy ilmeisesti pitää jollain tavoin tallella tietoa kaikista prosesseista. - Tarvitaan siis jokaista prosessia varten jonkinlainen ns. "prosessielementti". - Lisäksi vuorottelu vaatii jotakin organisointia, kuten "ready-jonon". "Ready-jono": yksinkertaisin tapa hoitaa vuorottelua voisi olla jonomainen tietorakenne: käyttöjärjestelmä voisi laittaa kellon keskeyttämän prosessin aina jonon hännille ja ottaa jonon keulasta aina seuraavan suoritettavaksi. I/O ohjelman näkökulmasta? - Jos ohjelma (joka siis ilmenee prosessina) tarvitsee jonkin syötteen, vaikkapa kirjaimia päätteeltä, sen täytyy pyytää tätä palvelua käyttöjärjestelmältä - Syitä tarvita I/O:ta on monia, esim. kaikki tiedostojen lataamiset ja tallennukset, tulostukset. - Seurauksia I/O:n luonteesta eli siitä että I/O -tapahtumat voivat tulla milloin vain, esim. heti tai viikon päästä: + Prosessi on voitava laittaa odottamaan jotakin tulevaisuuden tapahtumaa. + Kun odotettu tapahtuma on tullut, prosessin on päästävä jatkamaan siitä mihin se oli jäänyt, esimerkiksi juuri saapuneen päätesyötteen kera. Prosessin pitää voida olla tilassa: Blocked (eli odottamassa tapahtumaa) Prosessien hallintatyökaluja: Windows task manager, Linuxissa esim. ohjelmat ps, top. Prosessin käynnistäminen on ilmeisesti tarpeen, että ne voivat tulla käyntiin. Prosessin pitää voida olla tilassa: New (eli juuri luotuna) Ohjelmoitu keskeytys eli käyttöjärjestelmäkutsu. Käyttöjärjestelmän kutsurajapinta (engl. System call interface) on "käyttäjän portti" käyttöjärjestelmän palveluihin. Prosessorin käskykannan vastaava käsky "int" eli ohjelmoitu keskeytys: Suoritettava ohjelma voi pyytää keskeyttämään oman suorituksensa ja siirtymään käyttöjärjestelmän keskeytyskäsittelijään. Ensimmäisenä esimerkkinä ohjelman lopetus: - Nähtiin erilaisia tapoja lopettaa C-kielinen ohjelma: + "C:n sopimuksen mukainen" lopetus main() -aliohjelman paluuarvona, + exit() -aliohjelman kutsuminen sekä + "C:n laiteläheisyyden mahdollistama" suora konekielinen koodi eli "inline assembly". - Tästä päästiin käsittelemään käyttöjärjestelmän kutsurajapinnan käytäntöä: + Yleensä aliohjelmakirjastot hoitavat kutsujen tekemisen, joten ohjelmoijalle näyttää siltä että hänen ohjelmansa kutsuu esim. C:n aliohjelmaa (tai Javan/C#:n metodia). + Lopulta kuitenkin jossakin kirjastossa on ohjelmanpätkä, jonka konekielinen koodi sisältää nimenomaan ohjelmoidun keskeytyksen. Saatiin siis yleissivistystä laitteen ja ohjelmiston rajapinnasta sekä ohjelmille tyypillisestä kerrosmaisesta rakenteesta ("matalan tason kirjastot", mahdolliset "korkeamman tason kirjastot", jne.., ja päällä "korkean tason" sovellusohjelma) - Samalla ohimennen katsottiin yleistä käytäntöä ohjelmien lopetuskoodille (exit code) sekä tätä kautta todettiin että ilmeisesti myös suorituksesta poistettujen prosessien tietoja on kenties säilytettävä myöhempää käyttöä varten. Prosessin pitää voida olla tilassa: Finished (eli lopettanut suorittamisen, mutta prosessin tietoja ei vielä ole hukattu) Katsottiin päällisin puolin läpi Linuxin system call interfacea: - Käyttöjärjestelmäkutsun tekeminen on käsitteenä samanlainen kuin aliohjelman kutsuminen: pyydetään jotakin tiettyä palvelua, ja pyyntöön liitetään tietyt parametrit. - Parametrien välitys konekielitason käyttöjärjestelmäkutsulle on tapahduttava rekisterien kautta, koska varsinainen ohjelmoitu keskeytys on vain yksi konekielinen komento (muistamme että ne ovat pääsääntöisesti hyvin yksinkertaisia). - Joillain Linuxin palveluilla on jossain määrin tutun näköisiä nimiä tähänkin asti nähdyn perusteella (esim. "exit") ja joidenkin muiden merkitystä pystyi jo alustavasti arvailemaan nimien perusteella. Osa palveluista tulee jatkossa varsin tutuiksi. Ja vielä todettiin, että joskus prosessin suoritus on voitava keskeyttää väliaikaisesti, vaikka prosessi haluaisikin suorittaa jatkuvasti jotakin. Prosessin pitää voida olla tilassa: Suspended (eli "väkipakolla keskeytettynä kunnes toisin määrätään")