Luku 9

Lataus

Tässä aliluvussa kuvaamme, kuinka latausmoduulista saadaan järjestelmässä suorituskelpoinen prosessi.

Latausmoduuli

Oletamme nyt, että latausmoduuli on staattisesti linkitetty moduuli, jonka voi sellaisenaan suorittaa. Esittelimme edellisessä aliluvussa dynaamisen linkityksen, emmekä käsittele sitä tässä sen enempää.

Latausmoduulissa on ohjelman koodi konekielisessä esitysmuodossa ja mistä konekäskystä pääohjelman suoritus alkaa. Siellä on määritelty tilanvaraukset kaikille globaaleille (pääohjelmatasolla) määritellyille tietorakenteille mahdollisine alkuarvoineen. Siellä on myös kerrottu, kuinka suuri pino tälle ohjelmalle tulee varata ja mitä tiedostoja täytyy avata ohjelman käynnistämisen yhteydessä.

Lataus, prosessin luonti

Käyttöjärjestelmä (KJ) luo uuden prosessin valitsemalla ensin sille uuden prosessin tunnisteen (PID, process identifier). Prosessille varataan muistitilaa keskusmuistista sen koodia ja hallintotietoja varten. Jos käytössä on virtuaalimuisti, niin prosessille varataan muistitilaa virtuaalimuistin sivutauluille ja massamuistitilaa prosessin koko muistiavaruuden tallettamiseksi virtuaalimuistin tukimuistiin (ks. Luku 8).

KJ luo prosessille sen kuvaajan (kontrollilohko, PCB, Process Control Block). Kuvaajassa on tallessa kaikki prosessin käyttämät resurssit (ks. Luku 4). Prosessille avataan sen tarvitsemat tiedostot, laitteet ja verkkoyhteydet joko tässä yhteydessä etukäteen tai vasta prosessin suorituksen aikana. Tiedot kaikista aukiolevista tiedostoista, laitteista ja verkkoyhteyksistä ovat myös kuvaajassa. Kuvaajat ovat usein vakiokokoisia ja KJ tallettaa ne omalle muistialueelleen. Kuvaajalle ei siten yleensä tarvitse varata muistitilaa, vaan ainoastaan otetaan joku vapaana oleva kuvaaja uusiokäyttöön. Kuvaaja on (tietenkin) KJ:n omalla muistialueelle ja siihen voi viitata ainoastaan etuoikeutetussa suoritustilassa.

Prosessille varataan muistitilaa pinolle, keolle ja muiden prosessien kanssa yhteisille muistialueille sen latausmoduulissa annettujen määrittelyjen mukaisesti. Kaikki tiedot talletetaan kuvaajaan.

Otsake Prosessi ja sen kuvaaja (PCB). Oikealla on iso laatikko, joka kuvaa muistia. Siinä on prosessin muistialueet PC, koodi ja pino. Vasemmalla on PCB suurennettuna ja siinä ensin kentät PID ja suoritinympäristö (PC, etc). Sitten varatut muistialueet (pcp, koodi, pino), joista kustakin on nuoli oikealla olevaan muistin vastaavaan alueeseen. Lopuksi PCB.ssä on kentät tiedostot, laitteet, verkkoyhteydet, CPU-prioriteetti, jne.  Alla on väylän takana massamuistina kovalevy, josta on varattu tietty määrä tilaa virtuaalimuistin tukimuistille.

Perusidea on, että kaikki yhteen prosessiin liittyvät tiedot löytyvät sen kuvaajasta (ja siihen linkitetyistä muista tietorakenteista). Sitten kun prosessi aikanaan poistetaan järjestelmästä, käyttöjärjestelmä voi kuvaajan tietojen perusteella vapauttaa kaikki prosessin käyttämät resurssit ja lopulta vapauttaa sen tunnisteen (PID) ja kuvaajan uusiokäyttöön.

Prosessin suoritinympäristössä (processor context) on arvot kaikille laiterekistereille, jotka pitää ladata, kun tämä prosessi aikanaan pääsee suoritukseen. Kun (jos) prosessi joutuu myöhemmin odottamaan mistä tahansa syystä, suoritinympäristö kopioidaan suorittimelta tänne sitä varten, että suoritus voisi joskus jatkua samasta kohtaa (samasta konekäskystä sen alusta pitäen) täsmälleen samassa ympäristössä kuin mitä se oli suorituksen keskeytyessä. Suoritinympäristöön kuuluvat kaikki rekisterit ja prosessin hallintaan liittyvät rekisterit em. tarkoitusta varten. Siihen sisältyvät esimerkiksi kaikki laskentaan tarvittavat työ- ja indeksirekisterit sekä erilaiset suorittimen kontrolliin liittyvät rekisterit, kuten paikanlaskuri PC, pinorekisteri SP, kekorekisteri HP, tilarekisteri SR, vertailujen tulosrekisterit CR, muistialueiden rajarekisterit BASE ja LIMIT, virtuaalimuistin sivutaulujen osoiterekisterit PT, jne.

Nyt prosessi on valmis ja järjestelmä tunnistaa sen uniikista PID:stä. Jos prosessin kaikki tarvittavat resurssit (esim. riittävä määrä keskusmuistia) on heti saatu käyttöön, prosessi voidaan siirtää R-to-R jonoon (valmis suoritukseen -jono, Ready-jono, Ready-to-Run-jono) odottamaan suoritusta suorittimella. Muussa tapauksessa prosessi laitetaan odotustilaan (esim. keskusmuistia odottavien prosessien jonoon), josta se sitten joskus myöhemmin resurssien vapauduttua pääsee R-to-R-jonoon odottamaan suoritusvuoroaan.

Prosessin kuvaajan tietoja ja prosessien hallintaa yleensä käsitellään tarkemmin yliopistojen käyttöjärjestelmäkursseilla.

Yhteenveto

Tässä luvussa annoimme yleiskuvan siitä, kuinka ns. "tavallisella" korkean tason kielellä kirjoitetusta ohjelmasta saadaan järjestelmässä suoritettava prosessi. Ohjelman esitysmuotona on järjestelmän suorittimen ymmärtämä konekieli, joka annetaan suorittimelle koodina. Käännösmoduuleista saadaan eri ohjelmointikielistä kääntämällä kohdearkkitehtuurin konekielisiä objektimoduuleita. Niissä on kussakin uudelleensijoitustaulu, jonka avulla on määritelty liitokset kaikkiin muihin objektimoduuleihin. Objektimoduulit linkitetään yhteen osoiteavaruuteen latausmoduuliksi, josta lataaja sitten muodostaa käyttöjärjestelmän tunteman suorituskelpoisen prosessin. Eri ohjelmointikielten kääntäjät, staattiset ja dynaamiset linkittäjät sekä lataaja ovat normaaleja käyttöjärjestelmään sisältyviä peruspalikoita.

On myös olemassa toisen tyyppinen ohjelmien suoritustapa. Siinä suoritettava ohjelma annetaan datana (syötteenä) jollekin käyttöjärjestelmän tunnistamalle prosessille, joka voi olla esimerkiksi tulkki, emulaattori tai simulaattori. Suoritettavan ohjelman esitysmuoto voi olla esimerkiksi jotain skriptikieltä, jonkin toisen koneen konekieltä tai korkean tason kielen kääntäjän välikieltä. Tällaista ohjelmien suoritustapaa käsitellään seuraavassa luvussa 10.

Vastaa alla olevaan kyselyyn, kun olet opiskellut tämän luvun asiat.

Pääsit aliluvun loppuun!

Muistathan tarkistaa pistetilanteesi materiaalin oikeassa alareunassa olevasta pallosta!