htopin listaamia prosesseja
Tietotekniikassa **prosessi** on tietokoneessa ajossa oleva ohjelma. Prosessilla on ohjelmalaskurin tila, ajonaikainen pino sekä data-alue.

Jokaisella prosessilla on yleensä käytössä oma muistialue ja muita resursseja, joihin muut prosessit eivät pääse käsiksi. Useimmat käyttöjärjestelmät ylläpitävät näitä tietoja prosessitaulussa. Eri prosessit voivat käyttää prosessien välistä kommunikaatiota tiedon välitykseen keskenään lukuisilla menetelmillä. Usein prosessit koostuvat yhdestä tai useammasta säikeestä.

Typistetysti voidaan esittää prosessille kolme eri tilaa. Sitä voidaan *suorittaa* (engl. *running*), se voi olla *valmiustilassa* (engl. *ready, ready to run, suspended*), tai *odottavana/nukkuvana* (engl. *wait, blocked, asleep*). Odotustilassa oleva prosessi voi odottaa mitä tahansa tapahtumaa, kuten esimerkiksi oheislaitteen toimintaa, viestiä toiselta prosessilta tai ajan kulumista.

Prosessi siirtyy valmiustilasta suoritustilaan siten, että käyttöjärjestelmän ytimen osa *vuorontaja* (engl. *scheduler, dispatcher*) valitsee sen suoritukseen. Odotustilaan prosessi siirtyy, jos se tekee sellaisen järjestelmäkutsun (engl. *system call*), jota käyttöjärjestelmä ei voi suorittaa heti loppuun asti. Tällainen kutsu voi olla vaikkapa lukupyyntö oheislaitteelta kuten levyltä, jos haluttua tietoa ei ole jo keskusmuistissa (puskuroinnin takia tieto voi olla keskusmuistissa valmiina, jolloin pyyntö voidaan hoitaa heti loppuun asti, eikä tilasiirtymää tehdä). Kun odottaminen päättyy, prosessi siirtyy valmiustilaan, ja kierros alkaa alusta. Jos järjestelmässä on irrottava (engl. *pre-emptive*) vuoronnus, prosessi voi siirtyä myös suoritustilasta valmiustilaan.

Vaihtaessaan säiettä tai prosessia toiseen vuorontaja käyttää jotain vuoronnusmenetelmää. Menetelmästä riippuu hyvin pitkälle se, mikä odottavista prosesseista valitaan ajoon. Menetelmiä ovat muun muassa kiinteä prioriteetti (engl. *fixed priority*) (usein liitettynä irrottavaan vuoronnukseen, engl. *fixed priority pre-emptive scheduling, FPPE*), vaihteleva prioriteetti (engl. *dynamic priority*) (useita erilaisia tapoja vaihtaa prioriteettia), lyhyin tehtävä ensin (engl. *shortest remaining time, SRT*), lähin määräaika ensin (engl. *earliest deadline first, EDF*), jonomenetelmä (engl. *first in, first out, FIFO, myös first come, first served, FCFS*) ja sen lähisukulainen kiertovuorottelu (engl. *round robin, RR*). Vain osa vuoronnusmenetelmistä sopii reaaliaikaiseen vuoronnukseen (engl. *real-time scheduling*).

Vuoronnus voidaan toteuttaa kokonaan käyttöjärjestelmän ytimessä, mutta käytössä on myös kaksitasoisia ratkaisuja, joissa ytimen osa tyypillisesti hoitaa reaaliaikaista vuoronnusta ja muiden prosessien osalta esivalinnan tekee erillinen prosessi.

Unix-käyttöjärjestelmässä ja siitä vaikutteita ottaneissa käyttöjärjestelmissä prosessien välillä on isä-lapsisuhde. Prosessi, joka käynnistää toisen prosessin, on käynnistetyn prosessin *isäprosessi*. Vastaavasti prosessin käynnistämät prosessit ovat sen *lapsiprosesseja*. Kaikki prosessit ovat joko suoraan tai välillisesti init-prosessin jälkeläisiä. Init-prosessin prosessinumero on aina 1, ja käyttöjärjestelmä käynnistää sen ennen muita prosesseja. Uusi prosessi luodaan `fork`-kutsulla, joka kahdentaa käynnissä olevan prosessin. Suoritettava ohjelma vaihdetaan erillisellä `exec`-kutsulla. Kun prosessi päättyy, se ilmoittaa onnistumistiedon isäprosessilleen. Jos isäprosessi on jo päättynyt, prosessi on *orpo* ja lopetustieto menee init-prosessille, joka ei kuole ennen kuin käyttöjärjestelmä pysäytetään.

Kaikissa käyttöjärjestelmissä ei isä-lapsisuhdetta ole prosessien välillä (näin esimerkiksi Windows-käyttöjärjestelmässä). Prosessin luonti ja ohjelmakoodin vaihto ei myöskään ole aina kaksivaiheinen, vaan voi tapahtua yhdellä kutsulla.

Käyttöjärjestelmän ytimen kannalta prosessilla voi olla kaksi suorituskontekstia: käyttäjätilassa tapahtuva ja ytimen tilassa tapahtuva. Käyttäjäprosessi vaihtaa tilaa ytimen tilaan kun se suorittaa järjestelmäkutsun.

Säie
----

Nykykäyttöjärjestelmät tukevat usein perinteistä prosessia kevyempää prosessia eli säiettä (engl. *thread, task, light-weight process*). Säie eroaa prosessista siten, että sillä ei ole omia resursseja, vaan se käyttää sen prosessin resursseja, johon se kuuluu. Yhdessä prosessissa on silloin yksi tai useampia säikeitä.

Säikeet voivat olla käyttäjätilassa (prosessien sisällä) myös käyttöjärjestelmän ytimen sisäisiä. Lisäksi on eri malleja miten käyttäjätilassa olevat säikeet vastaavat ytimessä olevia (yksi-yhteen, yksi-moneen, monta-moneen tai kaksitasoinen vastaavuus).

Säikeet voidaan toteuttaa käyttöjärjestelmän ytimessä *etuoikeutetussa tilassa* (engl. *kernel, supervisor*) tai *käyttäjätilassa* (engl. *user*) prosessin osana. Jälkimmäinen vaihtoehto tarkoittaa sitä, että prosessin sisällä on vuorontaja, joka päättää, mikä sen sisäisistä säikeistä on ajossa. Tämän vaihtoehdon varjopuoli on se, että jos yksi säie tekee käyttöjärjestelmäpyynnön, joka edellyttää odottamista (esimerkiksi lukee tiedostoa), kaikki prosessin säikeet pysähtyvät odottamaan, koska yllä kuvattu kolmitilamalli on toteutettu vain prosessin tasolla. Jos säikeet on toteutettu käyttöjärjestelmässä, toteutuu kolmitilamalli säietasolla ja prosessin tehtäväksi jää toimia resurssien omistajana, eli prosessi ei enää suorita ohjelmaa lainkaan, vaan kaikki suoritus tapahtuu sen sisäisissä säikeissä. Tässä tapauksessa yhden säikeen tekemä odottamista vaativa pyyntö ei pysäytä muita säikeitä.

Moderneissa prosessoreissa on laitteistotasolla tuki yhtäaikaisille säikeille.
Nykyisissä prosessoreissa on tuki monisäikeistykselle, jolloin yksittäinen suoritinydin voi moniajaa säikeitä tehokkaammin. Lisäksi moniytimiset suorittimet mahdollistavat aidosti rinnakkaisen moniajon.

Katso myös
----------

* Moniajo

Lähteet
-------

1. ↑  Arpaci-Dusseau, Remzi H. & Arpaci-Dusseau, Andrea C.: The Abstraction: The Process (PDF) *pages.cs.wisc.edu*. Viitattu 1.3.2020. (englanniksi)
2. ↑  Silberschatz & Galvin & Gagne: *Operating System Concepts*, s. 101–102. Eighth edition. Wiley, 2009. ISBN 978-0-470-12872-5. (englanniksi)
3. ↑  Steven Hand: Operating Systems (PDF) *cl.cam.ac.uk*. Viitattu 5.10.2022. (englanniksi)
4. 1 2  Introduction to Processes *tldp.org*. Viitattu 28.7.2021. (englanniksi)
5. 1 2  What are threads (user/kernel)? *tldp.org*. Viitattu 28.7.2021. (englanniksi)
6. ↑  Implementing threads *it.uu.se*. Viitattu 28.7.2021. (englanniksi)
7. ↑  Simultaneous Multithreading Project *dada.cs.washington.edu*. Viitattu 9.1.2017. (englanniksi)