**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* (engl. *Symmetric multiprocessing, SMP*), 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* (engl. *Asymmetric multiprocessing, AMP*) 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* (engl. *Bound multiprocessing, BMP*) 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 *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 (engl. *mutual exclusion*), 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)
* Muistiarkkitehtuuri
* Flynnin luokittelu
* Supertietokone

Lähteet
-------

1. ↑  M. Satyanarayanan: Commercial Multiprocessing Systems  toukokuu 1980. Carnegie-Mellon University. doi:10.1109/MC.1980.1653626.  Viitattu 31.3.2018. (englanniksi)
2. ↑  Multiprocessing Encyclopaedia Britannica. Viitattu 7.6.2019. (englanniksi)
3. ↑  Chip multiprocessing
4. ↑   (1995) "5.3.3 Read-Modify-Write Cycle", *MC68020/MC68EC020 Microprocessors User's Manual UM Rev. 2*. Freescale Semiconductor.  (Arkistoitu – Internet Archive)
5. ↑  **MC68020 Signal Description**, Appendix A, page 84 *handle.dtic.mil*. Viitattu 17.1.2010. [vanhentunut linkki]
6. 1 2 3 4 5 6 7 8 9 10  Levi Ego: Memory Synchronization Techniques (PDF) *es.cs.uni-kl.de*. Viitattu 14.4.2022. (englanniksi)
7. 1 2  Categories of Computer Systems, Flynn’s Taxonomy *.cs.uidaho.edu*. Viitattu 19.2.2017.
8. ↑  Maurice Herlihy & Nir Shavit: *The Art of Multiprocessor Programming*, s. 1. Morgan-Kaufmann, 2018. ISBN 978-0-12-370591-4. (englanniksi)
9. ↑  2.13. System Partitioning Red Hat Enterprise Linux for Real Time *access.redhat.com*. Viitattu 18.2.2022. (englanniksi)
10. ↑  CPU Partitioning *wiki.linuxfoundation.org*. Viitattu 18.2.2022. (englanniksi)
11. ↑  Running AMP, SMP or BMP Mode for Multicore Embedded Systems (PDF) *nxp.com*. Viitattu 14.4.2022. (englanniksi)
12. ↑  Bound multiprocessing (BMP) *qnx.com*. Viitattu 14.4.2022. (englanniksi)
13. ↑  sched\_setaffinity(2) *man7.org*. Viitattu 14.4.2022. (englanniksi)
14. ↑  SetProcessAffinityMask function (winbase.h) *docs.microsoft.com*. Viitattu 14.4.2022. (englanniksi)

Aiheesta muualla
----------------

* Englanninkielisen Wikipedian artikkeli aiheesta (englanniksi)
* Asymmetric multiprocessing (englanniksi)
* Symmetric multiprocessing (englanniksi)

Käännös suomeksiKäännös suomeksi Tämä artikkeli tai sen osa on käännetty tai siihen on haettu tietoja muunkielisen Wikipedian artikkelista.   
Alkuperäinen artikkeli: en:Multiprocessing