Moniprosessointi

**Moniprosessointi** tarkoittaa kahden tai useamman suorittimen käyttöä yhdessä tietokoneessa siten, että jokainen suoritin voi jakaa samaa muistiavaruutta. Suorittimet voivat käsitellä samaa tai eri ohjelmaa samanaikaisesti.

Termillä viitataan järjestelmän tukea useammalle kuin yhdelle suorittimelle ja kykyä jakaa tehtäviä näille. Useamman kuin yhden prosessorin käyttö samassa tietokoneessa vaatii synkronointituen prosessorilta, jollainen on esimerkiksi Motorola 68020 prosessorin RMC-pinni. Moniprosessointi on merkittävä muutos tietokoneen arkkitehtuuriin, joka vaatii synkronointituen tiedon eheyden varmistamiseksi.

Moniprosessointi eroaa klusterista mm. siten, että tietokoneen jokainen suoritin pääsee samalla tavoin suoraan käsiksi laitteisiin (jaettu muistiavaruus ja resurssit). Klusterissa on käytössä *hajautettu* muistiarkkitehtuuri.
Moniydinprosessoreissa prosessorit (ytimet) voivat keskustella keskenään jaetun välimuistin kautta kun taas suuren mittakaavan supertietokoneet tarvitsevat koordinointia tietojen reitittämiseen.

Eräissä yhteyksissä asiaan viitataan termillä *symmetrinen moniprosessointi* (), jolloin käyttöjärjestelmän kerneli voidaan suorittaa millä tahansa tietokoneessa olevalla suorittimella yhtäläisesti. Tämä eroaa klusterista, jossa jokaisella *solmulla* (*node*) on oltava käyttöjärjestelmän ytimestä oma kopio suoritettavana.

*Epäsymmetrinen* tai *asymmetrinen moniprosessointi* () on symmetristä edeltävä ja toisinaan käytössä oleva edullisempi ratkaisu. Ratkaisua voidaan käyttää esimerkiksi sulautetuissa järjestelmissä, joissa suoritin voidaan varata tiettyyn tarkoitukseen suunnitteluvaiheessa eikä tehtäviä jaeta tasamäärin jokaiselle suorittimelle.
Tällöin suoritin tai joukko suorittimia eristetään tiettyyn käyttöön (järjestelmän osiointi).

*Rajattu moniprosessointi* () on QNX:n käyttämä termi tapaukseen, jossa järjestelmä toimii kuten symmetrinen, mutta kehittäjä tai ylläpitäjä rajoittaa suorituksen tietyyn suorittimeen estäen vuoronnusta vaihtamasta käytettävää suoritinta tehden siitä asymmetrisen. Linuxissa ja Windowsissa suoritusta voidaan rajata tietyille suorittimille asettamalla *affinity*-arvo halutuille säikeille.

Moniprosessointi soveltuu moniajoa käyttävälle käyttöjärjestelmälle koska se mahdollistaa aidon rinnakkaisuuden.

Suurissa moniprosessoritietokoneissa kuten supertietokoneissa muistin yhtenäinen käsittely on haastavaa ja näissä on käytetty muistiarkkitehtuureja kuten COMA ja NUMA.

## Synkronointi
Suorittimet toteuttavat ohjelmien synkronointia varten laitteistotasolla *[[Atomisuus (ohjelmointi)|atomisia]] primitiivejä*. Yhden prosessorin järjestelmissä laitteistokeskeytykset on mahdollista kytkeä pois päältä vuoron vaihdon estämiseksi. Moniprosessorijärjestelmät tarvitsevat laitteiston tukea, joista esimerkkejä ovat *test and set*, *compare and swap*, *fetch and increment*, *load-link / store-conditional*. Nämä primitiivit ovat "rakennuspalikoita" muille synkronointimuunnelmille kuten *barrier*- ja lukitustyypit.

Modernit moniprosessointijärjestelmät toteuttavat jaetun muistialueen arkkitehtuurin ohjelmien abstraktiotasolla koska se tarjoaa järkevän näkymän dataan ja on yksinkertainen ohjelmoijille käsitellä. Pääsy muistialueeseen voi kuitenkin tapahtua ennakoimattomassa järjestyksessä, joka johtaa ohjelman ennakoimattomaan toimintaan. Tästä johtuen on esitetty muistimalleja, joiden sääntöjä on helpotettu nopeuden parantamiseen. Järjestyksen odottamatonta muuttamista varten on *fence*-käskyt (myös nimellä *barrier*).

Toteutusratkaisuja on useita: atomiset operaatiot, poissulkeminen (), semaforit, *spin lockit*, *barrierit*, luku-/kirjoituslukot, monitorit ja *fence*-käskyt.

## Historia
Varhaisia moniprosessoinnin tutkimiseen kehitettyjä tietokoneita olivat esimerkiksi Carnegie Mellon -yliopiston C.mmp.

Varhaisia moniprosessointia tukevia mikroprosessoreita olivat esimerkiksi National Semiconductor SC/MP.

## Katso myös

* Moniytimellisyys (tietotekniikka)
* Monisäikeistys
* Prosessi (tietotekniikka)
* Flynnin luokittelu

## Lähteet