BEVEZETÉS Az Operációs rendszerek tantárgy a mindhárom informatikus alapszak tantárgya. A hallgatóknak a második félévben ajánljuk, a Számítógép architektúrák és a Programozás alapjai tantárgyak teljesítése után. A tárgy célja az, hogy a hallgatók megismerjék a működtető rendszerek fejlesztése, üzemelése során felmerülő alapfogalmakat, koncepciókat és megfontolásokat, felfedezzék az operációs rendszerek belső szerkezeteit, megértsék az egyes részek működését. Ezek az ismeretek képessé tehetik a hallgatókat arra, hogy operációs rendszerek menedzselésével kapcsolatos tantárgyakat vegyenek fel, hogy szoftverfejlesztési projektjeikben figyelembe vehessék a működtető architektúrákat, hogy számítástechnikai és infokommunikációs rendszerek infrastruktúrájának megtervezésében vegyenek részt. A számítástechnikai piacon sok és sokféle operációs rendszert szerezhetünk be. Egyes rendszerekhez ingyen juthatunk, másokért fizetni kell. A sokféle operációs rendszer működésének alapelveiben felfedezhetők közös, általános koncepciók. Bizonyos funkciókat minden operációs rendszerben meg kell valósítani. Természetesen vannak egyedi vonások is. A tárgyban megkíséreljük összefoglalni az általános törvényszerűségeket, azt, ami közös a rendszerekben. Amikor példákat kell választani és azokon bemutatni egy-egy megoldást, befolyásol majd a példa bonyolultsága, illetve éppen az egyszerűsége: ahol lehet, a könnyebben megérthető mintát mutatjuk. Azt mondhatjuk, a legtöbb példa a korai Unix rendszerek megoldása lesz, hiszen ezek tiszták, egyszerűek, lényegre törően mutatják a problémát és a megoldást. Természetesen említünk korszerűbb Unix-szerű rendszer elemeket is, és lesznek példák a MS Windows megoldásokból is. Kívánunk a tisztelt olvasónak sok sikert a tanulásban és munkában!
1.1. AZ OPERÁCIÓS RENDSZEREK FOGALMA A legtöbb számítógép felhasználó használja az operációs rendszereket, azok szolgáltatásait, anélkül, hogy pontosan meg tudná fogalmazni, mi is az operációs rendszer. Tudják, hogy egy rendszer szoftver, ami kezeli a gépet, parancsokat tud fogadni, tartoznak hozzá eszközök, állományok, katalógusok, ezekben lehet manipulálni stb. De ha definiálni kell az operációs rendszert, akkor gondban vannak. Ennek a bizonytalanságnak az az oka, hogy az operációs rendszerek alapvetően két, egymástól független funkciót (funkciócsoportot) valósítanak meg, két, egymástól független nézőpontból szemlélhetők, két szempontból definiálható a lényegük, és rendszerint nem tisztázzák a definíció során, hogy melyik nézőpontból történik a definíció, vagy az operációs rendszer fogalom meghatározásakor éppen keveredik a két nézőpont. Az operációs rendszer hasonlít egy kormányhoz, azaz maga nem teljesít valódi funkciót, de lehetőséget ad az alkalmazások hasznos tevékenységéhez. Van erőforrás kiosztó (resoruce allocator) és vezérlő (control program) szerepköre. Néha úgy szemléljük az operációs rendszert, hogy az azon programok gyűjteménye, amit a számítógéprendszer szállító a géphez szállított. Máskor: azon programok, amik mindig futnak a számítógépünkön. Egy jó módszer az operációs rendszer definiálására, ha megragadjuk kettős természetét: az operációs rendszer egyrészt virtuális gép, másrészt erőforrás menedzser. (Néha így definiálják: válaszoló gép). 1.1.1. Az operációs rendszer mint kiterjesztett gép A legtöbb számítógép gépi nyelvű programozása - különösen a B/K műveletekre gondoljunk bonyolult, sok odafigyelést igénylő munka. Jól kell ismerni az architektúrát (az első értelemben vett módon!), a hardver részleteket. Gondoljunk végig például egy floppy diszk blokk behozatal forgatókönyvet! A legtöbb programozó (nem is beszélve az általános felhasználóról) nincs olyan intim kapcsolatba az architektúrával, hogy ezt le tudná programozni! Az operációs rendszer - mint kiterjesztett gép - magasabb absztrakciós szintet biztosít a felhasználó számára. Az eszközöket és állományokat szimbolikus neveken engedi kezelni, ezekben magasabb szintű operációkat biztosít (pl. open, read, write rendszerhívásokat (system calls, lásd később részletesebben)), sőt, az operációs rendekhez kötődő parancsértelmezőkkel még magasabb szintű parancsokat (pl. copy, move, stb.). Úgy is mondhatjuk, ebből a szempontból nézve az operációs rendszer elrejti a részleteket a felhasználó elől, levesz bizonyos felelősséget a felhasználó válláról, akár különböző architektúrákon is biztosítja helyettesíthetőségét, egységességet biztosít a hasonló de részleteikben nagyban különböző eszközök (pl.: floppy diszkek és hard diszkek) kezelésére. Ez egy felülről-lefelé (top-down) megközelítése a problémának. A virtuális gépet, amit az operációs rendszer biztosít, könnyebb programozni, mint az alatta létező hardvert. Persze, hogy ezt hogyan biztosítja, ez egy hosszú történet, az Operációs rendszerek tárgy egyik célja, hogy ezt is megismerjük.
Ha úgy tetszik, ebből a szempontból kényelmessé teszi (convenience for the users) az operációs rendszer a hardver használatot. 1.1.2. Az operációs rendszer mint erőforrás menedzser Egy másik - valójában alulról-felfelé való (bottom-up) megközelítésben az operációs rendszer azért van, hogy egy összetett rendszer részeit menedzselje. Egy korszerű számítógép processzorokból, tárakból, óraeszközökből, diszkekből, mágnesszalagos tárolókból terminálokból, nyomtatókból, hálózati eszközökből, stb. tevődik össze. Az operációs rendszer feladata, hogy elossza ezeket az erőforrásokat a gépen futó különböző, az erőforrásokért tulajdonképpen vetélkedő programok számára. (Példa lehet itt is: forgatókönyv arra az esetre, amikor két processz ugyanarra a nyomtatóra akar nyomtatni.) Milyen erőforrásokat kell menedzselnie az operációs rendszereknek? ● ● ●
A hardver erőforrásokat (processzorok, elsődleges és másodlagos tárak, eszközök stb.), a szoftver erőforrásokat (alkalmazások, adatbázisok stb.) és az emberi erőforrást) felhasználók, operátorok, rendszermenedzserek stb.).
A menedzselési feladatkörbe az erőforrás kiosztás mellett természetesen beleértjük az erőforrás védelmet (kölcsönös kizárást kritikus esetekben) a konfliktusok feloldását az erőforrások használatának számbavételét (statisztikák készítését, számlázásokat is). Olyan fogalmak merülnek itt fel, mint a hatékonyság, a teljesítmény, a védelem és biztonság, a megbízhatóság stb. Ha úgy tetszik, ebből a szempontból az operációs rendszer hatékonnyá teszi (efficiency) a hardver használatát.
1.2. AZ OPERÁCIÓS RENDSZEREK TÖRTÉNETE A múlt század közepét tekintve a kezdetnek, kezdetben a programokat a hardveren direkt módon futtatták. Magyarosan: a számítógépeket működtető, kezelő szoftver nélkül használták, nem voltak még operációs rendszerek. Minden felelősség a programozóé volt, teljes mélységben ismernie kellett a hardvert, nemcsak meg kellett írnia a programot, hanem gondoskodnia kellett, hogy az a számítógép memóriájába kerüljön, miközben még nem voltak a program beolvasását segítő perifériakezelő programok. Az is igaz, nem volt a számítógép használók között a ma ismert munkamegosztás: akik a gépet tervezték és megépítették, ugyanazok voltak a karbantartók, a gépkezelők, a programozók és a programfuttatók, meg a programok eredményeinek felhasználói is. Az operációs rendszerek csírái éppen úgy alakultak ki, hogy az adat be- és kiviteli eszközöket kezelni képes programrészeket (szubrutinokat) összegyűjtötték, és a számítógép csak olvasható memóriájába írták. Ezek után az alkalmazói programokat már e rutinkészlettel írhatták vagy tölthették be, az eredményeket ezekkel adhatták vissza. Kialakult az ún. konzol terminált (ami olyan volt, mint egy régi írógép) kezelni képes és egy nagyon egyszerű parancsnyelvet értelmezni képes működtető rendszer, az operációs rendszer őse. Érdekes, hogy a neve monitor volt. (Talán azért, mert a konzolon a gép állapotát tükröző memória rekeszek pillanatnyi tartalmát meg lehetett figyelni vele.)
A fejlődés során a memória menedzselésben léptek előre. Hiába, a memória az egyik legfontosabb, ugyanakkor meglehetősen szűk erőforrás volt. Először a rögzített partíciós memória gazdálkodás, hamarosan a változó partíciós memória gazdálkodás alakult ki. Ezzel párhuzamosan a munka (job) fogalom: az erőforrásokat (köztük elsősorban a memória partíciót) célszerűen a futó programhoz (a job-hoz) rendelhették, a munka, a futó program lett az alanya az erőforrás gazdálkodásnak. Fejlődött a B/K rutinkészlet is. A „munkákat” változatos módon (lyukkártya, mágnesszalag, később mágneses dob eszköz, majd mágneslemez), „kötegelt módon” (batch processing) be lehetett már tölteni a partíciókban, az eredményeket változatos módon megkaphatták (sornyomtató, lyukkártya, mágnesszalag). A partíciókba betöltött munkák között a processzoridőt már lehetett ütemezni, az operációs rendszer funkcionalitása ezzel is bővült. Rövidesen megjelent az igény az interaktivitásra. Ez a felhasználói felületek (parancsnyelvi feldolgozók) és az ember-gép kapcsolattartó eszközök (terminálok) fejlődését hozta. Az interaktivitási igény a processzor ütemezésben is előrelépést indukált: megjelent az időosztás (time sharing). Igen nagy volt a fejlődés a programozás területén: nagyon sokféle programnyelv alakult ki, melyeket az operációs rendszerekhez szorosan kapcsolódó fejlesztő rendszerek támogattak. Ebben az időszakban (kb. a 70-es években vagyunk) nagyon sok operációs rendszer fejlődött ki (OS370, MULTCS, RSX, Unix stb.). A következő időszakra a személyi számítógépek kialakulása nyomja rá bélyegét. A számítástechnikai eszközök már nem egy titoktatos, légkondicionált teremben vannak, ahová csak fehér köpenyes és sokszor nagyképű számítás-technikusok léphetnek be, a felhasználónak még egy terminálterembe sem kell (feltétlenül) elfáradnia: a számítógép ott van az asztalán. Igaz, a gép, pontosabban az operációs rendszer használatához eleinte parancsokat kell megtanulnia, melyek nehezen megjegyezhető betűkombinációkból állnak, sokszor kevés logikát találhatunk mögöttük. Hamarosan megjelennek azonban a grafikus felhasználói felületek. Ezekkel már gyerekjáték a számítógép kezelés. A személyi számítógépekhez szállított operációs rendszerek egyik legfontosabb eleme éppen a grafikus felhasználói felület. Mellette a memóriagazdálkodás, a másodlagos tárolás (diszkek és rajtuk a fájlrendszerek) is fontosak még, kevésbé fontos a processzor ütemezés (hiszen egy valaki használja a gépet, az elindított programjai futhatnak sorban, egymás után). És még kevésbé fontos a védelem! Sajnálatosan nagy a visszaesés a személyi számítógépek operációs rendszerei védelmi koncepcióiban, akár a memória, akár a fájlrendszer védelmi mechanizmusait nézzük. Az ok nyilvánvaló: a számítógép gyártók azt gondolták, mindenki vállaljon felelősséget a saját asztalán lévő gép és annak erőforrásaiért, ne pazaroljunk még védelmi mechanizmusokra is erőforrásokat. Később, az adatcsere növekvő igénye miatt (vírusokkal fertőzött floppyk korára tessék emlékezni!), majd a hálózatosodás világában ez a hiányosság persze gondot jelentett. Az asztali gépek elterjedését az tette lehetővé, hogy a fajlagos számítási kapacitás (1 forintra eső processzor teljesítmény) nagyon olcsóvá vált. Fordítva is igaz, az elterjedés a tömeggyártáson keresztül olcsóvá tette a gépelőállítást. A következő fejlődési lépcsőben a hálózatosodás fejlődött ugrásszerűen. Az operációs rendszerek igen fontos funkciója volt a hálózatok támogatása. A számítógép használat fő céljai közé került a kommunikáció. Ezért az operációs rendszerektől elvárjuk, hogy változatos és könnyen kezelhető kommunikációs alkalmazásokat (elektronikus levelezés, távoli géphasználat általános célra, távoli fájlhasználat és fájl átvitel, távoli nyomtatás, információszolgáltatók lekérdezési lehetősége stb.) futtathassunk alattuk. Ugyanekkor a perifériákban is nagy – elsősorban a minőségi –
fejlődés. Ezek kezelését, a rendszerhez való könnyű illesztését (plug & play) elvárjuk az operációs rendszerektől. Elvárjuk a korrekt ütemezést is, hiszen párhuzamosan sok-sok programot indítunk, ezek haladjanak futásukban. Elvárjuk a komoly védelmi mechanizmusokat is, hiszen a kommunikációs lehetőségek megnövekedésével a kockázati tényezők is növekedtek. A közép európai államokban a hálózatba is köthető személyi számítógépek működtetésére két operációs rendszer család terjedt el jelentősen. Az egyik a Microsoft cég Windows operációs rendszer családja (melynek sok-sok tagja van), a másik pedig a Linux operációs rendszer család (meglehetősen sok Linux tag is van e gyűjtőnév alatt). E két család tagjai a legtöbb fenti követelményt teljesíti.
1.3. OPERÁCIÓS RENDSZEREK OSZTÁLYOZÁSA Több szempontból osztályozhatjuk az operációs rendszereket. A legfontosabb szempontokhoz tartozik a cél, a processzorok, a futó programok, a felhasználók száma, a memória menedzselés módja, a fájlrendszer kezelés, a nyílt rendszer elvhez, a szabványosításhoz és a licenszezési politikához való viszonyuk, illetve a készítőjük. Cél szerint megkülönböztetünk általános célú és speciális célú operációs rendszereket. Az általános célú operációs rendszereket ugyanabban az időben több céllal is használjuk. Lehet a működésük alatt programokat fejleszteni, ugyanakkor alkalmazásokat futtatni, ezek között lehetnek tranzakció feldolgozási célú alkalmazások, de lehetnek nagyobb számításokat végzők is. Tipikusan általános célú operációs rendszereket használunk egyetemi környezetben: a hallgatók és oktatók, az alkalmazottak egyidejűleg meglehetősen vegyes céllal használják a rendszereket. A speciális célú operációs rendszerek további osztályokba sorolhatók, éppen a különleges cél különbözteti meg az egyes osztályok tagjait. Lehet működtető rendszert készíteni és konfigurálni folyamatok vezérlésére (pl. vegyi üzem vagy atomerőmű), lehet tranzakció kezelésre (pl. repülőgép helyfoglalásra), kimondottan erre a célra hangolt operációs rendszereket használhatunk információ szolgáltatásra stb. Gazdag a speciális célú operációs rendszerek osztálya. Közös jellemzőjük, hogy egyetlen célt szolgálnak, a cél elérését segítő funkciói teljesítményét fokozzák, a többi funkció rovására. A folyamatszabályozó operációs rendszerekben a processzor idő ütemezése lehet a legfontosabb, általában valós idejű ütemezést használnak, a memória menedzselést viszont „lebutítják”: a virtuális memória kezelés mellőzhető. Egyszerűsítik a processz 1 kontrollt is, nem célszerű a processzek készítésére időt „pazarolni”, minden processz készüljön el a rendszer indításakor. A futó programok és a processzorok száma szerint megkülönböztetünk egy feladatos (single tasking), több feladatos (multi tasking) és több processzoros (multi processing) operációs rendszereket. Az első egy processzoros gépet képes kezelni, egyszerre egyetlen programot futtatva.
1
A processz kifejezésen itt egy futtatható program futási példányát értjük.
A több feladatos operációs rendszer ugyan egy processzort tud ütemezni, de egyidejűleg több programot is futtat kvázi párhuzamosságban. Végül a több processzoros operációs rendszer több, általában egyenrangú processzort is képes kezelni. Nyilvánvaló, hogy az ilyen rendszerben sok processz fut, rendszerint több, mint ahány processzor van a gépen. A felhasználók száma szerint egy felhasználós (single user) vagy több felhasználós (multi user) lehet egy operációs rendszer. Értelemszerű a név. Egy felhasználós operációs rendszerben a védelmi mechanizmusokat lehet egyszerűsíteni. Nem kell foglakozni a tulajdonosi kategóriákkal (azzal, hogy egyes erőforrások kinek a tulajdonában vannak), és egyszerűbbek lehetnek a hozzáférési kategóriák (pl. egy eszköz, vagy egy fájl olvasható, írható, ezen belül, hogy lehet-e hozzáfűzni, változtatni stb.) is. A memória menedzselés szerint vannak valós memória menedzselésű és virtuális memória menedzselésű operációs rendszerek. Az utóbbiakra jellemző, hogy a valós (gépbe helyezett fizikai) memóriánál sokkal nagyobb memóriát biztosítanak a futó processzek számára. Sokkal nagyobb programok futtathatók az utóbbiakon. A fájlrendszerek kezelése szerint osztályozás alapja a következő. Az operációs rendszerekhez (vagy családokhoz) a fejlesztőik rendszerint kidolgoznak egy fájlrendszert, ami szorosabban kapcsolódik az adott operációs rendszerhez. A System V Unixhoz szorosan kötődik az s5fs fájlrendszer, a BSD disztribúciókhoz az FFS (Fast File System), a DOS sajátja a FAT (File Allocation Table) fájlrendszer, A Linuxokhoz az ext2, újabban az ext3 tartozik, az OS/2 operációs rendszer fájlrendszere a HPFS (High Performance File System) volt, a Windowsoké pedig az NT-től kezdve az NTFS (New Technology File System). Bár a legtöbb mai operációs rendszer többféle fájlrendszert tud kezelni, az egye családokat (osztályokat) jellemzi a hozzájuk szorosabban kötődő fájlrendszer. A nyílt rendszer törekvéshez, a szabványosításhoz és licenszezési politikához való viszony szerint két csoportot fogunk megkülönböztetni. Vannak ingyenes operációs rendszerek, és vannak pénzes operációs rendszerek. Tudjuk, ez az osztályozás durva és igaztalan. A licenszezési politika és a szabványok követésének hajlama, továbbá a nyílt rendszer elv nem fedik egymást. Mi ebben a tárgyban két operációs rendszerrel foglakozunk, és az egyik a ingyenes, másik a pénzes osztályba tartozik. Igaz, az utóbbi nagyon elterjedt Közép Európában. Lehetne még további osztályozási szempontokat bevezetni? Hogyne, pl. a gyártó szerinti osztályokról érdemes volna beszélni, vagy az éppen említett elterjedtség szerinti osztályokról. Minden azonban nem fér be tárgyunkba.
1.4. AZ OPERÁCIÓS RENDSZEREK SZERKEZETE Megismertük az operációs rendszerek definícióját (olyan rendszer-szoftver, ami egyrészt kényelmet biztosít, mint virtuális gép, másrészt hatékonyságot biztosít, mint erőforrás menedzser), történeti kialakulásukat, osztályzási lehetőségüket. Nézzük most, mit is látunk belül, milyen struktúrájú is egy operációs rendszer?
Az operációs rendszerek strukturálását is több szempont szerint végezhetjük. Két szempontot említünk, két szempont szerinti struktúrát fogunk ismertetni. Az egyik szempont a funkció, a feladat: milyen részfunkciójú alrendszerekből áll össze egy operációs rendszer, ez adja a szerkezetet. A másik szempont a megvalósítás, a programozás: milyen programszerkezetekkel valósítják meg az egyes funkciókat. 1.4.1. Funkcionális struktúrák Minden operációs rendszerben három nagyobb funkciócsoportot megtalálhatunk, melyek jól elhatárolhatók, megkülönböztethetők. Van még egy negyedik funkciócsoport is, melybe éppen a vegyes, az előző három valamelyikébe szorosan nem tartozó funkciók tartoznak. Egyik sajátos funkciócsoport a processzek, szálak menedzseléséhez tartozó funkciók összessége. Tárgyunkban fontos absztrakció a futó program példány (processz, process, task), vagy a futó programegység (fonál, szál, thread) fogalom. Ezen entitások 2 készítésére, megszüntetésére, hozzájuk erőforrások rendelésére – ebből a processzor és az idő hozzárendelésre – a közöttük való szinkronizációra szolgál a processz kezelő alrendszer. Ezt az alrendszert természetesen tovább strukturálhatjuk: állapot nyilvántartási funkciók, ütemezési funkciók, processzek közötti kommunikációs funkciók, erőforrások használatát korlátozó kölcsönös kizárási funkciók, a processzek együttműködését segítő processz közti kommunikációkat biztosító funkciók stb. alkothatják ezt az alrendszert. Tulajdonképpen a számítógép rendszer felhasználójának másik nagyon fontos absztrakciója a fájl absztrakció. A fájl a felhasználó számára valamilyen szempontból összetartozó adatok névvel ellátott együttese. Az összetartó erő sokféle lehet: ez mondja meg a fájl típusát (szöveg-, dokumentum-, futtatható program-, kép-, hang- stb. fájl). A fájlok rendezésére, csoportosítására hierarchikus névtérben kezeljük a fájl neveket. Ehhez a könyvtár 3 (directory) fogalom, az ösvény 4 (path) fogalom, a gyökér könyvtár fogalom, a munka könyvtár fogalom ad segítséget. A hierarchikus fájl névtér egy fájlrendszert tükröz, amit egy blokkorientált (más néven strukturált) eszközön valósítottak meg. Az ösvény fogalommal a felhasználó egy fájlt tud azonosítani a fájlrendszerben. A fájlokon kívül a felhasználó az eszközöket is tudja kezelni. A fájl névtér kiegészíthető az eszköznevekkel (Windows megoldás), vagy az eszköz nevek beilleszthetők a fájl névtérbe (Unix megoldás). Mindezeket az operációs rendszer be/kiviteli alrendszere és fájl rendszereket kezelő alrendszere (közös névvel I/O alrendszer) biztosítja. A második nagy építőköve tehát az operációs rendszereknek az I/O alrendszer.
2
Entitás: fontos létező valami. Ez egy semleges elnevezés, amit azért használunk, mert bizonyos nevet túlterheltek, és használatuk félrevezető lehet. (A processz név jellegzetesen túlterhelt név, sok-sok tudományág használja. Mi adtunk már egy egyszerű definíciót rá, amit pontosítani fogunk a későbbiekben.) Itt az objektum név félrevezető lenne, a »dolog« kifejezés pedig közönséges.
3
Könyvtár (jegyzék, katalógus, mappa): olyan fájl, melyben feljegyzések vannak más fájlokról. Ezzel „szülője” más fájloknak.
4
Ösvény: szülő-gyermek kapcsolatban lévő könyvtárnevek sorozata (a sorozat utolsó tagja lehet nem könyvtár is), ami a hierarchikus névtérben egy fájl azonosítására szolgál.
A számítógépek egyik legfontosabb erőforrása a memória. A futó programok memóriát igényelnek, hogy gépi utasításaikat (a program kódot), adataikat, veremtáraikat, menedzselési adataikat tárolni lehessen. A memória igények kielégítése, összehangolása, védelme, továbbá a processzor által végrehajtott gépi utasítások címeinek, a memóriabeli adatok címeinek – ezek e címek ugyanis rendszerint logikai címek – átalakítása valós címekké az operációs rendszer fontos feladata. Ezt a feladatot az operációs rendszerek egy alrendszere, a memória menedzselő alrendszer végzi. Ez a harmadik jól elkülöníthető feladatkörrel ellátott funkcionális alrendszer bármely operációs rendszerben. Végül a funkcionális struktúra negyedik elemének a vegyes, az előző alrendszerek feladatkörébe nem sorolható szolgáltatásokat biztosító alrendszert vehetjük. Önkényesen nevezzük ezt az alrendszert vegyes szolgáltatásokat biztosító alrendszernek. Funkciói közé tartozhatnak a biztonsági és védelmi szolgáltatások, a felhasználók és csoportjainak menedzselése, egyes operációs rendszereknél a felhasználói felületek stb. 1.4.2. Programszerkezeti struktúrák Az operációs rendszer szolgáltatásait az operációs rendszer magjához tartozó, vagy futó programpéldányokhoz, processzekhez tartozó programegységek - rutinok - biztosítják. Attól függően, hogy a szolgáltató rutinok milyen nagyobb programegységbe tartoznak, különböző szerkezetűek az operációs rendszerek. Az a tény, hogy a rutinok milyen programegységekbe tartoznak, a programozási, implementációs módszerüket is meghatározzák. Mielőtt a lehetséges programszerkezeti struktúrákat tárgyalnánk, meg kell említeni a processzorok futási módja fogalmat. Korszerű processzorokra jellemző, hogy legalább két futási módjuk van. A futási módok között privilégiumi, kiváltsági, fontossági különbségek vannak. A kevésbé privilegizált mód a normál mód, más néven felhasználói mód (normal mode, user mode). A privilegizáltabb futási mód neve a védett mód, rendszer mód (kernel mode, system mode, supervisor mode stb.). A processzornak védett módban szélesebb az utasításkészlete (azaz bizonyos gépi utasításokat csak védett módban tud hiba nélkül végrehajtani) és szélesebb a címtartománya (azaz bizonyos memória címekre csak védett módban képes hiba nélkül hivatkozni). A módváltás aminek sajátos neve van: trap, csapda - feltétlenül eseményt vált ki, amit kezelni kell. A kezelő rutin pedig eldöntheti, hogy a módváltást engedélyezi-e vagy sem. A korszerű számítógép rendszerek alapvető védelmi mechanizmusa a processzor futási módjainak ellenőrzött váltási lehetősége. Az operációs rendszer szolgáltató rutinjai többnyire védett módú futást igényelnek. Monolitikus szerkezetűnek tartjuk az operációs rendszereket, amennyiben a szolgáltató rutinjaikat valamilyen programnyelven megírják (manapság a rutinok többségét magas szintű imperatív vagy objektum orientált stílusú nyelven, néhány a hardvertől nagyon függő rutint assambly nyelven), azokat fordítják (a megfelelő compiler-t használva), a tárgy modulokat egy taszképítő (linker, task builder) segédprogrammal egy betölthető (loadable), végrehajtható (executable) programmá építik. A betölthető programot elhelyezik egy rendszer-indítási eszközre, egy ilyen eszköz fájlrendszerének egy fájljába. A rendszerindítás során a betölthető program - a mag, kernel - a számítógép memóriájába kerül és a vezérlés egy belépési pontjára adódik: ez a belépési pont egy rutin belépési pontja, ezek után a rutinok egymásnak adva a vezérlést megvalósítják az operációs rendszer szolgáltatásait. Képesek a rutinok programpéldányokat indítani, azok kérelmeire szolgáltatásokkal válaszolni, megszakításokat
kezelni. A klasszikus monolitikus rendszer tehát rutinok és adattáblák együttese. Minden rutin a kernelhez tartozik. Egyes rutinokat klasszikus rutinhívási mechanizmussal lehet meghívni (call jellegű hívás szükség esetén ellenőrzött módváltással), és a veremtárba letett és onnan felvehető argumentumok átadásával lehet a hívás paramétereit átadni, más rutinok pedig megszakítás kezelőknek programozandók. A monolitikus operációs rendszerben a rutinoknak különösebb struktúrája nincs. A klasszikus monolitikus rendszer egy változata a réteges struktúrájú operációs rendszer. A szolgáltató rutinokat rétegekbe szervezik. Egy rétegbe kerülnek a valamilyen szempontból összetartozó funkciók. Az összetartó erő lehet a funkciók hasonlósága, a az egymást segítésének igénye, a hardver eszközöktől való függés távolsága. A rétegek között jól meghatározható felületek vannak, és ezeken a felületeken a rétegek funkciói szolgáltatásokat kérhetnek az alsóbb rétegektől. Alsóbb rétegnek szoktuk azokat a rétegeket nevezni, melyek funkciói jobban függenek a hardvertől. Magasabb rétegbe tartozók kevésbé függhetnek a hardvertől. A "legmagasabb réteg" éppen egy híváselosztó réteg lehet, melyet a felhasználói programok, melyek felhasználói módban futnak, a módváltási mechanizmuson keresztül szólítanak meg. A feladatuk éppen a módváltás lehetőségének ellenőrzése és a kérelmek elosztása (dispatching) szokott lenni. Egy-egy réteg funkcióit természetesen itt is fordítani kell, majd összeszerkeszteni azokat betölthető programokká. Elvileg egy-egy réteg "ki is cserélhető" a rendszerindítás során, vagy akár a rendszer élete során (vö. Dynamic Link Library, DLL programegységek). A réteges struktúrában a szolgáltató rutinokat ugyanúgy, mint a monolitikus rendszerben szokásos rutinhívással (call jelleg) vagy megszakítás generálással (kezelő, handler jelleg) hívják meg. Könnyen beláthatjuk, hogy egy szolgáltató rutin tartozhat egy futó program példányhoz, egy folyamathoz is. A monolitikus és a réteges rendszerben egy rutin egy betölthető rutincsomag része volt, ugyanabból a csomagból, de más réteghez tartozó csomagból call jelleggel meghívható volt. Ha a szolgáltató rutin processzhez tartozik, akkor processz közti kommunikációval kérhető a szolgáltatása (a processzen belül természetesen már call hívásokon át). Az operációs rendszerek fejlesztőiben megvan a törekvés, hogy minél kisebb legyen az operációs rendszer magja (a kernel: az a rutin- és adattábla csomag, amit rendszerindításkor be kell tölteni, a rendszer életében a memóriában kell tartani). Minél több szolgáltatást processzekhez tartozó rutinok biztosítsanak, minél kevesebb maradjon a magban. A legjobb lenne, ha csak a processzek közti kommunikáció és a processzek (szálak) ütemezése, utóbbinak is csak a legszükségesebb része maradna a kernelben, minden más processzekból szolgálódna ki. Ezzel elérhetnénk, hogy a kernel kicsi lenne. Milrokernel koncepció, szokták mondani e struktúra nevét. A mikrokernel koncepció támogatói azt is javasolják, hogy ráadásul amelyik funkció (vagy részfunkció) megengedi, azt ne a kernel módban futtassák, hanem a biztonságosabb felhasználói módban. Azzal, hogy a funkciók többségét processzekben valósítják meg, a rendszer rugalmasságát növelik. A kernelből kikerülő és felhasználó módban futtatható funkciók számának növekedése pedig a kockázatokat, a sebezhetőséget csökkenti. A mikrokerneles szerkezet további előnyöket kínál, főleg a hálózati sávszélességek növelésével: ha funkciók önálló processzekben szolgálnak, akkor nincs akadály annak, hogy egy-egy szolgáltató processz akár más számítógépen fusson, mint a szolgáltatást igénybevevő. A hálózatos operációs rendszerek fejlődésének nagy lökést adott a mikrokerneles paradigma. Meg kell említeni, hogy nem minden operációs rendszer mikrokerneles szerkezetű, amit a fejlesztői és árusítói ilyen néven illetnek. Lehet, hogy a név csak marketing fogás: réteges
struktúrában egy - rendszerint alacsony réteget - elneveznek mikrokernelnek, és kihasználva a hívószót, előnyt szereznek a piacon. A fenti struktúra típusok alap típusok. A valóságban tisztán monolitikus, vagy réteges, tiszta mikrokerneles struktúrájú operációs rendszer nincs, az alap szerkezeteket többé-kevésbé közelítő vegyes szerkezetek léteznek. A Unix és származékai, a Windows változatok leginkább réteges monolitikusak, azonban néhány funkciójuk (pl. a vitruális memória menedzselés részfeladata, a kilapozás) processzhez tartozó funkció.