Ugrás a tartalomhoz

Operációs rendszerek mérnöki megközelítésben

Benyó Balázs, Fék Márk, Kiss István, Kóczy Annamária, Kondorosi Károly, Mészáros Tamás, Román Gyula, Szeberényi Imre, Sziray József

Panem Kiadó

5.6. A LINUX-RENDSZER

5.6. A LINUX-RENDSZER

A Linux operációs rendszer tulajdonképpen a UNIX önálló változata, amely az elmúlt évek során egyre növekvő népszerűségre tett szert. A rendszer napjainkban is egyre inkább elterjedőben van, amit nagymértékben elősegít az a tény, hogy a különböző fejlesztési változatainak forráskódja bárkinek ingyenesen rendelkezésére áll az Interneten. Ez egyben azt is jelenti, hogy a fejlesztésekbe is szabadon kapcsolódhatnak be az abban érdekelt műhelyek, intézmények. A szabad hozzáférés lehetősége egyébként a Linux eddigi teljes történetére jellemző volt, aminek következtében az egyes változatok a világ különböző felhasználóinak és fejlesztőinek együttműködéséből jöttek létre, javarészt az Interneten keresztül történő kommunikáció révén.

Elvileg bárki installálhat egy Linux-rendszert azáltal, hogy az Internetről ftp-vel letölti a legújabb rendszerkomponenseket, majd lefordítja és összeszerkeszti őket. Ezt a munkát lényegesen megkönnyítették azok a fejlesztők, akik standard, előreszerkesztett csomagokat tettek közzé a könnyebb installálás érdekében. Az így előkészített összeállítások általában jóval többet rejtenek magukban, mint az alapkiépítésű Linux. Tipikusan olyan komponenseket is tartalmaznak, mint rendszerkezelési segédprogramok (utilityk), webkeresők, szövegfeldolgozó és szerkesztő eszközök, sőt még játékprogramok is. A legújabb megoldások szerint már külön csomagkezelő eszközök állnak rendelkezésre, a keresést megkönnyítő adatbázissal. Mindez a csomagok installálását, követését, módosítását, upgrade-olását, illetve eltávolítását segíti elő Interneten keresztül.

A Linux felhasználási jogát illetően a következő kikötések, feltételek vannak érvényben.

A Linux nem tekinthető ún. nyilvános (public-domain) szoftvernek. A public-domain megjelölés azt jelenti, hogy a szerzők nem tartanak igényt semmiféle szerzői jogra. A Linux-kód fölött azonban érvényesül a szerzőségi jog. Ugyanakkor a Linux szabad szoftver. Szabad abban az értelemben, hogy bárki lemásolhatja, módosíthatja, használhatja oly módon, ahogy neki tetszik, és továbbadhatja a saját példányait bármiféle megszorítás nélkül. A legfőbb kikötés itt az, hogy akár felhasználó, akár szerző lesz valaki, nem teheti saját tulajdonává az általa használt, vagy módosított terméket, így pénzért nem is forgalmazhatja azt. A másik kikötés az, hogy ha valaki kibocsát egy általa létrehozott példányt, akkor a bináris kódon kívül köteles a forráskódot is köz­readni.

A fentiekhez kapcsolódóan érdemesnek tartjuk még megjegyezni, hogy ugyancsak széles körben terjedt el az A. S. Tanenbaum professzor és munkatársai által kifejlesztett MINIX nevű operációs rendszer (első változata 1987-ben jelent meg), amelynek terjesztése a Linuxéhoz hasonló elvek szerint történik. A MINIX elsősorban oktatási célokra használható fel jól, valójában a UNIX kicsinyített változata. Igen alkalmas arra, hogy az operációs rendszerekkel ismerkedő informatikusok ennek a rendszernek a tanulmányozása és használata alapján mélyítsék el tudásukat. A MINIX C nyelvű forráskódja megtalálható az 1999-ben magyarul is kiadott, az operációs rendszerekkel foglakozó Tanenbaum-könyvben.* 

5.6.1. A Linux fejlődésének állomásai

A Linux fejlesztése 1991-ben vette kezdetét, amikor egy finn egyetemista, Linus Torvalds önálló kernelt írt Intel 80386 processzorra. A Linux elnevezés tőle (a saját nevéből) származik. A kernel forráskódját szintén ő tette publikussá Interneten. Fontos még megemlíteni, hogy az Intel-386 volt az első 32 bites processzor a PC-kompatíbilis CPU-k körében.

A Linux-projektekben mindvégig alapvető tervezési szempont volt a UNIX-szal való kompatibilitás, azaz a UNIX-on futó standard alkalmazások többségének futniuk kellett Linuxon is.

Az 1991-ben kibocsátott első kernel még meglehetősen korlátozott felhasználást tett lehetővé. Nem rendelkezett hálózati támogatással, csak személyi számítógépen működött, ezenkívül igen kevés perifériát támogatott, kevés készülékkezelő (device driver) állt rendelkezésre.

A Linux történetében a következő fontos állomás az 1.0 verzió volt, amelyet 1994-ben bocsátottak ki. Ez már képes volt a hálózati működtetésre, a UNIX által is támogatott TCP/IP-protokollt használta, továbbá BSD-kompatíbilis socket interfészen keresztül lehetővé tette a hálózati programozást is.

Az 1.0-s kernel már fejlett fájlkezelő rendszerrel volt ellátva, amely nagyteljesítményű diszkelérést is lehetővé tett. A virtuális memória alrendszert kiegészítették a lapkezeléssel (paging), ami a tárcserét (swapping) nagyban meggyorsította. Jóllehet ez a verzió még mindig csak Inteles PC-ken üzemelt, a hardvertámogatás tovább bővült a floppy diszkek, CD-ROM-ok kezelésével, továbbá hangkártyák, nemzetközi billentyűzetek stb. használatával.

Három közbülső verzió megjelenését követően, a következő kiugró állomás a Linux 2.0 volt, 1996-ban. Ez két területen tartalmazott lényeges előrelépést: egyrészt többfajta architektúra használatát engedte meg, beleértve a tiszta 64 bites Alpha portot is, másrészt pedig alkalmassá vált a többprocesszoros működésre. A 2.0-s verzió már futott Motorola 68000 sorozatú processzorokon, továbbá a Sun Sparc rendszereken is.

További lényeges előrelépés történt a TCP/IP-protokollkezelés teljesítményében, és számos új hálózati protokollt fogadott be a rendszer, valamint belekerült az ISDN-támogatás is.

Ugyancsak fontos javítás volt még a belső kernelszálak lehetővé tétele, ami a betölthető modulok közötti függőségkezelésére alapozva a modulok automatikus betöltésének támogatására szolgált.

5.6.2. A Linux felépítése és működése

Általános tervezési szempontból a Linux hasonlít bármelyik hagyományos UNIX-implementációhoz. Többfelhasználós, multiprogramozott rendszer a UNIX-kompatíbilis eszközök teljes készletével. Fájlrendszere a tradicionális UNIX-szervezést követi, ugyanazzal a hierarchikus könyvtári fa-struktúrával és ugyanazzal a nyelvi szemantikával. A fájlrendszer a standard UNIX-os hálózati modellt is teljes mértékben megvalósítja.

A Linux-rendszer kódja három fő részből tevődik össze, a legtöbb normál UNIX-implementációval teljes összhangban. A részek a következők:

  • Kernel: az operációs rendszer összes fontos belső funkcióját látja el, mint például a virtuális memória kezelése, vagy a folyamatkezelés.

  • Rendszerkönyvtárak: elemei azon standard funkciókat valósítják meg, amelyeken keresztül az alkalmazások együtt tudnak működni kernellel, másrészt pedig azokat a tevékenységeket látják el, amelyek nem igénylik a kernel felügyeletét.

  • Segédprogramok (utilityk): olyan programok, amelyek egyedi, speciális feladatokat látnak el. A utilityk egy része inicializálásra, valamint konfigurálásra való. Mások folyamatosan használatban lehetnek: a hálózati kapcsolatokat intézik, logon-kérést fogadnak terminálról, vagy naplózási fájlokat újítanak fel.

Az 5.46. ábrán láthatjuk a Linux-rendszer felépítését. A legfontosabb különbség a kernel és a többi komponens között, hogy a kernel a processzor privilegizált (ún. kernel) végrehajtási módjában hajtódik végre, így a kernel szabadon eléri a számítógép összes fizikai erőforrását. A kernel a Linuxban egyáltalán nem tartalmaz felhasználói módú kódot. A processzor privilegizált módba történő átkapcsolása a rendszer programozói interfészét adó rendszerkönyvtárak rutinjaiban elhelyezett rendszerhívásokkal történik.

5.46. ábra. ábra - A Linux-rendszer komponensei

A Linux-rendszer komponensei


A Linux megtartotta a UNIX tradicionális szerkezetét. Ez azt jelenti, hogy a kernel egyetlen monolitikus bináris kód. Ennek fő oka a minél nagyobb teljesítmény elérése volt. Mivel a teljes kernelkód és az adatterületek egyetlen címtérben vannak, nincs szükség környezetváltásra (context switch), amikor egy folyamat rendszerfunkciót hív meg, vagy egy megszakítás lép fel. Ezt a címteret nemcsak az ütemező és a virtuális memóriát kezelő kód használja, hanem a teljes kernelkód. Az összes készülékmeghajtó kódja, a fájlrendszer és a hálózatkezelő mind ugyanebben a címtérben találhatók.

A kernel azonban nem sűrít magába mindent, teret ad a modularitásnak is. Ugyanúgy, ahogyan a felhasználói alkalmazások futási időben be tudnak tölteni osztott elérésű könyvtárakat (run time library), a kernel is be tud tölteni kernelmodulokat futási időben. Ezek a modulok önállóan betölthető komponensei a kernelnek.

A kernel a Linux operációs rendszer magját képezi. Mindazt a funkcionalitást biztosítja, ami a folyamatok futtatásához szükséges, továbbá olyan rendszer­szolgáltatásokat nyújt, amelyek a hardver erőforrások szabályozott elérését biztosítják. Maga a Linux-kernel több lényeges ponton eltér a megszokott UNIX-kerneltől. A UNIX-kernelhez képest több extra funkció hiányzik belőle. Az általa megvalósított funkciókat pedig nem szükségszerűen ugyanabban a formában látja el, mint a tipikus UNIX-kernel.

A futó alkalmazások számára látható interfészt nem közvetlenül a kernel biztosítja. Az alkalmazások a rendszerkönyvtárakat hívják meg, amelyek szükség szerint meghívják az operációs rendszer szolgáltatásait.

A rendszerkönyvtárak legegyszerűbb funkciója, hogy lehetővé teszik az alkalmazások számára a kernel által biztosított rendszerszolgáltatások elérését. Egy rendszerhívás átkapcsolja a processzort felhasználói módból privilegizált (kernel) módba. Ennek az átváltásnak a részletei hardver architektúránként változnak.

A könyvtárak az alapvető rendszerhívásokon kívül összetett funkciókat is biztosítanak az alkalmazások számára. Például, a C nyelv fájlkezelő függvényei mind a rendszer­könyvtárakban vannak megvalósítva. Ez a fájlok elérésekor hatékonyságnövekedést eredményez. A könyvtárak olyan rutinokat is tartalmaznak, amelyek végrehajtása során nem hívódik meg a kernel. Ilyenek például a rendező algoritmusok, matematikai függvények, valamint a stringkezelő rutinok. Mindazok a funkciók, amelyek ahhoz szükségesek, hogy UNIX- vagy POSIX-alkalmazá­sokat lehessen futtatni Linux alatt, itt vannak megvalósítva.

A Linux-rendszer magában foglal még számos felhasználói módú programot, mind rendszer-segédprogramokat, mind pedig felhasználói segédprogramokat (utility). A rendszer-segédprogramok közé tartoznak mindazok a programok, amelyek a rendszer inicializálásához szükségesek, mint például a hálózati eszközöket konfiguráló, illetve a kernel modulokat betöltő programok. A folyamatosan futó szerver programok ugyancsak rendszerprogramnak számítanak. Az ilyen programok kezelik a felhasználói beléptetéseket, a bejövő hálózati kapcsolatokat, valamint a nyomtatási sorokat.

Nem mindegyik standard segédprogram lát el rendszeradminisztrációs feladatot. A UNIX felhasználói környezete nagyszámú standard segédprogramot tartalmaz olyan mindennapos feladatok ellátására, mint a könyvtárak kilistázása, fájlok mozgatása és törlése, egy fájl tartalmának megjelenítése stb. Ennél bonyolultabb segédprogramok szövegfeldolgozó funkciót tudnak ellátni, például szöveges adatok rendezése, szövegrészekre történő keresés. Ezek a segédprogramok együttesen olyan standard eszközkészletet alkotnak, amit a felhasználók bármelyik UNIX-rendszeren megtalálnak, és el is várnak. Jóllehet ezek nem végeznek operációs rendszerre háruló tevékenységet, a Linux-rendszernek is alapvetően fontos részét képezik.

A Linux többfelhasználós rendszer. Biztosítja a folyamatok párhuzamos futtatásának lehetőségét, az ehhez szükséges védelmi funkciókkal együtt. Az ütemező időosztásos. Az újonnan létrehozott folyamatok osztozhatnak a szülővel a környezetük egyes részein. Így lehetőség van többszálú programozásra (multithreaded programming). A folyamatok közötti kommuni­kációt a UNIX-ban megszokott mechanizmusok támogatják, mint például az üzenetsorok (message queue), szemaforok, osztott elérésű memória, valamint a BSD socket interfésze. A különböző hálózati protokollok egyidejűleg érhetőek el a socket interfészen keresztül.

A felhasználói felületen a Linux fájlrendszere teljes mértékben a UNIX-szemantikát alkalmazza. Belülről a Linux egy absztrakciós réteget használ a különböző fájlrendszerek kezelésére. A készülékorientált, az NFS, és a virtuális (VFS) fájlrendszert egyaránt támogatja a Linux. A készülékorientált fájlrendszerek a diszket két cache-en keresztül képesek elérni: az ún. lap cache-en (page cache), illetve a puffer cache-en (buffer cache) keresztül.

A Linux memóriakezelő rendszere támogatja az osztott memóriaelérést. Alkalmazza a copy-on-write módszert annak érdekében, hogy minimalizálja a különböző folyamatok által osztottan használt adatok duplikálását.

A memórialapokat a rendszer a rájuk történő első hivatkozáskor tölti be a fizikai memóriába. Háttértárra mentésük pedig akkor következik be, amikor a rendszer szabad memóriája egy adott szint alá kerül. Lapcserénél az átmenetileg a háttértárra mentendő memórialapot a Linux az ún. LFU-algoritmussal (LFU: Least-Frequently Used) választja ki, vagyis a többiekhez képest legritkábban használt lap kerül ki a memóriából.