Multitegumtöö

Informaatikas tähendab **multitegumtöö** mingi kindla aja jooksul mitme eri ülesande (protsessi) samaaegset täitmist. Multitegumtöö käigus ei oota arvuti käimasoleva protsessi lõppu ega täida ülesandeid järjepanu, vaid on valmis pooleli oleva ülesande kõrval uut ülesannet alustama. Selle tulemusena täidavad arvuti keskprotsessor ja muutmälu protsesse osaliselt ja vaheldumisi.

Multitegumtöö ei tähenda sõna otseses mõttes mitme ülesande samaaegset täitmist. Teisisõnu ei pruugi protsessid toimuda paralleelselt. Multitegumtöö eeldab, et mitu (rohkem kui üks) protsessi on osaliselt täidetud ning sealjuures need protsessid ka mingi etteantud aja jooksul edenevad. Paljudel arvutitel on tänapäeval mitu tuuma ja/või mitu protsessorit, et oleks võimalik korraga rohkem protsesse käitada. Iga protsessori või tuuma kohta on ette nähtud üks ülesanne, ent tänu multitegumtööle on võimalik ülesannete arvu ühe tuuma või ühe protsessori kohta oluliselt suurendada. 

Ühe keskprotsessoriga arvutil peaks olema võimalik käitada ainult üht protsessi korraga. Multitegumtöö lahendab selle probleemi ajaplaanimise näol ehk otsustab, millal üht või teist ülesannet täidetakse. Kui keskprotsessori ümberlülitamine ühe ülesande täitmiselt teisele ehk kontekstkommunikatsioon on piisavalt tihe, jääb mulje, nagu protsesse käitataks paralleelselt. Ajaplaanimise strateegiad erinevad suuresti operatsioonisüsteemiti, üldiselt esineb järgmisi tüüpe:

* Multiprogrammi süsteemides: käimasolev ülesanne peatatakse juhul kui on vaja oodata mõnd väljaspool asetleidvat sündmust (näiteks välisest allikast andmete lugemist) või kui ajakava koostamise programm sunduse korras parasjagu jooksva protsessi keskprotsessorist välja saalib. Multiprogrammi süsteemi eesmärk on kasutada keskprotsessorit maksimaalselt.
* Ajajaotusega süsteem: käimasolev ülesanne vabastab keskprotsessori kas vabatahtlikult või sunniviisiliselt (näiteks mingi riistvara seadme toimingu korral). Ajajaotusega süsteem on loodud mitmete programmide sujuvaks kooskasutamiseks.
* Reaalajasüsteem: osale ootel olevatele ülesannetele on tagatud keskprotsessori kasutusõigus teatavate väliste sündmuste korral. Reaalajasüsteemid on loodud mehaaniliste seadeldiste juhtimiseks (näiteks tööstuslikud robotid).

Mõiste *multitasking* on kujunenud rahvusvaheliseks. Paljudes keeltes (näiteks saksa, itaalia, taani, norra) kasutatakse seda mõistet muutmata, tõlkimata kujul. Eesti keeles on sõna *multitasking* tõlkevaste "rööprähklemine" omandanud ühiskonnas ka laiema, kohati ka allegoorilise tähenduse.

## Multiprogrammeerimine

Informaatika algusaegadel oli protsessoriaeg kallis ja kõiksugused arvuti lisaseadmed üldjuhul aeglased. Kui arvuti käitas programmi, millel oli tarvis juurdepääsu lisaseadmele, pidi keskprotsessor käskude täitmise seniks lõpetama, kuni lisaseadmed andmeid töötlesid.

Esimene multiprogrammi süsteemiga arvuti oli J. Lyons and Co. Leo III. Mitu programmi laeti korraga arvuti mällu ja üks neist lasti käima. Ühe programmi kontekst salvestati mällu, kui programm jäi ootama mõne välise seadme järele, ning mälus olevatest programmides järgmine lasti käima. 

Multiprogrammi süsteemi populariseerumisele aitas oluliselt kaasa virtuaalmälu ja -arvutite laiem levik. 

## Kooperatiivne multitegumtöö

Varajased multitegumtöö süsteemid kasutasid rakendusi, mis jagasid vabalt ressursse teiste rakendustega. Tänapäeval ei leia see meetod enam väga palju kasutust, ent sellel põhimõttel toimisid nii Windows 95 kui ka Mac OS.

Kooperatiivne multitegumtöö toimib põhimõttel, et käimasolev protsess on valmis ja võimeline korrapäraselt teistele programmidele ressursse loovutama. Süsteemi kokkujooksmiseks piisab ühest ainsast halvasti kirjutatud programmist, mis tarbib ära kogu keskprotsessori võimsuse.  

## Eelisasendus

Eelisasendus, ka tõrjuv multitegumtöötlus, on multitegumtöö vorm, kus operatsioonisüsteem lubab igale protsessile lõpliku aja selle täitmiseks. Kui protsessi ei suudetud selle ettenähtud ajaga täita, pannakse see ootele, kuni tähtsam tegum on lõpetanud. Plaanur tegeleb protsesside järjestamisega ning arvutusaja jagamisega.
Sellises süsteemis saab protsesse jaotada kaheks: esiteks protsessid, mis ootavad sisendit või väljundit, st nende täitmise kiirust piirab sisend või väljund, teiseks protsessid, mis kasutavad protsessorit, nende täitmiskiirus on piiratud arvutusvõimsusega. Näiteks lihtsamates süsteemides, kui protsess ootab mingit sisendit (nt kõvakettalt andmeid või klaviatuurilt klahvivajutusi), siis peab kogu süsteem selle taga ootama ning taustal ei ole võimalik protsessori jõudlust kasutada. Näiteks kasutades eelisasendust, on võimalik sisendi-väljundi protsess (protsess nr 1) katkestada ning anda protsessor mõne teise protsessi (protsess nr 2) käsutusse. Kui näiteks sisendist saadakse andmeid, siis katkestatakse protsess nr 2 ning jätkatakse protsessi nr 1 täitmisega.

## Multitegumtöö reaalajasüsteemis
Sarnaselt eelisasendusega antakse igale tegumile piiratud aeg, mille jooksul peab tegumi töö tehtud saama. Ajastust haldab protsessor. Kui aeg on täis, katkestatakse protsess ning liigutakse tähtsuselt järgmise juurde. Süsteemi hierarhia peab tagama olulisematele protsessidele suurema osa arvutusvõimsusest.

## Lõimtöötlus

Lõimtöötlus (inglise *multithreading*) on ühe programmi eri protsesside jaotamine eri tuumade või protsessorite vahel (näiteks üks protsess kogub andmeid, teine analüüsib neid andmeid, kolmas kirjutab saadud tulemused kõvakettale). Lõimed on efektiivsed, sest nendes töötavad programmiosad kasutavad sama aadressiruumi.

Mõned süsteemid toetavad lõimtöötlust riistvara tasandil.

## Mälukaitse

Multitegumtöös on vaja ressursse pidevalt ümber jaotada. Mälukaitse hoolitseb turvalise ja efektiivse mäluruumi haldamise eest nii, et seal ei tekiks viga ega kirjutataks mõne teise programmi infot üle.

Halvasti toimiv mälukaitse on potentsiaalne turvaoht, mälukaitse peab keelama selleks mitte ette nähtu programmidel delikaatsete andmete mälust lugemise, nt paroolide.

Üldiselt tegeleb mälukaitsega kernel.

## Viited