Tuum (informaatika)

**Tuum** ehk **kernel** on operatsioonisüsteemi keskne osa, mis suhtleb vahetult riistvaraga. Kihilise arhitektuuriga arvutisüsteemide puhul võib tuuma vastandiks mõelda kesta, mille ülesanne on suhelda kasutajaga. Tuum on ka esimene osa operatsioonisüsteemist, mis laaditakse arvuti käivitamisel mällu. Oma olulisuse pärast operatsioonisüsteemi ohjamisel, laaditakse tuuma lähtekood mälus kaitstud piirkonda, et välistada tuuma ülekirjutamist teiste programmide poolt.

Tuuma peamine ülesanne on hallata arvuti riistvara ja ka protsessilõimi. Tuum vastutab, et iga protsess saab oma arvutusaja protsessoril. Tuuma teisteks ülesanneteks on pakkuda algtasemel haldust ülejäänud süsteemikomponentide jaoks, hallates muutmälu, failiohje ning ka sisend/väljundit. 
Kerneli liideseks operatsioonisüsteemis on madala taseme abstraktsioonikiht ning tuuma hallatavad protsessid peavad küsima tuuma käest ressurssi (mitte otse suhtlema seadmega), tavaliselt läbi süsteemikutsungite.

## Mälu haldamine
Muutmälu kasutatakse, et hoiustada nii programmi vaheandmeid kui ka koodi. Tänapäevased operatsioonisüsteemid haldavad mitmeid programme korraga ning mõnikord vajavad programmid rohkem mälu kui riistvaraliselt on saadaval. Tuuma ülesandeks on jagada programmide vahel mälu ning otsustada mida teha, kui piisavalt muutmälu ei ole saadaval

Kernelil on täisligipääs süsteemi muutmälule ja kernel vastutab programmidele mälu jagamise eest. Esimene samm selle tagamiseks on mälu adresseerimine, tavaliselt rakendatud läbi saalimise. Adresseeritud mälu tõlgib füüsilised mäluaadressid virtuaalseks ning aadressiruum kahe programmi vahel võib erineda, lubades programmil käituda nagu ta jookseks peale tuuma riistvara peal üksi. 

Tuum jagab ka muutmälu sektsioonideks, esmalt reserveerides süsteemi tööks vajaliku osa (kerneli aadressiruum) ja siis vastavate programmide jaoks(kasutajaruum). Erinevate aadressiruumide vahel töötavatel programmidel ei ole õigusi teisest sektsioonist mälu lugemiseks, lisades operatsioonisüsteemi töösse turvakihi. 

## Seadmete haldus
Programmide kasulik töö tagamiseks peab tavaliselt programmil olema ligipääs seadmetele mis on riistvaraga ühendatud. Seadmetega suhtlus kernelis käib läbi seadmedraiveri. Seadmedraiver on vaheprogramm mis suhtleb riistvaraga ning tõlgib kõrgtaseme keele suhtluse masinkoodiks. 

Tuum haldab ka nimekirja riistvaralistest seadmetest ning tekitab vastavad ligipääsupunktid tagamiseks programmide suhtluse seadmetega. Seadmete nimekiri võib olla eelnevalt teada, näiteks sardsüsteemides, kus kerneli ülesanne on spetsiifiline ja riistvara kitsahaardeline. Seadmete nimekirja võib ka käigu pealt tekitada (isehäälestuvalt), kus seadmehaldur (kernel) kõigepealt skaneerib vastavaid riistvaralisi ühendusi ning laadib vastavad draiverid.

## Kernelitüübid

### Monoliitsed
Monoliitse kerneli puhul kõik operatsioonisüsteemi protsessid asuvad samas mälusaalis. Monoliitne kernel sisaldab kogu vajalikku koodi mida operatsioonisüsteemil on riistvara kasutamiseks vaja ning mida ei ole pärast kerneli laadimist võimalik teegist võtta. Osa kerneli arendajatest väidab (https://www.oreilly.com/openbook/opensources/book/appa.html), et monoliitse struktuuriga kerneleid on lihtsam rakendada.(thompsoni viide) Samas, viga kerneli alammoodulis väljendub monoliitse süsteemi puhul pea alati süsteemi krahhiga.

Monoliitse struktuuriga kernel kasutab oma töös peamiselt süsteemikutsungeid, sest kogu seadme funktsionaalsus on pakitud kerneliga kaasa ning väliseid teeke ei laadita.

Monoliitsel disaini peamised vead:
* Kerneli arendamine osutub tihtipeale keerulisemaks, sest kogu kerneli kood asub ühes tükis. 
* Vead ühes koodiosas väljenduvad tugevalt teises koodiosas. Kogu kernel laaditakse ühes tükis mällu ning protsessi- ja aadressiruumid ei ole eraldatud.
* Monoliitsed kernelid on vähem vastuvõtvad riistvaramuudatustele, uue arhitektuuri kasutamiseks tuleb terve kernel üle kirjutada.

### Mikrokernel

Mikrokernel üritab hoida võimalikult palju protsesse kasutajaruumis, tagades süsteemi minimaalse jalajälje mälus. Mikrokernelis laaditakse süsteemimällu nii vähe kui võimalik, peamiselt implementeerides mälu- ja protsessihalduse. Ülejäänud kood jäetakse väljapoole kernelit, kas süsteemsete teenustena või kerneli moodulitena. 

Mikrokerneli peamisteks tugevusteks loetakse hallatavust ja arenduslihtsust. Lisaks loetakse mikrokerneleid stabiilsemateks, kuna ühe koodi krahhi puhul saab selle asendada toimiva koopiaga käigu pealt. 

Küll aga on peamiseks mikrokerneli nõrkuseks jõudlus. Suhtlus kerneli eri osade vahel tehakse läbi liideste, ning kihtide vahel tõlkimine võtab lisajõudlust erinevalt monoliitsest kernelist.. Seetõttu kasutatakse mikrokerneleid peamiselt väikestes süsteemides mille keerukus on madalam ning ei vaja sama laiahaardelist tuge kui monoliitsed kernelid.

### Hübriidkernel

Hübriidkerneli disainifilosoofia üritab parandada monoliitse ja mikrokerneli vigu. Hübriidkernelis laaditakse algselt ainult vajalik kood kerneli enda töö garanteerimiseks. Seadmehalduse ja muude rakenduste teostamiseks laadib hübriidkernel endale vastavalt vajadusele vahemällu mooduleid, mille ülesandeks on vastava ülesandega tegelemine. 

Hübriidkerneli arendamine on ka hõlpsam, kuna tegu ei ole enam monoliitse koodibaasiga, vaid mooduleid saab vastavalt arendada. Lisaks saab mooduleid ka käigupealt ümber laadida, lubades arendajatel oma muudatusi testida ilma masinat taaskäivitamata.