Download as pdf or txt
Download as pdf or txt
You are on page 1of 340

Andrew S. Tanenbaum-Albert S.

Woodhull

Operációs
rendszerek
Tervezés és implementáció

2. kiadás

Panem
A mű eredeti címe: Operating Systems. Design and Implementation. 3rd edition.
0131429388 by Tanenbaum, Andrew S.; Woodhull, Albert S. Tartalom
Authorized translation from the English language edition
published by Pearson Education, Inc., publishing as Pearson Prentice Hall,
Copyright © 2007

Hungárián language edition Copyright © Panem Könyvkiadó Kft. 2007

A kiadásért felel a Panem Könyvkiadó Kft. ügyvezetője, Budapest, 2007

Ez a könyv az Oktatási Minisztérium támogatásával, a Felsőoktatási Tankönyv-


és Szakkönyv-támogatási Pályázat keretében jelent meg.
Előszó 11

OKTATÁSI ÉS KULTURÁLIS M INISZTÉRIUM 1. Bevezetés 15


OKM 1.1. Mi az az operációs rendszer? 17
1.1.1. Az operációs rendszer mint kiterjesztett gép 18
1.1.2. Az operációs rendszer m int erőforrás-kezelő 19
1.2. Az operációs rendszerek története 20
1.2.1. Az első generáció (1945-1955): vákuumcsövek és kapcsolótáblák 20
1.2.2. A második generáció (1955-1965): tranzisztorok és kötegelt rendszerek 21
1.2.3. Harm adik generáció (1965-1980): integrált áram körök
és m ultiprogramozás 23
1.2.4. A negyedik generáció (1980-tól napjainkig): személyi számítógépek 28
1.2.5. A M INIX 3 története 30
ISBN 978-9-635454-76-1 1.3. Az operációs rendszer fogalmai 33
1.3.1. Processzusok 34
1.3.2. Fájlok 36
1.3.3. A parancsértelm ező 39
Fordították: Alexin Zoltán, Bilicki Vilmos, Gombás Éva, Horváth Gyula, 1.4. Rendszerhívások 40
1.4.1. Processzuskezelő rendszerhívások 42
Schrettner Lajos, Tanács Attila
1.4.2. Szignálkezelő rendszerhívások 45
Lektorálta: Kató Zoltán
1.4.3. Fájlkezelő rendszerhívások 47
Szerkesztette: Dávid Krisztina
1.4.4. Könyvtárkezelő rendszerhívások 52
Tördelte a Pipaszó Bt. 1.4.5. A védelem rendszerhívásai 55
Készült a Dürer Nyomda Kft-ben, Gyulán 1.4.6. Az időkezelés rendszerhívásai 56
Felelős vezető Kovács János ügyvezető igazgató 1.5. Az operációs rendszer struktúrája 57
1.5.1. Monolitikus rendszerek 57
panem@panem.hu 1.5.2. Rétegelt rendszerek 59
www.panem.hu 1.5.3. Virtuális gépek 61
1.5.4. Exokernelek 63
1.5.5. A kliens-szerver modell 64
1.6. Könyvünk további részeinek felépítése 65
1.7. Összefoglalás 66
Minden jog fenntartva. Jelen könyvet, illetve annak részeit tilos reprodukálni,
Feladatok 66
adatrögzítő rendszerben tárolni, bármilyen formában vagy eszközzel
- elektronikus úton vagy más módon - közölni a kiadók engedélye nélkül.
6 TARTALOM TARTALOM 7

2. Processzusok 69 2.7.3. A rendszerkönyvtár megvalósítása 217


2.1. Bevezetés 69 2.8. A MINIX 3-időzítőtaszk 220
2.1.1. A processzusmodell 69 2.8.1. Időzítőhardver 220
2.1.2. Processzusok létrehozása 71 2.8.2. Időzítőszoftver 222
2.1.3. Processzusok befejezése 73 2.8.3. A M INIX 3-időzítőmeghajtó áttekintése 225
2.1.4. P rocesszushierarchiák 74 2.8.4. A M INIX 3-időzítőmeghajtó megvalósítása 230
2.1.5. Processzusállapotok 75 2.9. Összefoglalás 231
2.1.6. Processzusok megvalósítása 77 Feladatok 233
2.1.7. Szálak 79
2.2. Processzusok kommunikációja 83 3. Bevitel/Kivitel 238
2.2.1. Versenyhelyzetek 83 3.1. Az I/O-hardver alapjai 238
2.2.2. Kritikus szekciók 84 3.1.1. 1/O-eszközök 239
2.2.3. Kölcsönös kizárás tevékeny várakozással 86 3.1.2. Eszközvezérlők 240
2.2.4. Alvás és ébredés 91 3.1.3. M em órialeképezésű I/O 242
2.2.5. Szemaforok 93 3.1.4. Megszakítások 243
2.2.6. Mutexek 96 3.1.5. Közvetlen mem óriaelérés (DM A) 244
2.2.7. M onitorok 96 3.2. Az I/O-szoftver alapelvei 246
2.2.8. Üzenetküldés 100 3.2.1. Az I/O-szoftver céljai 246
2.3. Klasszikus IPC -problém ák 104 3.2.2. Megszakításkezelők 248
2.3.1. Az étkező filozófusok problém a 104 3.2.3. Eszközmeghajtók 248
2.3.2. Az olvasók és írók problém a 107 3.2.4. Eszközfüggetlen I/O-szoftver 250
2.4. Ütemezés 109 3.2.5. A felhasználói szintű I/O-szoftver 253
2.4.1. Bevezetés az ütemezésbe 109 3.3. Holtpontok 255
2.4.2. Ütem ezés kötegelt rendszerekben 114 3.3.1. Erőforrások 256
2.4.3. Ütem ezés interaktív rendszerekben 118 3.3.2. A holtpont alapelvei 257
2.4.4. Ütem ezés valós idejű rendszerekben 125 3.3.3. A strucc algoritmus 261
2.4.5. Elvek és megvalósítás 126 3.3.4. Felismerés és helyreállítás 262
2.4.6. Szálütemezés 127 3.3.5. A holtpont megelőzése 262
2.5. A MINIX 3-processzusok áttekintése 128 3.3.6. A holtpont elkerülése 265
2.5.1. A M INIX 3 belső szerkezete 129 3.4. A MINIX 3 I/O áttekintése 270
2.5.2. Processzuskezelés a M INIX 3-ban 132 3.4.1. Megszakításkezelők és I/O-elérés a M INIX 3-ban 270
2.5.3. Processzusok közötti kommunikáció a M INIX 3-ban 136 3.4.2. A M INIX 3 eszközmeghajtói 274
2.5.4. Processzusok ütemezése a M INIX 3-ban 139 3.4.3. Eszközfüggetlen I/O-szoftver a M INIX 3-ban 278
2.6. Processzusok megvalósítása MINIX 3-ban 141 3.4.4. Felhasználói szintű I/O-szoftver a M INIX 3-ban 278
2.6.1. A M INIX 3 forráskódjának szerkezete 141 3.4.5. H oltpontkezelés a M INIX 3-ban 279
2.6.2. A M INIX 3 fordítása és futtatása 144 3.5. Blokkos eszközök a MINIX 3-ban 280
2.6.3. A közös definíciós fájlok 147 3.5.1. Blokkos eszközmeghajtók áttekintése a M INIX 3-ban 280
2.6.4. A M IN IX 3 definíciós állományok 154 3.5.2. Közös blokkos eszközmeghajtó szoftver 283
2.6.5. Processzusok adatszerkezetei és definíciós állományai 163 3.5.3. A meghajtó könyvtára 287
2.6.6. A M INIX 3 indítása 173 3.6. RAM-lemezek 289
2.6.7. A rendszer inicializálása 176 3.6.1. H ardver és szoftver a RAM -lemeznél 290
2.6.8. Megszakításkezelés a M INIX 3-ban 183 3.6.2. A RAM -lemezmeghajtó áttekintése a M INIX 3-ban 291
2.6.9. Processzusok közötti kommunikáció a M INIX 3-ban 194 3.6.3. A RAM -lemezmeghajtó megvalósítása a M INIX 3-ban 293
2.6.10. Ütem ezés a M INIX 3-ban 198 3.7. Lemezek 296
2.6.11 . Hardverfüggő kernelkomponensek 202 3.7.1. Lem ezhardver 297
2 .6. 12. Kiegészítő eljárások és a kernelkönyvtár 206 3.7.2. RAID 299
2.7. A MINIX 3-rendszertaszk 209 3.7.3. Lemezszoftver 300
2.7.1. A rendszertaszk áttekintése 211 3.7.4. A M INIX 3 merevlemez-meghajtója 306
2.7.2. A rendszertaszk megvalósítása 214
8 TARTALOM TARTALOM 9

3.7.5. A m erevlem ez-m eghajtó m egvalósítása M IN IX 3-ban 310 4.7.7. Szignálkezelés 456
3.7.6. Hajlékonylemezek kezelése 319 4.7.8. Egyéb rendszerhívások 464
3.8. A terminálok 322 4.8. A MINIX 3 processzuskezelőjének implementációja 465
3.8.1. A term inálhardver 323 4.8.1. A definíciós fájlok és az adatszerkezetek 465
3.8.2. A terminálszoftver 327 4.8.2. A főprogram 469
3.8.3. A M INIX 3 term inálm eghajtójának áttekintése 337 4.8.3. A fork, az exit és a wait im plementációja 474
3.8.4. Az eszközfüggetlen term inálm eghajtó implementációja 353 4.8.4. Az exec im plementációja 476
3.8.5. A billentyűzetmeghajtó megvalósítása 372 4.8.5. A brk im plementációja 480
3.8.6. A képernyőmeghajtó megvalósítása 380 4.8.6. A szignálkezelés im plementációja 480
3.9. Összefoglalás 389 4.8.7. A többi rendszerhívás im plementációja 489
Feladatok 390 4.8.8. A memóriakezelés segédeljárásai 492
4.9. Összefoglalás 493
4. Memóriagazdálkodás 395 Feladatok 494
4.1. Alapvető memóriakezelés 396
4.1.1. M onoprogramozás csere és lapozás nélkül 396 5. Fájlrendszerek 499
4.1.2. M ultiprogramozás rögzített m éretű partíciókkal 397 5.1. Fájlok 500
4.1.3. Relokáció és védelem 398 5.1.1. Fájlnevek 500
4.2. Csere 400 5.1.2. Fájlszerkezet 502
4.2.1. M emóriakezelés bittérképpel 402 5.1.3. Fájltípusok 503
4.2.2. M emóriakezelés láncolt listákkal 403 5.1.4. Fájlelérés 505
4.3. Virtuális memória 405 5.1.5. Fájlattribútum ok 506
4.3.1. Lapozás 405 5.1.6. Fájlműveletek 507
4.3.2. Laptáblák 409 5.2. Könyvtárak 509
4.3.3. TLB - címfordítási gyorsítótár 413 5.2.1. Egyszerű könyvtárszerkezet 509
4.3.4. Invertált laptáblák 415 5.2.2. Hierarchikus könyvtárszerkezet 511
4.4. Lapcserélési algoritmusok 417 5.2.3. Útvonal megadása 511
4.4.1. Az optimális lapcserélési algoritmus 417 5.2.4. Könyvtári m űveletek 514
4.4.2. Az N R U lapcserélési algoritmus 418 5.3. Fájlrendszerek megvalósítása 515
4.4.3. A FIFO lapcserélési algoritmus 419 5.3.1. Fájlrendszerszerkezet 515
4.4.4. A második lehetőség lapcserélési algoritmus 420 5.3.2. Fájlok megvalósítása 517
4.4.5. Az óra lapcserélési algoritmus 420 5.3.3. Könyvtárak megvalósítása 521
4.4.6. Az L R U lapcserélési algoritmus 421 5.3.4. Lem ezterület-kezelés 527
4.4.7. Az LR U szoftveres szimulációja 422 5.3.5. Fájlrendszerek megbízhatósága 530
4.5. A lapozásos rendszerek tervezési szempontjai 424 5.3.6. Fájlrendszer hatékonysága 537
4.5.1. A munkahalmaz modell 424 5.3.7. Naplózott fájlrendszer 542
4.5.2. Lokális vagy globális helyfoglalás 426 5.4. Biztonság 543
4.5.3. Lapm éret 429 5.4.1. Biztonsági környezet 544
4.5.4. Virtuális m em ória interfész 430 5.4.2. Általános biztonság elleni támadások 549
4.6. Szegmentálás 431 5.4.3. Tervezési elvek a biztonság érdekében 550
4.6.1. A tiszta szegmentálás im plementációja 434 5.4.4. Felhasználó azonosítása 550
4.6.2. Szegmentálás lapozással: Intel Pentium 435 5.5. Védelmi mechanizmusok 555
4.7. A MINIX 3 processzuskezelője 439 5.5.1. Védelmi tartom ányok 555
4.7.1. A memória szerkezete 441 5.5.2. Hozzáférést vezérlő listák 557
4.7.2. Üzenetkezelés 444 5.5.3. Képességi listák 560
4.7.3. A processzuskezclő adatszerkezetei és algoritmusai 446 5.5.4. R ejtett csatornák 563
4.7.4. A fork, az exit és a wait rendszerhívás 451 5.6. A MINIX 3 fájlrendszere 566
4.7.5. Az exec rendszerhívás 452 5.6.1. Ü zenetek 567
4.7.6. A brk rendszerhívás 456 5.6.2. A fájlrendszer felépítése 568
10 TARTALOM

5.6.3. A bittérképek
5.6.4. Az i-csomópontok
572
574 Előszó
5.6.5. A blokkgyorsítótár 576
5.6.6. Könyvtárak és elérési utak 578
5.6.7. Az állományleírók 581
5.6.8. Fájlzárolás 583
5.6.9. Adatcsövek és speciális fájlok 583
5.6.10. Egy példa: a read rendszerhívás 585
5.7. A MINIX 3 fájlrendszerének megvalósítása 586
5.7.1. Definíciós állományok és globális adatszerkezetek 587
5.7.2. A táblák kezelése 591
5.7.3. A főprogram 600
5.7.4. Egyedi fájlokon végzett műveletek 604
5.7.5. Könyvtárak és elérési utak 614
5.7.6. További rendszerhívások 619 Az operációs rendszerekről szóló kézikönyvek többsége az elm életet hangsúlyoz­
5.7.7. Az I/O-eszközcsatoló 621 za és kevésbé a gyakorlatot. Könyvünk megkísérli a kettő egyensúlyban tartását.
5.7.8. Egyéb rendszerhívások 626
Nagy részletességgel tárgyalja az összes alapvető fogalmat, melyek között m egta­
5.7.9. Fájlrendszer-segédeljárások 628
5.7.10. Egyéb M INIX 3-komponensek 629 lálhatók a processzusok, processzusok kommunikációi, szemaforok, monitorok,
5.8. Összefoglalás 630 üzenetváltás, ütemezési algoritmusok, bem enet-kimenet, holtpont, eszközvezér­
Feladatok 631 lők, memóriakezelés, lapozási algoritmusok, fájlrendszerek, biztonság és véde­
lem módszerei. Em ellett részletesen ism ertetünk egy Unix-kompatibilis konkrét
6. További irodalom 635 rendszert is, a M INIX 3-at, melynek teljes forráskódját is rendelkezésre bocsát­
6.1. Ajánlott irodalom 635 juk tanulmányozás céljából. Ez a szerkezet biztosítja, hogy az olvasó ne csak a fo­
6.1.1. Bevezetés és általános tém ájú m unkák 635 galmakat tanulja meg, hanem azt is, hogyan használhatók ezek valódi operációs
6.1.2. Processzusok 638 rendszerekben.
6.1.3. Bevitel/kivitel 638 Könyvünk első, 1987-es kiadása szinte forradalmasította az operációsrendszer­
6.1.4. M emóriakezelés 639 kurzusok oktatását. Addig a kurzusok java része csak elmélettel foglalkozott.
6.1.5. Fájlrendszerek 640
A M INIX megjelenésével sok egyetem gyakorlati foglalkozásokat is bevezetett, eze­
6.2. Betűrendes irodalomjegyzék 642
ken a hallgatók egy valódi operációs rendszer belső működését vizsgálhatták. Ezt a
törekvést nagyon kívánatosnak véljük, és reméljük, hogy ez a tendencia folytatódik.
Függelék 649
F.l. A MINIX 3 telepítése 649 A M INIX az első tíz évben sokat változott. Eredetileg a 256 K-s 8088-alapú
F .l.l. Előkészület 649 IBM PC-re terveztük, csupán két hajlékonylemezzel, merevlemez nélkül. Ez a
F.1.2. Rendszerindítás 651 Unix 7-es verzióján alapult. Az idők során a M INIX több irányban is fejlődött: tá­
F.1.3. Telepítés a merevlemezre 652 m ogatta a 32 bites védett módú, nagy memóriával és nagy kapacitású merevlemez­
F.l.4. Tesztelés 654 zel ellátott gépeket. A korábbi Unix 7-es verzió helyett a POSIX nemzetközi szab­
F.l-5. Szimulátor használata 657 vány lett az alapja (IE E E 1003.1 és ISO 9945-1). Sok új tulajdonság is beépült,
F.2. A MINIX 3 forráskódja - CD melléklet 657 megítélésünk szerint túlságosan is sok, mások szerint viszont kevés. Ez vezetett
F.3. Fájlmutató 659 végül a Linux megszületéséhez. A M INIX-et sok más platform ra is átvitték, töb­
bek között fut Macintosh-, Amiga-, Atari- és SPARC-gépeken. Könyvünk előző,
Tárgymutató 661 1997-ben megjelent második kiadását, amely ezt a rendszert tárgyalta, széles kör­
ben használták az egyetemeken.
A M INIX népszerűsége töretlen, amit a Google kereső M INIX-találatainak
száma is mutat.
A harm adik kiadás sok változtatáson m ent keresztül. Az elméleti anyag java ré­
szét átdolgoztuk, és elég sok újdonság is bekerült. A legnagyobb változás azonban
az új, M INIX 3 nevű rendszer tárgyalásában van, beleértve az új forráskód közre­
12 ELŐSZÓ ELŐSZÓ 13

adását is. Bár a M INIX 3, ha nem is túl szorosan, a M INIX 2-re épül, több kulcs- következő honlapon követhetik a témákat: http://groups.google.com/group/comp.
fontosságú kérdésben alapvetően különbözik tőle. os.minix.
A M INIX 3 tervezését az a megfigyelés ösztönözte, hogy az operációs rendsze­ A M INIX 3 merevlemezre telepítése helyett akár a manapság elérhető PC-
rek egyre inkább túlm éretezetté, lassúvá és megbízhatatlanná válnak. Más elekt­ szimulátorokon is futtathatjuk a rendszert. Néhány ilyen szimulátort a honlap fő­
ronikus eszközökkel, televízióval, mobiltelefonnal, DVD-lejátszóval összehason­ oldalán fel is soroltunk.
lítva sokkal többször omlanak össze működés közben, és rengeteg olyan funk­ Rendkívül szerencsésnek m ondhatjuk m agunkat azért a sok segítségért, amit
cióval és beállítási lehetőséggel rendelkeznek, amelyeket gyakorlatilag senki sem a m unkánk során másoktól kaptunk. M indenekelőtt Ben Gras és Jorrit H erder
képes teljesen megismerni vagy jól kezelni. M indem ellett a számítógépes vírusok, végezte az új változat programozási feladatainak nagy részét. Nagyszerű munkát
férgek, kémprogramok, kéretlen reklámlevelek és a kártékony program ok más végeztek a szoros határidő mellett, beleértve e-mailek megválaszolását sokszor jó ­
formái „járványszerű” m éreteket öltöttek. val éjfél után is. Átolvasták a könyv kéziratát is, és sok hasznos megjegyzésük volt.
Ezen problém ák jó része nagymértékben a mai operációs rendszerek egy alap­ Legmélyebb megbecsülésünk mindkettőjüknek.
vető tervezési hibájából, a modularitás hiányából fakad. A teljes operációs rend­ Kees Bot szintén nagy segítséget nyújtott az előző változatokhoz, jó alapot biz­
szer egyetlen nagy, masszív kernel m ódban futó program, amelynek forráskódja tosítva a további munkához. Kees sok kódrészt írt a 2.0.4 verzióig, hibákat javított,
tipikusan több millió C /C + + sorból áll. A több millió sorban akár egyetlen hiba is és számtalan kérdésre válaszolt. Philip Hom burg írta a hálózati kód nagy részét,
az egész rendszer hibás m űködését eredményezheti. A teljes kód hibamentességét valamint számtalan egyéb hasznos m ódon segített, különösen a kézirathoz készí­
elérni lehetetlen, különösen ha figyelembe vesszük, hogy ennek körülbelül 70%-a tett részletes véleményével.
olyan meghajtóprogramokból áll, amelyeket külső cégek fejlesztenek, az operá­ Sokan, túl sokan ahhoz, hogy itt felsoroljuk őket, írtak kódrészeket m ár a leg­
ciós rendszer karbantartóinak hatáskörén kívül. korábbi változatokhoz is, ezzel segítve a M INIX elindulását. Oly sokan voltak és
A M INIX 3-rendszerrel bem utatjuk, hogy ez a monolitikus tervezés nem az olyan sokféleképpen működtek közre, hogy itt még csak felsorolásuk sem lehetsé­
egyetlen lehetőség. A M INIX 3 magja csak egy körülbelül 4000 soros futtatható ges, ezért ezúton m ondunk köszönetét mindannyiuknak.
kódból áll, nem milliókból, mint a Windows, a Linux, a Mac OS X vagy a FreeBSD Többen átolvasták a kézirat egyes részeit és javaslatokat fűztek hozzá. Gojko
esetében. A rendszer többi része, beleértve a m eghajtóprogram okat is (az óra Babic, Michael Crowley, Joseph M. Kizza, Sam Kohn Alexander Manov és Du
m eghajtóprogram kivételével), kicsi, moduláris felhasználói m ódban működő Zhang fogadják külön köszönetünket.
processzusok gyűjteménye, amelyek mindegyike esetében szigorúan korlátozott, Végül a családjainknak szeretnénk köszönetét mondani. Suzanne tizenhatszor,
hogy mit tehet és melyik másik processzusokkal kommunikálhat. B arbara tizenötször, Marvin tizennégyszer olvasta át eddig könyvünket. Bár ez
Bár a M INIX 3 fejlesztése jelenleg is zajlik, hiszünk abban, hogy a nagymérték­ m ár kezd gyakorlattá válni, a szeretet és a segítségnyújtás még inkább méltányo­
ben egységbe zárt, felhasználói m ódban futó processzusok összességeként felépülő landó. (AST)
operációsrendszer-modell megbízhatóbb operációs rendszerek m egalkotását ígéri. A1 felesége, B arbara m ásodjára esik át ezen. Támogatása, türelm e és jó hum ora
A M INIX 3 különösen a kisebb PC-ket helyezi a középpontba, amilyenek általá­ nélkülözhetetlen volt. G ordon türelm es hallgatóság volt. Még most is felemelő az
nosan m egtalálhatók a harmadik világ országaiban, illetve beágyazott rendszerek­ érzés, hogy egy fiú érti és figyel azokra a dolgokra, amik az apját érdeklik. Végül,
ben, ahol az erőforrások mindig korlátozottak. M indenesetre ez a tervezési mód m ostohaunokám , Zain születésnapja egybeesik a M INIX 3 kiadási dátumával.
sokkal egyszerűbbé teszi a hallgatók számára az operációs rendszer m űködésének Egy nap ezt még értékelni fogja. (ASW)
megértését, m intha egy nagy monolitikus rendszert kellene tanulmányozniuk. Andrew S. Tanenbaum (AST)
A könyvhöz tartozó C D -R O M m elléklet egy élő CD. A CD-ROM -m eghajtóba A lbert S. Woodhull (ASW)
helyezve és a gépet újraindítva pár másodperc után megjelenik a M INIX 3 beje­
lentkező parancssora. Rendszergazdaként (root) bejelentkezve kipróbálhatjuk a
rendszert anélkül, hogy a merevlemezre telepítenénk. Természetesen a merevle­
mezre telepítés is lehetséges. A telepítés részletes leírása m egtalálható a Függe­
lékben.
M int fentebb említettük, a M INIX 3 gyorsan fejlődik, új változatok gyakran
jelennek meg. Az aktuális, CD lemezre írható képfájl letölthető a hivatalos hon­
lapról: www.minix.org. Ezen a helyen találunk még nagy mennyiségű új szoftvert,
dokum entációt és híreket a M INIX 3 fejlesztéséről. Rendelkezésre áll egy tém a­
csoport a USENET-en, a comp.os.minix, ahol M INIX 3 témájú eszmecserére, il­
letve kérdésekre van lehetőség. Akiknek nincs témacsoport-olvasó szoftverük, a
1. Bevezetés

Szoftver nélkül a számítógép valójában egy haszontalan vasdarab. Szoftvertámo­


gatással azonban a számítógép képes információt tárolni, feldolgozni és vissza­
keresni; zenét és videót lejátszani; elektronikus levelet küldeni, az interneten
kutatni; és a fenntartását számos más értékes tevékenységgel megszolgálni. A
számítógépszoftverek durván két csoportra oszthatók: rendszerprogram ok, am e­
lyek a számítógép saját m űködését szervezik, és felhasználói programok, amelyek
a felhasználó kívánságának megfelelő tényleges m unkát végzik. A legalapvetőbb
rendszerprogram az operációs rendszer, amely a számítógép erőforrásait kezeli és
az alapot biztosítja a felhasználói program ok írásához. Könyvünk tém ája az ope­
rációs rendszerek tárgyalása. Pontosabban megfogalmazva a M INIX 3 operációs
rendszert használjuk m odellként a tervezési alapelvek és a tényleges im plem entá­
ció bem utatására.
Egy m odern számítógépes rendszer egy vagy több processzorból, belső m e­
móriából, lemezekből, nyomtatókból, hálózati csatolókból és más bem eneti-ki­
m eneti (B/K - Input/O utput, I/O) eszközökből áll. Azaz egy összetett rendszer.
Olyan program ot írni, amely mindezeket a kom ponenseket nyomon követi, helye­
sen, sőt optimálisan használja, rendkívül nehéz feladat. H a m inden program ozó­
nak azzal kellene foglalkoznia, hogy a lemezmeghajtók hogyan működnek, hány
tucat dolog lehet sikertelen mialatt egy lemezblokkot olvas, akkor valószínűtlen,
hogy sok program ot egyáltalán megírtak volna.
M ár sok évvel ezelőtt kétségtelenül világossá vált, hogy meg kell találni annak a
módját, hogy megvédjük a program ozókat a hardver bonyolultságától. A fokoza­
tosan kifejlesztett módszer az, hogy a nyers hardver fölé egy szoftverréteget helye­
zünk, amely a teljes rendszert kezeli és a felhasználó számára egy olyan kapcsoló­
dási felületet vagy virtuális gépet alkot, amelyet könnyebb megismerni és progra­
mozni. Ez a szoftverréteg az operációs rendszer.
Az operációs rendszer helyét az 1.1. ábra mutatja. Legalul van a hardver, amely
sok esetben maga is két vagy több szintből (vagy rétegből) áll. Ez a legalsó réteg
tartalm azza az integrált áramköri lapkákból épülő fizikai eszközöket, huzalozást,
áramellátást, katódcsöveket és hasonló fizikai eszközöket. Ezek tervezése és mű­
ködése azonban m ár a villamosmérnökök területe.
16 1.BEVEZETÉS 1.1. Ml AZ AZ OPERÁCIÓS RENDSZER? 17

tőket és a hasonló, alkalmazásoktól független program okat. Fontos tudnunk, hogy


Repülőjegy­
Banki Web­ Felhasználói programok ezek a program ok semmiképpen sem az operációs rendszer részei, bár általában
foglalási
rendszer böngésző
rendszer a számítógépgyártótól származnak a gépre előre telepítve vagy az operációs rend­
Szöveg- Parancs-
szerrel egy csomagban, ha a telepítésre a vásárlás után kerül sor. Ez döntő, de
Fordítók szerkesztők értelmező kényes kérdés. Az operációs rendszer (általában) a szoftvernek az a része, amely
Rendszerprogramok
kernel módban vagy felügyelt módban fut. Ezeket hardver védi a felhasználói kon­
Operációs rendszer
tárkodástól (eltekintve néhány öregebb mikroprocesszortól, amelyeknek hardver­
Gépi nyelv védelme egyáltalán nincs). A fordítók, szövegszerkesztők felhasználói módban
futnak. H a egy felhasználónak nem tetszik egy adott fordító, nyugodtan m egírhat­
Mikroarchitektúra Hardver
ja a sajátját, ha úgy dönt; de nem írhat saját óramegszakítás-kezelőt, amely az ope­
rációs rendszer része, és amelyet általában hardver véd a felhasználók módosítási
Fizikai eszközök
kísérleteivel szemben.
Ez a különbség azonban elmosódik néhány beágyazott rendszer esetében (ahol
1.1. ábra. Egy számítógépes rendszer hardverből, rendszerprogramokból és felhasználói nem érhető el kernel mód) vagy értelmezőprogram mal futtatott rendszerben
programokból áll (amilyenek például azok a Java-alapú rendszerek, ahol a kom ponensek szétvá­
lasztására értelm ezőt használnak a hardver helyett). Hagyományos számítógépek
A következő a m ikroarchitektúra szint, ahol a fizikai eszközöket működési egysé­ esetében az operációs rendszer azonban mégis az, ami kernel m ódban fut.
gekké csoportosítják. Ez a szint tipikusan tartalmaz belső CPU- (központi vezérlő- Sok rendszer esetében azonban vannak olyan felhasználói m ódban futó prog­
egység) regisztereket és aritmetikai-logikai egységet magában foglaló adatútvonalat. ramok is, amelyek az operációs rendszer m űködését segítik, vagy privilegizált fel­
Minden órajelciklusban egy vagy két operandus kerül betöltésre a regiszterekből, adatot hajtanak végre. Például gyakran elérhető olyan program, amely lehetővé
melyeket azután az aritmetikai-logikai egység dolgozza fel (például összeadás vagy teszi a felhasználó számára a jelszó megváltoztatását. Ez a program nem része az
logikai ÉS művelet). Az eredmény egy vagy több regiszterben tárolódik. Bizonyos operációs rendszernek és nem kernel m ódban fut, de egyértelműen érzékeny m ű­
gépeken az adatútvonal működését szoftver irányítja, melyet mikroprogramnak hí­ veletet hajt végre, amit speciális m ódon kell védeni.
vunk. Más gépeken ezt az irányítást közvetlenül a hardveráramkörök végzik. Bizonyos rendszerekben, amilyen a M INIX 3 is, ez az ötlet a végletekig fokozó­
Az adatútvonal célja utasítások egy halm azának a végrehajtása. Ezek közül né­ dik, és olyan részek, amelyek hagyományosan az operációs rendszer részét képe­
hány végrehajtható egy adatútvonal-ciklus alatt, mások több ciklust igénylenek. zik (amilyen a fájlrendszer), felhasználói szinten futnak. Ezekben a rendszerekben
Ezek az utasítások regisztereket és más hardveres lehetőségeket használhatnak nehéz egyértelmű határvonalat húzni. Minden, ami kernel módban fut, nyilván­
fel. Az assembly nyelven programozók számára elérhető hardver és az utasítások valóan az operációs rendszer része, de néhány ezen kívül futó program is vitatha­
együttesen alkotják az utasításkészlet-architektúrát (ISA). Ezt a szintet gyakran tatlanul része, vagy legalábbis szorosan kapcsolódik hozzá. A M INIX 3 esetében
gépi nyelvnek hívják. például a fájlrendszer egyszerűen egy nagy, felhasználói m ódban futó C program.
A gépi nyelv általában 50 és 300 közötti utasítást tartalm az, többségük a gé­ Végül a rendszerprogram ok fölé épülnek a felhasználói programok. Ezeket a
pen belüli adatmozgatásokra, aritmetikai és összehasonlító m űveletekre szolgál. program okat a felhasználók vásárolják vagy írják saját problém áik megoldására,
Ezen a szinten a bem eneti-kim eneti eszközöket vezérlik oly módon, hogy speciális ilyenek a szövegszerkesztés, táblázatkezelés, m érnöki számítások vagy informá­
eszközregisztereket értékekkel töltenek fel. Például a lemezolvasásra úgy utasít­ ciók tárolása adatbázisban.
hatjuk a lemezvezérlőt, hogy regisztereit feltöltjük a lemezeim, belsőmemória-
cím, bájtszám és irány (olvasás vagy írás) értékeivel. Ténylegesen még sok egyéb
param éter is szükséges a végrehajtáshoz, továbbá a művelet befejeztével vissza­
adott állapotjelző is bonyolult lehet. Sok I/O- (bemeneti/kim eneti) eszköz eseté­ 1.1. Mi az az operációs rendszer?
ben még az időzítés is jelentős szerepet kap a programozásban.
Az operációs rendszer egyik fő feladata az összes ilyen bonyolultság elrejtése A legtöbb számítógép-felhasználó szert tett m ár némi operációs rendszerekben
és a programozó számára egy kényelmesebb utasításkészlet biztosítása. Például a tapasztalatra, mégis nehéz pontosan leszögezni, mi is az az operációs rendszer.
read block from file fogalmilag egyszerűbb, mint annak a részletein gyötrődni, hogy a A problém a egyik része az, hogy az operációs rendszer két, alapjában különbö­
lemezfejeket mozgassuk, várjuk, hogy azok a helyükre érjenek, és így tovább. ző feladatot, a gép kiterjesztését és az erőforrások kezelését látja el, és attól füg­
Az operációs rendszer felett van a rendszerszoftver m aradék része. Itt találjuk gően, hogy ki beszél róla, többnyire csak az egyik vagy a másik funkcióról hallunk.
a parancsértelm ezőt (shell), az ablakkezelő rendszert, fordítókat, szövegszerkesz- Nézzük most mindkettőt.
18 1. BEVEZETÉS 1.1. Ml AZ AZ OPERÁCIÓS RENDSZER? 19

1.1.1. Az operációs rendszer mint kiterjesztett gép Ebből a nézőpontból az operációs rendszer feladata az, hogy a felhasználónak
egy olyan egyenértékű kiterjesztett gépet vagy virtuális gépet nyújtson, amelyiket
Am int m ár korábban em lítettük, a legtöbb számítógép architektúrája (utasí­ egyszerűbb programozni, mint a mögöttes hardvert. Könyvünk annak részleteit
táskészlet, memóriaszervezés, I/O-rendszer, sínstruktúra) a gépi nyelv szintjén tanulmányozza, hogy mindezt hogyan teljesíti az operációs rendszer. Dióhéjban
primitív és a programozása, különösen a bevitel/kivitel, kényelmetlen. Hogy ezt összefoglalva az operációs rendszer különféle szolgáltatásokat nyújt, amelyeket
világossá tegyük, röviden tekintsük át, hogyan történik a hajlékonylemez I/O a a program ok speciális, rendszerhívásoknak nevezett utasítások segítségével ér­
NEC PD765-kompatibilis vezérlőlapkán (chipen), amelyet sok Intel-alapú szemé­ hetnek el. Néhány gyakrabban használt rendszerhívást a fejezet további részében
lyi számítógépben használnak. (A „hajlékonylemez” és a „diszkett” kifejezéseket meg fogunk vizsgálni.
könyvünkben végig azonos értelem ben használjuk.) A vezérlő 16 utasítással ren­
delkezik, mindegyikük 1 és 9 bájt közötti értéket tölt egy eszközregiszterbe. Az
utasítások adatok olvasására, írására, a lemezfejck mozgatására, a pályák formázá­ 1.1.2. Az operációs rendszer mint erőforrás-kezelő
sára, továbbá a vezérlő és a meghajtók inicializálására, érzékelésére, alaphelyzetbe
állítására és bem érésére szolgálnak. A „felülről lefelé” nézőpontból az operációs rendszer elsősorban egy kényelmes
A két alapvető utasítás a read és write, m indkettőhöz 13 param éter szükséges, csatlakozási felület a felhasználók számára. A másik, „alulról felfelé” nézőpont
melyek 9 bájton vannak elrendezve. Ezek a param éterek adják meg az olyan m e­ azt tartja, hogy az operációs rendszer azért van, hogy az összetett rendszer min­
zőket, mint a beolvasandó lemez blokkcíme, a pályánkénti szektorok száma, a den egyes részét kezelje. A m odern számítógépek processzorokból, m em óriák­
fizikai hordozón alkalmazott tárolási mód, a szektorok közötti hézag m érete, és ból, órákból, lemezekből, egerekből, hálózati csatolókból, nyomtatókból és egyéb
hogy mi a teendő egy „törölt adat címe” jelzéssel. Ne bánkódjunk amiatt, ha nem eszközök bő választékából állnak. Az utóbbi nézőpont szerint az operációs rend­
értjük ezeket a mély értelm ű dolgokat; éppen az a lényeg, hogy ez m eglehetősen szer feladata az, hogy a különböző, a processzorokért, a m em óriáért és az I/O-
titokzatos. Amikor a művelet befejeződött, a vezérlő visszaad 23 állapot- és hiba­ eszközökért versenyző program ok számára szabályos és felügyelt m ódon biztosít­
mezőt, 7 bájton elrendezve. H a még ez sem lenne elég, a program ozónak arra is sa ezeket.
állandóan ügyelnie kell, hogy a m otor jár, vagy nem. H a a m otor ki van kapcsolva, Képzeljük el, mi történne, ha három, ugyanazon a számítógépen futó program
be kell kapcsolni (hosszú felpörgésre való várakozással), m ielőtt adatot olvasha­ egyidejűleg ugyanazon az egy nyomtatón próbálná kinyomtatni eredményeit. Az
tunk vagy írhatunk. De a m otort nem lehet túl sokáig bekapcsolva hagyni, m ert a első néhány sor az 1 . programtól, a következő néhány a 2. programtól, azután va­
diszkett elkopik. így a programozó arra kényszerül, hogy foglalkozzék a hosszú lamennyi a 3. program tól származna, és így tovább. Az eredmény káosz. Az operá­
felpörgési idő és a diszkett kopása (és a rajta lévő adatok elvesztése) közötti vá­ ciós rendszer tud rendet terem teni az esetleges káoszban azzal, hogy a nyom tatóra
lasztás dilemmájával. irányított minden eredményt átmenetileg tárol a lemezen (spooling). Am ikor egy
Anélkül, hogy a valódi részletekbe mennénk, tisztában kell lennünk azzal, program befejeződött, az operációs rendszer az eredményeit átmásolja a nyomta­
hogy egy átlagos programozó nem akar túl mélyen belem erülni a hajlékonylemez tóra abból a lemezállományból, ahol tárolta, miközben a többi program folytat­
program ozásába (sem a merevlemezébe, amelyik legalább olyan bonyolult és egé­ hatja saját eredményeinek előállítását, figyelmen kívül hagyva azt a tényt, hogy az
szen más). Ehelyett a programozó egy egyszerű, magas szintű absztrakcióval akar eredmény valójában (még) nem a nyom tatóra megy.
foglalkozni. A lemez esetében egy szokásos absztrakció lehet az, hogy a lemez H a a számítógépen (vagy a hálózaton) több felhasználó van, még inkább szük­
névvel ellátott állományok gyűjteményét tárolja. M inden állomány megnyitha­ ség van a memória, az I/O-eszközök és más erőforrások kezelésére és védelmére,
tó olvasásra vagy írásra, ezután olvasható vagy írható, végül lezárandó. Az olyan m ert enélkül a felhasználók zavarhatnák egymást. Ezenfelül a felhasználók gyak­
részletek, hogy a tárolás vajon a m ódosított frekvenciamodulációt alkalmazza-e, ran nemcsak a hardveren, de információkon (állományok, adatbázisok stb.) is osz­
és hogy a m otor aktuális állapota milyen, nem jelenhetnek meg a felhasználó szá­ toznak. Röviden ebből a nézőpontból az operációs rendszer elsőrendű feladata,
m ára nyújtott absztrakcióban. hogy nyilvántartsa, ki melyik erőforrást használja, hogy teljesítse az erőforráskéré­
Az a program, amelyik a programozó elől elrejti a valódi hardvert, és egy egy­ seket, hogy mérje a használatot, és hogy a különböző programok és felhasználók
szerű képet ad a névvel ellátott, olvasható és írható állományokról, term észetesen ellentmondásos kéréseit egyeztesse.
az operációs rendszer. Ugyanúgy, ahogy az operációs rendszer a lemezhardvertől Az erőforrás-kezelés az erőforrások kétféle megosztását foglalja magában: az
védi meg a program ozót és nyújt egy egyszerű állom ányorientált kapcsolatot, ké­ időalapút és a téralapút. Az időosztásos erőforrásokat a különböző program ok
pes elrejteni sok nemkívánatos foglalatosságot a megszakítások, az időzítések, a vagy felhasználók felváltva használják. Először az egyikük kapja meg, majd egy
memóriaszervezés és más alacsony szintű tulajdonság kezelése kapcsán. M inden másikuk, és így tovább. Például ha egy CPU-n egyszerre több program is fut, ak­
esetben az operációs rendszer által nyújtott abszrakció egyszerűbb és könnyebben kor azt az operációs rendszer először az egyik program nak osztja ki, majd mikor
használható, mint a mögötte lévő hardver. az m ár elég ideig futott, egy másik kapja meg, majd egy újabb, majd egyszer csak
20 1.BEVEZETÉS 1.2. AZ OPERÁCIÓS RENDSZEREK TÖRTÉNETE 21

újra az első. Az időosztás mikéntje, vagyis hogy ki következzen és mennyi ideig, az Advanced Study, Princeton), J. Presper Eckert és John William Mauchley (Uni-
operációs rendszer feladata. Egy újabb időosztásos példa a nyomtató megosztása. versity of Pennsylvania), K onrad Zuse (Németország) számológépek építésében
Am ikor több nyomtatási feladat is összegyűlik egy nyomtatóra, el kell dönteni, értek el sikereket. Az első gépek mechanikus reléket használtak, de túlságosan
hogy melyik nyomtatása következzen. lassúak voltak, egy-egy ciklus másodpercekig tartott. A reléket később vákuum­
A másik fajta megosztás a téralapú megosztás. A felváltott használat helyett csövek váltották fel. Ezek a gépek hatalm asak voltak, egész term eket betöltötték
itt mindenki kap egy részt az erőforrásból. Például a központi m em ória normál több tízezer vákuumcsővel, de mégis több milliószor lassabbak voltak, mint a ma
esetben fel van osztva számos futó program között, így mindegyikük egyszerre használatos legolcsóbb személyi számítógépek.
lehet rezidens (például a CPU felváltva történő felhasználásához). Feltételezve Ezekben a korai időkben m inden egyes gépet egy külön csapat tervezett, épí­
azt, hogy elegendő m emória áll rendelkezésre több program számára is, sokkal tett, programozott, kezelt és végezte a karbantartását. Abszolút gépi nyelven folyt
hatékonyabb ezeket a m em óriában tartani, mint a teljes m em óriát egynek kiosz­ a programozás, gyakran az alapvető funkciók vezérlésére kapcsolótáblákat huza-
tani, különösen ha annak csak kis részére van szüksége. Természetesen ez felveti a loztak. A programozási nyelvek (még az assembly nyelv is) ism eretlenek voltak.
korrektség, a védelem és egyebek kérdéseit, amiket az operációs rendszernek kell Senki sem hallott még ekkor operációs rendszerekről. A programozók szokásos
megoldania. Egy másik térosztásos erőforrás a (merev)lemez. Sok rendszerben munkamódszere az volt, hogy feliratkoztak a falon függő beosztástáblán egy időin­
egyetlen lemez képes sok felhasználó állományait egyidejűleg tárolni. A lem ezte­ tervallumra, azután lejöttek a gépterem be, behelyezték a saját kapcsolótáblájukat
rület lefoglalása és annak nyilvántartása, hogy ki melyik lemezblokkot használja, a számítógépbe, és a következő néhány órában azt remélték, hogy a 20000 körüli
az operációs rendszer egy tipikus erőforrás-kezelési feladata. vákuumcső közül a futás alatt egy sem gyullad ki. A problém ák többnyire egyszerű
numerikus számítások, mint a sin-, cos- és logaritmustáblák kikínlódása voltak.
Az 1950-es évek elejére a módszer kicsit javult a lyukkártyák bevezetésével.
Ekkor m ár kártyán lehetett program okat írni, és a kapcsolótáblák helyett ezek be­
1.2. Az operációs rendszerek története olvasásával m űködtették a gépet; egyebekben a módszer nem változott.

Az operációs rendszerek évek hosszú során alakultak ki. A következő szakaszok­


ban röviden áttekintjük a fejlődés fontosabb mozzanatait. Mivel az operációs 1.2.2. A második generáció (1955-1965): tranzisztorok
rendszerek történetileg szorosan kötődtek azon számítógépek architektúrájához, és kötegelt rendszerek
amelyen futottak, az egymást követő számítógép-generációkon keresztül m utat­
juk meg, hogy milyenek voltak. Az operációs rendszerek generációinak és a számí­ A tranzisztorok megjelenése az 1950-es évek közepén alaposan m egváltoztatta a
tógépek generációinak ez a kötődése laza, mégis ad ném i áttekintést. képet. A számítógépek eléggé megbízhatók lettek ahhoz, hogy gyárthatókká és
Az első valóban digitális számítógépet Charles Babbage (1792-1871) angol eladhatókká váljanak annak a reményében, hogy elég hosszú ideig m űködőképe­
m atematikus tervezte. Bár Babbage élete és vagyona javát „analitikai gépének” sek m aradnak és a vásárlóknak valami hasznos m unkát végeznek. Itt különültek
felépítési kísérleteire fordította, az soha nem m űködött megfelelően, mivel telje­ el először egymástól a tervezők, a gyártók, a kezelők, a programozók és a karban­
sen mechanikus volt, és korának technológiája nem tudta előállítani a szükséges tartó személyzet.
kerekeket, fogaskerekeket, fogakat. Szükségtelen m ondanunk, gépén nem volt Ezek a gépek, amelyeket ma nagyszámítógépeknek (vagy m ainframe-eknek)
operációs rendszer. hívunk, különleges légkondicionált term ekbe voltak zárva és szakképzett kezelők
Érdekes történeti mellékkörülmény, hogy Babbage rájött, szüksége van szoft­ m űködtették őket. Csak nagy vállalatok, főbb kormányzati szervek vagy egyete­
verre a gépéhez, ezért Ada Lovelace személyében a világ első program ozójaként m ek tudták előterem teni a több millió dolláros árat. Ahhoz, hogy egy feladatot
alkalmazott egy fiatal nőt, aki Lord Byron, a híres brit költő lánya volt. Az Ada® (program vagy programok egy csoportja) futtatni lehessen, először a program o­
programozási nyelvet róla nevezték el. zó papíron megírta a program ot (FORTRAN vagy akár assembly nyelven), ezt
kártyákra lyukasztották, a kártyacsomagot a beviteli terem be vitték és átadták az
egyik kezelőnek, majd elm entek kávézni, míg az eredmény elkészült.
1.2.1. Az első generáció (1945-1955): vákuumcsövek Amikor a számítógép végzett egy éppen futó feladattal, egy kezelő átm ent a
és kapcsolótáblák nyomtatóhoz, letépte az eredm ényt és átvitte a kiviteli terem be, így a programozó
később hozzájuthatott. Azután felvett egy új kártyacsomagot, amelyet a beviteli
A digitális számítógépek építésében Babbage sikertelen erőfeszítéseit követően terem ből hoztak, és beolvastatta. H a a FORTRAN fordítóra volt szükség, a kezelő
nem sok előrehaladás történt a második világháborúig. Az 1940-es évek köze­ elhozta az állománytároló rekeszekből, és azt is beolvastatta. A gépidő java része
pén - mások m ellett - Howard Aiken (Harvard), Neum ann János (Institute fór azzal telt, hogy a kezelő a gépterem ben m enetelt.
22 1.BEVEZETÉS 1.2. AZ OPERÁCIÓS RENDSZEREKTÖRTÉNETE 23

Rendszer­ A feladatköteg kb. egyórás összegyűjtése után a szalagot visszatekerték, átvitték


Szalag- Bemeneti szalag Kimeneti a gépterem be és behelyezték a szalagolvasóba. A kezelő elindított egy speciális
Nyomtató program ot (a mai operációs rendszer elődjét), amely beolvasta az első feladatot
és elindította a futtatását. Nyomtatás helyett az eredm ényeket egy másik szalagra
írta. A feladatok befejeztével az operációs rendszer autom atikusan beolvasta és
elindította a szalagon következő feladatot. Amikor az egész köteggel végzett, a
kezelő kivette a bem eneti és eredményszalagokat, a bem eneti szalagot kicserélte
1401 a következő köteggel, az eredményszalagot átvitte az 1401-esre off-line (azaz a fő­
géptől független) nyomtatásra.
Egy tipikus bem eneti feladat felépítését az 1.3. ábra mutatja. Egy $JOB kár­
(f) tyával kezdődik; ez specifikálja a maximális futási időt percekben, a terhelendő
számlaszámot és a programozó nevét. Ezt követi a $FORTRAN kártya, jelezve
1.2. ábra. Egy korai kötegelt rendszer, (a) A programozók kártyáikat az 1401-eshezjuttatják. az operációs rendszernek, hogy töltse be a FORTRAN fordítót a rendszerszalag­
(b) Az 1401-es szalagra olvassa a feladatköteget. (c) A gépkezelő átviszi a bemeneti ról. M ögötte a lefordítandó program, majd egy $LOAD kártya, amely utasítja az
szalagot a 7094-eshez. (d) A 7094-es végrehajtja a számolást, (e) A gépkezelő átviszi operációs rendszert a most fordított célprogram betöltésére. (A lefordított prog­
a kimeneti szalagot az 1401-eshez. (f)Az 1401-es kinyomtatja az eredményeket ram okat gyakran munkaszalagra írták és explicit kérésre töltötték be.) Ezután jön
a $RUN kártya, amely a program futtatását kéri a mögötte található adatokkal.
Nem csoda, ha a berendezés magas ára m iatt ham arosan gondolkodni kezdtek Végül a $END kártya jelzi a feladat végét. Ezek az egyszerű vezérlőkártyák voltak
azon, hogyan csökkentsék az elvesztegetett időt. Az általánosan elfogadott megol­ a mai feladatvezérlő nyelvek és parancsértelm ezők előfutárai.
dás a kötegelt rendszer lett. Az ötlet az volt, hogy a bem eneti terem ben gyűjtsünk Az óriási második generációs számítógépeket többnyire tudományos és mérnöki
össze egy kötegre való feladatot, ezeket olvastassuk mágnesszalagra egy (viszony­ számításokra használták, például fizikai és mérnöki feladatokban gyakran előfor­
lag) olcsó számítógéppel, mint például az IBM 1401-es, amely kitűnő volt kártya­ duló parciális differenciálegyenletek numerikus megoldására. Főként FORTRAN
olvasásban, szalagmásolásban, nyomtatásban, de nem jeleskedett numerikus szá­ és assembly nyelven programoztak. Tipikus operációs rendszerek voltak az FMS
mításokban. A másik, sokkal drágább gépet, mint például az IBM 7094-es, hasz­ (Fortran M onitor System) és az IBSYS, az IBM operációs rendszere a 7094-esen.
náljuk a tényleges számításokra. A megoldást az 1.2. ábra mutatja.

1.2.3. Harmadik generáció (1965-1980): integrált áramkörök


és multiprogramozás
Az 1960-as évek elejéig a számítógépgyártók két, egymástól teljesen független és
egymással nem kompatibilis termékvonallal rendelkeztek. Egyrészt voltak szó­
orientált, általános célú tudományos számítógépek, például a 7094-es, amelyeket
tudományos és műszaki számításokra használtak. Másrészt voltak karakterorientált
üzleti célú gépek, például az 1401-es; ezeket bankok és biztosítók széles köre hasz­
nálta szalagrendezésekre, nyomtatásra.
A két különböző termékvonal fejlesztése és fenntartása a gyártók számára költ­
séges vállalkozás volt. Ráadásul a legtöbb új számítógép-vásárló először egy kis
gépet igényelt, bár ezt később kinőtte, és egy olyan nagyobb gépet akart, amelyen
az összes korábbi programjai futnak, de gyorsabban.
Az IBM egy tollvonással próbálta megoldani mindkét problémát: bevezette a
System/360 rendszert. A 360-as sorozat az 1401-es m éretűtől a 7094-eseknél sok­
kal erősebb, szoftverszinten kompatibilis gépekből állt. A gépek csak az árukban
és a teljesítményükben (maximális memória, processzorsebesség, a megengedett
I/O-eszközök száma stb.) különböztek. Mivel az összes gépnek ugyanaz volt a fel­
1.3. ábra. Egy szokásos FMS-feladat építése és utasításkészlete, elméletileg az egyikre írt program bármelyik másikon
24 1.BEVEZETÉS 1.2. AZ OPERÁCIÓS RENDSZEREKTÖRTÉNETE 25

is futhatott. Ráadásul a 360-ast mind tudományos (azaz numerikus), mind üzleti


számítások végrehajtására is tervezték. Ezzel a gépek egyetlen családja minden
vevő kívánságát teljesíteni tudta. A következő években az IBM kihozta a 360-as
sorozat kompatibilis utódait, a 370, 4300, 3080, a 3090 és a Z jelzésű, m odernebb
technológiával készült családokat.
A 360-as volt az első olyan nagyobb sorozat, ahol a (kism éretű) integrált áram ­
köröket (IC) alkalmazták, ezzel óriási ár-/teljesítményelőnyhöz jutottak a m á­
sodik generációs gépekhez képest, amelyek egyedi tranzisztorokból épültek. A
siker azonnali volt, és a kompatibilis számítógépcsalád ötletét a nagyobb gyártók 1.4. ábra. Multíprogramozásos rendszer, három feladat van a memóriában
rövidesen átvették. Még mindig használják ezeknek a gépeknek a leszármazottait
számítóközpontokban. M anapság hatalmas m éretű adatbázisokat kezelnek (pél­ Az a megoldás alakult ki, hogy a m em óriát szeletekre particionálták, minden
dául repülőjegy-foglaláshoz), vagy olyan webszerverekként működnek, ahol m á­ partícióhoz egy-egy feladatot rendeltek, ahogy az 1.4. ábra mutatja. Amíg egy fel­
sodpercenként több ezer kérést kell feldolgozni. adat I/O teljesítésére várt, egy másik használhatta a CPU-t. H a elég feladatot tud­
Az „egy család” ötlet volt a sorozat legnagyobb erőssége, egyben a legnagyobb tak egyszerre tárolni a belső mem óriában, a CPU-t az idő közel 100 százalékában
gyengesége is. Az elképzelés szerint m inden szoftver, beleértve az OS/360 operá­ is foglalkoztathatták. Az, hogy több feladat van egyidejűleg a m emóriában, megkí­
ciós rendszert is, m inden m odellen működőképes. A kis gépeken, amelyek éppen vánja azt a speciális hardvert, amely megvédi a feladatokat a többiek beavatkozá­
csak a kártyáról szalagra másolást végezték (mint az 1401-esek), és nagy rendsze­ sától és rongálásától; a 360-ast és a többi harmadik generációs gépet felszerelték
reken, amelyek időjárás-előrejelzési és más óriási számításokat készítettek (mint a ezzel a hardverrel.
7094-esek). Egyaránt jónak kellett lennie kevés és sok külső egységgel rendelkező A harmadik generációs operációs rendszerek egy másik jelentős tulajdonsága az a
rendszeren. M űködnie kellett üzleti és tudományos környezetben. És m indenek­ képesség volt, hogy a kártyákról a feladatokat a számítógépteremben való megjelené­
előtt hatékonynak kellett lennie m inden felhasználási területen. sükkor azonnal lemezre tudták olvasni. Valahányszor egy futó feladat befejeződött,
Nem volt rá módszer, hogy az IBM (vagy bárki más) mindezen ellentmondásos az operációs rendszer egy új feladatot tudott a lemezről az immár üres partícióba töl­
követelményeknek megfelelő szoftveregységeket tudjon írni. Az eredmény egy teni és elindítani. A technikát háttértárolásnak (spooling, Simultaneous Peripheral
hatalmas és rettenetesen bonyolult, az FMS-nél mintegy két-három nagyságrend­ Operation On Line) nevezik, és a kimenetre is alkalmazták. Háttértárolással az
del nagyobb operációs rendszer. A programozók ezrei által írt, több millió soros 1401-esre már nem volt szükség, a szalagok alkalmazásainak többsége eltűnt.
assembly programból állt, ezerszám tartalm azott hibákat, melyek kiküszöbölésére Bár a harmadik generációs operációs rendszereket jól felszerelték nagy tu ­
folyamatosan áradtak a verziók. M inden új verzió néhány hibát javított, néhányat dományos számítások és komoly üzleti adatfeldolgozások végrehajtására, mégis
behozott, így az idők során a hibák száma valószínűleg konstans maradt. m egm aradtak kötegelt rendszereknek. Sok programozó visszasírta az első ge­
Az OS/360 egyik tervezője, Fred Brooks írt egy szellemes és találó könyvet nerációs időket, amikor órákon keresztül az egész gépet birtokolta, programjait
(Brooks, 1995) az OS/360-ról szerzett tapasztalatairól. Nem ism ertethetjük itt a gyorsan tesztelhette. A harmadik generációs rendszereken a feladat leadása és az
könyvet, legyen elég annyi, hogy a borítóján egy szurokcsapdába ragadt történe­ eredm ények visszakapása között több óra is eltelhetett, így egy félreütött vessző
lem előtti vadállatcsorda látható. Silberschatz és Galvin könyvének (Silberschatz képes volt fordítási hibát okozni, amivel a programozó fél napja elveszett.
et al., 2004) borítója hasonlóképpen dinoszauruszként ábrázolja az operációs A gyors válaszidő iránti igény egyengette az időosztás (tim esharing), a multi­
rendszereket. program ozás egy olyan variációjának útját, amikor is m inden felhasználónak saját
A hatalmas m éret és a problém ák ellenére az OS/360 és a többi számítógépgyár­ on-line term inálja van. H a 20 felhasználó jelentkezett be egy időosztásos rend­
tó harmadik generációs rokon operációs rendszerei elég jól teljesítették a vevők szerbe, és 17 közülük gondolkodik, beszélget vagy issza a kávéját, akkor a CPU
többségének igényeit. Elterjesztettek néhány olyan kulcsfontosságú módszert is, a m aradék három, kiszolgálást igénylő feladathoz rendelhető. Akik program okat
amelyek hiányoztak a második generációs operációs rendszerekből. Valószínűleg tesztelnek, általában rövid parancsokat (például egy ötlapos eljárás* fordítását)
a m ultiprogram ozás volt közülük a legfontosabb. Am ikor az aktuális feladat vára­ adnak ki, nem pedig hosszúakat (például millió rekordos adathalmaz rendezését),
kozott a szalag vagy más I/O-művelet teljesítésére a 7094-esen, a processzor üres­ így a számítógép nagyszámú felhasználót képes gyorsan, interaktív m ódon kiszol­
járatra állt az I/O befejeztéig. Erősen CPU-intenzív tudományos számítások ese­ gálni, miközben esetleg nagy kötegelt feladatokon is dolgozik a háttérben, amikor
tén az I/O ritka, így az elveszett idő jelentéktelen. Üzleti adatfeldolgozások ese­ a CPU üresjáratban volna. Az első igazi időosztásos rendszert (CTSS) az M.I.T
tében az I/O várakozási idő elérheti az összidő 80-90 százalékát is, ezért valamit
tenni kellett a CPU üresjárati idejének a csökkentésére. * Könyvünkben az eljárás, a szubrutin és a függvény kifejezéseket felváltva, azonos érte­
lemben használjuk.
26 1. BEVEZETÉS 1.2. AZ OPERÁCIÓS RENDSZEREKTÖRTÉNETE 27

fejlesztette ki egy speciálisan átalakított 7094-esen (Corbató et al., 1962). Az idő­ Egy működésképtelen PC vagy munkaállomás esetében könnyen újratelepítheti
osztás azonban csak akkor lett igazán népszerű, amikor a harmadik generációban a lokális szoftvereket anélkül, hogy aggódnia kellene a lokális adatok elérése vagy
széles körben elterjedt a hardvervédelem. megőrzése miatt. Heterogénebb környezetben egy szoftverosztály, az úgynevezett
A CTSS sikerén felbuzdulva, az M .I.T, a Bell Labs és a G eneral Electric (ak­ közvetítő szoftver (middlevvare) alakult ki a lokális felhasználók és az általuk hasz­
koriban jelentős számítógépgyártó) nekifogtak egy „számítógép-szolgáltató” fej­ nált, távoli gépeken lévő fájlok, programok és adatbázisok közötti rés áthidalására.
lesztésének; ez egy gép lett volna, amely egyidejűleg több száz időosztásos fel­ A közvetítő szoftver segítségével a felhasználó PC-je vagy munkaállomása lokális­
használót szolgál ki. M odelljük az elektromos hálózat volt - ha áram ot akarunk, nak érzékeli a hálózatba kapcsolt számítógépeket, és egységes felhasználói felületet
egyszerűen csatlakoztassunk egy falidugót, és remélhetjük, hogy ott annyi áram ot biztosít annak ellenére, hogy sokféle különböző kiszolgáló, PC, valamint munkaál­
kapunk, amennyi kell. A MULTICS (MULTlplexed Information and Computing lomás lehet használatban. Erre példa a világháló, a WWW (World Wide Web). Egy
Service) névre keresztelt rendszer tervezői egy hatalmas számítógépet álmodtak böngészőprogram egységes módon jeleníti meg a dokumentumokat, amelyek szö­
meg, amelyhez Bostonban m inden lakos hozzáfér. Abban az időben csak álom volt veges része egy kiszolgálóról, a képek egy másikról, a megjelenés m ódját definiáló
az, hogy 30 év múlva az ő GE-645-ös típusuk teljesítményét messze meghaladó stíluslap pedig akár egy harmadikról is származhat. Cégek és egyetemek általáno­
személyi számítógépek vásárolhatók majd ezer dollár alatti áron, amilyen álom san használnak webes felületeket adatbázisok elérésére vagy programok futtatására
manapság az óceán alatt futó, hangsebességnél gyorsabb transzatlanti vasút ötlete. olyan gépeken, amelyek egy másik épületben vagy akár másik városban találhatók.
A MULTICS sikere vegyes volt. Felhasználók százainak kiszolgálására tervezték A közvetítő szoftver az elosztott rendszerek operációs rendszerének tűnik, bár iga­
egy Intel 80386-alapú PC-nél alig nagyobb kapacitású gépre, bár az I/O-képessége zából egyáltalán nem az, tárgyalása pedig túlmutat könyvünk keretein. Az elosztott
jóval nagyobb volt annál. Ez nem annyira őrült ötlet, amennyire hangzik, lévén rendszerekről bővebb információt Tanenbaum és Van Steen (Tanenbaum és Van
az em berek akkoriban tudták, hogyan kell kisméretű és hatékony program okat Steen, 2002) könyvében találhatunk.
írni - ez a képesség a későbbiekben eltűnni látszik. Több ok is volt, ami miatt a A harmadik generáció másik nagy fejlődési ága a miniszámítógépek csodálato­
MULTICS nem vette át a világuralmat; ezek közül nem elhanyagolható az a tény, san gyors növekedése, elsőként 1961-ben a DEC PD P-1. A PD P-1 18 bites sza­
hogy PL/I nyelven írták, a PL/I fordító pedig éveket késett és alig működött, ami­ vakból 4 K memóriával rendelkezett, ára viszont m ár csak 120000 dollár volt (a
kor végül elkészült. Ráadásul a MULTICS roppantul nagyra törő volt a korához, 7094-es árának kevesebb mint 5 százaléka), úgy vitték, mint a cukrot. Bizonyos
akárcsak Charles Babbage analitikus gépe a XIX. században. nem numerikus számításokban majdnem olyan gyors volt, mint a 7094-es, és egy
A MULTICS sok eredeti ötletet hozott a számítógépes szakirodalomba, de ko­ új iparág születését jelentette. Gyorsan követték a PDP más sorozatai (mind-mind
moly term ékké és sikeres üzletté válása sokkal nehezebb volt, mint azt bárki is inkompatibilisek, nem úgy, mint az IBM-család), a csúcs a P D P -1 1.
gondolta. A Bell Labs kiszivárgott a projektből, a G eneral Electric pedig teljesen Ken Thompson, a Bell Labs MULTICS projektben dolgozó számítástudósa
kilépett a számítógépes üzletágból. Az M.I.T azonban kitartott és működésre bír­ ráakadt egy használatlan kis PD P-7-re, és elkezdte a MULTICS lecsupaszított,
ta a MULTICS-ot. Kereskedelmi term ékként végül az a cég árulta (Honeywell), egyfelhasználós változatának a megírását. M unkája a Unix operációs rendszer fej­
amely a G E számítógépes üzletágát megvette, és nagyjából 80 jelentős cég és lesztésébe torkollott, amely a tudományos világ, kormányhivatalok és számos vál­
egyetem telepítette világszerte. Bár kevesen voltak, a MULTICS felhasználói lalat körében igen népszerűvé vált.
rendkívüli módon lojálisak m aradtak. Példaként a G eneral M otors, a Ford és az A Unix történetét mások mesélik el (például Salus, 1994). Mivel forráskódja
Egyesült Államok Nemzetbiztonsági Hivatala csak az 1990-es évek vége felé ál­ hozzáférhető volt, minden szervezet kifejlesztette a saját (inkompatibilis) verzió­
lították le MULTICS rendszereiket. Az utolsó működő MULTICS-ot a Kanadai ját, ami káoszhoz vezetett. Két fő változat fejlődött ki: a System V rendszert az
Védelmi Minisztériumban 2000 októberében állították le. Az üzleti siker elm ara­ AT&T, a BSD-t (Berkeley Software Distribution) pedig a Kaliforniai Berkeley
dása ellenére a MULTICS a későbbi rendszerekre óriási hatást gyakorolt. Bővebb Egyetem készítette. Voltak kism értékben eltérő verziók is: ilyen a FreeBSD, az
információ található (Corbató et al., 1972; Corbató és Vyssotsky, 1965; Daley és OpenBSD és a NetBSD. Az IE E E (ejtsd I triple E) POSIX néven kidolgozott
Dennis, 1968; Organick, 1972; Saltzer, 1974). Van egy jelenleg is aktív honlapja, a egy szabványt, amelyet ma a legtöbb Unix-verzió betart. A POSIX egy minimális
www.multicians.org, ahol magáról a rendszerről, a tervezőiről és a felhasználóiról rendszerhíváskészletet definiál, amelyet a szabványos Unix-rendszereknek tartal­
nagy mennyiségű információ érhető el. mazniuk kell. Ma m ár néhány más operációs rendszer is tartalmazza a POSIX kész­
A „számítógép-szolgáltató” kifejezés nem volt hallható többé, de az ötlet az letét. A POSIX szabványnak megfelelő szoftverek készítéséhez szükséges informá­
elmúlt években új életre kelt. Legegyszerűbb formájában egy cég vagy egy osz­ ció elérhető könyvekben (IEEE, 1990; Lewine, 1991), valamint a www.unix.org olda­
tályterem személyi számítógépei vagy munkaállomásai (a legkorszerűbb PC-k) lon az Open Group „Single Unix Specification” címszó alatt. A fejezet további ré­
helyi hálózaton (Local Area Network, LAN) keresztül egy fájlkiszolgálóhoz csat­ szében, amikor a Unixra hivatkozunk, akkor beleértjük az összes változatot, hacsak
lakozhatnak, ahol az összes programot és adatot tárolják. A rendszergazdának így ezt külön nem jelezzük. Bár ezek belső felépítésükben különböznek, mindegyikük
csak egyféle program- és adattelepítésről, illetve védelemről kell gondoskodnia. támogatja a POSIX szabványt, így a programozó számára elég hasonlók.
28 1. BEVEZETÉS 1.2. AZ OPERÁCIÓS RENDSZEREK TÖRTÉNETE 29

1.2.4. A negyedik generáció (1980-tól napjainkig): memória) rendelkezett a grafikus felhasználói felület támogatására. A Macintosh
személyi számítógépek tovább fejlődött az évek során. A következő M otorola-processzorok m ár igazi
32 bites rendszerek voltak, később az Apple átváltott az IBM 32 bites (majd 64
Az LSI (Large Scale Integration - magas integráltságú) áram körök fejlődésével, bites) RISC-architektúrájú PowerPC processzoraira. 2001-ben fontos váltás tö r­
amelyek egy négyzetcentiméter szilikonon több ezer tranzisztort tartalmaznak, tént az operációs rendszer terén: megjelent a Berkeley Unixra épülő Mac OS X,
beköszöntött a mikroprocesszor-alapú személyi számítógépek kora. Az architek­ a Macintosh grafikus felhasználói felületének új változatával. Végül 2005-ben az
túra tekintetében a személyi számítógépek (kezdetben mikroszámítógépeknek Apple bejelentette, hogy átvált Intel processzorokra.
hívták őket) kevéssé különböztek a P D P -1 1 osztály miniszámítógépeitől, de az A Microsoft kitalálta a Windowst, hogy a Macintoshsal versenyre tudjon kel­
áruk alaposan eltért. A saját miniszámítógép egy vállalati részleg vagy egy egyete­ ni. Eredetileg a Windows csak egy grafikus környezet volt a 16 bites MS-DOS fe­
mi tanszék számára tette elérhetővé a számítógépet. A mikroprocesszor megadta lett (vagyis inkább egy parancsértelm ező, mintsem igazi operációs rendszer). A
a lehetőséget arra, hogy bárkinek saját személyi számítógépe legyen. Windows aktuális verziói azonban m ár a Windows NT leszármazottjai, amely egy
A mikroszámítógépek számos családja létezett. Az Intel 1974-ben jelentette teljes 32 bites rendszer az alapoktól újraírva.
meg az első általános célú 8 bites mikroprocesszort, a 8080-ast. Több cég is gyár­ A másik nagy versenytárs a személyi számítógépek világában a Unix (és külön­
tott 8080-ra vagy a vele kompatibilis Zilog Z80-ra épülő kész rendszereket, am e­ böző leszármazottjai). A Unix a m unkaállomásokon és a nagyszámítógépeken,
lyeken a Digital Research cég CP/M (Control Program fór Microcomputers) ope­ mint amilyenek a hálózati szerverek, a legerősebb. Különösen népszerű a nagy
rációs rendszere volt széles körben használatos. A CP/M alá sok felhasználói prog­ teljesítményű RISC-alapú gépeken. Pentium-alapú gépeken a Linux kezd a
ram ot készítettek, és körülbelül 5 évig uralta a személyi számítógépek világát. Windows népszerű alternatívájává válni az egyetemi hallgatók és egyre növekvő
A M otorola szintén megjelent egy 8 bites processzorral, a 6800-assal. M iután a számú vállalati felhasználó körében. (A könyvünkben végig a „Pentium” alatt a
cég elutasította a 6800 javítására szolgáló javaslataikat, a M otorola-m érnökök egy teljes Pentium-családot értjük, az alacsony teljesítményű Celeronoktól a csúcska­
csoportja kivált megalapítva a MOS Technology céget, és nekikezdtek a 6502 CPU tegóriás Xeonig, valamint a kompatibilis AM D-processzorokat.)
gyártásának. Ez volt a központi egysége számos korai rendszernek. Egyikük, az H abár sok Unix-felhasználó, különösen a gyakorlott programozók a parancs­
Apple II komoly vetélytársa lett a CP/M -rendszereknek az otthoni és az oktatási sori felületet részesítik előnyben a grafikus felülettel szemben, szinte minden
piacon. De a CP/M annyira népszerű volt, hogy sok Apple II tulajdonos vásárolt Unix-rendszer tám ogatja az M.I.T.-n kifejlesztett, X Window néven ismert ablakos
Z -80 társprocesszor bővítőkártyát a CP/M futtatásához, mivel a 6502 CPU nem rendszert. Ez a rendszer kezeli az alapvető ablakműveleteket, lehetővé téve a fel­
volt kompatibilis a CP/M -rendszerrel. A CP/M -kártyákat egy kis cég, a Microsoft használó számára ablakok létrehozását, törlését, mozgatását és átm éretezését az
árulta, amely a CP/M -rendszert futtató mikroszámítógépekhez készített BASIC egér segítségével. Gyakran egy teljes grafikus felhasználói felület, amilyen például
értelmező révén is rendelkezett piaci részesedéssel. a Motif, is rendelkezésre áll az X Window-rendszer felett, amivel a Macintoshhoz
A mikroprocesszorok következő generációja 16 bites rendszer volt. A z Intel vagy a Microsoft Windowshoz hasonló külsőt adhatnak a Unixnak azok a felhasz­
m egjelentette a 8086-ot, majd az 1980-as évek elején az IBM megtervezte az IBM nálók, akik ilyenre vágynak.
PC-t az Intel 8088-ra építve (ez egy 8 bites külső adatúttal rendelkező 8086-os Egy érdekes fejlődés vette kezdetét az 1980-as évek közepén: a személyi számí-
volt). A Microsoft egy olyan csomagot ajánlott az IBM-nek, amely tartalm azta a tógép-hálózatok megnövekedtek, és megjelentek a hálózati operációs rendszerek
Microsoft BASIC-et, valamint a DOS (Disk Operating System) operációs rend­ és osztott operációs rendszerek (Tanenbaum és Van Steen, 2002). Egy hálózati
szert, amelyet ugyan egy másik cég készített, de a Microsoft felvásárolta a term é­ operációs rendszeren a felhasználók számára több számítógép áll rendelkezésre,
ket, és szerződtette az eredeti szerzőt a további fejlesztésekhez. Az átdolgozott bejelentkezhetnek távoli gépekre, állományokat m ásolhatnak egyik gépről a m á­
rendszer neve MS-DOS (MicroSofí Disk Operating System) lett, és gyorsan ural­ sikra. Minden gépen saját lokális operációs rendszer fut, és mindegyiknek megvan
kodóvá vált az IBM PC-piacon. a saját lokális felhasználója (vagy felhasználói). Alapjában véve a gépek függetle­
A CP/M, az MS/DOS és az Apple DOS mind parancssoros rendszerek voltak: nek egymástól.
a felhasználók a billentyűzet segítségével gépelték be a parancsokat. Evekkel ko­ A hálózati operációs rendszerek lényegében nem különböznek az egyprocesz-
rábban Doug Engelbart a Stanford Research Institute-ban kitalálta az ablakok­ szoros operációs rendszerektől. Nyilvánvalóan szükség van hálózati csatolókra és
kal, ikonokkal, menükkel, egérrel rendelkező úgynevezett grafikus felhasználói ezek alacsony szintű vezérlőszoftvereire, program okra a távoli bejelentkezések és
felületet, a GUI-t (Graphical User Interface). Az Apple-nél dolgozó Steve Jobs az adatállományok távoli hozzáférésének kiszolgálására, de ez a többlet nem vál­
m eglátta az igazán felhasználóbarát személyi számítógép lehetőségét (azok szá­ toztat az operációs rendszer lényegi struktúráján.
mára, akik nem tudtak semmit a számítógépekről, és nem akartak beletanulni), Nem így az osztott operációs rendszer, amelyik a felhasználói felé úgy m utat­
és az Apple M acintosht 1984 elején be is m utatták. Ez a M otorola 16 bites 68000 kozik, mint egy hagyományos egyprocesszoros rendszer, holott ténylegesen több
processzorát használta és 64 KB ROM-mal (Read Only Memory - csak olvasható processzorból áll. A felhasználóknak nem kell azzal törődniük, hogy hol futnak a
1.BEVEZETÉS 1.2. AZ OPERÁCIÓS RENDSZEREK TÖRTÉNETE 31
30

programjaik, hol tárolódnak az állományaik; ezt mind autom atikusan és hatéko­ fut. A jelenlegi verzióban (M INIX 3) ez a strukturáltság ki lett terjesztve az I/O-
nyan az operációs rendszer kezeli. m eghajtóprogram okra is, amelyek (az óra-m eghajtóprogram kivételével) szintén
Nem elég az egyprocesszoros operációs rendszerhez egy kis programbővítés, felhasználói m ódban futnak. A másik különbség, hogy a Unixot hatékonyra, míg a
hogy igazi osztott operációs rendszert kapjunk, m ert alapvető m ódszerekben kü­ M INIX-et áttekinthetőre tervezték (ha egyáltalán lehet áttekinthetőségről beszél­
lönböznek az osztott és a centralizált rendszerek. Az osztott rendszerekben pél­ ni több száz oldalas program ok esetében). A M INIX-forráskód több ezer kom ­
dául többnyire megengedett, hogy egy alkalmazás egy időben több processzoron m entárt (m agyarázatot) is tartalmaz.
fusson, ez pedig bonyolultabb processzorütemező algoritmust kíván ahhoz, hogy A M INIX eredetileg a Unix 7. verziójával kompatíbilisra készült. A 7. verzió
optimalizáljuk a párhuzam osítás m értékét. egyszerűsége és könnyedsége volt a minta. A 7. verzióról m ondták sokszor, hogy
A hálózaton keresztüli késleltetett kommunikáció m iatt az ilyen vagy a hasonló nemcsak az elődein, hanem az utódain is sokat javított. A POSIX m egjelenése­
algoritmusok hiányos, lejárt, sőt hamis információkkal kénytelenek dolgozni. Ez kor a M INIX az új szabvány irányába fejlődött tovább, de m egtartotta a korábbi
a helyzet nagyon különbözik az egyprocesszoros rendszerektől, ahol az operációs programokkal való kompatibilitást is. Az ilyen fejlesztés általános a számítógép-
rendszernek teljes áttekintése van a rendszer állapotáról. iparban, m ert egyetlen gyártó sem szeretné, ha új gyártmányát a régi vevői csak
nagy átállásokkal tudnák használni. A könyvünkben ism ertetett MINIX-verzió, a
M INIX 3, a POSIX szabványra épül.
A Unixhoz hasonlóan a M INIX is a C programozási nyelven készült, és a kü­
1.2.5. A MINIX 3 története
lönböző számítógépek közötti hordozhatóság igen lényeges szempont volt. Az
A Unix forráskódját a korai években ( 6. verzió) szabadon felhasználhatták az első implementáció IBM PC-re készült. Később számos más platform ra is átke­
AT&T engedélye alapján, és gyakran tanulmányozták is. John Lions az ausztráliai rült. A „kicsi a szép” filozófiáját követve, a M INIX futtatásához eredetileg még
New South Wales Egyetemen még egy kis füzetet is kiadott (Lions, 1996), amely merevlemez sem kellett (az 1980-as évek közepén a merevlemez még költséges
sorról sorra kom m entálja a kódot. Az AT&T hozzájárulásával ezt használta sok újdonság volt). Természetes, hogy a M INIX szolgáltatásainak és m éretének nö­
egyetem az operációs rendszerek tárgy tankönyveként. vekedése következtében a futtatásához ma m ár szükséges merevlemez, de hála a
Amikor az AT&T kibocsátotta a 7. verziót, kezdte észrevenni, hogy a Unix ér­ MINIX-filozófiának, elegendő egy 200 megabájtos partíció (beágyazott alkalma­
tékes üzleti áru, ezért az egyetemi kurzusokon nem engedélyezte forráskódját fel­ zások esetében azonban nem szükséges a merevlemez). Ezzel szemben még a leg­
használni, nyilván azért, hogy ne veszélyeztesse az üzleti titkot. Sok egyetem erre kisebb Linux-rendszer is 500 megabájt lem ezterületet igényel, és több gigabájtra
azzal reagált, hogy egyszerűen nem oktatták magát a Unixot, csak az elméletet. van szükség az általánosan használt program ok telepítéséhez.
Nem szerencsés a hallgatókkal csak az elm életet ismertetni, m ert így az operáci­ Egy IBM PC-n futó M INIX felhasználója Unix-felhasználónak érezheti magát.
ós rendszerek tényleges m ibenlétéről csak hiányos áttekintésük lesz. Az operációs Az alapvető program ok megtalálhatók és ugyanazokat a funkciókat hajtják vég­
rendszerek elméleti kérdései, amelyeket nagy részletességgel tárgyaltak a kurzu­ re, mint a Unix-megfelelők (például a cat, grep, Is, make és a parancsértelm ező).
sokon és a könyvekben, nem minden esetben fontosak a gyakorlatban, például az Ezeket a segédprogramokat, ugyanúgy, ahogy magát az operációs rendszert, a
ütemezési algoritmusok esetében sem. A gyakorlatban igazán érdekes kérdéseket, szerző és hallgatói, továbbá még néhányan az alapoktól teljes egészében újraírták,
például az I/O-t és a fájlrendszereket mellőzték, m ert kevés elm életük van. AT&T vagy más szabadalm aztatott program kód felhasználása nélkül. Sok egyéb
A helyzet orvoslására könyvünk egyik szerzője (Tanenbaum) elhatározta, hogy szabadon terjeszthető program létezik manapság, és a legtöbb esetben ezek sike­
teljesen az elejéről kezdve ír egy új operációs rendszert, amely felhasználói resen átültethetők (lefordíthatok) M INIX alá.
szempontból kompatibilis, felépítésében viszont teljesen különbözik a Unixtől. A következő évtizedben a M INIX továbbfejlődött, és 1997-ben megjelent a
Egyetlen sort sem fog használni az AT&T kódjából, így nem sért szerzői jogokat, M INIX 2, könyvünk második angol nyelvű kiadásával egyidejűleg, amely ezt az új
ha felhasználják csoportos vagy egyéni tanulásra. Az olvasó egy valódi operá­ változatot m utatta be. A két verzió közötti változtatások ha forradalm iak nem is,
ciós rendszert boncolgathat, hogy lássa, milyen belülről, ahogy a biológushallga­ de alapvetők voltak (például a hajlékonylemezt és a 8088-as processzor 16 bites
tó békát boncol. A neve MINIX lett, és 1987-ben jelent a meg teljes forráskóddal valós m ódját használó rendszerből merevlemezt és a 386-os processzor 32 bites
együtt, hogy bárki számára tanulmányozható és m ódosítható legyen. A M INIX védett módját használó rendszerré alakult).
név a mini-Unixból származik, mivel elég kicsi ahhoz, hogy kevésbé jártas hallga­ A fejlesztés lassan, de szisztematikusan haladt 2004-ig, amikor Tanenbaum biz­
tók is átláthassák működését. tossá vált abban, hogy a szoftver túlságosan naggyá és megbízhatatlanná vált, és
A jogi problém ák kiküszöbölése m ellett a Unixhoz képest a M INIX más elő­ úgy döntött, hogy újra felveszi a kissé alvó MINIX-szálat. Az amszterdami Vrije
nyökkel is rendelkezik. Egy évtizeddel a Unix után készült, annál sokkal struk- Egyetemen hallgatóival és programozóival közösen elkészítette a M INIX 3-at a
turáltabb. Például m ár a M INIX legelső megjelenése óta a fájlrendszer és a m e­ rendszer alapvető áttervezésével, nagymértékben átstrukturált kernellel, kisebb
móriakezelés nem az operációs rendszer része, hanem felhasználói program ként m érettel, valamint a modularitás és megbízhatóság hangsúlyozásával. Az új ver­
1.BEVEZETÉS 1.3. AZ OPERÁCIÓS RENDSZER FOGALMAI 33
32

ziót mind PC-kre, mind beágyazott rendszerekre szánták, ahol a kompaktság, m eghajtóra van szüksége, amelyet szintén elkészített. Ezután le akarta tölteni és
a modularitás és a megbízhatóság kulcsfontosságú. Míg a csoport néhány tagja elm enteni a hozzászólásokat, ehhez írt egy lemezmeghajtót, majd egy fájlrend­
teljesen új nevet szeretett volna, végül mégis a M INIX 3 lett a befutó, mivel a szert. 1991 augusztusára elkészült egy nagyon egyszerű maggal, amelyet 1991. au­
M INIX név m ár jól ismert volt. Hasonlóan, mint amikor az Apple felhagyott a gusztus 25-én jelentett be a comp.os.minix hírcsoportban. Ez a bejelentés vonzotta
saját operációs rendszerével, a Mac OS 9-cel, és lecserélte a Berkeley Unix egyik az em bereket, hogy segítsenek neki, aminek eredm ényeként 1994. március 13-án
változatára; az új rendszer neve Mac OS X lett, és nem A PPLIX vagy valami h a­ megjelent a Linux 1.0. így született meg a Linux.
sonló. A W indows-rendszerekben bekövetkezett alapvető változások után is meg­ A Linux a nyílt forráskód mozgalom (amelyet a M INIX segített elindítani)
m aradt a Windows elnevezés. egyik jelentős sikere lett. A Linux a Unix (és a Windows) vetélytársa több kör­
A M INIX 3 magja csak egy körülbelül 4000 soros futtatható kódból áll, nem nyezetben is, részben mivel a Linuxot futtatni képes PC-k teljesítménye a néhány
milliókból, mint a Windows, a Linux, a FreeBSD és más operációs rendszerek Unix-implementáció által megkövetelt RISC-rendszerekkel vetekszik. Más nyílt
esetében. A kism éretű mag azért fontos, m ert az ott előforduló hibák sokkal pusz- forráskódú szoftverek, m indenekelőtt az Apache webkiszolgáló és a MySQL
títóbbak, mint a felhasználói m ódban futó program ok esetében, és több kód több adatbázis-kezelő jól működnek Linuxon az üzleti világban. A Linux, az Apache, a
hibát jelent. Egy alapos vizsgálat m egm utatta, hogy a felderített hibák száma 1000 MySQL és a nyílt forráskódú Perl és PH P programozási nyelvek gyakran használa­
végrehajtható soronként 6 és 16 között váltakozik (Basili és Perricone, 1984). tosak webkiszolgálókon, időnként a LAMP betűszóval hivatkoznak rájuk. A Linux
A hibák tényleges száma valószínűleg sokkal magasabb lehet, mivel a kutatók csak és a nyílt forráskódú szoftverek történetéről bővebben olvashatunk (DiNone et
a bejelentett hibákat tudták számolni, a bejelentetleneket nem. Egy másik vizsgá­ al., 1999; Moody, 2001; és Naughton, 2000).
lat (Ostrand et al., 2004) azt mutatja, hogy még egy tucatnál is több kiadott válto­
zat után is a fájlok 6%-a tartalm azott olyan hibát, amit később jelentettek, és egy
bizonyos pont után a hibák száma stabilizálódik ahelyett, hogy aszimptotikusan
közelítene a nullához. Ezt az eredm ényt alátámasztja az a tény is, hogy amikor na­ 1.3. Az operációs rendszer fogalmai
gyon egyszerű, autom atikus modellellenőrzőt eresztettek a Linux és az OpenBSD
stabil változataira (Chou et al., 2001; és Engler et al., 2001), az százszámra talált Az operációs rendszer és a felhasználói program ok közötti kapcsolatot az a
hibákat a magban, túlnyomórészt a meghajtóprogram okban. Ez az oka annak, „kiterjesztett utasítás” készlet alkotja, amelyet az operációs rendszer biztosít.
hogy a m eghajtóprogram ok kikerültek a M INIX 3 magjából - felhasználói m ód­ Hagyományosan ezeket a kiterjesztett utasításokat rendszerhívásoknak nevezzük,
ban kisebb kárt képesek okozni. bár többféle m ódon valósíthatók meg. Az operációs rendszer valódi működésének
Könyvünk a M INIX 3-at példaként ismerteti. A M INIX 3-rendszerhívásokra m egértéséhez közelebbről kell megismerni ezt a kapcsolatrendszert. A kapcsolat-
vonatkozó legtöbb hivatkozásunk azonban (az aktuális forráskódra vonatkozók­ rendszer által biztosított rendszerhívások operációs rendszerenként eltérők, de a
kal ellentétben) érvényes más Unix-rendszerekre is. Ennek tudatában olvassuk m ögöttük rejlő fogalmak egyre hasonlóbbá válnak.
ezt a könyvet. Ez az oka annak, hogy választanunk kell a kissé homályos általánosságok („az
Néhány olvasót érdekelhet a Linux és a M INIX viszonya, erről is ejtünk pár operációs rendszerekben van rendszerhívás a fájlok olvasására”) és a konkrét
szót. M egjelenését követően egy U SEN ET tém acsoport (newsgroup), a comp. rendszerek („a M INIX 3-ban van egy read rendszerhívás három param éterrel: egy
os.minix alakult a M INIX értékelésére. Néhány héten belül 40 000 előfizetője lett, a fájl azonosítására, egy megmondja hová helyezzük az adatokat, egy pedig a beol­
majdnem mindegyikük rengeteg új szolgáltatást akart a M INIX-be építeni, ezzel vasandó bájtok számát közli”) között.
nagyobbá, jobbá (de nagyobbá biztosan) akarták tenni. N aponta százak ajánlgat- Mi az utóbbi megközelítést választottuk. Több munkával jár, de az operáci­
ták javaslataikat, ötleteiket és program darabkáikat. A M INIX szerzője éveken ós rendszer működésébe mélyebb betekintést nyújt. Az 1.4. alfejezetben rész­
keresztül sikeresen hárította el ezeket a tám adásokat, így m aradt a M INIX elég letesen vizsgáljuk a Unix (beleértve a többféle BSD-változatot is), a Linux és
tiszta ahhoz, hogy a hallgatók megérthessék, valamint elég kism éretű ahhoz, hogy a M INIX 3 által biztosított rendszerhívásokat. Az egyszerűség kedvéért azon­
hallgatók által is megfizethető gépeken fusson. Azon felhasználók számára, akik ban általában csak a M INIX 3-ra fogunk hivatkozni, mivel a megfelelő Unix-
nem tartották sokra az MS-DOS-t, a M INIX jelenléte alternatívaként (forráskód­ és Linux-rendszerhívások többnyire POSIX-alapúak. M ielőtt belem erülnénk a
jával együtt) okot adott arra, hogy végül vegyenek egy PC-t. konkrét rendszerhívások ism ertetésébe, érdem es madártávlatból rápillantanunk a
Egyikük egy finn egyetemi hallgató, Linus Torvalds volt. Torvalds telepítette a M INIX 3-ra, és egy általános benyomást szereznünk az operációs rendszerek mi­
M INIX-et az új PC-jére, és alaposan tanulm ányozta a forráskódot. Szerette volna benlétéről. Ez az áttekintés jól illik a Unixra és a Linuxra is.
a USENET-es hírcsoportokat (amilyen a comp.os.minix is) az otthoni gépén ol­ A M INIX 3-rendszerhívások durván két nagy osztályba tartoznak: a procesz-
vasni az egyetemi helyett, de ehhez néhány funkció hiányzott a MINIX-ből, ezért szusokat kezelő és az adatállományok rendszerét (fájlokat) kezelő osztályokba.
ennek m egoldására írt egy program ot. H am ar rájött, hogy egy másfajta term inál­ E nnek megfelelően a kettőt külön-külön tanulmányozzuk.
34 1. BEVEZETÉS 1.3. AZ OPERÁCIÓS RENDSZER FOGALMAI 35

1.3.1. Processzusok egy új processzust, amely a fordítót hajtja végre. Amikor ez a processzus befejezte
a fordítást, végrehajt egy rendszerhívást, amellyel megszünteti saját magát.
Kulcsfontosságú a M INIX 3-ban és m inden operációs rendszerben a processzus Windows és más grafikus felhasználói felületet használó operációs rendszer
fogalma. A processzus lényegében egy végrehajtás alatt lévő program. M inden esetében a munkaasztalon található ikonokra történő (dupla) kattintással indít­
processzushoz tartozik egy saját címtartomány, azaz a m em ória egy minimális (ál­ hatunk program okat, hasonló módon, m intha a program nevét egy parancssorba
talában 0) és egy maximális című helye közötti szelet, amelyen belül a processzus gépelnénk be. Bár a grafikus felhasználói felületeket nem igazán tárgyaljuk, lénye­
olvashat és írhat. A címtartomány tartalm azza a végrehajtandó program ot, annak gében azok is egyszerű parancsértelmezők.
adatait és a vermét. M inden processzushoz tartozik még egy regiszterkészlet, be­ Mivel egy processzus létrehozhat egy vagy több processzust (gyermekprocesszu­
leértve az utasításszámlálót, verem m utatót, egyéb hardverregisztereket és a prog­ sait), és ezek újra saját gyermekprocesszusaikat, láthatjuk, hogy a processzusok az
ram futásához szükséges egyéb információkat. 1.5. ábra szerinti fastruktúrát alkotják. Az egymással olyan kapcsolatban lévő pro­
A 2. fejezetben részletesen vissza fogunk térni a processzus fogalmának tisztá­ cesszusok esetében, amikor egy közös feladat végrehajtásában együttműködnek,
zására, most megfelelő, ha egy multiprogramozásos rendszerbeli processzusról szükség van az egymással való kommunikációra és tevékenységük összehangolására.
kapunk képet. Időnként az operációs rendszer megszakítja egy processzus futását, Ezt az ún. processzusok közötti kommunikációt a 2. fejezet tárgyalja részletesen.
és egy másikat kezd futtatni, m ert például az előbbi processzusnak lejárt a m eg­ További processzus-rendszerhívások alkalmasak memória kérésére (vagy már
előző m ásodpercre járó CPU-idő részesedése. nem használt m em ória felszabadítására), gyermekprocesszus megszűnésére való
H a az olyan esetekben, mint a fentiben is, ideiglenesen felfüggesztünk egy pro­ várakozásra és program részietek m egosztott használatára.
cesszust, akkor később pontosan ugyanabban az állapotban kell folytatni, mint Esetenként olyan processzus számára is szükség van információátadásra, amely
amelyben megszakítottuk a futást. Ezért a processzushoz tartozó minden infor­ éppen nem erre várakozik. Például egy processzus, amely egy másik gépen futó
mációt a felfüggesztés időtartam ára valahol tárolnunk kell. A processzus például processzussal kommunikál, hálózaton keresztül küldi el az üzenetét. Annak kivé­
olvasásra m egnyithatott néhány fájlt. M inden ilyen fájlhoz hozzátartozik az aktuá­ désére, hogy az üzenet vagy a válasz esetleg elveszhet, a küldő kérheti saját operá­
lis pozícióra mutató pointer (azaz a legközelebb olvasandó bájt vagy rekord sor­ ciós rendszerét, hogy értesítse valahány másodperc múlva, amikor is a válasz hiá­
száma). H a egy ilyen processzust felfüggesztünk, az összes m utatót tárolnunk nyában az üzenetet újra elküldheti. M iután ezt az időzítést beállította, a procesz-
kell ahhoz, hogy az újraindítása utáni read hívások a megfelelő adatokat olvassák. szus folytathatja saját munkáját.
A legtöbb operációs rendszerben a processzushoz tartozó minden, a saját cím tar­ Am ikor a beállított másodpercek elteltek, az operációs rendszer egy riasztás
tományának tartalm án kívüli információt az operációs rendszer processzustáblá­ szignált (jelet vagy jelzést) küld a processzusnak. A szignál ideiglenesen felfüg­
zatában tárolnak. Ez az aktuálisan létező processzusokhoz tartozó struktúraele­ geszti a processzus pillanatnyi tevékenységét, a regiszterértékeket eltárolja a ve­
mekből álló vektor vagy láncolt lista. rembe, és elindít egy speciális szignálkezelő eljárást, például a feltételezhetően
E nnek megfelelően egy (felfüggesztett) processzus a cím tartom ányának tartal­ elveszett üzenet újraküldésére. Amikor a szignálkezelő eljárás befejeződött, a
mából, amelyet memóriatérképnek szokás nevezni és a processzustáblázatbeli processzus újraindítódik ugyanabban az állapotban, amilyenben a szignál érkezé­
hozzá tartozó elemből áll; ez utóbbi tartalmazza egyebek között a regiszterérté­ se előtt volt. A szignálok a hardvermegszakítások szoftvermegfelelői. Sokféle ok
keket. m iatt generálódhatnak, nem csak időzítők lejártakor. A hardver által észlelt csap­
Kulcsfontosságú processzuskezelő rendszerhívások a processzust létrehozó és dák többsége, mint például az illegális utasítás-végrehajtás vagy érvénytelen me-
megszüntető hívások. Nézzünk egy tipikus példát. A parancsértelmező vagy shell móriacím-használat, a „bűnös” processzus számára szignálként jelentkezik.
processzus parancsokat olvas egy terminálról. Egy program fordítását kérő parancs A rendszeradminisztrátor minden személynek, aki a M INIX 3 felhasználója lehet,
begépelését befejezte a felhasználó. A parancsértelm ezőnek most létre kell hoznia ad egy UID (User IDentification) felhasználói azonosítót. A MINIX-ben indított
minden processzus az indító személy UID-azonosítóját kapja. A gyermekprocesszus
a szülő UID-azonosítóját kapja. A felhasználók különböző csoportok tagjai lehet­
nek, amelyek csoportazonosítóval (GID - Group IDentification) rendelkeznek.
Az ún. szuperfelhasználó UID-azonosítója speciális lehetőségeket kap, és sok
védelmi szabályt áthághat. Nagy rendszerek esetében csak a rendszeradm inisztrá­
tor ismeri a szuperfelhasználó jelszavát, bár sok „rendes” felhasználó (rendszerint
hallgató) jelentős erőfeszítést tesz olyan rendszerbeli hézagok felkutatására, am e­
lyek jelszó nélkül is szuperfelhasználói jogokhoz juttatják.
1.5. ábra. Egy processzus-fastruktúra. Az A processzus két gyermekprocesszust, aB-tésa C-t hozta A processzusokat, a processzusok közötti kommunikációt és egyéb kapcsolódó
létre. A B processzus további három processzust, a D-t, az E-t és az F-et hozta létre tém ákat a 2. fejezetben tárgyaljuk.
1.BEVEZETÉS 1.3. AZ OPERÁCIÓS RENDSZER FOGALMAI 37
36

1.3.2. Fájlok rom nál több szint szokatlan), míg a fájlhierarchia négy-öt, sőt többszintű. A pro­
cesszushierarchia rövid életű, általában néhány perces, a könyvtár-hierarchia vi­
A másik kiterjedt rendszerhívás osztály a fájlrendszerrel kapcsolatos. M ár em lítet­ szont évekig létezhet. A tulajdonosi és a védelmi rendszer úgyszintén különbözik
tük, hogy az operációs rendszer egyik fő feladata a lemez és egyéb I/O-egységek a processzusok és a fájlok esetében. Egy gyermekprocesszus vezérlésére vagy akár
különlegességeinek az elrejtése és a programozó számára egy világos, eszközfüg­ elérésére általában csak a szülőprocesszus jogosult, míg a fájlok és könyvtárak
getlen fájlrendszer-absztrakció biztosítása. Nyilvánvalóan rendszerhívások szük­ olvasására majdnem mindig a tulajdonosnál bővebb csoport számára is van jogo­
ségesek fájlok létrehozására, törlésére, olvasásukra és írásukra. M ielőtt egy fájlt sultság.
olvashatunk, meg kell nyitni, olvasás után pedig le kell zárni, így ezekhez is rend­ Bármely könyvtár-hierarchiabeli fájl azonosítható az útvonal nevével, kezdve a
szerhívások szükségesek. könyvtár-hierarchia tetejétől, az ún. gyökérkönyvtártól. Az ilyen teljes útvonalnév
A M INIX 3 a könyvtár (directory) fogalmát biztosítja a fájlok helyének nyilván­ azoknak a „/"jelek k el elválasztott könyvtárneveknek a listájából áll, amelyeket a
tartására és a fájlok csoportosítására. Egy hallgatónak például lehet egy könyvtára gyökérkönyvtártól a fájlhoz vezető úton találunk. Az 1.6. ábrán a CS101 fájl útvo­
a felvett kurzusairól (ebben tartja a kurzusok anyagait), egy másik az elektronikus nalneve /Oktatók/Prof Brown/Előadások/CSlOl. A kezdő „/” azt jelenti, hogy tel­
levelezéséhez, egy harm adik a World Wide Web honlapjához. Rendszerhívások jes útvonalnévről van szó, azaz a gyökérkönyvtárból indulunk. A Windows eseté­
kellenek a könyvtárak létrehozására, törlésére. Ugyancsak hívások segítenek ben a „\” jel használatos az elválasztásra a „/” helyett, így a fenti elérési útvonal a
egy létező fájl valamelyik könyvtárba helyezésére vagy abból való törlésére. következő lesz: \Oktatók\Prof.Brown\Előadások\CSl()l. A könyvben a Unix útvo­
Könyvtárelemek fájlok vagy újabb könyvtárak lehetnek. Ez a modell szintén egy nal-megadási jelölésm ódját fogjuk használni.
hierarchiához, a fájlrendszerhez vezet, amint az 1 .6. ábra mutatja. M inden processzus egy adott időpontban rendelkezik egy m unkakönyvtárral,
A processzusok és a fájlok hierarchiája egyaránt fastruktúrába szerveződik, de a ahol a nem „ / ” jellel kezdődő útvonalnevű fájlok keresése történik. Az 1.6. ábra
hasonlóság itt be is fejeződik. A processzushierarchia általában nem túl mély (há- példáján, ha a /Oktatók/Prof.Brown a munkakönyvtár, akkor az Előadások/CSlOl
útvonalnév ugyanazt a fájlt azonosítja, mint az előbbi teljes útvonalnév. A pro­
Gyökérkönyvtár cesszusok váltogathatják munkakönyvtáraikat, ha új m unkakönyvtárat azonosító
rendszerhívásokat hajtanak végre.
A M INIX 3 a fájlok és könyvtárak védelmére hozzájuk rendel egy 11 bites biná­
ris védelmi kódot. A védelmi kód három 3 bites mezőből áll, rendre a tulajdonos, a
tulajdonos csoportjának tagjai (a felhasználókat a rendszer-adm inisztrátor csopor­
tokba sorolja) és a többiek számára, a m aradék 2 bitet később tárgyaljuk. A mezők
bitjei az olvasási, írási, valamint végrehajtási jogokat jelzik. Egy ilyen 3 bites mezőt
rwx biteknek szokásos nevezni. Például az rwxr-x—x védelmi kód azt jelenti, hogy
a tulajdonosnak olvasási, írási és végrehajtási, csoportja többi tagjának olvasási
és végrehajtási (de írási nem), míg mindenki másnak csak végrehajtási joga van a
fájlra. Könyvtárakra az x a keresési engedélyt jelzi. A jel a megfelelő engedély
hiányát jelzi (a megfelelő bit 0 értékű).

Gyökér CD-ROM Gyökér

(a) (b)

1.7. ábra. (a) A CD-ROM-meghajtó fájljai a felcsatolás előtt nem elérhetők, (b) Felcsatolás után
1.6. ábra. Egy egyetemi tanszék fájlrendszere a fájlhierarchia részévé válnak
38 1.BEVEZETÉS 1.3. AZ OPERÁCIÓS RENDSZER FOGALMAI 39

Egy fájlt olvasása vagy írása előtt meg kell nyitni, ekkor történik a jogosultságok összekapcsolására alkalmas egyfajta fájl, amelyet az 1.8. ábra is m utat. H a az ,4 és
ellenőrzése. H a a hozzáférés engedélyezett, a rendszer visszaad egy kis egész érté­ B processzusok adatcsövön keresztül szeretnének kommunikálni, akkor azt előtte
ket, az ún. fájlleírót (deszkriptor), m inden további műveletben ezt kell használni. fel kell építeniük. Am ikor az A processzus adatot kíván küldeni a B processzus­
H a a hozzáférés tiltott, egy hibakódot (-1) kapunk vissza. nak, akkor az adatcsőbe ír, m intha az kimeneti fájl lenne. A B processzus az ada­
A M INIX 3 egy további fontos fogalma a fájlrendszerek felcsatolása. Majdnem tokat az adatcsőből olvashatja, m intha az bem eneti fájl lenne. Ezzel a M INIX 3
minden személyi számítógépben van egy vagy több CD-ROM -m eghajtó, ezek­ processzusainak egymással való kommunikációja a közönséges fájlolvasás és -írás
ben cserélgethetjük a CD lemezeket. Az ilyen eltávolítható adathordozók (CD módszeréhez hasonlónak látszik. Sőt egy processzus csak speciális rendszerhívás­
és DVD lemezek, hajlékonylemezek, Zip-meghajtók stb.) egyszerű kezelésére a sal képes megállapítani, hogy kimeneti fájlja nem valódi fájl, hanem adatcső.
M INIX 3 megengedi, hogy azok fájlrendszerét hozzácsatoljuk a fő könyvtár-hie-
rarchiához. Nézzük az 1.7.(a) ábra esetét. A mount rendszerhívás előtt a merevle­
mezen található gyökérfájlrendszer és a C D -R O M -on található másik fájlrend­ 1.3.3. A parancsértelmező
szer egymástól elválasztott és független.
A CD -RO M fájlrendszere azonban nem használható, hiszen nem tudunk rá útvo­ A rendszerhívásokat az operációs rendszer kódja hajtja végre. A szövegszerkesz­
nalnevet mondani. A M INIX 3 nem engedi, hogy az útvonalnevek elé m eghajtóne­ tők, fordítók, assemblerek, linkerek és a parancsértelm ezők nem az operációs
veket vagy számokat írjunk; ezzel ugyanis éppen eszközfüggőséget vezetne be, hol­ rendszer részei, de igen fontosak és hasznosak. Vállalva a dolgok egy kis keveré­
ott az operációs rendszernek illik az ilyet kiküszöbölni. Ehelyett a mount rendszer- sét, ebben a szakaszban röviden ism ertetjük a M INIX 3 parancsértelm ezőjét, a
hívás a CD-ROM -m eghajtó fájlrendszerét hozzácsatolja a gyökérfájlrendszerhez, shellt. Ez ugyan nem része az operációs rendszernek, de mivel intenzíven hasz­
megengedve a program kívánsága szerinti bármelyik helyre. Az 1.7.(b) ábrán a nálja az operációs rendszer funkcióit, igen kitűnő példa arra, hogyan kell a rend­
CD-ROM -m eghajtó fájlrendszerét a b könyvtárra csatoltuk fel, ezzel a /b/x és Ibly szerhívásokkal bánni. A term inálja előtt ülő felhasználó és az operációs rendszer
fájlok elérhetők. H a a b könyvtár tartalm az fájlt, az mindaddig nem érhető el, amíg között is ez az elsődleges kapcsolati felület, hacsak nem grafikus felhasználói felü­
a CD-ROM -m eghajtó oda van felcsatolva, hiszen a /b hivatkozás a CD-ROM - letet használunk. Sokféle shell létezik, ilyen például a csh, a ksh, a zsh és a bash is.
meghajtó gyökérkönyvtárát jelenti. (Az ilyen fájlok elérhetetlensége nem tragédia, Mindegyikük tám ogatja a következőkben ism ertetett funkciókat, amelyek az ere­
a fájlrendszereket üres könyvtárakra szokták felcsatolni.) H a a rendszerben több deti shellből származnak (sh).
merevlemez is elérhető, ezek szintén felcsatolhatók egyetlen fastruktúrába. M inden felhasználó bejelentkezésekor egy parancsértelm ező indul el. A pa­
A M INIX 3 egy másik fontos fogalma a specifikus fájl. A specifikus fájlok rancsértelm ező standard bem enete és kim enete a terminál. A parancsértelm ező a
segítségével lehet az I/O-eszközöket fájlokként kezelni. Ezzel a módszerrel ugyan­ prompt, például a dollárjel megjelenítésével indul, ezzel jelzi, hogy kész a felhasz­
azokkal a rendszerhívásokkal tudunk olvasni róluk és írni rájuk, amelyekkel a fáj­ náló parancsának fogadására. H a most a felhasználó például a
lokat olvassuk és írjuk. Kétféle specifikus fájl létezik: a blokkspecifikus és a karak­
terspecifikus fájlok. Blokkspecifikus fájlokat használunk norm ál esetben az olyan date
eszközök modellezésére, amelyek tetszőlegesen címezhető blokkok gyűjteményé­
ből állnak, ilyenek például a lemezek. H a megnyitunk egy blokkspecifikus fájlt sort gépeli, akkor a parancsértelm ező létrehoz egy gyermekprocesszust, amely a
és olvassuk például a 4. blokkot, akkor a program az eszköz 4. blokkját közvet­ date program ot futtatja. A gyermekprocesszus futása közben a parancsértelm ező
lenül eléri, függetlenül attól, hogy az eszközön a fájlrendszer milyen struktúrájú. annak m egszűntére vár. A gyermek megszűnésekor a parancsértelm ező újra meg­
H asonlóan karakterspecifikus fájlokat használunk nyomtatók, m odem ek és olyan jeleníti a prom ptot, és a következő bem eneti sor beolvasását kísérli meg.
eszközök modellezésére, amelyek karaktersorozatokat fogadnak vagy küldenek. A felhasználó a standard kim enetet átirányíthatja fájlba, ha begépeli például a
A specifikus fájlok egyezményes helye a /dev könyvtár. Például a Idevllp egy soros
nyomtató lehet. date >file
Még egy fogalomról ejtünk szót ebben az áttekintésben, amely mind a processzu­
sokkal, mind a fájlokkal kapcsolatos, az adatcsőről. Az adatcső két processzus sort. Hasonlóan a standard bem enet is átirányítható, mint az alábbi parancsban

Processzus Processzus sort <file1 >file2

amely a sort program ot indítja; ez bem enetét a filel fájlból veszi, eredményeit pe­
dig a file2 fájlba küldi.
1.8. ábra. Két processzust egy adatcső köt össze
40 1. BEVEZETÉS 1.4. r e n d s z e r h ív á s o k 41

Egy program kim enetét egy másik program bem eneteként használhatja, ha egy Processzus­ pid =fork() A szülővel azonos gyermekprocesszus létrehozása
adatcsővel kötjük össze őket. A kezelés pid =waitpid(pid, &status, opts) Gyermek megszűnésére várakozás
s =waitf&status) A waitpid elavult változata
s=execve(name, argv, envp) A processzus memóriatérképénekfelülírása
cat filel file2 file3 | sort >/dev/lp exit(status) A processzus végrehajtásának befejezése és az exit státus
beállítása
parancsban a cat három fájlt konkatenál, eredm ényét átküldi a sort programnak, size =brk(addr) Az adatszegmens méretének beállítása
pld =getpidO A hívó processzus pid azonosítójának visszaadása
amely a sorokat alfabetikus sorrendbe rendezi. A sort kim enetét átirányítottuk a pid =getpgrpO A hívó processzus csoportazonosítójának visszaadása
/dev/lp fájlba, amely szokásosan a nyom tatót jelenti. pid =setsidO Új szekció létrehozása és processzuscsoport gid visszaadása
H a a parancs végére egy „&” jelet gépel a felhasználó, akkor a parancsértelm e­ 1=ptracefreq, pid, addr, data) Tesztelésre használható
ző nem vár a parancs végrehajtásának befejeztére, hanem azonnal újra prom ptot Szignálok s=sigaction(sig, &act, &oldact) Szignálokon végrehajtandó akciót definiál
s=sigreturnl&context) A szignál eljárásból való kilépés
ad. így a s=sigprocmask(how, &set, fold) A szignál maszkvizsgálata vagy módosítása
s=sigpendlng(set) A blokkolt szignálhalmaz megkérése
cat filel file2 file31 sort >/dev/lp & s=sigsuspend(sigmask) Aszignál maszkfelülírása és a processzus felfüggesztése
s=kill(pid, sigj Szignál küldése egy processzusnak
residual =alarm(seconds) Az ébresztőóra beállítása
parancs háttérfeladatként indítja el a sort program ot, eközben a felhasználó foly­ s=pauseO A hívó felfüggesztése a következő szignál érkezéséig
tathatja megszokott munkáját. Itt nincs hely arra, hogy a parancsértelm ező számos Fájlkezelés fd =creat(name, mode) Új fájl létrehozásának elavult változata
egyéb érdekes tulajdonságát tárgyaljuk. A kezdők számára készült Unix-könyvek fd =mknodfname, mode, addr) Reguláris, specifikus vagy könyvtár i-csomópont létrehozása
fd =openffile, how,...) Fájl megnyitása olvasásra, írásra vagy mindkettőre
nagy része megfelelő azoknak, akik a M INIX 3 használatát szeretnék jobban meg­
s =dose(fd) Nyitott fájl lezárása
tanulni; ilyenek például (Ray és Ray, 2003; H erborth, 2005). n =read(fd, buffer, nbytes) Adat olvasása fájltárolóba
n =write(fd, buffer, nbytes) Adat írása fájltárolóból fájlba
pos =lseek(fd, offset, whence) A fájlmutató mozgatása
s =statfname, &buf) Fájl állapotinformációinak megkérése
s =fstat(fd, &buf) Fájl állapotinformációinak megkérése
1.4. Rendszerhívások fd =dup(fd) Nyitott fájl leírójának átmásolása
s=pipe(&fd[0]) Adatcső létrehozása
s=ioctl(fd, request, argp) Fájlokon speciális műveletek végrehajtása
Van m ár áttekintésünk arról, hogyan kezeli a M INIX 3 a processzusokat és a fáj­ s =access(name, amode) Fájl elérhetőségének vizsgálata
lokat, most nézzük az operációs rendszer és a felhasználói program ok közötti kap­ s =rename(old, new) Fájl átnevezése
csolatot, azaz a rendszerhívások készletét. Tárgyalásmódunk POSIX- (International s =fcntl(fd, cmd,...) Fájl zárolása és egyéb műveletek
Standards 9945-1) alapú, így a M INIX 3-ra, a Unixra és a Linuxra is érvényes, de Könyvtár- és s =mkdir(name, mode) Új könyvtár létrehozása
fájlrendszer­ s =rmdir(name) Üres könyvtár megszüntetése
a legtöbb mai operációs rendszerben ugyanezeket a feladatokat végrehajtó rend­
kezelés s =link(name1,name2) Egy új, a namel-re mutató name2 bejegyzés létrehozása
szerhívások vannak, még ha részleteikben különböznek is. A rendszerhívások vég­ s =unlink(name) Egy könyvtárbejegyzés megszüntetése
rehajtásának esetenkénti módszere erősen gépfüggő, leginkább assembly nyelven s=mountfspecial, name, flag) Fájlrendszer felcsatolása
fogalmazható meg, ezért egy eljáráskönyvtár áll rendelkezésünkre ahhoz, hogy C s=umount(special) Fájlrendszer lecsatolása
s =sync() A raktározott adatblokkok írása lemezre
nyelvű programokból rendszerhívásokat hajthassunk végre. s=chdlr(dirname) A munkakönyvtár változtatása
Érdem es megjegyezni a következőt: bármelyik egyprocesszoros számítógép egy s=chroot(dirname) A gyökérkönyvtár változtatása
időben csak egy utasítást képes végrehajtani. Amennyiben a processzus egy fel­ Védelem s=chmod(name, mode) Afájl védelmi bitjeinek változtatása
használói m ódban futó felhasználói program ot futtat és rendszerhívásra van szük­ uid =getuidO A hívó uid azonosítójának megkérése
gid =getgidO A hívó gid csoportazonosítójának megkérése
sége, egy csapdát vagy rendszerhívó utasítást kell végrehajtania, hogy a vezérlést s=setuid(uid) A hívó uid azonosítójának beállítása
átadja az operációs rendszernek. A param éterek vizsgálatával az operációs rend­ s =setgid(gid) A hívó gid csoportazonosítójának beállítása
szer eldönti, hogy a hívó processzus mit szeretne. Ezután végrehajtja a rendszer- s=chown(name, owner, group) Afájl tulajdonosának és csoportjának változtatása
oldmask =umask(complmode) A módmaszk változtatása
hívást, és visszaadja a vezérlést arra az utasításra, amely a rendszerhívást követi.
Időkezelés seconds =time(&seconds) Az 1970.jan.1-jétől eltelt idő megkérése
Bizonyos értelem ben egy rendszerhívás olyan, mint egy speciális eljáráshívás, csak
s=stime(tp) Az 1970. jan.1-jétől eltelt idő beállítása
a rendszerhívások a magba vagy más privilegizált operációsrendszer-komponens- s=utime(file, timep) Afájlok utolsó hozzáférési idejének beállítása
be lépnek be, míg a hagyományos eljáráshívások nem. s=times(buffer) Az elhasznált felhasználói és rendszeridő megkérése

1.9. ábra. A MINIX fő rendszerhívásai. Az fd egy fájlleíró; az n egy bájtszámláló


42 1. BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 43

A rendszerhívások mechanizmusának megvilágítására nézzük a read esetét, #defineTRUE 1


melynek három param étere van: a fájl, a tároló és a beolvasandó bájtok számának while (TRUE) { /* ismételd örökké */
type_prompt(); /* prompt megjelenítése a képernyőn */
specifikációi. Egy C program ból a read hívása így nézhet ki:
read_command(utasitas, paraméterek); /* olvass bemenő adatokat a terminálról */

count = read(fd, buffer, nbytes); if (fork() != 0) { /* indíts el egy gyermekeljárást */


/* Szülő kódja */
A rendszerhívás (és a könyvtárbeli eljárás) a count változóban visszaadja a tényle­ waitpid(-1, &status, 0); /* várj, amíg a gyermekeljárás kilép */
gesen beolvasott bájtok számát. Ez az érték általában megegyezik az nbytes érték­ } else {
kel, de lehet kisebb, ha például az olvasás közben fájl végét észlelünk. /* Gyermek kódja */
H a a rendszerhívás nem hajtható végre param éterhiba vagy lemezhiba miatt, a execve(utasitas, paraméterek, 0); /* hajtsd végre az utasítást */
count értéke -1 lesz, továbbá az ermo globális változóba egy hibakód kerül. Prog­ }
ramjainkban mindig ellenőrizni kell a rendszerhívások által visszaadott értéket, }
hogy az esetleges hibát észrevegyük.
A M INIX 3-ban összesen 53 fő rendszerhívás van. Az 1.9. ábra (lásd előző ol­ 1.10. ábra. Egy lecsupaszított parancsértelmező. A TRUE-ró/ az egész könyvben feltételezzük,
dal) sorolja fel ezeket áttekinthető csoportosításban, hat kategóriában. Van még hogy 1-nek van definiálva
néhány más hívás is, de mivel azok csak nagyon speciális célra használhatók, ezért
kihagyjuk őket. A következő szakaszokban röviden megvizsgáljuk az 1.9. ábrán A fork-ot követően a gyermeknek legtöbbször a szülőétől különböző program ot
felsorolt hívások m űködését. Nagyrészt ezen rendszerhívások által biztosított kell végrehajtania. Nézzük a parancsértelm ezőt. A term inálról olvas egy paran­
tevékenységek határozzák meg az operációs rendszerek nyújtotta szolgáltatáso­ csot, fork-kal létrehoz egy gyermekprocesszust, várakozik arra, hogy a gyermek
kat. (Személyi számítógépeken az erőforrás-kezelés elhanyagolhatóan kis feladat végrehajtsa a parancsot, ezt követően pedig olvassa a következő parancsot. A szü­
a sokfelhasználós nagy rendszerekhez képest.) lő a waitpid rendszerhívás végrehajtásával várja a gyermek megszűnését; ez csak
Ez a megfelelő hely arra, hogy rámutassunk, a POSIX-eljáráshívások és a rend­ a gyermek (vagy az egyik gyermek, ha több is van) megszűnéséig várakoztat. A
szerhívások egymáshoz való m egfeleltetése nem feltétlenül egyértelmű. A POSIX waitpid végrehajtása után a második (statloc) param éterében adott címen elhelyezi
szabvány felsorolja a rendszerek által biztosítandó eljárásokat, de nem írja elő, a gyermek exit státusát (normális vagy abnormális megszűnés, illetve exit státus).
hogy ezek rendszerhívások, könyvtári eljárások vagy egyebek legyenek. Egyes ese­ Különböző lehetőségek (opciók) is beállíthatók, amit a harm adik param éter hatá­
tekben a POSIX-eljárásokat a M INIX 3 könyvtári eljárásokkal valósítja meg. Más roz meg. A waitpid helyettesíti a korábbi elavult wait hívást, amelyet csak a vissza­
esetekben, ha a szabvány előírta eljárások egymástól csak kissé különböznek, ak­ menőleges kompatibilitás m iatt soroltunk fel.
kor azokat egyetlen rendszerhívással valósítottuk meg. Most nézzük, hogyan használja a parancsértelm ező a fork-ot. H a egy parancsot
begépeltünk, a parancsértelm ező létrehozza az új processzust. Ez a gyermekpro­
cesszus fogja végrehajtani a felhasználói parancsot. Ezt az execve rendszerhívás
1.4.1. Processzuskezelő rendszerhívások végrehajtásával teszi, amely a teljes m em óriatérképét felülírja az első param éter­
ként adott fájl tartalmával. (Tulajdonképpen maga a rendszerhívás az exec, de ezt
Az első rendszerhíváscsoport a processzusok kezelésére szolgál. Az ism ertetést számos különböző könyvtári eljárás hívja más-más param éterezéssel és alig külön­
a fork hívással kezdjük. A fork a processzusok létrehozásának egyetlen módja böző névvel.) Egy leegyszerűsített parancsértelm ezőt illusztrál az 1.10. ábra a fork,
M INIX 3-ban. Az eredeti processzus pontos másolatát hozza létre, beleértve a a waitpid és az execve használatára.
fájlleírókat, regiszterértékeket, mindent. A fork után az eredeti és a m ásolat (a Általános esetben az execve-nek három param étere van: a végrehajtandó fájl
szülő- és a gyermek-) processzus végzi a maga külön-külön feladatát. A fork vég­ neve, az argumentumvektorra m utató pointer és a környezeti változók vektorá­
rehajtásának pillanatában m inden változójuk értéke azonos, mivel a szülő adatai ra m utató pointer. Ezeket most röviden ismertetjük. Néhány további könyvtá­
m ásolódtak át a gyermek létrehozásakor. A későbbi m ódosítások azonban már ri eljárás is rendelkezésünkre áll, például az execl, execv, execle, execve, amelyek
függetlenek egymástól. (A program kódján a szülő és a gyermek osztozik, hiszen megengedik bizonyos param éterek elhagyását vagy más m ódon való megadását.
ez nem változtatható.) A fork által visszaadott érték a gyermek számára 0, a szülő Könyvünkben az exec nevet használjuk mint ezek reprezentatív rendszerhívását.
számára a gyermek PID (processzusazonosító). A visszaadott PID-azonosító érté­ Nézzük a
ke alapján tudják a processzusok eldönteni, hogy melyikük a szülő- és melyikük a
gyermekprocesszus. cpfile! file2
44 1.BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 45

parancsot, amely a file l tartalm át átmásolja a file2 fájlba. M iután a parancsértel­ Cím (hexadecimális)
mező létrehozta, a gyermekprocesszus megkeresi és végrehajtja a cp fájlt a forrás- FFFF
és a célfájl neveinek átadásával. terem
A cp (és többnyire minden más C nyelvű) program főprogram ja a következő
deklarációt tartalmazza: vv Hézag ^
W ////Á
Adat
main(argc, argv, envp)
Kód
0000
ahol az argc a parancssorbeli elemek darabszáma, beleértve a program nevét is,
példánkban az argc 3. 1.11. ábra. A processzusok három szegmensből állnak: kód, adat és verem.
A második param éter, az argv egy vektorra m utató pointer. A vektor i-edik ele­ Ebben a példában egy címtartomány van, de megengedett a külön-külön kód-
me a parancssor í-edik karaktersorozatára m utató pointer, példánkban argv[0] a és adatcímtartomány is
„cp”, az argv[ 1] a „filel”, míg az argv[2] a „file2” karaktersorozatra mutat.
A main harm adik param étere, az envp a környezetre m utató pointer, amely egy az adatszegmenshez adandó bájtok számát tartalm azza (negatív érték csökkenti
name=value alakú értékadó karaktersorozatokat tartalm azó vektor. Ezekkel tu­ az adatszegmenst). Úgy működik, hogy lekérdezi az adatszegmens aktuális m ére­
dunk olyan információkat közölni a programokkal, mint például a term inál típusa tét; ez a brk visszaadott értéke, majd kiszámolja az új m éretet, végül egy hívással
vagy a home könyvtár neve. Az 1.10. ábrán a környezetet nem adjuk át a gyermek­ erre állítja a m éretet. A POSIX szabvány azonban nem definiál brk és sbrk híváso­
processzusnak, ezért 0 az execve harmadik param étere. kat. Dinamikus helyfoglaláshoz a malloc könyvtári eljárás használatát javasolják a
Ne essünk kétségbe, ha az exec-et bonyolultnak találjuk; ez a (szemantikusán) programozóknak, a malloc alapját képező megvalósítást ugyanis nem tartották al­
legösszetettebb rendszerhívás. Az összes többi sokkal egyszerűbb. Hogy lássunk kalmasnak szabványosításra, mivel kevés programozó használja azt közvetlenül.
egy egyszerűbbet is, nézzük az exit-et, amelyet m inden program nak végrehajtása A getpid processzuskezelő rendszerhívás úgyszintén egyszerű. Visszaadja a hívó
befejezésekor végre kell hajtania. Az exit státus (0-255) az egyetlen param étere; processzus PID-értékét. Emlékezzünk arra, hogy a fork végrehajtásakor csak a szülő
ezt kapja vissza a szülő a waitpid rendszerhívás statloc param éterében. A státus kapja meg a gyermek PID-értékét. A gyermek a getpid végrehajtásával kaphatja meg
alacsonyabb helyi értékű bájtja a megszűnési státust tartalmazza; ez 0 normális saját PID-értékét. A getpgrp a hívó processzus csoportjának PID -értékét adja visz-
megszűnéskor, egyéb értéke különböző hibafeltételeket jelent. A magasabb helyi sza. A setsid egy új szekciót hoz létre, ennek processzuscsoportja a hívó PID -értékét
értékű bájton a gyermek exit státusa van. H a például a szülőprocesszus az kapja. A szekció a POSIX-készlet opcionális feladatvezérlés fogalmával kapcsola­
tos; ez a M INIX 3-ban nincs implementálva, nem is foglalkozunk vele többet.
n = waitpid(-1, &statloc, options); U toljára említjük a ptrace processzuskezelő rendszerhívást, amelyet tesztelő
program ok használhatnak a tesztelt program ok vezérlésére. Megengedi a tesztelt
utasítást hajtja végre, akkor mindaddig felfüggesztődik, míg valamelyik gyermek­ program memóriájának olvasását, írását és egyéb kezelési lehetőségeket ad.
processzusa meg nem szűnik. H a egy gyermek például exit(4) végrehajtásával szű­
nik meg, akkor a szülő feléledésekor n értéke a gyermek pid azonosítója, a statloc
értéke pedig 0x0400 lesz. (Könyvünkben a C írásm ódnak megfelelő Ox prefixet 1.4.2. Szignálkezelő rendszerhívások
használjuk hexadecimális számok jelölésére.)
A M INIX 3 processzusainak m emóriáját három szegmensre tagoljuk: a kódszeg­ Bár a processzusok közötti kommunikáció többnyire tervezett m ódon folyik, van­
mens (a program kódja), az adatszegmens (a változók) és a veremszegmens. Az nak esetek, amikor váratlan kapcsolatterem tésre van szükség. Például ha vélet­
1 .11 . ábra mutatja, hogy az adatszegmens felfelé, míg a veremszegmens lefelé nő. lenül egy nagyon hosszú fájl teljes tartalm ának nyom tatását kérjük egy szöveg-
Köztük található a nem használt címtartomány hézaga. A verem szükség szerint au­ szerkesztőtől, majd észrevesszük, hogy hibáztunk, valahogy meg kell állítanunk a
tomatikusan terjeszkedik a hézagban, de az adatszegmens bővítéséhez a brk rend­ szerkesztőt. A M INIX 3-ban a c t r l -C billentyű leütésével küldhetünk szignált a
szerhívás explicit végrehajtása szükséges, amely azt a címet adja meg, hogy hol fe­ szerkesztőnek. A szerkesztő megkapja a szignált, és erre leállítja a nyomtatást.
jeződjék be az adatszegmens. Ez a cím lehet magasabb (az adatszegmens nő) vagy Szignálok alkalmasak a hardver által felderített csapdák jelzésére is: ilyenek az ér­
alacsonyabb (az adatszegmens csökken), mint az adatszegmens aktuális végcíme. vénytelen utasítás-végrehajtás vagy a lebegőpontos túlcsordulás. Az időintervallu­
Természetesen a veremmutató értékénél alacsonyabb param étert kell használnunk, mok lejártát szintén szignálokkal implementálják.
különben az adat- és veremszegmens átfednék egymást, ami megengedhetetlen. H a a szignált egy olyan processzus kapja, amely nem jelezte, hogy hajlandó ezt
A kényelmesebb programozás kedvéért egy sbrk könyvtári eljárás is rendelkezé­ a szignált fogadni, a processzus minden további nélkül megszűnik. A processzus
sünkre áll az adatszegmens m éretének változtatására, ennek egyetlen param étere
46 1. BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 47

a sigaction rendszerhívás végrehajtásával kerülheti el ezt a sorsot. Ezzel a hívással sítójuk - független processzusok ugyanis nem küldhetnek szignált egymásnak).
jelzi, hogy felkészült bizonyos típusú szignálok fogadására, továbbá megadja a szig­ Tételezzük fel az előbbi példában, hogy a háttérprocesszus m ár elindult, de kide­
nálkezelő eljárásának a címét és egy változót, ahol az aktuális szignálkezelő eljárás rül, hogy meg kell állítani. A SIG IN T és a SIG Q U IT szignálokat hatástalanítot­
címe elhelyezhető. A sigaction hívást követő, ennek megfelelő típusú szignál megjele­ tuk, valami egyébre van szükség. A megoldás a kill parancs végrehajtása, amely
nésekor (például a c t r l - C leütése) a processzus állapota saját vermébe mentődik, a kill rendszerhívással bármelyik processzusnak képes szignált küldeni. H a a 9-es
majd a szignálkezelő eljárás hívódik. Ez addig fut, amíg szükséges, sőt feladatától (SIGKILL) szignált elküldjük bármelyik háttérprocesszusnak, akkor az megszű­
függően még további rendszerhívásokat is végrehajthat. A szignálkezelő eljárások nik. A SIGKILL nem kezelhető le és nem hagyható figyelmen kívül.
a gyakorlatban leginkább igen rövidek. H a a szignálkezelő eljárás befejeződött, a A valós idejű alkalmazásokban gyakori eset, hogy a processzusok m eghatáro­
sigreturn hívást hajtja végre; ezzel a processzus ott folytatódik, ahol a szignál érkezé­ zott időintervallum onként megszakítandók valamilyen tevékenység végrehajtásá­
sekor megszakadt. A sigaction váltotta fel a régebbi signal hívást; ez utóbbi könyvtári ra, például a m egbízhatatlan kommunikációs vonalakon esetleg elveszett üzene­
eljárásként még elérhető, de csak a visszafelé kompatibilitás megőrzése érdekében. tek újraküldésére. E rre való az alarm rendszerhívás. Param étere másodpercekben
A szignálok blokkolhatok a M INIX 3-ban. Egy blokkolt szignál függő állapot­ m egad egy időintervallumot, amelynek elteltével a processzus egy SIGALRM
ban m arad blokkolásának feloldásáig. Nem veszik el, de nem is küldjük el. A pro­ (ébresztőóra) szignált kap. Egy processzusnak egyszerre csak egy ébresztőóra-be­
cesszus a sigproemask hívással definiálhatja a blokkolt szignálok halm azát oly mó­ állítása lehet. így, ha egy alarm hívás történik 10 m ásodperces param éterrel, majd
don, hogy egy bitvektort (maszkot) határoz meg. Lehetséges az is, hogy a procesz- 3 másodperccel később egy másik 20 másodperces param éterrel, akkor csak egy
szus lekérdezze az aktuálisan függő állapotú, de blokkolt állapotuk m iatt el nem szignált fogunk kapni, mégpedig a második hívás után 20 másodperccel. Az első
küldhető szignálok halmazát. A sigpending hívás adja vissza ezt a halmazt bitvek­ hívást semmissé teszi a második alarm hívás. H a az alarm param étere 0, akkor min­
tor formájában. Végül a sigsuspend hívás szolgál arra, hogy a processzus egyenként den korábbi ébresztőóra-beállítás megsemmisül. H a egy ébresztőóra-szignált nem
állíthassa be a blokkolt szignálok bitvektorait és függeszthesse fel saját magát. fogadunk, akkor az alapeljárás érvényesül, azaz a processzus megszűnik.
A szignálkezelő eljárás megadása helyett a processzus a SIG_IGN konstanst is Az az eset is előfordul, hogy szignál érkezéséig nincs teendője a processzusnak.
megadhatja, ezzel a később megjelenő, adott típusú szignálok figyelmen kívül ha­ Nézzük például azt a számítógéppel segített oktatóprogram ot, amely az olvasás
gyását kéri, a SIG_DFL konstanssal pedig helyreállíthatja a szignálra vonatkozó sebességét és megértését teszteli. Megjeleníti a szöveget a képernyőn, majd hívja az
alapeljárást. A z alapeljárás szignáltípusonként különböző, vagy a processzus meg­ alarm-ot 30 másodperces param éterrel. Amíg a tanuló olvassa a szöveget, a prog­
szüntetését, vagy a szignál figyelmen kívül hagyását jelenti. A SIG_IGN használa­ ram nak nincs teendője. Esetleg várakozhatna egy üres ciklusban, de ezzel a más
tának bem utatására nézzük meg, mi történik, ha egy processzusok vagy felhasználók szám ára hasznos CPU-időt vesztegetné el. Jobb
ötlet a pause végrehajtása, amely a M IN IX 3-mal azt közli, hogy a következő szig­
command & nál érkezéséig függessze fel a processzust.

parancsra a parancsértelm ező létrehoz egy háttérprocesszust. Nem volna kívána­


tos, ha a ( c t r l - C lenyomásával keletkező) SIGINT szignál zavarná a háttérpro­ 1.4.3. Fájlkezelő rendszerhívások
cesszust, ezért a fork után, de még az exec előtt a parancsértelm ező végrehajtja a
Igen sok rendszerhívás a fájlrendszerekkel kapcsolatos. Ebben a szakaszban az
sigaction(SIGINT, SIG JG N , NULL); egyedi fájlokra vonatkozó hívásokkal foglalkozunk. A következő szakasz a könyv­
tárak vagy a fájlrendszerek egészére vonatkozó hívásokat fogja tárgyalni. Új fájl
és létrehozására a creat hívás szolgál. (Hogy m iért creat és nem create, m ár az idő ho­
mályába veszett.) Param éterei a fájl nevét és védelmi m ódját jelentik. Az
sigaction(SIGQUIT, SIG JG N , NULL);
fd = creat("abc", 0751);
hívásokat; ezzel a SIGIN T és a SIG Q U IT szignálok letiltását kéri. (A SIG Q U IT
szignált a c t r l -\ generálja; ez ugyanaz, mint a SIGINT, azzal a különbséggel, hogy hívás egy abc nevű fájlt az oktális 0751 védelmi kóddal hoz létre. (C-ben a vezető
ha a processzus nem fogadja vagy nem kéri a figyelmen kívül hagyását, akkor 0 oktális konstanst jelez.) A 0751 utolsó 9 bitje jelöli az rwx biteket a tulajdonosra
a processzus megszűnik, és elkészül a mem óriaképének fájlmásolata.) H a nem (a 7 olvasási-írási-végrehajtási jog), a csoportra (az 5 olvasási-végrehajtási jog) és
háttérprocesszusról van szó, ezek a szignálok nem lesznek figyelmen kívül hagyva. a többiekre (az 1 csak végrehajtási jog) vonatkozóan.
A c t r l - C leütése nem az egyetlen mód szignál küldésére. A kill rendszerhívás­ A creat nemcsak létrehozza, hanem a m ódtól függetlenül, írásra meg is nyitja
sal egy processzus egy másiknak tud szignált küldeni (ha közös az UID-azono- a fájlt. A visszaadott fd fájlleíró használható a fájl írásakor. H a a creat m ár létező
48 1.BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 49

fájlra hajtódik végre, ez 0 hosszúságúra rövidül, term észetesen csak ha a jogosult­ struct stat {
ságok rendben vannak. A creat hívás elavult, mivel az open is létrehozhat fájlokat, short st_dev; /* az i-csomóponthoz tartozó eszköz */
csak a visszafelé kompatibilitás miatt soroltuk fel. unsigned short stjno ; /* az i-csomópont száma */
Specifikus fájlokat nem a creat-tel, hanem az mknod-dal hozunk létre. Például az unsigned short st_mode; /* a mód */
short st_nlink; /*a linkek száma */
fd = mknod("/dev/ttyc2", 020744,0x0402); short st_uid; /* a felhasználó uid azonosítója */
short st_gid; I* a csoport gid azonosítója */
short st_rdev; I* fő- vagy mellékeszköz specifikus fájlokhoz */
hívás létrehozza a /dev/ttyc2 nevű fájlt (ez a 2. konzol szokásos neve) a 020744 ok­
long st_size; /* fájl méret*/
tális m óddal (karakterspecifikus fájl az rwxr—r— védelmi bitekkel). A harmadik
long st_atime; /* az utolsó hozzáfordulás időpontja */
param éter magasabb helyi értékű bájtja a főeszközt (4), alacsonyabb helyi értékű long st_mtime; I* az utolsó módosítás időpontja */
bájtja a mellékeszközt (2) jelöli. A főeszköz bármi lehet, de a /dev/ttyc2 nevű szo­ long st_ctime; /* az utolsó i-csomópont módosítás időpontja */
kásosan a 2-es mellékeszköz szokott lenni. Az mknod hívás hibára vezet, ha nem a };
szuperfelhasználó hajtja végre.
Létező fájl olvasása vagy írása előtt a fájlt open-nel meg kell nyitni. A hívás­ 1.12. ábra. A stat és fstat rendszerhívások által visszaadott információ struktúrája.
ban specifikáljuk a megnyitandó fájl teljes útvonalnevét vagy a munkakönyvtár­ A tényleges programban egyes típusokat szimbolikus nevekjelölnek
hoz képest a relatív útvonalnevét, továbbá az O RDONLY, az O JV R O N L Y és az
O RD W R kódok valamelyikét; ezzel az olvasásra, írásra vagy m indkettőre való a standard kim enetre írja, végül helyreállítja az eredeti állapotot. Az 1 értékű fájl­
megnyitást kérve. A visszakapott fájlleíró használható ezután az olvasásra, írásra. leíró lezárása és egy új fájl megnyitása pontosan azt eredményezi, hogy az új fájl
Végül a fájlt le kell zárni a close hívással; ezzel a fájlleíró további creat vagy open lesz a standard kim enet (feltételezve, hogy a standard bem enet 0 értékű fájlleírója
hívásokban újrafelhasználhatóvá válik. használatban van), de az eredeti állapot ezek után m ár nem állítható helyre.
Kétségkívül a read és a write hívásokat használjuk a legtöbbet. A read-ről m ár M egoldásként először hajtsuk végre az
szóltunk korábban; a write-nak ugyanazok a param éterei.
A program ok többsége a fájlokat szekvenciálisán olvassa és írja, néhány felhasz­ fd = dup(1);
nálói program nak azonban szüksége lehet valamely fájl véletlenszerűen kiválasz­
tott tetszőleges részéhez való hozzáférésre. M inden fájlhoz tartozik egy pointer, utasítást, az ebben szereplő dup rendszerhívás ad egy új f d fájlleírót, amelyik
amely a fájl aktuális pozíciójára mutat. H a szekvenciálisán olvasunk (írunk), a po­ ugyanarra a standard kimeneti fájlra való hivatkozás. Most m ár a standard kime­
inter a legközelebb olvasandó (írandó) bájtra mutat. Az lseek hívás szolgál a pozí­ net lezárható és az új fájl megnyitható, használható. Amikor az eredeti állapot
cióm utató értékének a m ódosítására, így az ezt követő read és write hívások indít­ helyreállításának itt az ideje, az 1 értékű fájlleírót lezárjuk, ezt követően az
hatók a fájl tetszőleges helyéről, esetleg a végéről is.
Az lseek három param éteres: a fájlleíró, a kívánt fájlpozíció, a harm adik pedig n = dup(fd);
azt közli, hogy a fájlpozíció a fájl elejéhez, az aktuális pozíciójához vagy a végéhez
képest relatív. Az lseek visszaadott értéke a m utató változása utáni fájlbeli abszo­ végrehajtásával újra megkapjuk a legalacsonyabb, nevezetesen az 1 értékű fájlle­
lút pozíció. írót, amely az fd-ve 1 azonos fájlra hivatkozik. A z f d lezárásával végül a kiindulási
A M INIX 3 m inden fájlra vonatkozóan megőrzi a fájl típusát (közönséges vagy állapotba jutunk vissza.
specifikus fájl, könyvtár vagy egyéb), m éretét, utolsó módosítási idejét és más in­ A dup hívás egy variánsa azt teszi lehetővé, hogy tetszőleges használaton kívüli
formációkat. A program ok ezen információkat a stat és az fstat rendszerhívásokkal fájlleírót hozzárendeljünk egy m ár megnyitott fájlhoz. Ez a
kérhetik meg. Csak abban különbözik a kettő, hogy a fájlt az előbbi a nevével,
utóbbi pedig a fájlleírójával specifikálja. Az fstat használható megnyitott fájlokra, dup2(fd,fd2);
különösen ha a fájl nevét nem is ismerjük, például a standard bem eneti és kim ene­
ti fájlok esetében. M indkét hívás második param étere egy struktúra címe, ahová hívással történik, ahol fd a megnyitott fájl leírója, fd2 pedig egy használaton kívüli
az információk elhelyezését kérjük. Az 1.12. ábrán látható a struktúra. leíró, amely ezek után az/d-vel azonos fájlra fog hivatkozni. H a fd a standard be­
Am ikor fájlleírókkal dolgozunk, a dup hívás hasznos lehet. Például nézzük azt m enetre hivatkozik (0 értékű fájlleíró) és fd 2 értéke 4, akkor a fenti hívás után a
a program ot, amelyik lezárja a standard kim enetét (fájlleírója 1), standard kim e­ 0 és 4 értékű fájlleírók mindegyike a standard bem enetre hivatkozik.
netként egy másik fájlt határoz meg, meghív egy függvényt, amely az eredményeit
50 1. BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 51

M ár említettük, hogy a M INIX 3 a processzusok közötti kommunikációra adat­ lenne egy hibát elemző és argum entum okat is kezelő példa.) Először az adatcső
csöveket használ. H a a felhasználó a jön létre, majd a fork után a szülő lesz az adatcső egyik processzusa, a gyermek pe­
dig a másik. A végrehajtandó processl és process2 programfájlok nem tudják, hogy
cat filel file21 sort egy adatcső részei, ezért a fájlleírókat kell úgy beállítani, hogy az első processzus
standard kimenete a második processzus standard bem enete legyen. A szülőpro­
parancsot begépeli, a parancsértelm ező létrehoz egy adatcsövet, megszervezi azt, cesszus lezárja az adatcső olvasására szolgáló fájlleíróját. Ezt követően lezárja
hogy az első processzus standard kim enetén az adatcsőbe írjon, míg a második standard kim enetét, a dup hívással eléri, hogy az 1 értékű fájlleíróval az adatcsőbe
processzus a standard bem enetén az adatcsőből olvasson. A pipe rendszerhívás írhasson. Jegyezzük meg, hogy a dup mindig a legalacsonyabb értékű, használaton
létrehoz egy adatcsövet, továbbá két fájlleírót ad vissza: egyik írásra, a másik olva­ kívüli fájlleírót adja vissza; esetünkben ez 1. Végül a szülő lezárja az adatcsőre hi­
sásra alkalmas. A vatkozó másik fájlleírót.
Az exec hívással elindított program a 0 és a 2 értékű fájlleírókat érintetlenül
pipe(&fd[0]); megkapja, az 1 értékű fájlleíróval pedig írhat az adatcsőbe. A gyermek program ­
ja hasonló. Az execl hívás param étere ismétlődik, lévén az első a végrehajtandó
hívásban az fd két egész értékből álló vektor, fd[0] az olvasásra, fd[\] pedig az írás­ programfájl neve, a második pedig a program első argumentuma. Első argum en­
ra szolgáló fájlleíró lesz. Többnyire ezt a hívást egy fork követi, a szülő az olvasás­ tum ként a legtöbb program a programfájl nevét várja.
ra, a gyermek az írásra szolgáló fájlleírót lezárja (vagy fordítva), miáltal az egyik Az ioctl rendszerhívás alkalmazható a specifikus fájlok többségére. Ezt használ­
processzus írni tud, a másik pedig olvasni tud ugyanabból az adatcsőből. juk az SCSI szalag és CD-ROM -eszközök és más hasonló blokkspecifikus eszkö­
Az 1.13. ábrán egy m intaprogram ot olvashatunk, amely két processzust hoz lét­ zök vezérlésére. Elsődleges feladata azonban a karakterspecifikus fájlokkal, fő­
re, egyikük az eredményeit adatcsövön keresztül adja át a másiknak. (Valósághűbb ként a terminálokkal kapcsolatos. Több, a POSIX által definiált függvényt a prog­
ramkönyvtár ioctl hívásokkal implementál. A tegetattr és a tcsetattr könyvtári függ­
#define STDJNPUT 0 /* a standard bemenet fájlleírója */ vények ioctl hívásokkal hajtják végre az olyan feladatokat, mint a gépelési hibákat
#define STD_OUTPUT 1 /* a standard kimenet fájlleírója */ javító karakterek beállítása, a terminálmód megváltoztatása, és így tovább.
Hagyományosan három term inálm ód van: a feldolgozott, a nyers és a ebreak
pipeline(process1, process2)
mód. A feldolgozott mód a term inálok módjának alaphelyzete. Ebben a m ódban
char *process1, *process2; /* a programnevekre mutató pointerek */
a visszaléptető és törlő karakter működik, a c t r l -S és c t r l - Q a term inálra írást
{
megállítja, illetve újraindítja, a c t r l - D fájl végét jelent, a c t r l - C megszakítás szig­
int fd[2];
nált generál, míg a c t r l -\ a kilépési szignált és ezzel memóriatérkép fájlmásolatá­
pipe{&fd[0]); /* az adatcső létrehozása */ nak előállítását eredményezi.
if (fork() != 0) { Nyers módban a karakterek előbbi funkciói nem léteznek, m inden karakter fel­
/* Ezt a programrészletet a szülőprocesszus hajtja végre */ dolgozatlanul jut el közvetlenül a programokhoz. Ebben a m ódban a term inálra
close(fd[0]); /* az 1. processzusnak az adatcsőből nem kell olvasnia */ vonatkozó m inden read hívás bármilyen leütött karaktert átad a programnak, tö­
close(STD_OUTPUT); /* az új standard kimenet előkészítése */ redéksorokat is, és nem vár a sor teljes begépelésére, mint a feldolgozott módban.
dup(fd[1 ]); /* a standard kimenetet az fd[1 ]-hez rendeljük */ A képernyőt használó szövegszerkesztők gyakran ezt a m ódot használják.
close(fd[1 ]); /* ez a fájlleíró többé nem kell */ A C break mód a kettő közötti átmenet. A visszaléptető, törlő és a c t r l - D ka­
execl(process1, processl, 0);
rakterek szerkesztésre nem használhatók, a c t r l -S , c t r l - Q , c t r l - C és c t r l -\
} else {
funkciói azonban a feldolgozott m ódnak megfelelők. A nyers módhoz hasonló­
/* Ezt a programrészletet a gyermekprocesszus hajtja végre */
an, a program ok töredéksorokat is megkapnak. (Sorközi tévedéseit a felhasználó
close(fd[1]); /* a 2. processzusnak az adatcsőbe nem kell írnia */
close(STDJNPUT); /* az új standard bemenet előkészítése */ nem tudja törlésekkel rendbe hozni, mint a feldolgozott módban. H a a sorközbeni
dup(fd[0]); /* a standard kimenetet az fd[0]-hoz rendeljük */ szerkeszthetőséget nem engedjük meg, akkor viszont a program oknak nem kell a
close(fd[0]); /* ez a fájlleíró többé nem kell */ teljes sor begépeléséig várakozniuk.)
execl(process2, process2,0); A POSIX nem a feldolgozott, nyers és cbreak terminológiát használja. A
POSIX kanonikus mód kifejezése a feldolgozott m ódnak felel meg. Ebben a m ód­
ban 11 speciális karakternek van funkciója, és a bem enet soronként valósul meg.
A nem kanonikus módban előírható a karakterkészlet minimális száma, továbbá
1.13. ábra. Egy két processzust összekötő adatcső létrehozásának vázlata m egadható egy időintervallum tizedmásodperces egységekben, ami alatt egy read
52 1.BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 53

hívásnak teljesülnie kell. A POSIX flexibilitásra törekszik; különböző indikátorok /usr/ast /usr/jim /usr/ast /usr/jim
beállításával a nem kanonikus módból akár nyers, akár cbreak mód kialakítható. 16 levelek 31 bin 16 levelek 31 bin
A régebbi terminológia kifejezőbb, informálisan ezt fogjuk használni. 81 játékok 70 memo 81 játékok 70 memo
Az ioctl hívás három param éteres; példaképpen a tcsetattr eljárásban a term inál 40 teszt 59 f.c. 40 teszt 59 f.c
38 progl 70 feljegyzés 38 progl
param étereit az

ioctl(fd, TCSETS, &termios); (a) (b)

rendszerhívás fogja beállítani. Az első param éter a fájlt, a második a m űveletet 1.14. ábra. (a) Két könyvtár a link végrehajtása előtt, (b) Ugyanezek a végrehajtás után
azonosítja, a harmadik pedig egy POSIX-struktúra címe, amely az indikátorokat
és a vezérlő karakterek vektorát tartalmazza. További műveletek szolgálnak arra, link(7usr/jim/memo", "/usr/ast/note");
hogy a változtatások hatásait a rendszer elhalassza a folyamatban lévő kim enet
teljesítésének befejezéséig, hogy a be nem olvasott bem enetet megsemmisítsük és rendszerhívást, akkor a jim könyvtárában lévő m emo nevű fájl megjelenik az ast
az aktuális beállítást lekérdezzük. könyvtárában note néven. Ezután a /usr/jim/memo és a /usr/ast/note nevek ugyan­
Az access rendszerhívással kérdezhetjük le, hogy a védelmi rendszer engedé- arra a fájlra hivatkoznak.
lyez-e egy bizonyos fájlhoz való hozzáférést. E rre szükség van, m ert ugyanaz a A link m űködésének megértéséhez valószínűleg hozzájárul egy alaposabb vizs­
program különböző felhasználói UID-azonosítóval is futtatható. A SETU ID le­ gálat. A Unixban m inden fájlt egy egyedi szám, az i-szám azonosít. Fájlonként a
hetőségeit később ismertetjük. fájl i-száma egy index az ún. i-csomópont (vagy i-csomó) táblázatban, ahol a fájl
Egy fájlnak új nevet a rename rendszerhívással adhatunk. Param éterei a régi és tulajdonosát, lemezblokkjainak helyét és egyebeket tárolunk. Egy könyvtár nem
az új nevet specifikálják. más, m int egy fájl, amelyben (i-szám, név) párokat tárolunk. A Unix első változa­
Végül az fenti hívás az ioctl-hez kissé hasonlóan fájlok vezérlésére szolgál (m ind­ taiban egy könyvtárbejegyzés 16 bájtból állt - 2 bájt az i-szám, 14 bájt a fájl neve
kettőnek elég fáradságos a használata). Opciói közül a fájlzárolásokra szolgálók a számára. A hosszú fájlnevek tám ogatásához ennél összetettebb struktúra szüksé­
legfontosabbak. A processzusok az fenti hívást használhatják fájlok részeinek zá­ ges, de alapötletét tekintve a könyvtár továbbra is (i-szám és ASCII név) párok
rolására és felszabadítására vagy az egyes részek zároltságának vizsgálatára. Maga halmaza. Az 1.14. ábrán a levelek i-száma 16. A link egyszerűen készít egy új könyv­
a rendszerhívás nem definiál zárolási mechanizmust, a program oknak kell egyez­ tárbejegyzést (esetleg új névvel), ebben egy már létező fájl i-számát használja. Az
ményes szemantikára épülniük. 1.14.(b) ábrán két bejegyzésnek ugyanaz az i-száma (70); ezek ugyanarra a fájlra
való hivatkozások. H a az egyiket megszüntetjük az unlink rendszerhívással, a m á­
sik megmarad. H a mindkét bejegyzést megszüntetjük, akkor a Unix észreveszi,
1.4.4. Könyvtárkezelő rendszerhívások hogy nincs a fájlra hivatkozó bejegyzés (az i-csomópontban egy mező őrzi az egy
fájlra hivatkozó könyvtárbejegyzések számát), ezért törli a lemezről.
Ebben a szakaszban azokról a rendszerhívásokról szólunk, amelyek inkább könyv­ M ár em lítettük korábban, hogy a mount rendszerhívás alkalmas két fájlrendszer
tárakkal vagy a fájlrendszer egészével kapcsolatosak, mintsem az előző szakasz­ egyesítésére. Általában van egy gyökérfájlrendszerünk a merevlemezen, ebben tá­
beli egyedi fájlokra vonatkozó hívások. Az mkdir, illetve rmdir üres könyvtárakat roljuk a parancsaink bináris (végrehajtható) program jait és egyéb gyakran hasz­
hoz létre, illetve szüntet meg. A link hívás biztosítja azt, hogy egy fájl két vagy több nált fájljainkat. A felhasználó ezenkívül például a CD-ROM -m eghajtóba helyez­
néven is szerepelhessen, esetleg különböző könyvtárakban is. Bevált használata heti a saját program jait tartalm azó lemezét.
az, hogy egy program ozócsoport tagjai egy közös fájlon osztoznak; mindegyikük A mount rendszerhívás végrehajtásával a CD-ROM -m eghajtó fájlrendszere fel­
a saját könyvtárában látja a fájlt, esetleg még különböző névvel is. Az, hogy a cso­ csatolható a gyökérfájlrendszerre; ezt m utatja az 1.15. ábra. Egy tipikus C prog­
port tagjai osztoznak egy közös fájlon, nem azt jelenti, hogy mindegyikük kap egy rambeli utasítás a mount végrehajtására a
saját m ásolatot, hanem azt, hogy ha bármelyikük módosít a tartalm án, akkor a
többiek ezt azonnal észlelik, hiszen egyetlen fájlról van szó. H a m ásolatokat készí­ mount(7dev/cdrom0", 7mnt", 0);
tenénk a fájlról, akkor az egyik másolaton végrehajtott későbbi m ódosítás a töb­
bire hatástalan lenne. hívás, ahol az első param éter a CD-RO M -m eghajtó blokkspecifikus fájljának a
Az 1.14.(a) ábrán szemléltetjük a link működését. Ezen ast és jim két felhasz­ neve, a második a fában az a hely, ahová a felcsatolás történik, a harm adik pedig
náló, m indkettőjüknek van saját könyvtára, benne fájlokkal. H a ast végrehajtja azt m ondja meg, hogy a felcsatolandó fájlrendszer írható és olvasható, vagy csak
egy program jában a olvasható.
54 1.BEVEZETÉS 1.4. RENDSZERHÍVÁSOK 55

1.4.5. A védelem rendszerhívásai


O A M INIX 3-ban a védelemre m inden fájlhoz egy 11 bites mód van rendelve.
bin dev lib mnt usr
Ebből kilenc a tulajdonos, a csoport és a többiek olvasás-írás-végrehajtás bitjei. A
fájl módját a chmod rendszerhívással változtathatjuk. Például, hogy egy fájlt csak
olvashatóvá tegyünk mindenki, kivéve a tulajdonos számára, hajtsuk végre a
(a)
chmod("file", 0644);
1.15. ábra. (a) Fájlrendszer felcsatolás előtt, (b) Fájlrendszer felcsatolás után
hívást.
A mount hívás után a CD-ROM -m eghajtó bármelyik fájlja elérhető a gyökér­ A két további védelmi bit, a 02000 és a 04000, a SETGID (csoportazonosító,
vagy a munkakönyvtártól induló útvonalnévvel, függetlenül attól, hogy melyik GID-beállítás) és a SETU ID (felhasználóazonosító, UID -beállítás) bit. H a egy
m eghajtón van. Második, harmadik és további meghajtók is felcsatolhatók a fa felhasználó úgy hajt végre egy program ot, hogy a SETUID bit be van kapcsol­
tetszőleges pontjára. A mount adja a lehetőséget arra, hogy eltávolítható m édiu­ va, akkor a végrehajtás ideje alatt a felhasználó UID -azonosítója a programfájl
m okat egyetlen egységes hierarchiába rendezzünk, és ne kelljen azzal foglalkoz­ tulajdonosának azonosítója lesz. Ennek a funkciónak nagyon gyakori felhaszná­
nunk, hogy egy fájl melyik m eghajtón van. Példánk a C D -R O M lemezről szólt, de lási m ódja a csak a szuperfelhasználó által végrehajtható tevékenységeket végző
merevlemezek vagy merevlemezek részei (partíciók vagy mellékeszközök) ugyan­ program ok végrehajtásának engedélyezése más felhasználók számára is. Például
így csatolhatok fel. H a egy fájlrendszerre m ár nincs szükség, az umount rendszer- a könyvtár létrehozása az mknod-dal történik; ez csak szuperfelhasználónak meg­
hívással lecsatolhatjuk. engedett. H a az mkdir program a szuperfelhasználó tulajdona a 04755 móddal,
A M INIX 3 a m em óriában egy átmeneti tárolót (cache) tart fenn a korábban akkor m inden felhasználó megkapja a jogot ennek végrehajtására, de csak nagyon
használt blokkok őrzésére. Ezzel elkerüli a lemezről való újbóli olvasásukat, ha korlátozott lehetőségekkel.
rövidesen újra szükségesek. H a az átm eneti tárolóban egy blokk módosul (a fájl­ H a egy processzus olyan fájlt hajt végre, amelynek SETUID és SETGID bitjei
ra vonatkozó write következtében), és a rendszer összeomlik, mielőtt a módosí­ be vannak kapcsolva, akkor a tényleges U ID - és GID-azonosítói különböznek
tott blokk visszaíródna a lemezre, a fájlrendszer megsérül. Az esetleges sérülések a valódi azonosítóitól. Néha szükségünk van arra, hogy lekérdezzük a valódi és
csökkentésére időnként fontos az átm eneti tároló tartalm ának visszaírása; ezzel a tényleges U ID - és GID-azonosítókat. A getuid és a getgid rendszerhívások er­
az összeomlásokkal okozott adatvesztés mennyisége minimális m aradhat. A sync re szolgálnak. Ezek visszaadják a valódi és a tényleges azonosítókat, ezért négy
rendszerhívás utasítja a M INIX 3-at, hogy az átm eneti tárolóban a beolvasásuk könyvtári eljárás áll rendelkezésünkre: getuid, getgid, illetve geteuid, getegid; ezek
óta m ódosított blokkokat írja vissza a lemezre. A M INIX 3 indításakor egy update rendre a valódi, illetve a tényleges U ID -, G ID -azonosítókat adják vissza.
nevű háttérprogram is elindul, amely 30 m ásodpercenként kiad egy sync hívást az Az átlagos felhasználó nem m ódosíthatja UID-azonosítóját, kivéve ha bekap­
átm eneti tároló időnkénti visszaírására. csolt SETU ID bittel rendelkező program ot hajt végre. A szuperfelhasználó vi­
A könyvtárakkal kapcsolatos további két hívás a chdir és a chroot. Az első a m un­ szont használhatja a setuid rendszerhívást, amely mind a valódi, mind a tényleges
kakönyvtárat, a második a gyökérkönyvtárat változtatja. A U ID -azonosítókat beállítja. A setgid hasonló a GID-azonosítókhoz. A szuperfel­
használó a fájl tulajdonosát is m ódosíthatja a chown hívással. Most m ár láthatjuk,
chdir("/usr/ast/test"); hogy a szuperfelhasználónak bőven van lehetősége a védelmi rendszer m egsérté­
sére (és az is világos, hogy miért fordítanak a hallgatók annyi időt a szuperfelhasz­
hívást követően egyxyz nevű fájlra vonatkozó megnyitás a lusr/astltestlxyz fájlt fog­ nálóvá válási kísérleteikre).
ja megnyitni. A chroot hasonlóan működik. H a egy processzus kérte a rendszertől Ebben a kategóriában az utolsó két rendszerhívást közönséges felhasználói
a gyökérkönyvtár módosítását, akkor minden teljes (a „ / ” jellel kezdődő) útvonal­ processzusok is végrehajthatják. Az umask egy bitvektort állít be, amely fájlok
név az új gyökérkönyvtártól kezdődő útvonalnév lesz. M iért lehet erre szükség? létrehozásakor azok védelmi bitjeire lesz befolyással. Az
Biztonsági okokból - az FTP (File TVansfer Protocol - fájlátviteli protokoll), a
HTTP (HyperText IVansfer Protocol - hiperszöveg-átviteli protokoll) és hasonló umask(022);
protokollokhoz tartozó kiszolgálóprogramok így biztosítják azt, hogy a távoli fel­
használók a fájlrendszernek csak az új gyökérkönyvtár alatt található részét é r­ végrehajtását követően a creat és az mknod védelmi param étereiben a 022 bitek
hessék el. Csak a szuperfelhasználó hajthatja végre a chroot-ot, de ő sem szokta törlődni fognak. Ezért a
gyakran.
56 1.BEVEZETÉS 1.5. AZ OPERÁCIÓS RENDSZER STRUKTÚRÁJA 57

creat("file", 0777); 1.5. Az operációs rendszer struktúrája


hívás a fájl védelmi m ódját 0755-re fogja beállítani. Az umask biteket a gyermek­ Eddig megismertük az operációs rendszert kívülről (azaz a programozói felü­
processzusok is öröklik, ezért ha a parancsértelm ező a felhasználó bejelentkezé­ letet), most nézzük meg belülről. A következő szakaszokban öt, m ár kipróbált
sekor ezt a fenti értékre állítja, akkor véletlenül sem történhet meg, hogy a fel­ struktúrát vizsgálunk, amellyel némi áttekintést nyerünk a lehetőségekről. Nem
használó processzusai olyan fájlokat hoznak létre, amelyeket mások is m ódosít­ törekszünk teljességre, inkább ízelítőt adunk a gyakorlatban is kipróbált tervezési
hatnak. elvekből. Az öt struktúra a monolitikus rendszerek, a rétegelt rendszerek, a vir­
H a a program a szuperfelhasználó tulajdona és SETUID bitje be van kapcsol­ tuális gépek, exokernelek és a kliens-szerver rendszerek.
va, akkor joga van bármely fájl elérésére, hiszen a tényleges U ID -azonosítója a
szuperfelhasználóé. Gyakran szükség lehet arra, hogy megtudjuk, vajon az a sze­
mély, aki hívta a program ot, rendelkezik-e az adott fájlhoz hozzáférési joggal. H a 1.5.1. Monolitikus rendszerek
megkíséreljük az ilyen fájlhoz a hozzáférést, az mindig sikerülni fog, ebből nem
tudunk meg semmit. Messzemenően ez a legelterjedtebb szervezési mód, de viselhetné akár a „Nagy
Amire szükségünk van, az az, hogy a valódi UID-azonosítóval van-e hozzáférési összevisszaság” nevet is. Struktúrája a strukturálatlanság. Az operációs rendszer
jogunk. E rre szolgál az access rendszerhívás. A mód param éter értéke 4 az olvasá­ eljárások gyűjteménye, bármelyik hívhatja a másikat m inden korlátozás nélkül.
si, 2 az írási és 1 a végrehajtási jog lekérdezésére. A mód param éter kom binálható Ennél a módszernél a param éterek és a visszaadott érték alapján m inden eljárás­
is, ha például az értéke 6, akkor a visszaadott érték 0, amennyiben a valódi U ID - nak jól definiált felülete van, és ha a programozó úgy gondolja, hogy eljárásában
azonosítóval az olvasási és az írási jog egyaránt megengedett; különben -1. A 0 ér­ egy másik eljárás valami hasznosat nyújthat, akkor azt szabadon hívhatja.
tékű m ód param éterrel a fájl létezését és a hozzá tartozó útvonal kereshetőségét Az operációs rendszer végrehajtható program jának előállításához először az el­
ellenőrizhetjük. járásokat, illetve az eljárások forráskódjait tartalm azó fájlokat lefordítjuk, azután
Annak ellenére, hogy a védelmi mechanizmusok a Unix-szerű operációs rend­ a programszerkesztő segítségével az összeset egyetlen kóddá rakjuk össze. Az in­
szerekben általában hasonlók, vannak különbségek és következetlenségek, am e­ formációelrejtés fogalma teljesen ismeretlen, m inden eljárás látja az összes többit.
lyek biztonsági résekhez vezetnek. Ennek bővebb tárgyalását lásd Chen és társai (Ezzel ellentétes a modulokból vagy modulcsoportokból építkező tervezés, ami­
könyvében (Chen et al., 2002). kor is az információk döntő többségét a modulok belsejébe zárjuk, és csak az előre
m egtervezett belépési pontok hívhatók a modulon kívülről.)
Ennek ellenére a monolitikus rendszereket is lehet kicsit strukturálni. Az ope­
1.4.6. Az időkezelés rendszerhívásai rációs rendszer szolgáltatásait (a rendszerhívásokat) úgy kérjük, hogy először el­
helyezzük a param étereket egyezményes helyeken, például regiszterekben vagy a
A M INIX 3-ban négy hívás vonatkozik a rendszerórára. A time visszaadja a jelen­ veremben, ezután pedig egy speciális, csapdázott ún. kernelhívást vagy felügyelt
legi időt másodpercekben; 1970. január 1. éjfél a kezdő, 0 értékű időpont (a kezdő hívást hajtunk végre.
és nem a befejező éjfél). Természetesen a rendszerórát valamikor be is kell állíta­ Ez az utasítás felhasználói m ódról kernel m ódra kapcsolja a gépet, és a vezér­
ni, hogy később lekérdezhessük. Az stime hívással ezt a szuperfelhasználó teheti lést átadja az operációs rendszernek. (A legtöbb CPU két m ódban dolgozhat:
meg. A harmadik hívás az utime; ezzel a fájl tulajdonosa (vagy a szuperfelhasz­ kernel m ódban az operációs rendszernek dolgozik, és ekkor m inden utasítás meg­
náló) tudja a fájl i-csomópontjában tárolt időt változtatni. Ennek alkalmazása engedett; felhasználói m ódban a felhasználói program oknak dolgozik, és az I/O,
eléggé behatárolt, de néhány program nak szüksége van rá. Ilyen például a touch, továbbá néhány más utasítás is tiltva van.)
amely a fájl idejét a jelenlegi időre állítja. Itt a jó alkalom, hogy megvizsgáljuk, hogyan hajtódnak végre a rendszerhívá­
Az utolsó a times hívás, amellyel a processzusról elszámolási információkat kap­ sok. Emlékezzünk vissza, hogy a read hívást hogyan használjuk:
hatunk. Megmondja, hogy eddig közvetlenül mennyi CPU-időt használt a procesz-
szus, és azt is, hogy a rendszer mennyi időt fordított rá (rendszerhívásaink végre­ count = readffd, buffer, nbytes);
hajtásával). A processzus és összes gyermekei által felhasznált közvetlen és rend­
szeridőt is megadja. A read könyvtári függvény hívásának előkészítéseként, amely a read rendszerhívást
ténylegesen meghívja, a hívó program a param étereket a verembe helyezi, ahogyan
azt az 1.16. ábra 1-3. lépései mutatják. Történelmi okokból a C és C + + fordítók
fordított sorrendben teszik a param étereket a verembe (a magyarázat az, hogy a
printf függvényhíváshoz az első param éter, a formátumsztring legyen híváskor lég­
58 1. BEVEZETÉS 1.5. AZ OPERÁCIÓS RENDSZER STRUKTÚRÁJA 59

Címtartomány
OxFFFFFFFF

A read
könyvtári
eljárás

Felhasználói .
terület S

A read-et hívó
’ felhasználói 1.17. ábra. Egy monolitikus rendszer egyszerű szerkezeti modellje
program

Fentebb a 9. lépésnél jó okkal m ondtuk azt, hogy „a vezérlés visszaadódhat a


felhasználói szinten található könyvtári eljárásnak”. A rendszerhívás ugyanis akár
blokkolhatja is a hívót, ami megakadályozza a folytatását. Például ha a program
a billentyűzetről vár adatot, de még nem történt gépelés, a hívót blokkolni kell.
Kernelterület I Ebben az esetben az operációs rendszer körülnéz, hogy van-e másik futtatható
(Operációs / processzus. Később, amikor a kívánt bem eneti adat rendelkezésre áll, a procesz-
rendszer) ]
szus visszakaphatja a vezérlést a rendszertől, és a 9-11. lépések végrehajtódnak.
0 Ez a szervezés utal az operációs rendszer alapstruktúrájára:

1.16. ábra. A read(fd, buffer, nbytes) rendszerhívás 11 lépése 1. Főprogram; ez hívja a kívánt szolgáltató eljárásokat.
2. Szolgáltató eljárások készlete; ezek hajtják végre a rendszerhívásokat.
felül). Az első és harmadik param éterek érték szerint, a második pedig cím szerint 3. Segédeljárások a szolgáltató eljárások támogatására.
adódik át; ez utóbbi azt jelenti, hogy a puffer címe (a & jelzi) és nem tartalm a ke­
rül átadásra. Ezután következik a tényleges könyvtári függvényhívás (4. lépés). Ez Ebben a modellben m inden rendszerhíváshoz egy ezt kezelő szolgáltató eljárás
a megszokott eljáráshívó utasítás, amely tetszőleges eljárás hívására használható. tartozik. A segédprogram ok a több szolgáltató eljárás által is igényelt feladatokat
A valószínűleg assembly nyelven megírt könyvtári függvény a rendszerhívás hajtják végre; ilyen például adatok átvétele a felhasználói programoktól. Az 1.17.
számát rendszerint arra a helyre, például egy regiszterbe teszi, ahol az operációs ábra m utatja az eljárások így nyert háromszintű besorolását.
rendszer azt elvárja (5. lépés). Majd a felhasználói módból kernel módba váltás­
hoz végrehajt egy trap utasítást, és egy kernelen belüli rögzített címtől elkezdi a
végrehajtást ( 6. lépés). Az elinduló kernelkód megvizsgálja a rendszerhívás szá­ 1.5.2. Rétegelt rendszerek
mát, és kiküldi a megfelelő rendszerhívás-kezelőnek, rendszerint a rendszerhívás
számával indexelt, a rendszerhívás-kezelők címeit tartalm azó táblázat segítségével Az 1.17. ábrán látható megközelítés általánosításaként az operációs rendszer réte­
(7. lépés). Ekkor a rendszerhívás-kezelő lefut ( 8. lépés). Amikor a rendszerhívás­ gekből álló hierarchia is lehet, ahol minden réteget az alatta lévőre építünk. Az
kezelő befejezte a m unkát, a vezérlés visszaadódhat a felhasználói szinten találha­ első így építkező rendszert, a TH E-t E. W. Dijkstra (1968) tervezte a hollandiai
tó könyvtári eljárásnak a trap utasítást követő utasításra (9. lépés). Ez az eljárás a Technische Hogeschool Eindhoven egyetemen hallgatói közreműködésével. A
szokásos m ódon tér vissza a felhasználói program hoz ( 10. lépés). TH E kötegelt rendszer volt, és az Electrologica X 8 holland gépen futott 27 bites
A feladat befejezéséhez a felhasználói program nak helyre kell állítania a verem szavakból álló 32 K mem óriában (a bitek akkoriban költségesek voltak).
tartalm át, ahogyan bármelyik másik eljáráshívás után (11. lépés). Feltételezve, A rendszernek az 1.18. ábra szerinti 6 rétege volt. A 0. réteg végezte a
hogy a verem „lefelé” növekszik, ahogyan a legtöbbször történik, a lefordított kód processzor-hozzárendelést, a processzusok közötti átkapcsolást megszakítások
pontosan annyival növeli a verem m utató értékét, hogy a read hívás előtt a verem ­ jelentkezése vagy időintervallumok lejárta esetében. A 0. réteg fölött a rendszer
be helyezett param éterek eltűnjenek. A program ezután azt tehet, amit akar. olyan szekvenciális processzusokból állt, amelyeket már úgy lehetett programozni,
60 1.BEVEZETÉS 1.5. AZ OPERÁCIÓS RENDSZER STRUKTÚRÁJA 61

Réteg Feladat 1.5.3. Virtuális gépek


5 A gépkezelő
4 Felhasználói programok Az OS/360 első változatai szigorúan kötegelt rendszerek voltak. A 360-as sok fel­
3 Bemenet/kimenet kezelése használója azonban időosztásra vágyott, így az IBM-en belüli és kívüli csoportok
2 Gépkezelő processzus kommunikáció is úgy döntöttek, hogy megírják az időosztásos rendszert. A hivatalos IBM idő­
1 Memória- és dobkezelés osztásos rendszert (TSS/360) későn hozták ki, amikor pedig elkészült, olyan óriá­
0 Processzor-hozzárendelés és multiprogramozás si és olyan lassú volt, hogy csak néhányan kezdték el használni. Abba is hagyták,
m iután m ár vagy 50 millió dollárt a fejlesztésére költöttek (Graham , 1970). De az
1.18. ábra. A THE operációs rendszer struktúrája IBM cambridge-i (M assachusetts) Scientific Centerének egyik csoportja előállt
egy teljesen más rendszerrel, amelyet az IBM végül is elfogadott hivatalos term é­
hogy nem kellett azzal törődni, hogy egyetlen processzoron több processzus is fut. kének, és még ma is használnak a működő nagygépein.
M ás szóval a 0. réteg biztosította a CPU m ultiprogramozhatóságát. Az eredetileg CP/CMS nevű, majd VM/370-re átkeresztelt rendszer (Seawright
Az 1. réteg a memóriakezelést végezte. Lefoglalta a processzusok számára a és MacKinnon, 1979) két jó ötletre épült: az időosztásos rendszerek egyrészt a
belső m em óriát és az 512 K szavas dobon a területeket. Ez utóbbin tárolták a pro­ multiprogramozást, másrészt a csupasz hardvernél sokkal kényelmesebb kapcso­
cesszusok olyan részeit (lapokat), amelyek számára nem volt hely a belső m em ó­ latot adó kiterjesztett gépet biztosítanak. A VM/370 különlegessége, hogy ezt a
riában. Az 1. réteg felett a processzusoknak m ár nem kellett azzal törődniük, hogy két funkciót teljesen szétválasztja.
m em óriában vagy dobon vannak-e, mivel az 1 . réteg biztosította számukra a visz- A virtuális gép m onitor a lelke a rendszernek, amely a nyers hardveren fut,
szatöltéshez szükséges lapokat, amikor erre szükség volt. kezeli a m ultiprogramozást, és nem egy, hanem több virtuális gépet is szolgáltat,
A 2. réteg kezelte a processzusok közötti kommunikációt és a gépkezelő kon­ amint az az 1.19. ábrán látható. Ellentétben minden más operációs rendszerrel,
zolját. A magasabb rétegek processzusai m ár saját gépkezelői konzollal rendelkez­ ezek a virtuális gépek nem kiterjesztett gépek, a szokásos fájlokkal és jó tulajdon­
tek. A 3. réteg felügyelte az I/O-eszközöket és a bejövő vagy kimenő adatfolyamok ságokkal, hanem a hardver pontos másolatai, beleértve a felügyelt felhasználói
átm eneti tárolását. A 3. réteg feletti processzusok m ár absztrakt I/O-eszközöket módokat, I/O-t, megszakításokat, szóval a hardvert mindenestől.
érzékeltek, m entesültek a fizikai eszközök részleteinek kezelésétől. A 4. réteg a A nnak következtében, hogy mindegyik virtuális gép azonos a hardvergéppel,
felhasználói program oké volt. Ezek m ellőzhették a processzusokkal, memóriával, bármelyiken futtatható olyan tetszőleges operációs rendszer, amely a hardveren
konzollal és I/O-eszközökkel való foglalkozást. A rendszer kezelőjének processzu­ futni képes. A különböző virtuális gépeken különböző operációs rendszerek fut­
sa került az 5. rétegre. tathatók, és igen gyakran futnak is. Az egyiken az OS/360 futhat kötegelt vagy
A MULTICS-rendszer tovább általánosította a rétegelt koncepciót. Rétegek adatfeldolgozási feladatkörrel, miközben a másikon a CMS (Conversational
helyett a MULTICS koncentrikus gyűrűkbe szerveződött, a belsők több, a külsők M onitor System) egyfelhasználós interaktív rendszer kiszolgálja az időosztásos
kevesebb privilégiumot kaptak. H a egy külső gyűrűbeli eljárás egy belső gyűrűbeli felhasználókat.
eljárást kívánt hívni, egy rendszerhívásnak megfelelő TRAP utasítást kellett vég­ H a egy CMS-en futó program rendszerhívást hajt végre, akkor ezt a saját vir­
rehajtania. A TRAP param étereinek a helyességét részletesen ellenőrizték a hívás tuális gépén futó operációs rendszer fogja kezelni, és nem a VM/370, mégpedig
teljesítésének engedélyezése előtt. A nnak ellenére, hogy a MULTICS-ban a teljes pontosan úgy, m intha valódi és nem virtuális gépen futna. A CM S-hardver I/O-
operációs rendszer beletartozott m inden felhasználói processzus cím tartom ányá­ utasításokat hajt végre lemez olvasására, írására, vagy mást, ami a hívás teljesí­
ba, a hardver képes volt minden egyes eljárást (ténylegesen a memóriaszegmense­ téséhez szükséges. A VM/370 ezeket az I/O-utasításokat csapdázza, és a valódi
ket) védeni olvasás, írás vagy végrehajtás ellen. hardver szimulációjaként végrehajtja. A m ultiprogramozás és a kiterjesztett gép-
Míg a TH E-rendszer rétegelt volta valójában még csak egy tervezési segítség
volt, hiszen a rendszer összes alkotóelem ét végül is egyetlen végrehajtható prog­ Virtuális 370-esek
ram m á szerkesztették össze, addig a MULTICS gyűrűs szerkezete inkább futás A rendszerhívások
közben alakult ki, nagyrészt hardvertámogatással. A gyűrűs szerkezet előnye, hogy helye
könnyen kiterjeszthető a felhasználói alrendszerek strukturálására is. Például a Az l/O-utasítások
helye — CMS CMS CMS A csapda helye
tanár az n. gyűrűben futtatja a hallgatói program okat tesztelő és értékelő prog­
ramját, míg a hallgatók programjai az n + 1 . gyűrűben futnak, és nem tudják az ér­ A csapda helye — ■4 VM/370
demjegyeiket megváltoztatni. A Pentium hardvere tám ogatja a MULTICS gyűrűs A 370-es nyers hardver
szerkezetét, de ezt jelenleg nem használja ki egyetlen fontosabb operációs rend­
szer sem. 1.19. ábra. A VM/370 és a CMS együttesének szerkezete
62 1. BEVEZETÉS 1.5. AZ OPERÁCIÓS RENDSZER STRUKTÚRÁJA 63

funkciók teljes szétválasztása a rendszer egyes részeit egyszerűbbé, flexibilissé és zonyára nagyon ideges lenne, ha meg kellene osztania a számítógépes laborokat
könnyebben karbantarthatóvá tette. olyan operációsrendszer-kurzussal, ahol a hallgatók hibái tönkretehetnék vagy tö­
M a a virtuális gép fogalmát másra is használják, mégpedig a régi MS-DOS-prog- rölhetnék a lemez tartalm át.
ramok futtatására Pentium processzoron. Amikor a Pentiumot és szoftverét ter­ Egy másik terület, ahol virtuális gépeket használnak, bár kissé más módon, a Java­
vezték, az Intel és a Microsoft rájött, hogy kénytelenek lesznek futtatni a régi programok futtatása. Amikor a Sun Microsystems kifejlesztette a Java program o­
szoftvereket az új hardveren. Az Intel ezért a Pentiumba beépített egy virtuális zási nyelvet, egy JVM-nek (Java Virtual Machine) nevezett virtuális gépet (vagyis
8086 módot. Ebben a m ódban a gép 8086-ként viselkedik (szoftverszempontból ez egy számítógép-architektúrát) is megalkotott. A Java-fordító a JVM számára készít
megegyezik a 8088 processzorral), beleértve az 1 MB-on belüli 16 bites címzést is. kódot, amelyet jellemzően egy szoftveres JVM -értelmező hajt végre. Ennek a meg­
Ezt a m ódot használja a Windows és más operációs rendszerek MS-DOS-prog- közelítésnek az előnye az, hogy a JVM -kódot az interneten keresztül tetszőleges
ram ok futtatására. A program ok 8086 módban indulnak, és a hardveren futnak gépre eljuttathatjuk, amely rendelkezik JVM-értelmezővel, és ott futtathatjuk. Ha
mindaddig, amíg közönséges utasításokat hajtanak vcgre. H a viszont az operációs a fordító például SPARC vagy Pentium bináris kódot készítene, akkor a tetszőleges
rendszerrel egy rendszerhívást kívánnak végrehajtatni, vagy felügyelt I/O-t kísé­ gépre eljuttatás és futtatás nem m enne ennyire könnyen. (Természetesen a Sun ké­
relnek meg közvetlenül, akkor a virtuális gép m onitorának csapdájába esnek. szíthetett volna olyan fordítót, amely SPARC bináris kódot állít elő, és terjeszthetett
A m onitor kétféleképpen reagálhat erre. H a az MS-DOS maga is be van töltve volna egy SPARC-értelmezőt, de a JVM egy sokkal egyszerűbben interpretálható
a 8086 virtuális címtartományba, akkor a csapdázott eseményt egyszerűen tovább­ rendszer.) A JVM használatának másik előnye az, hogy ha az értelmező megfele­
küldi az MS-DOS-nak, m intha a csapdázás valódi 8086-on történt volna. H a majd lően van megvalósítva, ami persze nem teljesen magától értetődő feladat, akkor a
később az MS-DOS kísérli meg az I/O végrehajtását, a műveletet a virtuális gép beérkező JVM -programok biztonságossága ellenőrizhető, és védett környezetben
m onitora elfogja és végrehajtja. futtathatók, így nem tudnak adatot lopni vagy egyéb kárt okozni.
A másik lehetőség az, hogy a m onitor az első csapdában elfogja az utasítást,
és az I/O-t maga hajtja végre, hiszen pontosan tudja, hogy milyen rendszerhívá­
sok vannak az MS-DOS-ban és melyik csapdára mi a teendő. Ez nem olyan szép 1.5.4. Exokerneiek
változat, mint az előbbi, m ert csak az MS-DOS-t szimulálja pontosan, más operá­
ciós rendszereket nem. M ásrészt viszont gyorsabb az előbbinél, m ert nem kell az A VM/370-en m inden processzus megkapja a tényleges gép egy pontos m ásola­
MS-DOS-t is elindítani az I/O kedvéért. Az MS-DOS virtuális 8086 m ódban való tát. A Pentium virtuális 8086 módjában a felhasználói processzusok nem a tény­
tényleges futtatásának van egy másik hátránya is. Az MS-DOS sokat játszadozik a leges gép, hanem egy másik pontos m ásolatát kapják. Az M.I.T. kutatói ennek az
megszakítások engedélyezésével/tiltásával, amelynek szimulációja költséges. ötletnek a továbbfejlesztéseként felépítettek egy rendszert, amelyen a felhasz­
Megjegyezzük, hogy a fenti m ódszerek egyike sem azonos a VM/370-nel, nálók a tényleges gép egy változatát kapják az erőforrások egy részével (Engler
ugyanis csak a 8086 és nem a teljes Pentium emulációjáról van szó. A VM/370- et al., 1995; és Leschke, 2004). Például az egyik virtuális gép a 0-1023, a másik az
rendszeren magát a VM/370-et is lehet futtatni egy virtuális gépen. Mivel a 1024-2047 lemezblokkokat kapja, és így tovább.
Windows legkorábbi változatai is legalább 286-os processzort igényelnek, így nem Az alsó rétegen kernel m ódban fut az ún. exokernel program. A feladata a vir­
futtathatók a virtuális 8086 gépen. tuális gépek számára az erőforrások hozzárendelése, használat közben annak biz­
Számos virtuálisgép-megvalósítás vásárolható meg. Webhelyszolgáltatást nyúj­ tosítása, hogy a gépek egymás erőforrásait ne használhassák. A felhasználói vir­
tó cégek számára gazdaságosabb lehet egy gyors (akár több processzorral ren­ tuális gépeken saját operációs rendszer futhat (mint a VM/370-en vagy a Pentium
delkező) szerveren több virtuális gépet futtatni, mint sok kis kapacitású gépet virtuális 8086 m ódjában), a korlátozás csupán annyi, hogy csak a kért és a hozzá
üzemeltetni, amelyek csak egy-egy weboldalt szolgálnak ki. Ennek megvalósítá­ rendelt erőforrásokat használhatja.
sához a VMWare és a Microsoft Virtual PC program ja érhető el a piacon. Ezek a Az exokernel szerkezet egyben meg is takarít egy ún. leképező réteget. Másfajta
program ok nagyméretű fájlokat használnak a vendégrendszerek szimulált lem e­ tervezés esetén a virtuális gépek azt gondolhatják, hogy saját, 0-tól egy maximális
zeiként a gazdarendszeren. A hatékonyság biztosítása érdekében elemzik a ven­ blokkszámig terjedő lemezzel rendelkeznek, ezért a virtuálisgép-monitornak kell
dégrendszer bináris program kódjait, és engedélyezik a biztonságos kódok futását táblázatok segítségével a blokkcímek (és egyéb erőforrások) leképezéseinek nyil­
közvetlenül a gazdahardveren, csapdát állítva azoknak az utasításoknak, am e­ vántartását vezetni. Az exokernel esetében erre a leképezésre nincs szükség, csak
lyek operációsrendszer-hívásokat eszközölnek. Ilyen rendszerek az oktatásban azt kell nyilvántartani, hogy mely erőforrásokat mely virtuális gépekhez rendelte.
is hasznosak. Például a M INIX 3 gyakorlati házi feladatokon dolgozó hallgatók Ez a struktúra előnyösen el is választja a multiprogramozást (ezt az exokernel ke­
a M INIX 3-at vendég operációs rendszerként használhatják VMWare-t futtató zeli) és a felhasználók operációs rendszereinek kódját (ez a felhasználói szinten
Windows-, Linux- vagy Unix-gazdarendszeren, más, a PC-re telepített program van), sőt ezt takarékosan valósítja meg, hiszen az exokernel csak a virtuális gépe­
tönkretételének kockázata nélkül. A legtöbb, más tárgyat oktató professzor bi­ ket védi egymástól.
64 1. BEVEZETÉS 1.6. KÖNYVÜNKTOVÁBBI RÉSZEINEK FELÉPÍTÉSE 65

1.5.5. A kliens-szerver modell l.gép 2. gép 3. gép 4. gép

A VM/370 jelentősen egyszerűsödött azzal, hogy a hagyományos operációs rend­


szerek kódjának többségét áthelyezte egy magasabb rétegre (CMS). A VM/370
ennek ellenére azért elég bonyolult program m aradt, hiszen nem olyan egyszerű
több virtuális 370-et szimulálni (különösen ha még a hatékonyságot is szem előtt
kell tartani).
A korszerű operációs rendszerek ennek az ötletnek a továbbfejlesztését m utat­ a szervernek
ják, azaz egyre több és több program ot tolnak magasabb rétegekbe. Ennek kö­
szönhetően az operációs rendszerből végül egy minimális kernel marad. A m ód­ 1.21. ábra. A kliens-szerver modell osztott rendszerekben
szer általában az, hogy az operációs rendszer több funkcióját felhasználói pro­
cesszusokra bízzák. H a egy szolgáltatást kérünk, például egy fájlblokk olvasását, netváltás módszerével kom munikálnak a többi processzussal. Ennek a m echa­
akkor a felhasználói processzus (kliensprocesszus) egy kérést küld a szerverpro­ nizmusnak egy változatát használtuk a M INIX korábbi változataiban, ahol is a
cesszusnak, amely azután elvégzi a m unkát és visszaküldi a választ. m eghajtóprogram ok a kernel részei voltak, de külön processzusként futottak.
E bben az 1.20. ábrán is látható modellben a kernelnek csak a kliens és a szer­ A másik lehetőség, hogy a kernelbe beépítünk egy m inim ális kezelőkészletet,
ver közötti kommunikációt kell kezelnie. Az operációs rendszer darabokra vágá­ de ennek használatáról a felhasználói m ódban futó szerverek gondoskodnak.
sa, ahol egy-egy rész csak a rendszer egy adott szeletével foglalkozik, mint fájl-, Például a kernel felismerheti, hogy egy speciális címre küldött üzenet tartalm át
processzus-, terminál- vagy memóriagazdálkodás, végső soron az egyes részek le­ valamelyik lemez I/O-eszközregisztereibe kell betölteni. Ebben a példában a
egyszerűsödését és jobb kezelhetőségét eredményezi. A szerverek felhasználói és kernel nem vizsgálja az üzenet tartalm át, annak érvényességét és jelentését, ha­
nem kernel m ódban futnak, így a hardverhez nincs közvetlen hozzáférésük. Ezért nem vakon átmásolja a lemez eszközregisztereibe. (Természetesen em ellett szük­
ha a fájlszerver egy program hiba m iatt összeomlik is, ez nem feltétlenül okozza a ség van egy másik m ódszerre is, amely szerint az ilyen üzeneteket küldő processzu­
teljes gép leállását. sok jogosultságát ellenőrizzük.) így működik a M INIX 3 is, a meghajtóprogramok
O sztott rendszerekben is megm utatkoznak a kliens-szerver modell használatá­ a felhasználói szinten helyezkednek el, és speciális kernelhívások használatá­
nak előnyei (1.21. ábra). H a a kliens egy üzenet küldésével kommunikál a szerver­ val kérhetik I/O-regiszterek olvasását és írását, valamint így férhetnek hozzá
rel, nem kell tudnia, hogy üzenetét lokálisan, a saját gépén fogadják vagy hálóza­ kernelinformációkhoz. Az elv, hogy a kezelőkészletet és annak használatát szét­
ton keresztül átküldik egy távoli gépen futó szervernek. M indkét esetben ugyanaz választjuk, fontos elv, amelyet az operációs rendszerekben változatos célokra gya­
történik, és a kliensnek csak azzal kell törődnie, hogy a kérést elküldje és a választ korta használnak.
fogadja.
A kernelről fentebb festett kép, mint csak üzenetközvetítő a kliensek és a szer­
verek között, nem teljesen realisztikus. Az operációs rendszer néhány funkcióját
(például az I/O-eszközregiszterek feltöltését) felhasználói m ódban nehéz, esetleg 1.6. Könyvünk további részeinek felépítése
lehetetlen végrehajtani. Az ilyen eseteket kétféleképpen kezelhetjük. Az egyik a
speciális, kernel m ódban futó szerverprocesszusok (például I/O-eszközvezérlők) Az operációs rendszerek négy fő részből állnak: processzuskezelés, I/O-eszközke-
létrehozása, amelyek a teljes hardverhez hozzáférhetnek, de változatlanul az üze- zelés, memóriakezelés és fájlkezelés. A M INIX 3 is erre a négy részre tagolódik.
A következő négy fejezet egyenként tárgyalja ezeket a részeket. A 6. fejezet aján­
Kliens­ Kliens­ Felhasz-
lott irodalm at és bibliográfiát tartalmaz.
Processzus­ Terminál- Fájl­ Memória­
processzus processzus szerver szerver szerver szerver nálói mód A processzusokról, I/O-ról, memória- és fájlkezelésről szóló fejezetek általános
felépítése azonos. Először a tém a fő elveit m utatjuk be. Azután a M INIX 3-beli
^ ____ y Kernel
Mikrokernel ^ mód megfelelő elemekről adunk áttekintést (ezek a Unixra is érvényesek). Végül
részletezzük a M INIX 3-implementációt. H a az olvasót az elvek érdeklik, és a
M INIX 3-megvalósítás nem, akkor az implementációs részeket átfuthatja, vagy ki
A kliens a szolgáltatást
a szerverprocesszusoknak
is hagyhatja. H a viszont érdekli, hogyan is működik egy valódi operációs rendszer
küldött üzenettel kéri (a M INIX 3), akkor m indent végig kell olvasnia.

1.20. ábra. A kliens-szerver modell


66 1. BEVEZETÉS FELADATOK 67

1.7. Összefoglalás 10. Egy MINIX-fájlra az uid = 12, a gid = 1 és a mód rwxr-x— . A z uid = 1 és
gid = 1 azonosítókkal rendelkező felhasználó végre akarja hajtani ezt a fájlt.
Az operációs rendszereket kétféle nézőpontból vizsgálhatjuk: erőforrás-kezelők Mi történik?
és kiterjesztett gépek. M int erőforrás-kezelők, a feladatuk a rendszer különböző 11. A szuperfelhasználó puszta létezése egész sor védelmi problém át vet fel. M iért
részeinek hatékony kezelése. M int kiterjesztett gépek, a feladatuk a felhasználó van mégis szükség szuperfelhasználóra?
számára olyan virtuális gép biztosítása, amelyet a felhasználó a valódi gépnél ké­ 12. A Unix m inden változata tám ogatja a fájlok nevének abszolút elérési útvonal­
nyelmesebben tud használni. lal (a gyökérkönyvtárhoz képesti hely) és a relatív elérési útvonallal (a m unka­
Az operációs rendszerek története hosszú időszakot ölel fel; először csak a gép­ könyvtárhoz képesti hely) történő megadását. Lehetséges lenne az egyiktől
kezelőt helyettesítették, m ára eljutottak a korszerű, m ultiprogram ozható rendsze­ megszabadulni és csak a másikat használni? Amennyiben igen, melyik lehető­
rekig. séget tartaná meg?
M inden operációs rendszer lelke a megvalósított rendszerhívások készlete. 13. Időosztásos rendszereken miért van szükség processzustáblázatra? Szükség
Ezek határozzák meg az operációs rendszer tényleges tevékenységeit. A M INIX 3 van a táblázatra olyan személyi számítógépeken is, ahol egyszerre csak egy, az
a hívások készletét hat csoportra tagolja. Az első csoport a processzusok létreho­ egész gépet használó processzus létezik?
zására és m egszüntetésére szolgál. A második a szignálkezelésre, a harm adik a 14. Mi az alapvető különbség a blokkspecifikus és a karakterspecifikus fájlok kö­
fájlok írására és olvasására, a negyedik a könyvtárkezelésre, az ötödik az adatvé­ zött?
delemre, míg a hatodik az időkezelésre alkalmas csoport. 15. M INIX 3-ban az 1-es felhasználó tulajdonában lévő fájlt a 2-es felhasználó
Az operációs rendszerek többféleképpen strukturálhatok. Legtöbbjük a m ono­ link hívással osztott használatúvá teszi, majd az 1-es felhasználó a fájlt törli. Mi
litikus, a rétegelt, a virtuális gép, az exokernel, illetve a kliens-szerver modell vala­ történik, ha a 2-es felhasználó olvasni akarja a fájlt?
melyikének struktúrájába sorolható. 16. Nélkülözhetetlen funkcióval rendelkeznek az adatcsövek? Fontos m űködőké­
pesség veszne el, ha nem lennének elérhetők?
17. M odern fogyasztói berendezések (például zenelejátszók, digitális fényképező­
gépek) gyakran rendelkeznek képernyővel, ahol parancsokat vihetünk be, és
Feladatok ahol ezen parancsok bevitelének eredménye megjelenik. Ezek a berendezések
belül gyakran rendelkeznek nagyon egyszerű operációs rendszerrel. A PC-k
1. Mi az operációs rendszer két fő feladata? szoftverének mely részéhez hasonlítható ez a parancsbeviteli mód?
2. Mi a különbség a kernel mód és a felhasználói mód között? M iért fontos ez a 18. A Windows nem rendelkezik fork rendszerhívással, mégis képes új processzu­
különbség az operációs rendszerek szempontjából? sok létrehozására. Próbálja kitalálni a szemantikáját annak a rendszerhívás­
3. Mi a multiprogramozás? nak, amelyet a Windows használ erre a célra.
4. Mi a háttértárolás? Mi a véleménye arról, hogy a nagyobb személyi számítógé­ 19. M iért csak a szuperfelhasználó hajthatja végre a chroot hívást? (Emlékezzünk
pekbe beépítik a kim enet átm eneti tárolását? a védelmi problém ákra.)
5. A régebbi számítógépeken m inden bejövő és kimenő bájtot közvetlenül a 20. Vizsgáljuk meg a rendszerhívások listáját az 1.9. ábrán. Mit gondol, valószínű­
CPU kezelt (nem volt D M A - Direct Memory Access). Milyen befolyással volt leg melyik hívás hajtódik végre leggyakrabban? Indokolja válaszát.
ez a multiprogramozásra? 21. Tegyük fel, hogy egy számítógép m ásodpercenként 1 milliárd művelet végre­
6. A második generációs gépeken miért nem terjedt el az időosztás? hajtására képes, és hogy egy rendszerhíváshoz 1000 utasítás szükséges, bele­
7. A következő utasítások közül melyek hajthatók végre csak kernel módban? értve a csapda és a kontextusváltás végrehajtását is. A számítógép m ásodper­
(a) Megszakítás tiltása. cenként hány rendszerhívást hajthat végre úgy, hogy a CPU kapacitásának a
(b) Az idő megkérése. fele megm aradjon a felhasználói kód futtatására?
(c) Az idő beállítása. 22. Az 1.16. ábrán láthatunk mknod rendszerhívást, de nincs rmnod. Jelenti-e ez
(d) A memórialeképezés módosítása. azt, hogy nagyon-nagyon figyelmesen hozhatunk csak létre új csomókat ezzel a
8. Soroljon fel a személyi számítógépek operációs rendszerei és a nagyszámító­ módszerrel, m ert nincs lehetőségünk törölni őket?
gépek operációs rendszerei közötti néhány különbséget. 23. M iért futtatja a M INIX 3 az update háttérprogram ot állandóan?
9. Indokolja meg, m iért lehet jobb minőségű egy zárt forráskódú, szabadalmazott 24. Van értelm e a SIGALRM szignál figyelmen kívül hagyásának?
operációs rendszer, amilyen a Windows is, mint egy nyílt forráskódú rendszer, 25. O sztott rendszereken a kliens-szerver modell népszerű. Használható ez egygé-
például a Linux. Ezután indolja meg azt, m iért lehet jobb minőségű egy nyílt pes rendszeren is?
forráskódú operációs rendszer, mint egy zárt forráskódú, szabadalmazott.
68 1.BEVEZETÉS

26. A Pentium kezdeti változatai nem tám ogatták a virtuális gép m onitort. Milyen
lényeges karakterisztika szükséges egy gép virtualizálásához? 2. Processzusok
27. írjunk program ot vagy program okat az összes M INIX 3-rendszerhívás tesz­
telésére. Használjuk a hívásokat különböző, esetleg hibás param éterekkel és
figyeljük meg, hogy a hibák kiderülnek-e.
28. írjunk az 1 .10. ábrán láthatóhoz hasonló parancsértelmezőt, amely m ár m űkö­
dőképes és tesztelésre is alkalmas. Bővíthetjük a bem enet és a kimenet átirányí­
tásával, adatcsövekkel, háttérfeladatok végrehajtásával és egyéb funkciókkal.

Ebben a fejezetben elkezdjük az operációs rendszerek tervezésének és megvalósí­


tásának részletes tanulmányozását mind általánosságban, mind pedig konkrétan a
MINIX 3 esetében. M inden operációs rendszer központi fogalma a processzus: a
futó program egy absztrakciója. M inden más ettől a fogalomtól függ, ezért fontos,
hogy az operációs rendszer tervezője (és a hallgató) jól megértse, mit takar.

2.1. Bevezetés
M inden m odern számítógép több dolgot képes egy időben elvégezni. M ialatt egy
felhasználói program fut, a számítógép olvashat is egy lemezről, és szöveget is ír­
hat a képernyőre vagy nyomtatóra. Egy m ultiprogram ozható rendszerben a CPU
is program ról program ra kapcsol, futtatva azokat néhány tíz vagy száz ezred má­
sodpercig. Bár szigorúan véve a CPU m inden időpillanatban csak egy program ot
futtat, egy másodperc leforgása alatt több program on is dolgozhat, és ezzel a pár­
huzamosság illúzióját kelti a felhasználóban. Néha látszatpárhuzam osságról be­
szélünk ebben az összefüggésben, megkülönböztetve a többprocesszoros rendsze­
rek (két vagy több CPU megosztva használja ugyanazt a fizikai m em óriát) valódi
hardverpárhuzamosságától. Az em bernek nehéz követnie ezeket a többszörös,
párhuzam os tevékenységeket. Ezért az operációs rendszerek tervezői az évek so­
rán egy olyan fogalmi modellt (szekvenciális processzusok) fejlesztettek ki, amely
megkönnyíti a párhuzamosság kezelését. Ennek a modellnek a használata és né­
hány következménye lesz e fejezet tárgya.

2.1.1. A processzusmodell

Ebben a modellben minden, a számítógépen futtatható szoftver, gyakran beleért­


ve magát az operációs rendszert is, szekvenciális processzusok vagy röviden pro­
cesszusok sorozatává szerveződik. A processzus egyszerűen egy végrehajtás alatt
álló program, beleértve az utasításszámláló, a regiszterek és a változók aktuális ér-
70 2. PROCESSZUSOK 2.1. BEVEZETÉS 71

Egy utasításszámláló A különbség egy processzus és egy program között hajszálnyi, de döntő. Egy
Négy utasításszámláló analógia segíthet ezt világosabbá tenni. Tekintsünk egy konyhaművész számító­
Processzus­
váltás géptudóst, aki a lányának születésnapi tortát süt. Megvan a születésnapi to rta re­
ceptje, és a szükséges nyersanyagok is rendelkezésre állnak a konyhában: van liszt,
ÜT tojás, cukor, vaníliakivonat stb. Ebben az analógiában a recept a program (vagyis
egy algoritmus, amelyet ideillő jelölésrendszerben írtak le), a számítógéptudós a
processzor (CPU), és a sütemény hozzávalói a bem eneti adatok. A processzus a
következő tevékenységekből áll: cukrászunk olvassa a receptet, veszi a hozzávaló­
kat és süti a tortát.
(a) (b) (0 Most képzeljük el, hogy a számítógéptudós fia sírva beszalad azzal, hogy meg­
csípte egy méhecske. A számítógéptudós megjegyzi, hol tart a receptben (az ak­
2.1. ábra. (a) Négy program multiprogramozása, (b) Négy független, szekvenciális processzus tuális processzus állapotát elmenti), előveszi az elsősegélynyújtó könyvet, és el­
elméleti modellje, (c) Minden időpillanatban csak egy program aktív kezdi követni annak utasításait. Itt látjuk, hogy a processzort átkapcsolták az egyik
processzusról (sütés) egy magasabb prioritású processzusra (elsősegélynyújtás),
tékét is. Elméletileg m inden processzusnak saját virtuális CPU-ja van. A valóság­ amelyek mindegyike külön programmal rendelkezik (recept, illetve elsősegély-
ban term észetesen a valódi C PU kapcsolgat oda-vissza a processzusok között, de nyújtó könyv). A méhcsípés ellátása után a számítógéptudós visszatér a sütem é­
ahhoz, hogy a rendszert megértsük, könnyebb az (ál-)párhuzam osan futó procesz- nyéhez, ott folytatva, ahol abbahagyta.
szusok együttesét elképzelni, mint megpróbálni követni, hogyan kapcsolgat a CPU Egy processzus, és ez itt a lényeg, egy bizonyosfajta tevékenység. Van program ­
program ról program ra. Ezt a gyors oda-vissza kapcsolást m ultiprogram ozásnak ja, bem enő és kimenő adatai és állapota. Egyetlen processzort bizonyos ütemezési
nevezzük, ahogy azt m ár az 1. fejezetben láttuk. algoritmussal megoszthatunk több processzus között, amelyet arra használunk,
A 2.1. (a) ábrán egy számítógépet látunk, amely multiprogramozást kezel négy hogy meghatározzuk, mikor fejezzük be a m unkát az egyik processzuson és szolgál­
programmal a memóriájában. A 2.1.(b) ábrán négy processzust látunk, m ind­ junk ki egy másikat.
egyiknek saját vezérlése (vagyis saját utasításszámlálója) van, és mindegyik a töb­
bitől függetlenül fut. Természetesen csak egyetlen fizikai utasításszámláló van,
ezért az egyes processzusok futásakor annak logikai utasításszámlálója betöltődik 2.1.2. Processzusok létrehozása
az igazi utasításszámlálóba. Amikor futása egy időre befejeződik, a fizikai utasítás­
számláló elm entődik a processzus logikai utasításszámlálójába, amely a m em óriá­ Az operációs rendszernek valamilyen m ódon gondoskodnia kell az összes szük­
ban található. A 2.1.(c) ábrán látható, hogy elegendően hosszú időintervallumot séges processzus létrehozásáról. Nagyon egyszerű rendszerekben, illetve olyan
tekintve m inden processzus végrehajtódik, de m inden adott időpillanatban aktuá­ rendszerekben, amelyeket csak egy processzus futtatására terveztek (például egy
lisan csak egy processzus fut. eszköz valós idejű vezérlésére), megoldható, hogy m inden processzus, amelyre
Azzal, hogy a CPU oda-vissza kapcsolgat a processzusok között, egy procesz- valaha szükség lehet, a rendszer indulásakor elérhető legyen. Általános célú rend­
szus nem állandó sebességgel halad előre a számításai végrehajtásában, és ez szerekben azonban szükség van processzusok létrehozására és megszüntetésére
valószínűleg nem is reprodukálható, még akkor sem, ha ugyanazokat a procesz- m űködés közben is. M ost megvizsgáljuk a felmerülő kérdéseket.
szusokat még egyszer futtatjuk. Ezért a processzusokba nem szabad belső időzí­ Négy fő esemény okozhatja processzusok létrehozását:
tési feltételeket beépíteni. Tekintsünk például egy I/O-processzust, amely elindít
egy szalagot, hogy kim entett fájlokat töltsön vissza, és végrehajt 10 000-szer egy 1. A rendszer inicializálása.
üres ciklust, hogy a szalag felgyorsulhasson, majd kiad egy utasítást az első rekord 2. A processzus által meghívott processzust létrehozó rendszerhívás végrehaj­
beolvasására. H a a CPU úgy dönt, hogy a várakozó ciklus alatt egy másik procesz- tása.
szusra kapcsol át, lehet, hogy a szalagprocesszus csak azután fog újból futni, ami­ 3. A felhasználó egy processzus létrehozását kéri.
kor az első rekord már elhaladt az olvasófej előtt. Amikor a processzusnak ehhez 4. Kötegelt feladat kezdeményezése.
hasonló kritikus valós idejű követelményei vannak, azaz bizonyos eseményeknek
be kell következni előre m eghatározott néhány ezred m ásodpercen belül, speciá­ Egy operációs rendszer indulásakor gyakran számos processzus keletkezik. Sok
lis intézkedésekre van szükség, hogy biztosítsuk azok tényleges bekövetkezését. közülük előtérben fut; ezek azok a processzusok, amelyek a felhasználókkal tart­
Rendszerint azonban a legtöbb processzust nem befolyásolja a C PU alapvető mul­ ják a kapcsolatot, vagy számukra m unkát végeznek. Mások háttérprocesszusok,
tiprogramozása vagy a különböző processzusok relatív sebessége. amelyek nincsenek egy bizonyos felhasználóhoz hozzárendelve, ehelyett valami­
72 2. PROCESSZUSOK 2.1. BEVEZETÉS 73

lyen sajátos feladatuk van. Például egy háttérprocesszust tervezhetünk a gépen tá­ az elindít egy gyermekprocesszust, és a gyermek hajtja végre a sort-ot. Ennek a
rolt weboldalak elérésére vonatkozó kérések fogadására, amely akkor aktivizáló­ kétlépéses megoldásnak az oka az, hogy a gyermek képes legyen a fájlleírók m a­
dik, amikor ilyen kiszolgálandó kérés érkezik. Azokat a processzusokat, amelyek nipulálására a fork után, de még az execve előtt a standard bem eneti, kim eneti és
a háttérben m aradnak valamilyen tevékenység kezelésére (weboldalak, nyomta­ hibacsatornák átirányításához.
tás), démonoknak (daemon) hívjuk. Nagy rendszerek rendszerint tucatnyi ilyennel A M INIX 3-ban és Unixban egyaránt a processzus létrehozása után a szülő és a
rendelkeznek. A M INIX 3-ban a ps program ot használhatjuk a futó processzusok gyermek saját elkülönülő címtartománnyal rendelkezik. H a bármelyikük megvál­
kilistázására. toztat egy szót a címtartományán belül, az a másik processzus számára nem lesz
A rendszerinduláskori processzuslétrehozás mellett később is létrehozhatók látható. A gyermek kezdeti címtartománya a szülőének másolata, de a két cím tar­
processzusok. Gyakran egy futó processzus ad ki rendszerhívást egy vagy több tomány elkülönül, írható m em óriaterületen nem osztoznak (akárcsak néhány más
új processzus létrehozására, hogy munkáját segítsék. Új processzus létrehozása Unix-megvalósítás, a M INIX 3 is képes a nem m ódosítható program kódrészt meg­
különösen hasznos, ha az elvégzendő munka könnyen megfogalmazható számos osztani közöttük). Azonban az újonnan létrehozott processzus m egteheti azt, hogy
egymáshoz kapcsolódó, egymással együttműködő, de egyébként egymástól függet­ osztozik a létrehozójának néhány más erőforrásán, például a megnyitott fájlokon.
len processzussal. Például egy nagyméretű program fordításakor a make program
meghívja a C fordítót a forráskód tárgykóddá alakításához, majd az install progra­
m ot a program rendeltetési helyére másolásához, tulajdonosi információk, hozzá­ 2.1.3. Processzusok befejezése
férési jogok és egyebek beállításához. A M INIX 3-ban a C fordító tulajdonképpen
számos különböző program összessége, amelyek együtt dolgoznak. Ezek közé tar­ A processzus létrehozása után elkezd dolgozni, és teszi a dolgát. Azonban semmi
tozik az előfeldolgozó, a C nyelvi elemző, az assembly kódgenerátor, az assembler sem tart örökké, még a processzusok sem. Előbb vagy utóbb az új processzus befe­
és a tárgykódszerkesztő (linker). jeződik, rendszerint a következő körülmények között:
Interaktív rendszerekben a felhasználók parancsok begépelésével indíthat­
nak program okat. A M INIX 3-ban virtuális konzolok segítségével a felhasználó 1. Szabályos kilépés (önkéntes).
program ot, például egy fordítót indíthat, majd átválthat egy másik konzolra, ahol 2. Kilépés hiba miatt (önkéntes).
mondjuk indíthat egy szövegszerkesztőt a dokumentáció megírására, mialatt a 3. Kilépés végzetes hiba m iatt (önkéntelen).
fordító dolgozik. 4. Egy másik processzus megsemmisíti (önkéntelen).
Az utolsó olyan helyzet, ahol processzusok keletkezhetnek, csak a nagyszámító­
gépeken futó kötegelt rendszerekre érvényes. Itt a felhasználók kötegelt feladato­ A legtöbb processzus azért fejeződik be, m ert végzett a feladatával. Amikor a
kat küldhetnek a rendszernek (valószínűleg távolról). Am ikor az operációs rend­ fordítóprogram lefordította a neki adott program ot, akkor végrehajt egy rendszer-
szer úgy dönt, hogy van elegendő rendelkezésre álló erőforrás egy új feladat fut­ hívást, amivel közli az operációs rendszer felé, hogy elkészült. Ez az exit hívás a
tatásához, készít egy új processzust, és ebben futtatja a bem eneti sorban található M INIX 3-ban. A képernyő-orientált program ok is támogatják az önkéntes befe­
következő feladatot. jezést. Például a szövegszerkesztők mindig rendelkeznek olyan billentyűkombiná­
Technikai értelem ben ezen esetek mindegyikében egy m ár létező processzus cióval, amellyel a felhasználó közölheti a processzussal, hogy m entse a munkafájlt,
processzuslétrehozó rendszerhívás segítségével hoz létre új processzust. A kér­ távolítsa el a megnyitott ideiglenes állományokat, és fejezze be a futását.
déses processzus lehet egy futó felhasználói processzus, egy billentyűzettel vagy A befejezés második indoka az lehet, hogy a processzus végzetes hibát fedezett
egérrel elindított rendszerprocesszus, vagy egy kötegelt feladatkezelő processzus. fel. Például ha a felhasználó begépeli a
Ez a processzus hajtja végre a rendszerhívást az új processzus létrehozásához. Ez
a rendszerhívás mondja meg az operációs rendszernek, hogy egy új processzust cc foo.c
hozzon létre, és közvetve vagy közvetlenül jelzi, hogy melyik program ot kell ebben
futtatnia. parancsot a foo.c program fordításához, és nem létezik ilyen nevű fájl, a fordító-
A M INIX 3 egyetlen processzuslétrehozó rendszerhívással rendelkezik, a fark­ program egyszerűen kilép.
kal. Ez a hívás az őt meghívó processzus tökéletes másolatát készíti el. A fork után A befejezés harmadik oka a processzus által okozott hiba, esetleg egy hibás
a két processzus, a szülő és a gyermek ugyanazzal a m emóriaképpel, környezeti program sor miatt. E rre példa többek között egy illegális utasítás végrehajtása,
sztringekkel és megnyitott fájlokkal fognak rendelkezni. Ennyi az egész. A gyer­ nem létező memóriacímre hivatkozás, vagy a nullával való osztás. A M INIX 3-ban
mekprocesszus ezek után rendszerint végrehajt egy execve vagy hasonló rendszer- a processzus az operációs rendszer tudtára hozhatja, hogy bizonyos hibákat maga
hívást a mem óriakép m egváltoztatására és egy új program futtatására. Például kíván kezelni, amely esetben a processzus egy szignált kap (megszakítódik), ahe­
amikor a felhasználó begépeli mondjuk a sort parancsot a parancsértelm ezőben, lyett hogy befejeződne a hiba bekövetkeztekor.
74 2. PROCESSZUSOK 2.1. BEVEZETÉS 75

A processzusbefejezés negyedik oka az, hogy egy processzus végrehajt egy olyan felhasználó parancsértelm ezőjét (shell). így a shell az init gyermekprocesszusa.
rendszerhívást, amely azt közli az operációs rendszerrel, hogy semmisítsen meg A felhasználó parancsai a shell gyermekei és az init unokái lesznek. Az események
egy másik processzust. A M INIX 3-ban ez a kill hívás. Természetesen a megsem­ ezen sorrendje példája a processzusfák működésének. A reinkarnációs szerver és
misítőnek rendelkeznie kell a szükséges jogosultsággal a kérés végrehajtásához. az init kódja nincs a könyvünkben kilistázva, mint ahogy a parancsértelm ezőé sem:
Bizonyos rendszerekben egy processzus akár önkéntes, akár önkéntelen befejező­ valahol meg kell húzni a határt. Az alapötlet így is világos.
dése maga után vonja az általa létrehozott valamennyi processzus azonnali meg­
semmisítését is. A M INIX 3 azonban nem így működik.
2.1.5. Processzusállapotok

2.1.4. Processzushierarchiák Bár m inden processzus egy önálló egység saját utasításszámlálóval, veremmel,
nyitott fájlokkal, ébresztőkkel és egyéb belső állapottal, a processzusoknak gyak­
Bizonyos rendszerekben, amikor egy processzus egy másikat hoz létre, a szülő és ran szükségük van interakcióra, kommunikációra, szinkronizációra más procesz-
a gyermek bizonyos értelem ben kapcsolatban m aradnak. A gyermek maga is több szusokkal. Egy processzus generálhat például olyan kim enetet, amelyet egy másik
processzust hozhat létre, így egy processzushierarchiát kialakítva. A processzusok processzus bem enetként használ. A
csak egy szülővel rendelkeznek (de lehet nulla, egy, kettő vagy több gyermekük).
A M INIX 3-ban egy processzus, a gyermekei és további leszármazottjai együt­ cat chapterl chapter2 chapter3 | grep tree
tesen egy processzuscsoportot alkotnak. Am ikor a felhasználó a billentyűzetről
egy szignált küld, ez a szignál a billentyűzethez rendelt processzuscsoport összes parancsértelm ezőnek szóló utasításban az első processzus, a cat futtatása, három
tagja számára kézbesítődhet (rendszerint azoknak a processzusoknak, amelyek fájlt kapcsol össze. A második processzus, a grep futtatása, kiválaszt minden olyan
az aktuális ablakban jöttek létre). Ez a viselkedés szignálfüggő. Amennyiben a sort, amely tartalm azza a „tree” szót. A két processzus relatív sebességétől füg­
szignál egy csoportnak lett küldve, m inden processzus elkaphatja, figyelmen kívül gően (amely függ mind a program ok relatív bonyolultságától, mind attól, hogy
hagyhatja, vagy az alapértelm ezett m ódon cselekedhet, ami a szignál általi befe­ egy-egy processzus mennyi CPU-időt kapott) előfordulhat, hogy a grep futásra ké­
jezését jelenti. szen áll, de nincs feldolgozásra váró bem enet. Ekkor blokkolódnia kell, amíg nem
A processzusfák használatának egyszerű példájaként nézzük meg, hogyan ini­ áll rendelkezésre bem enő adat.
cializálja magát a M INIX 3. Két speciális processzus, a reinkarnációs szerver és Egy processzus blokkolódik, ha logikailag nem lehet folytatni rendszerint azért,
az init, megtalálható az indító m em óriatartalom ban (boot image). A reinkarnációs m ert olyan bem enetre vár, amely még nem elérhető. Az is lehetséges, hogy egy
szerver feladata a meghajtóprogram ok és a kiszolgálók (újra)indítása. M űködését processzust, amely elvileg kész és futásra képes, az operációs rendszer leállít, hogy
blokkolt állapotban kezdi, üzenetre várva, hogy mit hozzon létre. a CPU-t egy kis időre egy másik processzusnak adja. Ez a két feltétel teljesen kü­
Ezzel szemben az init végrehajtja az léteire szkriptet, aminek következtében ar­ lönböző. Az első esetben a felfüggesztés a problém a velejárója (nem tudjuk fel­
ra utasítja a reinkarnációs szervert, hogy a kezdeti m em óriatartalom ban nem sze­ dolgozni a felhasználói parancssort, amíg be nem gépelték). A második esetben
replő m eghajtóprogram okat és kiszolgálókat indítsa el. Ez az eljárás a meghajtó- ez a rendszer sajátossága (nincs elegendő CPU, hogy m inden processzusnak saját
program okat és a kiszolgálókat a reinkarnációs szerver gyermekeiként indítja el, külön processzora legyen). A 2.2. ábrán egy állapotdiagram ot látunk, amely be­
így amennyiben bármelyikük befejeződik, a reinkarnációs szerver értesül erről és m utatja azt a három állapotot, amelyben egy processzus lehet.
újraindíthatja (reinkarnálhatja). Ezzel a mechanizmussal képes a M INIX 3 leke­
zelni egy meghajtóprogram vagy kiszolgáló összeomlását, mivel egy másikat tud
indítani autom atikusan helyette. A gyakorlatban egy meghajtóprogram cseréje 1. A processzus bemeneti adatra várva blokkol
azonban jóval egyszerűbb, mint egy kiszolgálóé, mivel jóval kevesebb utóhatása 2. Az ütemező másik processzust szemelt ki
van a rendszer más részeire nézve. (És nem mondjuk, hogy mindig tökéletesen 3. Az ütemező ezt a processzust szemelte ki
működik; ez még egy folyamatban lévő munka.) 4. A bemeneti adat elérhető
Amikor az init végzett ezzel, beolvassa az letelttytab konfigurációs fájlt, amely
megadja, hogy mely term inálok és virtuális terminálok léteznek. Az init elindít
a fork segítségével egy getty processzust mindegyikük számára, megjeleníti a be­ 2.2. ábra. A processzus lehet futó, blokkolt vagy futáskész állapotban. Láthatjuk az állapotok
jelentkezési prom ptot, és vár a bem enetre. Am ikor egy név begépelésre kerül, a közötti átmeneteket
getty az exec segítségével végrehajt egy login processzust a m egadott névvel argu­
mentum ként. Amennyiben a felhasználó bejelentkezése sikeres, a login futtatja a
76 2. PROCESSZUSOK 2.1. BEVEZETÉS 77

1. Futó (az adott pillanatban éppen használja a CPU-t). Processzusok


2. Futáskész (készen áll a futásra; ideiglenesen leállították, hogy egy másik p ro­
0 1 n-2 n- 1
cesszus futhasson).
•• •
3. Blokkolt (bizonyos külső esemény bekövetkezéséig nem képes futni).

Az első két állapot logikailag hasonló. A processzus mindkét esetben futni akar,
Ütemező
csak a második esetben ideiglenesen nincs számára elérhető CPU. A harmadik
állapot az első kettőtől abban különbözik, hogy itt a processzus nem képes futni
még akkor se, ha a CPU-nak nincs más dolga. 2.3. ábra. A processzuséivá operációs rendszer alsó szintje kezeli a megszakításokat
M int a 2.2. ábrán látható, négy átm enet lehetséges a három állapot között. Az és az ütemezést. A felette lévő szinten vannak a szekvenciális processzusok
1. átm enet akkor következik be, amikor egy processzus ráébred arra, hogy futását
nem tudja folytatni. Néhány rendszerben ekkor a processzusnak egy rendszerhí­ blokkolódnak, amikor valaminek a bekövetkezésére várnak. Amikor a lemezblok­
vást, a block-ot vagy a pause-t kell végrehajtania, hogy blokkolt állapotba kerüljön. kot beolvastuk vagy a karaktert leütöttük, az erre váró processzus blokkolása fel­
Más rendszerekben, beleértve a M INIX 3-at is, amikor egy processzus adatcsőből oldódik, és ezzel készen áll, hogy újra fusson.
vagy speciális fájlból (például term inálról) olvas, és nincs elérhető bem enet, a pro­ Ez a szemlélet eredményezi a 2.3. ábrán látható modellt. Itt az operációs rend­
cesszus autom atikusan átkerül futó állapotból blokkokba. szer legalsó szintje az ütemező, és felette helyezkedik el a többi processzus. Mind
A 2. és 3. átm enetet a processzusütemező, mint az operációs rendszer része, a megszakításkezelés, mind a processzusok tényleges indításának és megállításá­
váltja ki anélkül, hogy a processzus bármit is tudna erről. A 2. átm enet akkor kö­ nak részletei az ütem ezőben vannak elrejtve, amely tulajdonképpen elég kicsi.
vetkezik be, amikor az ütem ező úgy dönt, hogy a futó processzus m ár elég rég­ Az operációs rendszer többi része könnyen beilleszthető a processzusmodellbe.
óta fut, és itt az ideje, hogy egy másik processzus kapjon valamennyi CPU-időt. A 2.3. ábra modelljét használja a M INIX 3. Természetesen az ütemezés nem az
A 3. átm enet akkor fordul elő, amikor m ár m inden más processzus m egkapta a egyetlen dolog a legalsó szinten, a megszakításkezelés és a processzusok közötti
jogos részét, és itt az ideje, hogy az első processzus jusson a CPU-hoz, hogy is­ kommunikáció támogatása is itt található. Mindazonáltal első közelítésként jól m u­
m ét futhasson. Az ütem ezés tárgya, vagyis annak eldöntése, hogy melyik procesz- tatja az alapvető szerkezetet.
szus fusson, mikor és mennyi ideig, nagyon fontos dolog. Sok algoritmust találtak
ki, hogy megpróbálják kiegyensúlyozni a két egymással versengő követelményt: a
rendszernek mint egésznek a hatékonyságát és az egyes processzusok pártatlan 2.1.6. Processzusok megvalósítása
kezelését. M agát az ütem ezést és néhány ilyen algoritmust a fejezet későbbi részé­
ben tárgyaljuk. A processzusmodell megvalósításához az operációs rendszer egy táblázatot (adat-
A 4. átm enet akkor fordul elő, amikor az a külső esemény, amelyre a processzus szerkezetek töm bjét) kezel, amelyet processzustáblázatnak nevezünk, procesz-
várakozott, bekövetkezik (például megérkezik a bem enő adat). H a egy processzus szusonként egy bejegyzéssel. (Néhány szerző ezeket a bejegyzéseket processzus­
sem fut ebben a pillanatban, azonnal kiváltódik a 3. átm enet, és a processzus el­ vezérlő blokkoknak nevezi.) Ez a bejegyzés információt tartalm az a processzus
kezd futni. Különben lehet, hogy várakoznia kell egy kicsit a futáskész állapotban, állapotáról, utasításszámlálójáról, verem m utatójáról, a lefoglalt memóriáról, a
amíg a CPU elérhető lesz. megnyitott fájljainak állapotáról, az elszámolási és ütemezési információjáról,
A processzusmodellt használva könnyebben el tudjuk képzelni, hogy mi tör­ ébresztőiről és egyéb szignáljairól, valamint m inden egyéb, a processzusra vo­
ténik a rendszer belsejében. Egyes processzusok olyan program okat futtatnak, natkozó olyan információról, amit azért kell elmenteni, amikor a processzust fu tó ­
amelyek a felhasználó által begépelt parancsokat hajtják végre. Más processzusok ról futáskész állapotba kapcsoljuk, hogy később úgy indulhasson újra a processzus,
a rendszer részei, és olyan feladatokat látnak el, mint a fájlkiszolgáló felé érkező m intha soha nem állítottuk volna le.
igények teljesítése vagy egy lemez vagy szalagegység résztevékenységeinek ösz- A M INIX 3-ban a processzusok közötti kommunikációt, a m emóriakezelést és
szehangolása. Am ikor bekövetkezik egy lemezmegszakítás, a rendszer döntést a fájlkezelést a rendszeren belül különálló modulok valósítják meg, így a procesz-
hozhat az aktuális processzus futásának megállításáról és annak a lemezprocesz- szustáblázat részekre van osztva, hogy m inden modul karbantarthassa a számá­
szusnak a futtatásáról, amely eddig blokkolva volt, m ert erre a megszakításra várt. ra szükséges mezőket. A 2.4. ábra a fontosabb mezők közül m utat be néhányat.
Azért használtuk a feltételes módot, m ert ez a futó processzus és a lemezmeghaj­ Ehhez a fejezethez kizárólag az első oszlop mezői tartoznak. A másik két oszlop
tó processzus egymáshoz képesti prioritásaitól függ. D e a lényeg az, hogy anélkül, csak arra szolgál, hogy lássuk, a rendszer más részein milyen információkra van
hogy a megszakításokkal foglalkoznánk, úgy tekinthetünk a felhasználói procesz- szükség.
szusokra, a lemezprocesszusokra, a terminálprocesszusokra stb., mint amelyek
78 2. PROCESSZUSOK 2.1. BEVEZETÉS 79

Processzuskezelés Fájlkezelés 1. A hardver verembe teszi az utasításszámlálót stb.


Kernel
2. A hardver a megszakításvektorból betölti az új utasításszámlálót.
Mutató a kódszegmensre UMASK maszk 3. Az assembly nyelvű eljárás elmenti a regisztereket.
Regiszterek
Utasításszámláló Mutató az adatszegmensre Gyökérkönyvtár 4. Az assembly nyelvű eljárás beállítja az új vermet.
Mutató a bss szegmensre Mun kakönyvtár 5. A C megszakításkezelő üzenetet készít és küld.
Programállapot szó
Kilépés állapota Fájlleírók 6. Az ütemező futáskésznek jelöli a várakozó feladatot.
Veremmutató
Processzusállapot Szignál állapota Valós UID 7. Az üzenetküldő kód az üzenetre várakozót futáskészre állítja.
Aktuális ütemezési prioritás Processzusazonosító Tényleges UID 8. A C eljárás visszatér az assembly kódba.
Maximális ütemezési prioritás Szülőprocesszus Valós GID 9. Az assembly nyelvű eljárás elindítja az új aktuális processzust.
Hátralévő ütemezett idő Processzuscsoport Tényleges GID
Időzítési egység mérete Gyermekek CPU-ideje Vezérlő tty
2.5. ábra. Vázlat az operációs rendszer legalsó szintjének tevékenységéről, amikor egy
Felhasznált CPU-idő Valódi UID Mentési terület olvasáshoz/
megszakítás bekövetkezik
Mutató az üzenetsorra Tényleges UID íráshoz
Függő szignálbitek Valódi GID Rendszerhívás paraméterei
Különböző jelzőbitek Tényleges GID Különböző jelzőbitek A processzusok kommunikációját a M INIX 3-ban üzenetekkel valósítjuk meg,
Processzus neve Fájlinformáció vagyis a következő lépés, hogy összeállítsunk egy üzenetet, amelyet annak a le­
megosztáshoz
mezprocesszusnak küldünk, amelyik blokkolt állapotban erre vár. Az üzenet azt
Bittérkép a szignálokhoz
Különböző jelzőbitek mondja, hogy megszakítás következett be, megkülönböztetve ezzel attól az üze­
Processzus neve nettől, amely felhasználói processzusoktól származik, és egy lemezblokk olvasását
vagy valami hasonlót kér. A lemezprocesszus állapota blokkokról futáskészre vál­
2.4. ábra. A MINIX3-processzustáblázat néhány mezője. A mezők a kernel, a processzuskezelés tozik, és meghívásra kerül az ütemező. A M INIX 3-ban a különböző processzu­
és a fájlrendszer szerint vannak felosztva soknak különböző prioritása van, hogy jobban ki tudjuk szolgálni például az I/O-
eszközkezelőket, mint a felhasználói processzusokat. H a most a lemezprocesszus
Most, hogy megnéztük a processzustáblázatot, nézzük meg egy kicsit jobban, a legmagasabb prioritású futtatható processzus, akkor az ütem ező futásra kijelöli.
hogyan tartják fenn a többszörös szekvenciális processzusok illúzióját egy olyan H a az a processzus, amelyet megszakítottunk, ugyanilyen fontos, vagy fontosabb,
gépen, amelynek egy CPU-ja és több I/O-eszköze van. Szigorúan véve most annak akkor az ütem ező ismét azt választja ki futásra, és a lemezprocesszusnak kis ideig
a leírása következik, hogyan dolgozik a M INIX 3-ban a 2.3. ábra „ütem ezője”, de a várnia kell.
legtöbb m odern operációs rendszer alapvetően ugyanígy működik. M inden egyes így vagy úgy az assembly nyelvű megszakítási kód által hívott C eljárás most
I/O-eszközosztályhoz (vagyis hajlékonylemez-egységekhez, merevlemezegységek­ visszatér, és az assembly nyelvű kód feltölti a regisztereket és a m em óriatérképet a
hez, időmérőkhöz, terminálokhoz) tartozik egy tábla, amelyet megszakításleíró most aktuális processzus számára, majd elindítja futását. A 2.5. ábrán összefoglal­
táblának nevezünk. A tábla egyes bejegyzéseinek legfontosabb része a megszakí­ juk a megszakításkezelést és az ütemezést. Érdem es megjegyezni, hogy a részletek
tásvektor, amely a megszakítást kiszolgáló eljárás címét tartalmazza. Tegyük fel, rendszerről rendszerre kissé eltérnek.
hogy éppen a 23. felhasználói processzus fut, amikor egy lemezmegszakítás be­
következik. Az utasításszámlálót, a program állapot szót és esetleg egy vagy több
regisztert a megszakításhardver az (aktuális) verembe teszi. A számítógép ezután 2.1.7. Szálak
a lemezmegszakítás-vektorban m eghatározott címre ugrik. Ez minden, amit a
hardver csinál. Innen kezdve a szoftveren a sor. Egy hagyományos operációs rendszerben minden egyes processzus saját cím tarto­
A megszakítást kiszolgáló eljárás azzal kezdi, hogy az összes regisztert elm en­ mánnyal és egyetlen vezérlési szállal rendelkezik. Ez tulajdonképpen m ajdnem a
ti az aktuális processzushoz tartozó processzustáblázat-bejegyzésbe. Az aktuális teljes definíciója a processzusnak. M indem ellett gyakran fordul elő olyan helyzet,
processzus száma és a bejegyzésére m utató pointer globális változóban marad, amikor kívánatos lenne több kvázi párhuzam osan futó vezérlési szál használata
hogy gyorsan megtalálhassuk. Ezután a megszakítás által lerakott információk ki­ egy címtartományon belül, úgy, m intha különálló processzusok lennének (a kö­
kerülnek a veremből, és a verem m utató egy ideiglenes verem re állítódik, amelyet zös címtartomány kivételével). Ezeket a vezérlési szálakat általában csak szálak­
a processzuskezelő használ. Az olyan tevékenységek, mint a regiszterek elm enté­ nak (thread) hívjuk, vagy esetenként könnyűsúlyú processzusoknak (lightweight
se vagy a verem m utató beállítása, nem fejezhetők ki magas szintű programozási process).
nyelvekben, amilyen például a C, ezért ezeket kis assembly nyelvű rutinokkal való­ A processzust tekinthetjük egymással összefüggő erőforrások egy csoportosítási
sítják meg. Am ikor ez a rutin befejeződik, meghív egy C eljárást az adott megsza­ módjának. A processzus címtartománya tartalm azza a program kódját, adatait és
kítástípushoz tartozó m unka hátralévő részének elvégzésére. más erőforrásait. Ilyen erőforrások lehetnek megnyitott fájlok, gyermekprocesz-
80 2. PROCESSZUSOK 2.1. BEVEZETÉS 81

1. processzus 2. processzus 3. processzus Processzus


Processzushoz tartozó elemek Szálhoz tartozó elemek

Címtartomány Utasításszámláló
Globális változók Regiszterek
Megnyitott fájlok Verem
Felhasználói Gyermekprocesszusok Állapot
terület Függőben lévő ébresztők
Szignálok és szignálkezelők
Elszámolási információ

2.7. ábra. Az első oszlop a processzushoz tartozó elemeket mutatja, amelyeken a szálak
terület osztoznak. A második oszlop néhány, a szálakhoz egyenként tartozó elemet mutat

hatjuk. A regiszterekre azért van szükség, m ert amikor a szálakat felfüggesztjük, a


2.6. ábra. (a) Három processzus, mindegyik egy szállal, (b) Egy processzus három szállal regisztereiket el kell menteni. Végül a szálak, a processzusokhoz hasonlóan, futó,
futáskész vagy blokkolt állapotban lehetnek. A 2.7. ábrán felsorolunk néhány pro­
szusok, függőben lévő ébresztők, szignálkezelők, elszámolási információk, egye­ cesszushoz és szálhoz kapcsolódó elemet.
bek. Ezek egyszerűbben kezelhetők, ha processzus formájában összerakjuk őket. Vannak rendszerek, ahol az operációs rendszer nem vesz tudom ást a szálakról.
Egy újabb fogalom, amellyel a processzus rendelkezik, a végrehajtási szál, amit Más szóval azok teljes egészében a felhasználó hatáskörében vannak. Am ikor pél­
rendszerint szálként rövidítenek. A szál rendelkezik utasításszámlálóval, amely dául egy szál blokkolásra készül, kiválasztja és elindítja az utódját, mielőtt megáll.
nyilvántartja, hogy melyik utasítás végrehajtása következik. Regiszterei vannak, Különböző felhasználói szintű szálkezelő csomagok terjedtek el, mint a POSIX
amelyek az aktuális munkaváltozóit tárolják. Rendelkezik veremmel, amely a vég­ P-szálak és a Mach C-szálak csomagja.
rehajtás eseményeit rögzíti, egy-egy kerettel minden meghívott eljáráshoz, amely­ Más rendszerekben az operációs rendszer tud arról, hogy a processzusnak több
ből nem tért még vissza a vezérlés. Bár a szálat egy processzuson belül kell vég­ szála létezik. H a egy szál blokkol, akkor az operációs rendszer választja ki a kö­
rehajtani, a szál és annak processzusa különböző fogalmak, így külön kezelhetők. vetkezőt futtatásra vagy ugyanabból a processzusból, vagy egy másikból. Ahhoz,
A processzusok az erőforrások csoportosításai, a szálak pedig azok az egyedek, hogy a kernel az ütemezést el tudja végezni, szüksége van egy száltáblázatra, amely
amelyeket CPU-n való végrehajtásra ütemeznek. a processzustáblázathoz hasonlóan a rendszerben lévő összes szálat nyilvántartja.
A szálak segítségével ugyanazon a processzuson belül több végrehajtást eszkö­ Bár lehet, hogy ez a két lehetőség egyformának látszik, teljesítményben jelen­
zölhetünk, amelyek egymástól nagymértékben függetlenek. A 2.6.(a) ábrán három tős m értékben különböznek. A szálak közötti kapcsolgatás sokkal gyorsabb, ha
hagyományos processzust látunk. M inden processzusnak saját címtartománya és a szál kezelése a felhasználói szinten történik, mint amikor ehhez rendszerhívás
egyetlen vezérlési szála van. Ezzel ellentétben a 2.6.(b) ábrán egy egyedülálló p ro­ szükséges. Ez az érv határozottan am ellett szól, hogy a szálak kezelését a felhasz­
cesszust látunk három vezérlési szállal. Bár mindkét esetben három vezérlési szá­ nálói szinten végezzük. Másrészről, amikor a szálakat teljes egészében a felhasz­
lunk van, a 2.6.(a) ábrán mindegyik különböző címtartományban dolgozik, ugyan­ nálói szinten kezeljük, és egy szál blokkol (például I/O-ra vagy egy laphiba leke­
akkor a 2.6.(b) ábrán m indhárom ugyanazon a címtartom ányon osztozik. zelésére vár), a kernel az egész processzust blokkolja, hiszen nem tud más szálak
Többszörös szálak használatára példaként tekintsünk egy webböngésző pro­ létezéséről. Ez a tény másokkal együtt határozottan am ellett érvel, hogy a szálak
cesszust. Sok weblap tartalm az több kis képet. A böngészőnek a weblap minden kezelését a kernelben kell elvégezni (Boehm, 2005). Következésképpen mindkét
képéért külön kapcsolatot kell kiépítenie a lapot tároló számítógéppel, és lekérnie rendszert használják, és különféle hibrid megoldásokat is javasolnak (Anderson
a képet. Nagyon sok idő kárba vész az összes ilyen kapcsolat felépítése és lebon­ et al., 1992).
tása miatt. A böngésző több szál egyidejű használatával több képet kérhet le egy Mindegy, hogy a szálak kezelését a kernel vagy a felhasználói szint végzi, egy sor
időben, ezzel nagymértékben növelve a teljesítményt, mivel kis képek esetén a megoldandó probléma vetődik fel, amely a programozási modellt jelentősen megvál­
kapcsolat felépítésének ideje a korlátozó tényező és nem a sávszélesség. toztatja. Kezdetnek tekintsük a fork rendszerhívás hatásait. Ha a szülőprocesszusnak
H a ugyanazon a címtartományon több szál van, a 2.4. ábra mezői közül néhány több szála van, létrehozzuk ezeket a gyermeknek is? H a nem, lehet, hogy a procesz-
nem processzusonként, hanem szálanként értendő, vagyis egy különálló száltáb­ szus nem működik megfelelően, hiszen mindegyik szál lényeges lehet.
lázatra van szükség szálankénti bejegyzésekkel. A szálankénti bejegyzések között M indamellett, ha a gyermekprocesszusnak ugyanannyi szála van, mint a szülő­
lesz az utasításszámláló, a regiszterek és az állapot. Az utasításszámláló azért szük­ nek, mi fog történni, ha egy szál blokkolódik, mondjuk egy billentyűzetről történő
séges, m ert a szálakat, hasonlóan a processzusokhoz, felfüggeszthetjük és folytat- read hívás m iatt? Most két szál van blokkolva a billentyűzet m iatt? Am ikor egy
82 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 83

sort begépelünk, akkor mindkét szál kap ebből egy másolatot? Vagy csak a szülő? 2.2. Processzusok kommunikációja
Vagy csak a gyermek? Hasonló problém ák fordulnak elő nyitott hálózati kapcso­
latoknál. A processzusoknak gyakran szükségük van az egymással való kommunikációra.
A problém ák másik része ahhoz kapcsolódik, hogy a szálak adatszerkezeteken Például egy parancsértelm ező adatcsőben, amikor az első processzus kimenő ada­
osztoznak. Mi történik, ha egy szál lezár egy fájlt, mialatt egy másik még olvas be­ tait át kell adni a második processzusnak, és sorban így tovább. így szükség van
lőle? Tegyük fel, hogy egy szál észreveszi, hogy túl kevés a memória, és elkezd m e­ a processzusok közötti kommunikációra, előnyben részesítve egy megszakítások
m óriát lefoglalni. Eközben egy szálváltás történik, és az új szál is észreveszi, hogy nélküli, jól strukturált módot. A következő fejezetekben áttekintünk néhány, a
kevés a memória, és szintén elkezdi a m em ória lefoglalását. Egyszer vagy kétszer processzusok kommunikációjával, az IPC-vel (InterProcess Communication)
történik meg a foglalás? Majdnem m inden rendszerben, amelyet nem arra tervez­ kapcsolatos témát.
tek, hogy szálakban gondolkodjon, a programkönyvtárak (mint például a m em ó­ Itt három tém a merül fel. Az első arról szól, hogyan tud egy processzus in­
riafoglaló eljárás) nem indíthatók újra és összeomlanak, ha másodszor is meghív­ formációt küldeni egy másiknak. A másodikban biztosítani kell, hogy kettő vagy
juk azokat, mialatt az első hívás még aktív. több processzus ne tudja egymás útját keresztezni, amikor kritikus tevékenységbe
Egy másik problém a a hibajelzéssel kapcsolatos. A Unixban egy rendszerhívás kezdenek (tegyük fel, hogy két processzus mindegyike megpróbálja megszerezni
után a hívás állapota egy globális változóba, az ermo-ba kerül. Mi történik, ha a az utolsó 1 MB mem óriát). A harmadik függőség esetén a megfelelő sorrendbe
szál végrehajt egy rendszerhívást, és mielőtt el tudná olvasni az ermo- 1, egy másik állítással foglalkozik: ha az A processzus adatokat állít elő, és a B processzus ki­
szál is végrehajt egy rendszerhívást, kitörölve az eredeti értéket? nyom tatja azt, akkor fí-nek várnia kell, míg az A néhány adatot elkészít, és csak
Ezután tekintsük a szignálokat. A szignálok egy része logikailag szálspecifikus, ezután kezdhet nyomtatni. M indhárom tém át meg fogjuk vizsgálni a következő
míg mások nem. Például ha egy szál az alarm-ot hívja, az lenne a logikus, hogy az szakaszban.
eredményszignál ahhoz a szálhoz jusson el, amelyik a hívást végrehajtotta. H a a Érdem es megemlíteni, hogy két tém a a szálakra is ugyanúgy vonatkozik. Az
kernel tud a szálakról, akkor általában biztosak lehetünk abban, hogy a megfele­ első - az információküldés - szálak esetében egyszerű, mivel közös cím tartom á­
lő szál kapja a szignált. H a a kernel nem tud a szálakról, akkor a szálakat kezelő nyon osztoznak (különböző címtartományban található szálak kommunikációja az
csomagnak m agának kell valahogyan nyomon követnie a riasztásokat. További egymással kommunikáló processzusok tém ához tartozik). A másik kettő azonban
nehézség felhasználói szintű szálak kezelésénél, hogy (mint a Unixban is) egy pro­ - egymást nem akadályozni és a megfelelő sorrendet kialakítani - a szálakra is vo­
cesszusnak csak egy függőben lévő riasztása lehet, és mégis több szál is hívja az natkozik. A problém ák és a megoldásaik megegyeznek. A következőkben a prob­
alarm-ot egymástól függetlenül. lém át a processzusok keretén belül tárgyaljuk, de jegyezzük meg, hogy a problé­
Más szignálok, mint a billentyűzetről kezdeményezett SIG IN T, nem szálspecifi­ mák és a megoldások a szálak esetében is ugyanazok.
kusak. Ezeket kinek kell elkapnia? Egy kijelölt szálnak? Mindegyiknek? Egy újon­
nan létrehozott szálnak? Mindegyik megoldásban vannak problémák. Ráadásul
mi történik, ha egy szál lecseréli a szignálkezelőket anélkül, hogy erről értesítené 2.2.1. Versenyhelyzetek
a többieket?
A szálak okozta utolsó problém a a veremkezelés. Sok rendszerben, amikor Vannak operációs rendszerek, ahol az együtt dolgozó processzusok közös tároló-
veremtúlcsordulás történik, a kernel egyszerűen autom atikusan megnöveli a ver­ területen osztozhatnak, amelyből mindegyik olvashat és amelybe mindegyik írhat.
met. H a a processzusnak több szála van, akkor lennie kell több vermének is. H a a A m egosztott tároló lehet a főm em óriában (valószínűleg egy kernel-adatstruktú­
kernel nem tud az összes veremről, akkor nem képes azokat autom atikusan meg­ rában), vagy lehet egy m egosztott fájl; a m egosztott tároló elhelyezkedése nem
növelni veremhiba esetén. Tény, hogy még csak fel sem ismeri, hogy a m em óriahi­ változtat a kommunikáció term észetén vagy a felmerülő problémákon. Hogy lás­
ba összefügg a verem növekedésével. suk, hogyan dolgozik a gyakorlatban a processzusok kommunikációja, tekintsünk
Ezek a problém ák bizonyára nem leküzdhetetlenek, de megmutatják, hogy szá­ egy egyszerű, de általános példát, a háttérnyomtatást. H a egy processzus ki akar
lak bevezetése egy m ár meglévő rendszerbe, annak alapvető újratervezése nélkül, nyomtatni egy fájlt, akkor beteszi a fájl nevét egy speciális háttérkatalógusba. Egy
nem vezet működőképes rendszerhez. Legalább a rendszerhívások szemantikáját másik processzus, a nyomtató démon, rendszeresen ellenőrzi, hogy van-e nyomta­
újra kell definiálni, és a könyvtárakat újra kell írni. M indezeket úgy kell végre­ tandó fájl, és ha van, akkor kinyomtatja és kitörli a nevét a katalógusból.
hajtani, hogy visszafelé kompatibilis m aradjon azokkal a meglévő programokkal, Képzeljük el, hogy a háttérkatalógusunknak nagyszámú rekesze van, amelyek
amelyek a processzusokat az egyszálas esetre korlátozzák. A szálakról további in­ sorszáma 0 ,1 , 2, ..., és mindegyik egy fájlnév tárolására alkalmas. Ezenkívül kép­
formációk állnak rendelkezésre (H auser et al., 1993; és M arsh et al., 1991). zeljük el, hogy van két megosztott változónk, out, amely a következő nyomtatandó
fájlra m utat, és in, amely a katalógus következő szabad rekeszére mutat. Ez a két
változó jól tárolható egy kétszavas fájlban, amely m inden processzus számára elér-
84 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 85

Háttér­ sára, hogy egy időben egynél több processzus olvassa és írja a megosztott adato­
katalógus kat. Más szavakkal, amire nekünk szükségünk van, az a kölcsönös kizárás - egy
módszer, amely biztosítja, hogy ha egy processzus használ valamely megosztott
változót vagy fájlt, akkor a többi processzus tartózkodjon ettől a tevékenységtől. A
abc out =4 fenti problém a azért fordult elő, m ert a B processzus azelőtt kezdte el használni a
megosztott változók egyikét, mielőtt az A processzus végzett volna vele. Bármely
prog. c
operációs rendszer egyik fő tervezési szempontja, hogy megválasszuk az alkalmas
prog. n primitív m űveleteket a kölcsönös kizárás eléréséhez; a következőkben ezt a tém át
in = 7 fogjuk részletesen megvizsgálni.
A versenyhelyzetek elkerülésének problém áját absztrakt m ódon is megfogalmaz­
hatjuk. Az idő egy részében a processzus belső számolási és egyéb olyan tevékeny­
ségekkel van elfoglalva, amelyek nem vezetnek versenyhelyzetekhez. Azonban
néha a processzus megosztott memóriához vagy fájlokhoz nyúl. A program nak azt
2.8. ábra. Két processzus ugyanabban az időben akarja elérni a megosztott memóriát a részét, amelyben a m egosztott m em óriát használja, kritikus területnek vagy k ri­
tikus szekciónak nevezzük. H a úgy tudnánk rendezni a dolgokat, hogy soha ne le­
hető. Egy bizonyos pillanatban a 0-3-as rekeszek üresek (a fájlokat m ár kinyom­ gyen azonos időben két processzus a kritikus szekciójában, akkor elkerülhetnénk
tattuk), és a 4-6-os rekeszek teli vannak (a nyom tatásra sorban álló fájlok ne­ a versenyhelyzeteket.
vével). Többé-kevésbé egy időben az A és B processzusok elhatározzák, hogy be­ Bár ez a követelmény megóv a versenyhelyzetektől, mégsem elegendő ahhoz,
sorolnak egy fájlt a nyom tatásra várók sorába. Ezt a helyzetet m utatja a 2.8. ábra. hogy korrekten együttműködő párhuzamos processzusaink legyenek, és azok ha­
M urphy törvényét (ami el tud romlani, az el is romlik) alkalmazva a követke­ tékonyan használják a m egosztott adatokat.
ző történhet. A z A processzus elolvassa az in tartalm át, és a 7-es értéket tárolja a A jó megoldáshoz négy feltételt kell betartani:
következő_szabad_rekesz lokális változóban. Éppen ekkor egy óramegszakítás tö r­ 1. Ne legyen két processzus egyszerre a saját kritikus szekciójában.
ténik, és a CPU elhatározza, hogy az A processzus m ár elég hosszú ideje fut, és 2. Semmilyen előfeltétel ne legyen a sebességekről vagy a CPU-k számáról.
átkapcsol a B processzusra. A B processzus szintén elolvassa az in- 1, szintén 7-et 3. Egyetlen, a kritikus szekcióján kívül futó processzus sem blokkolhat más p ro ­
kap, így a 7-es rekeszbe fogja a fájl nevét tárolni, és az in- 1 8-ra frissíti. Ezután to­ cesszusokat.
vábbhalad, és más dolgokat csinál. 4. Egyetlen processzusnak se kelljen örökké arra várni, hogy belépjen a kritikus
Végül az A processzus ismét futni kezd, ott folytatva, ahol legutóbb abbahagyta. szekciójába.
Megnézi a következő_szabad_rekesz-t, 7-et talál benne, és beírja a fájlnevet a 7-es
rekeszbe, törölve azt a nevet, amelyet a B processzus éppen most tett oda. Ezután A kívánt viselkedést a 2.9. ábra m utatja be. Itt az A processzus a T l időpilla­
kiszámolja a kö v etkező jza b a d jekesz + 1 értéket, amely 8, és in- 1 8-ra állítja. natban lép be a kritikus területre. Egy kicsivel később, a T2 időpillanatban a B
A háttérkatalógus most belsőleg konzisztens, tehát a nyom tatóprogram nem ész­ processzus is megpróbál a kritikus területre lépni, de ez sikertelen lesz, m ert egy
lel hibát, de a B processzus sohasem kap kimenetet. A B felhasználó évekig vára­ másik processzus m ár belépett, és mi egyszerre csak egyet engedélyezünk. Ennek
kozhat a nyomtatószobában, reménykedve várva a kim enetet, amely sohasem fog eredm ényeként a B processzus futása ideiglenesen felfüggesztődik a T3 időpilla­
elkészülni. Az ehhez hasonló eseteket, ahol kettő vagy több processzus olvas vagy natig, amikor A elhagyja a kritikus területét, lehetővé téve ezzel, hogy B azonnal
ír megosztott adatokat, és a végeredmény attól függ, hogy ki és pontosan mikor beléphessen. Egyszer csak (a T4 időpillanatban) B is kilép a kritikus szekciójából,
fut, versenyhelyzeteknek nevezzük. Egyáltalán nem szórakoztató nyomon követni és így visszakerülünk a kiindulási helyzetbe, amikor nem volt processzus a kritikus
versenyhelyzeteket tartalm azó program okat. A legtöbb teszt eredménye jó, de na­ szekciójában.
gyon ritkán előfordulnak furcsa és megmagyarázhatatlan dolgok.

2.2.3. Kölcsönös kizárás tevékeny várakozással


2.2.2. Kritikus szekciók
Ebben az alfejezetben különféle lehetőségeket fogunk megvizsgálni a kölcsönös
Hogyan kerüljük el a versenyhelyzeteket? A baj megelőzésének kulcsa - itt is és kizárás megvalósítására, azaz mialatt egy processzus azzal van elfoglalva, hogy
sok más esetben is, ahol megosztott memória, megosztott fájlok és bármi más a saját kritikus szekciójában a megosztott m em óriát aktualizálja, ne legyen más
megosztott dolog szerepel - az, hogy találjunk valamilyen m ódot annak megtiltá- olyan processzus, amely belép saját kritikus szekciójába és bajt okoz.
86 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 87

Zárolásváltozók

Második lehetőségként keressünk egy szoftvermegoldást. Tekintsünk egy egysze­


rű, megosztott (zárolás-) változót, kezdetben 0 értékkel. M ielőtt egy processzus
belépne a saját kritikus szekciójába, először ezt vizsgálja meg. H a értéke 0, akkor
a processzus 1-re állítja azt, és belép a kritikus szekcióba. H a m ár 1, akkor a pro­
cesszus addig vár, míg 0 lesz. így a 0 azt jelenti, hogy egyetlen processzus sincs a
saját kritikus szekciójában, és az 1 azt, hogy valamely processzus a saját kritikus
szekciójában van.
Sajnos, ez az elgondolás pontosan ugyanazt a végzetes hibát rejti magában,
mint amelyet m ár a háttérkatalógus esetében láttunk. Tegyük fel, hogy az egyik
processzus elolvassa a zárolásváltozót, és látja, hogy értéke 0. M ielőtt be tudná ál­
lítani 1-re, egy másik processzus kerül ütemezésre, fut, és beállítja a változót 1-re.
Amikor az első processzus ismét futni fog, megint beállítja 1-re a változót, és m ár­
Idő --------► is két processzus lesz egy időben a saját kritikus szekciójában.
Azt gondolhatnánk, hogy megkerülhetjük ezt a problém át azzal, hogy először
2.9. ábra. Kölcsönös kizárás kezelése kritikus szekciókkal kiolvassuk a zárolásváltozó értékét, majd ismét ellenőrizzük azt pontosan azelőtt,
hogy írnánk bele, de ez valójában nem segít. A verseny akkor fog bekövetkezni, ha
Megszakítások tiltása a második processzus éppen azután módosítja a változót, amikor az első procesz-
szus a második ellenőrzését befejezte.
A legegyszerűbb megoldás az, hogy m inden processzus letiltja az összes megsza­
kítást, mihelyt belép saját kritikus szekciójába, és újraengedélyezi, éppen mielőtt
elhagyja azt. Azzal, hogy a megszakítások tiltva vannak, nem fordulhat elő óra­ Szigorú váltogatás
megszakítás sem. Mivel a CPU csak órajelre vagy más megszakításra vált egyik
processzusról a másikra, végül is a megszakítások kikapcsolásával a CPU nem fog A kölcsönös kizárás problém ájának harmadik megközelítését a 2.10. ábra m utat­
másik processzusra váltani. így ha egyszer egy processzus letiltotta a megszakítá­ ja. Ez a program töredék, mint m ajdnem mindegyik ebben a könyvben, C-ben író­
sokat, megvizsgálhatja és módosíthatja a megosztott m em óriát anélkül, hogy b ár­ dott. A C nyelvet azért választottuk, m ert a valódi operációs rendszerek is általá­
melyik más processzus beavatkozásától tartania kellene. ban C-ben íródnak (esetleg C + + -b a n ), de szinte sohasem Javában vagy hasonló
Ez a megközelítés azonban nem igazán vonzó, m ert oktalanság a felhasználói nyelven. A C nyelv erőteljes, hatékony és kiszámítható. Olyan jellemzők ezek,
processzusok kezébe adni a megszakítások kikapcsolásának lehetőségét. Tegyük amelyek kritikusak operációs rendszerek írásához. A Java például nem kiszámít­
fel, hogy egyikük megteszi ezt, és soha nem kapcsolja vissza. Ez a rendszer végét ható, m ert ha egy kritikus pillanatban fogy el a tárhely, akkor a szemétgyűjtőt a
jelentheti. Továbbá egy többprocesszoros rendszerben, ahol kettő vagy több CPU legkevésbé alkalmas pillanatban indítja cl. A C nyelv esetében ez nem fordulhat
van, a megszakítások tiltása csak arra a CPU-ra vonatkozik, amelyik a tiltó utasí­ elő, m ert nincs szemétgyűjtő mechanizmusa. A C, C + + , Java és négy másik nyelv
tást végrehajtotta. A többiek folytatják a futtatást, és hozzáférhetnek a megosztott kvantitatív összehasonlítását m egtalálhatjuk Prechelt (Prechelt, 2000) cikkében.
memóriához.
Másrészt m agának a kernelnek is gyakran hasznos a megszakítások tiltása né­ while (TRUE) { while(TRUE){
hány utasítás erejéig, amíg változókat vagy listákat aktualizál. H a például megsza­ while (turn != 0) /* ciklus*/;while (turn != 1) /*ciklus*/;
kítás következne be, mialatt a futáskész állapotú processzusok listája inkonzisz­ critical_region(); critical_region();
turn = 1; turn = 0;
tens állapotban van, akkor versenyhelyzet fordulhatna elő. Ebből az következik,
noncritical_region(); noncritical_region();
hogy a megszakítások tiltása gyakran hasznos technika magán az operációs rend­
} }
szeren belül, de nem megfelelő a felhasználói processzusok számára mint általá­ (a) (b)
nos kölcsönös kizárási mechanizmus.
2.10. ábra. Egyjavasolt megoldás a kritikus szekció problémára, (a) 0. processzus.
(b) 7. processzus. Mindkét esetben figyeljünk arra, hogy a while utasítást
pontosvessző (;) zárja le
88 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 89

A 2.10. ábrán a 0 kezdőértékű tűm egész változó követi nyomon, hogy ki lesz #define FALSE 0
a következő, aki a kritikus szekcióba lép, és vizsgálja vagy aktualizálja a megosz­ #defineTRUE 1
tott memóriát. Kezdetben a 0. processzus nézi meg a tűm értékét, 0-nak találja, és #define N 2 /* a processzusok száma */
belép a kritikus szekciójába. Az 1. processzus szintén 0-nak találja, és ezért belép
int turn; /* ki következik? */
egy rövid ciklusba, folyamatosan tesztelve a tűm értékét, hogy lássa, mikor lesz 1 .
int interested[N]; /* kezdetben minden érték 0 (FALSE) */
Azt, amikor folyamatosan tesztelünk egy változót egy bizonyos érték megjelené­
séig, tevékeny várakozásnak nevezzük. Általában tartózkodni kellene ettől, m ert void enter_region(int process); /* process vagy 0, vagy 1 *1
pazarolja a CPU-időt. Csak akkor használjuk a tevékeny várakozást, ha ésszerűen {
elvárható, hogy a várakozás rövid lesz. A tevékeny várakozást használó zároláso­ intother; /* a másik processzus sorszáma */
kat aktív várakozásnak hívjuk.
Amikor a 0. processzus elhagyja a kritikus szekciót, beállítja a tűm - 1 1-re, hogy other = 1 - process; /* a process ellenkezője */
megengedje az 1. processzus kritikus szekciójába lépését. Tegyük fel, hogy az 1. interested[process] = TRUE; /* mutatja, hogy érdekeltek vagyunk */
processzus gyorsan befejezi a kritikus szekcióját, így mindkét processzus a saját turn = process; /* áll a zászló */
nemkritikus területén van, a tűm értéke pedig 0. Most a 0. processzus gyorsan vég­ while (turn == process && interested[other] == TRUE) /* üres utasítás */;
rehajtja a teljes ciklusát, elhagyja a kritikus szekcióját, beállítva a tum -t 1-re. Ezen }
a ponton tűm értéke 1, és m indkét processzus a nemkritikus területen fut.
void leave_region(int process) /* process: ki hagyja el */
A 0. processzus hirtelen befejezi a nemkritikus szekcióját, és visszatér a ciklu­
{
sának az elejére. Sajnos, nincs megengedve neki, hogy most belépjen a kritikus
interested[process] = FALSE; /* mutatja a kritikus szekció elhagyását */
szekciójába, m ert a tűm értéke 1, és az 1. processzus a nemkritikus szekciójával van }
elfoglalva. Addig marad a while ciklusában, amíg az 1. processzus nem állítja tűm
értékét 0-ra. A váltogatás tehát nem túl jó ötlet, amikor az egyik processzus sokkal 2.11. ábra. Peterson megoldása a kölcsönös kizárás megvalósítására
lassabb, mint a másik.
Ez a helyzet megsérti az előbb felállított 3. feltételt: a 0. processzust blokkolta biztosítanunk. Helytakarékosságból azonban mi nem fogjuk megm utatni a proto­
egy olyan processzus, amely nem a kritikus szekciójában van. Visszatérve a nem ­ típusokat ebben és a további példákban sem.
rég tárgyalt háttérkatalógusra, ha most a háttérkatalógus olvasását és írását te­ M ielőtt a megosztott változókat használná (vagyis m ielőtt a kritikus szekcióba
kintjük kritikus szekciónak, akkor a 0. processzus nem nyom tathatna másik fájlt, lépne), m inden processzus meghívja az enterjegion- 1, param éterként átadva a sa­
m ert az 1 . valami mást csinál. ját processzus sorszámát, 0-t vagy 1-et. Ez a hívás azt eredményezi, hogy ha szük­
Valójában ez a megoldás megköveteli, hogy két a processzus egymást szigorúan séges, akkor a biztonságos belépésig várakozni fog. M iután végzett a megosztott
váltogatva lépjen be saját kritikus szekciójába, például fájlokat tegyenek be a hát­ változókkal, a processzus meghívja a leave_region-1, jelezve, hogy végzett, és meg­
térkatalógusba. Egyiknek sincs megengedve, hogy egymás után kettőt adjon át. engedi a másik processzusnak, hogy belépjen, ha akar.
Bár ez az algoritmus elkerül minden versenyt, mégsem számít komoly jelöltnek a Nézzük, hogyan működik ez a megoldás. Kezdetben egyik processzus sincs a
problém a megoldására, m ert a 3. feltételt megsérti. kritikus szekciójában. Most a 0. processzus meghívja az enter_region-1, amely jelzi
az érdekeltségét a töm belem ének beállításával, majd a tűm változót 0-ra állítja.
H a az 1. processzus nem érdekelt, az enter_region azonnal visszatér. H a az 1. p ro­
Peterson megoldása cesszus most meghívja az enter_region-1, addig vár, míg az interested[0] FALSE-ra
vált, ami csak akkor következik be, ha a 0 . processzus meghívja a leave_region-1,
Kombinálva az egymás váltogatásának ötletét a zárolásváltozók és a figyelmezte­ hogy kilépjen a kritikus szekcióból.
tő változók ötletével, T. D ekker holland matem atikus volt az első, aki kitalált egy Most tekintsük azt az esetet, amikor mindkét processzus majdnem egyszerre
olyan szoftvermegoldást a kölcsönös kizárás problém ájára, amely nem igényel szi­ meghívja az enter_region-t. M indkettő beírja a saját processzussorszámát a tű m ­
gorú váltogatást. D ekker algoritmusát részletesen lásd (Dijkstra, 1965). be. Csak az utolsó beírás fog számítani; az első elvész. Tegyük fel, hogy az 1. p ro­
1981-ben G. L. Peterson talált egy egyszerűbb m ódot a kölcsönös kizárás meg­ cesszus ír be utoljára, vagyis a tűm értéke 1. Amikor m indkét processzus a while
valósítására, amely elavulttá tette D ekker megoldását. Peterson algoritmusát a utasításhoz ér, a 0. processzus a várakozó ciklust nullaszor hajtja végre, és belép
2.11. ábra mutatja. Ez az algoritmus két ANSI C-ben írt eljárásból áll, ami azt je ­ a kritikus szekciójába. Az 1. processzus ismételget, és nem lép be a kritikus szek­
lenti, hogy m inden definiált és használt függvényhez függvényprototípusokat kell ciójába.
90 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 91

A TSL utasítás 2.2.4. Alvás és ébredés


Most lássunk egy olyan javaslatot, amelyik egy kis hardversegítséget igényel. Sok szá­ Mind Peterson megoldása, mind az a megoldás, amelyben a TSL utasítást hasz­
mítógépnek, különösen azoknak, amelyeket többprocesszorosnak terveztek, van egy náljuk, korrekt, de m indkettőnek megvan az a hibája, hogy tevékeny várakozást
követel meg. Ezek a megoldások lényegében a következőképpen működnek: ami­
TSL RX,LOCK kor egy processzus be akar lépni a kritikus szekciójába, ellenőrzi, hogy a belépés
engedélyezett-e. H a nem, akkor a processzus azonnal egy kis ciklusban m arad az
utasítása (Test and Set Lock), amely a következőképpen dolgozik: beolvassa a engedélyre várva.
LO C K memóriaszó tartalm át az RX regiszterbe, és ezután egy nem nulla értéket ír Ez a megközelítés nemcsak a CPU-időt pazarolja, de még váratlan hatásai is
erre a memóriacímre. A szó kiolvasása és a tárolási művelet garantáltan nem vá­ lehetnek. Tekintsünk egy számítógépet két processzussal, a H legyen magas, az L
lasztható szét - az utasítás befejezéséig más processzor nem érheti el a m em ória­ pedig alacsony prioritású, amelyek egy kritikus szekción osztoznak. Az ütemezési
szót. A TSL utasítást végrehajtva a CPU zárolja a memóriasínt, a művelet befejezé­ szabályok olyanok, hogy valahányszor H futáskész állapotban van, futni fog. Egy
séig megtiltva más CPU-knak a m emória elérését. bizonyos pillanatban, amikor L a kritikus szekciójában van, H futáskész állapotba
A TSL utasítás alkalmazásához egy LO C K megosztott változót fogunk használni, kerül (például egy I/O-művelet befejeződik). H most tevékeny várakozásba kezd,
hogy összehangoljuk a megosztott memória elérését. Amikor a L O C K 0, bárm e­ de mivel L -re soha nem kerül sor, amikor H fut, így L soha nem kap esélyt, hogy
lyik processzus beállíthatja 1-re a TSL utasítás használatával, és ezután olvashatja elhagyja a kritikus szekcióját, ezért H a végtelenségig ismétel. E rre az esetre néha
vagy írhatja a megosztott memóriát. Amikor ezt megtette, a processzus visszaállít­ úgy szoktak hivatkozni, mint fordított prioritás probléma.
ja a L O C K értékét 0-ra egy egyszerű MOVE utasítással. Most lássunk néhány olyan processzusok közötti kommunikációs primitívet,
Hogyan használhatjuk ezt az utasítást annak megakadályozására, hogy két procesz- amelyek a CPU-idő pazarlása helyett blokkolnak, amikor nem megengedett, hogy
szus egyidejűleg lépjen be saját kritikus szekciójába? A megoldást a 2.12. ábra m utat­ a kritikus szekciójukba lépjenek. Az egyik legegyszerűbb a sleep és wakeup pár. A
ja, ahol látunk egy négyutasításos szubrutint egy fiktív (de tipikus) assembly nyelven. sleep egy rendszerhívás, amely a hívót blokkolja, vagyis fel lesz függesztve m indad­
Az első utasítás átmásolja a L O C K régi értékét a regiszterbe, majd a LOCK-ot 1-re dig, amíg egy másik processzus fel nem ébreszti. A wakeup hívásnak egy param é­
állítja. Ezután a régi értéket összehasonlítja 0-val. H a nem 0, a zárolás már megtör­ tere van, az a processzus, amelyet fel kell ébreszteni. Másik alternatíva az, hogy
tént, így a program visszatér az elejére, és ismét tesztelni fogja. Előbb vagy utóbb 0 mind a sleep, mind a wakeup egy param éterrel, egy memóriacímmel rendelkezik,
lesz (amikor a jelenleg a kritikus szekciójában lévő processzus végez kritikus szekció­ amit a sleep-ek és a wakeup-ok összepárosítására használunk.
jával), és a szubrutin visszatér a zárolás beállításával. A zárolás feloldása egyszerű. A
program csupán 0-t tárol a LOCK-ba. Nincs szükségünk speciális utasításra.
A kritikus szekció problém a egy megoldása most m ár egyszerű. M ielőtt a pro­ A gyártó-fogyasztó probléma
cesszus belép a kritikus szekciójába, meghívja az enterjegion-t, amely tevékenyen
várakozik a zárolás feloldásáig; ezután zárol és visszatér. A kritikus szekció után A primitívek használatára példaként tekintsük a gyártó-fogyasztó problémát (kor­
a processzus meghívja a leave_region-1, amely 0-t tárol a LOCK-ba. Minden, a kri­ látos tároló problém ának is nevezik). Két processzus osztozik egy közös, rögzített
tikus szekciókon alapuló megoldásnál a processzusoknak a megfelelő időben kell m éretű tárolón. Az egyikük, a gyártó, adatokat helyez el benne, a másikuk, a fo­
hívniuk az enterjegion-X és a leave_region-1, hogy a módszer működjön. H a egy gyasztó, kiveszi azokat. (Általánosíthatjuk a problém át m gyártóra és n fogyasztó­
processzus csal, a kölcsönös kizárás meghiúsul. ra is, de mi csak az egy gyártó és egy fogyasztó esetet tekintjük, m ert ez a feltétele­
zés egyszerűsíti a megoldásokat.)
enter_region: A nehézség akkor jelentkezik, amikor a gyártó új elem et kíván a tárolóba tenni,
TSL REGISTER,LOCK | átmásolja a LOCK-ot a regiszterbe, és LOCK legyen 1 de az m ár tele van. A megoldás a gyártó számára az, hogy elalszik, és felébresztik,
CMP REGISTER,#0 | a LOCK nulla volt? amikor a fogyasztó egy vagy több elem et kivett. Hasonlóképpen, ha a fogyasztó
JNE ENTER_REGION | ha nem volt nulla, akkor be volt állítva, így ciklus szeretne egy elem et kivenni a tárolóból és látja, hogy a tároló üres, akkor elalszik,
RÉT | vissza a hívóhoz; beléptünk a kritikus szekcióba
amíg a gyártó tesz valamit a tárolóba és felébreszti őt.
Ez a megközelítés elég egyszerűnek tűnik, bár ugyanolyan típusú versenyhelyze­
leave_region:
MOVE LOCMO | LOCK legyen 0
tekhez vezet, mint amilyet korábban láttunk a háttérkatalógusnál. Hogy nyomon
RÉT | visszatérés a hívóhoz követhessük az elemek számát a tárolóban, szükségünk lesz egy count változóra.
H a a tárolóban az elemek maximális száma N , akkor a gyártó programja először
2.12. ábra. A zárolás beállítása és törlése a TSL utasítással
92 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 93

#define N 100 /* a rekeszek száma a tárolóban */ és elindítja a gyártót. A gyártó betesz egy elem et a tárolóba, növeli a count értékét,
int count = 0; /* az elemek száma a tárolóban */ és megállapítja, hogy az most 1. Ebből arra következtet, hogy a count éppen 0 volt,
és így a fogyasztó bizonyára alszik. Tehát a gyártó hívja a wakeup-ot, hogy feléb­
void producer(void)
ressze a fogyasztót.
{ Sajnos, a fogyasztó logikailag még nem alszik, így az ébresztő jelzés elvész. Ami­
int item;
kor a fogyasztó ismét fut, megvizsgálja a count azon értékét, amelyet előzőleg be­
while (TRUE) { /* vegtelen ciklus */ olvasott, 0-nak találja, és elalszik. Előbb-utóbb a gyártó megtölti a tárolót, és szin­
item = produce_item(); I* a következő elem létrehozása */ tén elalszik. M indkettő örökké aludni fog.
if (count = = N) sleepO; /* ha a tároló tele van, megyünk aludni */ A problém a lényege az, hogy egy ébresztőjel, amelyet egy (még) nem alvó
insertjtem(item); /* betesszük az elemet a tárolóba */ processzusnak küldtek, elveszett. H a nem veszett volna el, akkor minden m ű­
count = count + 1; /* növeljük az elemek számát a tárolóban */ ködne. Egy gyors javítás az, hogy módosítjuk a szabályokat egy ébresztőt váró bit
if (count = = 1) wakeup(consumer); /* üres volt a tároló? */ hozzáadásával. H a olyan processzusnak küldünk ébresztőt, amely még ébren van,
} akkor ez a bit beállítódik. Később, amikor a processzus megpróbál elaludni, de az
} ébresztőt váró bit be van kapcsolva, akkor kikapcsolja ezt a bitet, és ébren marad.
Az ébresztőt váró bit egy másodlagos eszköz az ébresztő jel számára.
void consumer(void)
Míg az ébresztőt váró bit ebben az egyszerű példában megmenti a helyzetet,
{
int item;
könnyű olyan példát konstruálni három vagy több processzussal, ahol egy ébresz­
tőt váró bit nem elegendő. Készíthetünk újabb javítást is, és hozzávehetünk kettő
while (TRUE) { /* végtelen ciklus */ vagy akár 8, vagy 32 ébresztőt váró bitet is, a problém a lényege megmarad.
if (count = = 0) sleepO; /* ha a tároló üres, megyünk aludni */
item = removeJtemO; /* kiveszünk egy elemet a tárolóból */
count = count - 1; /* csökken az elemek száma a tárolóban */ 2.2.5. Szemaforok
if (count = = N - 1) wakeup(producer); /* tele volt a tároló? */
consumejtem(item); /* kinyomtatjuk az elemet */ Ez volt a helyzet egészen addig, amíg 1965-ben E. W. Dijkstra (Dijkstra, 1965) azt
} nem javasolta, hogy egy egész változóban számoljuk az ébresztéseket későbbi fel-
} használás céljából. Javaslatában egy új változótípust vezetett be, amelyet szemafor­
2.13. ábra. A gyártó-fogyasztó probléma egy végzetes versenyhelyzettel nak hívunk. A szemafor értéke lehet 0, jelezve, hogy nincs elm entett ébresztés, vagy
valamilyen pozitív érték, ha egy vagy több ébresztés függőben van.
azt fogja vizsgálni, hogy a count értéke egyenlő-e N-nel. H a igen, akkor a gyártó Dijkstra azt javasolta, hogy két művelet legyen, a down és az up (rendre a sleep
elalszik, ha nem, akkor hozzátesz egy elemet, és növeli a count értékét. és a wakeup általánosításai). A down művelet megvizsgálja, hogy a szemafor értéke
A fogyasztó program ja hasonló, először vizsgálja a count értékét, hogy egyen­ nagyobb-e, mint 0. H a igen, csökkenti az értéket (vagyis felhasznál egy tárolt éb­
lő-e nullával. H a igen, akkor elalszik, ha nem nulla, akkor kivesz egy elemet, és resztést), és azonnal folytatja. H a az érték 0, akkor a processzust elaltatja, mielőtt
csökkenti a számlálót. Mindegyik processzus teszteli azt is, hogy a másiknak alud­ a down befejeződne. Az érték ellenőrzése, cseréje és a lehetséges elalvás együtt
nia kell-e, és ha nem, akkor felébreszti. A 2.13. ábrán látható mind a gyártó, mind egyetlen oszthatatlan elemi műveletként hajtódik végre. Ez garantálja, hogy ha
a fogyasztó kódja. egy szemafor művelet elkezdődik, más processzus nem tudja elérni a szemafort
Ahhoz, hogy a rendszerhívásokat, mint a sleep és a wakeup, kifejezhessük C-ben, mindaddig, amíg a művelet be nem fejeződik vagy nem blokkolódik. Az elemi m ű­
könyvtári rutinok hívásaként fogjuk bem utatni. Ezek nem részei a standard C velet bevezetése nagyon lényeges a szinkronizációs problém ák megoldásához és a
könyvtárnak, de feltételezhetően elérhetők mindazokban a rendszerekben, am e­ versenyhelyzetek elkerüléséhez.
lyekben megvannak ezek a rendszerhívások. Az enterJtem és rem ovejtem eljá­ Az up művelet a m egadott szemafor értékét növeli. H a egy vagy több processzus
rások, amelyeket most nem m utatunk be, végzik az elemek tárolóba helyezését, aludna ezen a szemaforon, mivel képtelen volt befejezni egy korábbi down műve­
illetve tárolóból való kivételét. letet, akkor közülük az egyiket kiválasztja a rendszer (például véletlenszerűen),
Térjünk most vissza a versenyhelyzethez. Ez előfordulhat, hiszen a count eléré­ és megengedi neki, hogy befejezze a down műveletét. így olyan szemaforon vég­
se nem korlátozott. A következő helyzet fordulhat elő: A tároló üres és a fogyasz­ rehajtva az up műveletet, amelyen processzusok aludtak, a szemafor még mindig
tó éppen most olvasta ki a count értékét, hogy megnézze, nulla-e. Ebben a pilla­ 0 lesz, de eggyel kevesebb processzus fog rajta aludni. A szemafor növelésének és
natban az ütem ező elhatározza, hogy ideiglenesen megállítja a fogyasztó futását egy processzus felébresztésének művelete szintén nem választható szét. Egy up
94 2^PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 95

m űveletet végrehajtó processzus nem blokkolható, m int ahogy az előző modell­ #define N 100 /* a rekeszek száma a tárolóban */
ben a wakeup végrehajtása sem volt az. typedef int semaphore; /* a szemafor az int speciális fajtája */
Mellesleg Dijkstra az eredeti cikkében a p és v neveket használta rendre a down semaphore mutex = 1; /* felügyeli a kritikus szekció elérését */
semaphore empty = N; /* a tároló üres rekeszeinek a száma */
és up helyett, de mivel ezek nehezen jegyezhetők meg azok számára, akik nem be­
semaphore full = 0; /* a tároló tele rekeszeinek a száma */
szélik a holland nyelvet (és azok számára is csak részben, akik beszélik), mi ehelyett
a down és up kifejezéseket használjuk. Ezeket először az Algol 68-ban vezették be. void producer(void)
{
int item;
A gyártó-fogyasztó probléma megoldása szemaforok segítségével
while (TRUE) { /* a TRUE az 1 konstans */
A 2.14. ábrán bem utatjuk, hogy a szemaforok megoldják az elveszett ébresztés item = produce_item(); /* létrehoz valamit, amit a tárolóba lehet tenni */
problémáját. Fontos, hogy ezek oszthatatlan m ódon legyenek megvalósítva. Ké­ down(&empty); /* üres rekeszek száma csökken */
zenfekvő, hogy az up és a down rendszerhívásként kerül megvalósításra, amelyben down(&mutex); /* belépés a kritikus szekcióba */
az operációs rendszer egyszerűen tilt minden megszakítást, mialatt vizsgálja és ak­ insertjtem(item); /* betesszük az új elemet a tárolóba */
up(&mutex); /* elhagyjuk a kritikus szekciót */
tualizálja a szemafort, valamint elaltatja a processzust, ha kell. Mivel mindezen te­
up(&full); /* tele rekeszek száma növekszik */
vékenységek csak néhány utasításból állnak, nem okoz bajt a megszakítások tiltása.
}
H a több CPU -t használunk, m inden szemafort védeni kell egy zárolásváltozóval, a
}
TSL utasítást használva annak biztosítására, hogy egy időben csak egy CPU vizsgál­
ja a szemafort. Biztosan érthető a különbség aközött, hogy TSL utasítást használva void consumer(void)
megvédjük a szemafort attól, hogy egy időben több CPU érje el, és aközött, hogy {
a gyártó vagy fogyasztó tevékeny várakozással a másikra vár, hogy az kiürítse vagy int item;
feltöltse a tárolót. A szemafor művelet mindössze néhány mikromásodpercig tart,
míg a gyártónál vagy fogyasztónál tetszőlegesen sokáig tarthat. while (TRUE) { /* végtelen ciklus */
Ez a megoldás három szemafort használ: a teli rekeszek számolására szolgál a down(&full); /* tele rekeszek száma csökken */
full, az üres rekeszek számolására szolgál az empty, a mutex pedig azt biztosítja, down(&mutex); /* belépés a kritikus szekcióba */
item = removeJtemO; /* kiveszünk egy elemet a tárolóból */
hogy a gyártó és fogyasztó ne érje el a tárolót egy időben. Kezdetben a full 0, az
up(&mutex); /* elhagyjuk a kritikus szekciót */
empty a tárolóban lévő rekeszek számát tartalmazza, a mutex pedig 1. Az olyan
up(&empty); /* üres rekeszek száma növekszik */
szemaforokat, amelyeknek kezdőértéke 1 , és arra szolgálnak, hogy biztosítsák,
consumejtem(item); /* csinálunk valamit az elemmel */
hogy kettő vagy több processzus közül egy időben csak egyikük léphessen be a kri­
}
tikus szekciójába, bináris szemaforoknak nevezzük. H a minden processzus ponto­
san azelőtt hajt végre egy down-t, mielőtt belép a kritikus szekciójába, és pontosan
azután egy up-ot, miután kilép onnan, a kölcsönös kizárás biztosítva van. 2.14, ábra. A gyártó-fogyasztó probléma szemaforok felhasználásával
Most, hogy rendelkezésünkre áll egy jó processzusok közötti kommunikációs
primitív, térjünk ismét vissza a 2.5. ábrához, és vessünk egy pillantást a megszakí- A 2.14. ábra példájában a szemaforokat valójában kétféle módon használjuk.
tási tevékenységsorra. Egy szemaforokat használó rendszerben a megszakítások A különbség elég fontos ahhoz, hogy jobban megvilágítsuk. A mutex szemafort a
elrejtésének term észetes módja, hogy egy 0 kezdőértékű szemafort rendelünk kölcsönös kizárásra használjuk. Ez biztosítja, hogy egy időben csak egy processzus
m inden I/O-eszközhöz. Közvetlenül az I/O-eszköz indulása után a kezelő procesz- olvassa vagy írja a tárolót és a hozzá kapcsolódó változókat. Ez a kölcsönös kizárás
szus végrehajt egy down-t a hozzárendelt szemaforon, így azonnal blokkolva m a­ szükséges, hogy megelőzzük a káoszt. A kölcsönös kizárást és megvalósításának
gát. Am ikor a megszakítás megérkezik, a megszakításkezelő végrehajt egy up-ot m ódját a következő alfejezetben tárgyaljuk bővebben.
a hozzárendelt szemaforon, amely a megfelelő processzust újra futáskésszé teszi. A szemaforok másik felhasználási területe a szinkronizáció. A full és az empty
Ebben a m odellben a 2.5. ábra 6. lépése tartalm az egy up-ot, amelyet az eszköz szemaforok azért kellenek, hogy biztosítsák, hogy bizonyos eseménysorozatok
szemaforán hajtunk végre, és így a 7. lépésben az ütem ező képes futtatni az esz­ bekövetkezzenek és bizonyosak ne. A mi esetünkben biztosítják, hogy a gyártó
közkezelőt. Természetesen, ha több processzus van futáskész állapotban, akkor az megállítsa a futását, ha a tároló tele van és a fogyasztó megállítsa a futását, ha a
ütem ező kiválaszthatja futásra a legfontosabb processzust. A fejezet későbbi ré­ tároló üres. Ez a használat különbözik a kölcsönös kizárástól.
szében azt is megnézzük, hogyan dolgozik az ütemező.
96 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 97

monitor example
2.2.6. Mutexek
integer /';
Amikor a szemafor számlálási képességére nincs szükség, akkor a szemafor egy condition c;
egyszerűsített változata, a mutex kerülhet felhasználásra. A mutexek csak bizo­
procedure producer(x)-,
nyos erőforrások vagy kódrészek kölcsönös kizárásának kezelésére alkalmasak.
Megvalósításuk könnyű és hatékony, ami m iatt különösen hasznosak a teljes m ér­
tékben felhasználói szinten megvalósított szál (thread) csomagok számára.
A mutex egy olyan változó, amely kétféle állapotban lehet: nem zárolt vagy end;
zárolt. Ennek következtében egyetlen bit is elegendő a reprezentálásához, de a
gyakorlatban gyakran egy egész értéket használnak, ahol 0 jelenti a nem zárolt, és procedure consumer(x);
bármilyen más érték a zárolt állapotot. Két eljárás használatos a mutexek eseté­
ben. Am ikor egy processzus (vagy szál) hozzá szeretne férni a kritikus szekcióhoz,
meghívja a m utexJock eljárást. H a a mutex pillanatnyilag nem zárolt (ami azt je ­
end;
lenti, hogy a kritikus szekció elérhető), akkor a hívás sikeres, és a hívó szál szaba­
end monitor;
don beléphet a kritikus szekcióba.
Másrészről, ha a mutex m ár zárolt állapotban van, akkor a hívó blokkolódik,
amíg a kritikus szekcióban lévő processzus nem végez, és meg nem hívja a mutex_ 2.15. ábra. Egy monitor
unlock eljárást. Ekkor ha több processzus is blokkolódik a mutexen, közülük az
egyik véletlenszerűen kiválasztott szerezheti meg a zárolást. Ez a szabály, amely általánosan használt a m odern objektum orientált nyelvekben,
amilyen a Java is, meglehetősen szokatlan volt a maga idejében, annak ellenére,
hogy az objektum okat a Simula 67-ig vezethetjük vissza. A 2.15. ábra egy m onitort
2.2.7. Monitorok m utat be, amelyet egy elképzelt nyelven, a Pidgin Pascal nyelven írtak.
A m onitoroknak van egy kulcsfontosságú tulajdonsága, ez teszi használhatóvá
A szemaforokkal a processzusok kommunikációja könnyűnek tűnik, igaz? Felejt­ a kölcsönös kizárás megvalósítására: m inden időpillanatban csak egy processzus
sük el. Lássuk közelebbről a 2.14. ábrán a down-ok sorrendjét, mielőtt beteszünk lehet aktív egy monitorban. A m onitorok programozási nyelvi konstrukciók, ezért
vagy kiveszünk egy elem et a tárolóból. Tegyük fel, hogy a két down-t a gyártó a fordítóprogram tudja, hogy ezek speciálisak, és képes a monitoreljárás-híváso-
kódjában felcseréltük, vagyis a mutex csökkentése az empty előtt történik, és nem kat másképpen kezelni, mint az egyéb eljáráshívásokat. Jellemzően, amikor egy
utána. H a a tároló teljesen tele lenne, akkor a gyártó blokkolna, a mutex 0 lenne. processzus meghív egy monitoreljárást, akkor az eljárás első néhány utasítása el­
Következésképpen a fogyasztó ezután m egpróbálná elérni a tárolót, végrehajta­ lenőrizni fogja, hogy más processzus jelenleg aktív-e a m onitoron belül. H a igen,
na egy down-t a mutex-en, ami most 0, és szintén blokkolna. M indkét processzus akkor a hívó processzus felfüggesztésre kerül, amíg a másik processzus el nem
a végtelenségig blokkolt állapotban m aradna, és soha sem folyna m ár semmilyen hagyja a m onitort. H a nem használja másik processzus a m onitort, akkor a hívó
munka. Ezt a sajnálatos esetet holtpontnak hívják. A holtpontokkal a 3. fejezet­ processzus beléphet.
ben részletesen foglalkozunk. A fordítóprogramtól függ, hogy hogyan valósítja meg a kölcsönös kizárást a moni­
Ez a problém a rám utatott arra, hogy óvatosnak kell lennünk, ha szemaforokat tor belépési pontjainál, de egy általános módszer a mutexek vagy bináris szemafo­
használunk. Egy szövevényes hiba, és m inden egy nyomasztó megálláshoz vezet. rok használata. Mivel a fordítóprogram, és nem a programozó intézi el a kölcsönös
Ez hasonló az assembly nyelvű programozáshoz, csak rosszabb, m ert a hibák ver­ kizárást, kisebb a valószínűsége, hogy valami elromlik. A m onitort író személynek
senyhelyzetek, holtpontok és más megjósolhatatlan és reprodukálhatatlan viselke­ sosem kell tudnia, hogy hogyan intézi el a fordítóprogram a kölcsönös kizárást.
dési formák. Elegendő annyit tudni, hogy minden kritikus szekciót monitoreljárássá alakítva so­
Hogy megkönnyítsék a helyes programok írását, Brinch Hansen (Hansen, 1973) ha nem fogja két processzus egy időben a saját kritikus szekcióját végrehajtani.
és H oare (H oare, 1974) egy magasabb szintű szinkronizációs primitívet javasoltak, Bár a m onitorok egy könnyű módszert kínálnak a kölcsönös kizárás eléréséhez,
amelyet monitornak neveztek el. A javaslataik kicsit különböztek egymástól, mint ez nem elegendő, mint m ár fentebb láttuk. Szükségünk van egy olyan módszerre
látni fogjuk. A m onitor eljárások, változók és adatszerkezetek együttese, és m ind­ is, amellyel egy processzust blokkolhatunk, ha nem tud továbbhaladni. A gyártó-fo­
ezek egy speciális fajta modulba vagy csomagba vannak összegyűjtve. A processzu­ gyasztó problémában elég könnyű az összes tároló-tele, tároló-üres vizsgálatokat
sok bárm ikor hívhatják a m onitorban lévő eljárásokat, de nem érhetik el közvet­ monitoreljárásokra átalakítani, de hogyan kell blokkolni a gyártót, ha úgy találja,
lenül a m onitor belső adatszerkezeteit a m onitoron kívül deklarált eljárásokból. hogy a tároló tele van?
98 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 99

monitor ProducerConsumer Ez a másik processzus, például a fogyasztó, felébresztheti alvó partnerét egy
condition full, empty, signal végrehajtásával azon az állapotváltozón, amelyre a partnere éppen vár.
integer count;
Annak megakadályozására, hogy két processzusunk legyen egy időben aktív a
m onitorban, szükségünk van egy szabályra, amely megmondja, hogy mi történ­
procedure insert(item: integer);
jen a signal után. H oare azt javasolta, hogy az újonnan felébresztett processzust
begin
if count = N then w ait {full); hagyjuk futni, felfüggesztve a másikat. Brinch Hansen azt javasolta, hogy oldjuk
insertjtem(item); meg a problém át azzal, hogy megköveteljük a signal-t végrehajtó processzustól,
count := count + 1; hogy azonnal lépjen ki a monitorból. Más szavakkal, a signal utasítás csak a m oni­
if count = 1 then signai(empfy) toreljárás utolsó utasításaként fordulhat elő. Mi Brinch Hansen javaslatát fogjuk
end; használni, m ert ez koncepciójában egyszerűbb és megvalósítani is könnyebb. Ha
egy signal lett végrehajtva egy olyan állapotváltozón, amelyre több processzus vár,
function remove: integer; ezek közül csak egy, az ütem ező által m eghatározott ébred fel.
begin Létezik egy harmadik megoldás is, amit sem Hoare, sem Brinch Hansen nem
if count = 0 then wait(empfy);
említ. Ez az lenne, hogy hagyjuk futni a szignált küldő processzust, és a várakozó
remove = removeJtem;
processzus akkor léphessen be, ha a szignált küldő kilépett a monitorból.
count := count - 1;
if count = N - 1 then signal(fu//)
Az állapotváltozók nem számlálók. Nem gyűjtenek össze szignálokat későbbi
end; felhasználásra, mint ahogy azt a szemaforok teszik. így, ha egy olyan állapotvál­
tozó kap egy szignált, amelyre nem vár senki, akkor a szignál elvész. Más szavak­
count := 0; kal, a wait-nek a signal előtt kell jönnie. Ez a szabály a megvalósítást egyszerűbbé
end monitor; teszi. A gyakorlatban ez nem probléma, m ert változókkal könnyű nyomon követ­
ni m inden processzus állapotát, ha szükséges. Egy processzus, amely egyébként
procedure producer, végrehajtana egy signal-t, a változók vizsgálatával láthatja, hogy ez a művelet nem
begin szükséges.
while true do A 2.16. ábrán Pidgin Pascalban adjuk meg a gyártó-fogyasztó problém a vázlatát
begin
monitorokkal. A Pidgin Pascal használatának előnye itt az, hogy letisztult, egysze­
item = producejtem;
rű és pontosan követi a Hoare/Brinch Hansen-modellt.
ProducerConsumer.insertfitem)
Lehet, hogy az olvasóban felmerül, hogy a wait és signal műveleteknek is, ha­
end
end;
sonlóan a m ár korábban bem utatott sleep és wakeup műveletekhez, van végzetes
versenyhelyzete. Tényleg nagyon hasonlók, de van egy döntő különbség: a sleep és
procedure consumer; wakeup használata azért fullad kudarcba, m ert m ialatt egy processzus próbál el­
begin aludni, egy másik próbálja őt felébreszteni. M onitorokkal ez nem fordulhat elő.
while true do Az autom atikus kölcsönös kizárás a m onitoreljárásban garantálja, hogy ha, m ond­
begin juk, a gyártó a monitoreljárás belsejében felfedezi, hogy a tároló tele van, képes
item = ProducerConsumer.remove; lesz befejezni a wait műveletet anélkül, hogy tartania kellene attól a lehetőségtől,
consumejtem(item) hogy az ütem ező átkapcsolhat a fogyasztóra éppen a wait befejezése előtt.
end H abár a Pidgin Pascal csak egy képzeletbeli nyelv, néhány valódi program ozá­
end;
si nyelv is támogatja a m onitorok használatát, még ha nem is mindig a H oare és
2.16. ábra. A gyártó-fogyasztó probléma vázlata monitorokkal. Csak egy monitoreljárás aktív Brinch Hansen által m egtervezett formában. Az egyik ilyen nyelv a Java. A Java
egy időben. A tárolónak N rekesze van objektum orientált nyelv, amely támogatja a felhasználói szintű szálakat, és meg­
engedi a m etódusok (eljárások) osztályokba szervezését. Egy eljárás deklarálása­
A megoldás az állapotváltozók bevezetésében rejlik, két, rajtuk végezhető m ű­ kor a synchronized kulcsszó megadásával a Java garantálja, hogy amint egy szál el­
velettel, a wait-tel és a signal-lal. Amikor egy m onitoreljárás rájön, hogy nem tud kezdi végrehajtani az eljárást, egyetlen más szálnak sem engedi az osztály egyetlen
tovább dolgozni (például a gyártó megállapítja, hogy a tároló tele van), végez egy másik synchronized-del megjelölt eljárásának megkezdését sem.
wait-et egy állapotváltozón, mondjuk afull-on. Ez a tevékenység a hívó processzus A Java szinkronizált eljárásai lényegesen különböznek a klasszikus m onito­
blokkolását okozza. Ez azt is megengedi, hogy más, előzőleg a m onitorba való b e­ roktól: a Java nem rendelkezik állapotváltozókkal. Ehelyett két eljárást biztosít,
lépéstől eltiltott processzus most belépjen.
100 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 101

wait-et és a notify-1, amelyek megfelelnek a sleep-nek és a wakeup-nak, azzal a kü­ receive(source, &message);
lönbséggel, hogy ha szinkronizált eljárásokon belül használjuk őket, akkor nincse­
nek kitéve versenyhelyzeteknek. Az előbbi hívás egy üzenetet küld a célállomáshoz, az utóbbi egy üzenetet fogad
Azzal, hogy a m onitorok a kritikus szekciók kölcsönös kizárását automatikussá egy adott forrástól (vagy A/VY-től, ha a fogadót nem érdekli a forrás). H a nincs
tették, a párhuzamos programozás kevésbé lett hibára hajlamos, mint a szema­ elérhető üzenet, akkor a fogadó blokkolhatna, míg egy megérkezik. Vagy pedig
forokkal. De még ezeknek is van néhány hátrányuk. Nem véletlen, hogy a 2.16. azonnal visszatérhetne egy hibakóddal.
ábrát Pidgin Pascalban írtuk, és nem C-ben, ahogy a könyv többi példáját. Mint
m ár előbb említettük, a m onitor egy programozási nyelvi fogalom. A fordítóprog­
ram nak kell ezeket felismernie és valahogy elintéznie a kölcsönös kizárást. A C, a Tervezési szempontok az üzenetküldő rendszereknél
Pascal és a legtöbb más programozási nyelvnek nincsenek monitorjai, tehát nem
ésszerű elvárni a fordítóprogramjaiktól, hogy betartsanak valamilyen kölcsönös Az üzenetküldő rendszereknél sok kihívást jelentő problém a és tervezési szem­
kizárási szabályt. Valójában mégis honnan tudná a fordítóprogram , hogy mely pont merül fel, amely nem került elő a szemaforoknál vagy monitoroknál, különö­
eljárások vannak a m onitorban, és melyek nem? sen ha a kommunikáló processzusok a hálózat különböző gépein vannak. Például
Az ilyen nyelveknek szemaforuk sincs, bár szemaforokat hozzáadni könnyű: az üzenetek el tudnak veszni a hálózaton. Hogy az üzenetek elvesztése ellen véde­
mindössze annyit kell tenni, hogy két kis assembly nyelvű rutint kell a könyvtárhoz kezzenek, a küldő és a fogadó megegyezhet, hogy amint egy üzenet megérkezik,
hozzávenni, hogy kiadhassuk az up és down rendszerhívásokat. A fordítóprogra­ a fogadó visszaküld egy speciális nyugtázó üzenetet. H a a küldő nem kapja meg a
moknak még csak azt sem kell tudniuk, hogy ezek léteznek. Természetesen az nyugtát egy bizonyos időintervallumon belül, akkor újra elküldi az üzenetet.
operációs rendszernek tudnia kell a szemaforokról, de végül is, ha van egy sze­ Most gondoljuk át, mi történik akkor, ha maga az üzenet korrekten m egérke­
maforalapú operációs rendszerünk, akkor m ár írhatunk hozzá felhasználói prog­ zik, de a nyugta elvész. A küldő újból elküldi az üzenetet, így azt a fogadó kétszer
ram okat C-ben vagy C + + -b a n (vagy akár FORTRAN-ban is, ha eléggé mazo­ kapja meg. Alapvető, hogy a fogadó meg tudjon különböztetni egy új üzenetet
chisták vagyunk). A m onitorok esetén azonban szükségünk van egy programozási egy újraküldött régitől. Általában ez a problém a megoldódik, ha egymás utáni
nyelvre, amelybe ezek be vannak építve. sorszámokkal látunk el m inden eredeti üzenetet. H a a fogadó egy olyan üzenetet
A másik problém a a m onitorokkal és a szemaforokkal is az, hogy a kölcsönös kap, amelynek a sorszáma megegyezik az előzőével, akkor tudni fogja, hogy az
kizárás problém ájának megoldására tervezték ezeket egy vagy több CPU-ra, am e­ üzenet ismétlés, amelyet figyelmen kívül hagyhat.
lyek mindegyike elérheti a közös memóriát. A szemaforokat m egosztott m em ó­ Az üzenetküldő rendszereknek azzal a kérdéssel is foglalkozniuk kell, hogy mi a
riába helyezve és megvédve azokat TSL utasításokkal, elkerülhetjük a versenyt. neve a processzusoknak, azért, hogy a send és récéivé hívásban specifikált procesz-
Amikor egy olyan osztott rendszerre térünk át, amelyik több, saját memóriával szus egyértelmű legyen. A hitelesítés szintén tém a az üzenetküldő rendszerekben:
rendelkező CPU-ból áll, amelyek egy lokális hálózattal vannak összekötve, akkor hogyan tudja az ügyfél megmondani, hogy a valódi fájlszerverrel kommunikál, és
ezek a primitívek alkalm azhatatlanokká válnak. A következtetés az, hogy a szema­ nem egy szélhámossal?
forok túl alacsony szintűek, és a m onitorok néhány programozási nyelvet kivéve A dolgok másik oldaláról nézve akkor is felmerülnek fontos tervezési kérdések,
nem használhatók. Ráadásul egyik primitív se szolgál a gépek közötti információ- amikor a küldő és a fogadó ugyanazon a gépen vannak. Ezek egyike a hatékony­
cserére. Valami másra van szükségünk. ság. Mindig lassúbb egy processzustól egy másikhoz üzenetet másolni, mint egy
szemafor műveletet elvégezni, vagy belépni egy monitorba. Rengeteget dolgoztak
azon, hogy az üzenetküldést hatékonnyá tegyék. Cheriton (Cheriton, 1984) pél­
2.2.8. Üzenetküldés dául azt javasolta, hogy korlátozzuk le az üzenetm éretet akkorára, ami megfelel a
gép regiszterének, és utána az üzenetek küldésére használjuk a regisztereket.
Ez a valami más az üzenetküldés. A processzusok kommunikációjának ezen mód­
szere két primitívet használ, a send-et és a receive-et, amelyek a szemaforokhoz
hasonlóan - és nem úgy, mint a m onitorok - inkább rendszerhívások, mint nyelvi A gyártó-fogyasztó probléma üzenetküldéssel
konstrukciók. Mint ilyenek, könnyen beilleszthetők a könyvtári eljárások közé a
következőképpen: Most nézzük meg, hogyan lehet megoldani a gyártó-fogyasztó problém át
üzenetküldéssel, és nem megosztott memóriával. Ezt m utatja a 2.17. ábra. Feltéte­
send(destination, &message); lezzük, hogy m inden üzenet egyforma hosszú, és ezeket a m ár elküldött, de még
meg nem kapott üzeneteket az operációs rendszer autom atikusan egy tárolóba
és teszi. Ennél a megoldásnál összesen N üzenetet használunk, hasonlóan a megosz-
102 2. PROCESSZUSOK 2.2. PROCESSZUSOK KOMMUNIKÁCIÓJA 103

#define N 100 /* a rekeszek száma a tárolóban */ használunk, a send és récéivé hívásokban a cím param éterek levelesládák és nem
processzusok. H a egy processzus olyan levelesládának próbál üzenetet küldeni,
void producer(void) amely tele van, akkor addig felfüggesztődik, amíg abból a levelesládából ki nem
{ vesznek egy üzenetet, ezáltal helyet biztosítva az újnak.
int item; A gyártó-fogyasztó problém ánál mind a gyártó, mind a fogyasztó N üzenet táro­
message m; /* üzenetek tárolója */
lására elegendő nagy levelesládát hozhat létre. A gyártó adatokat tartalmazó üze­
neteket fog küldeni a fogyasztó levelesládájába, és a fogyasztó üres üzeneteket a
while (TRUE) {
item = produce_item(); /* létrehoz valamit, amit a tárolóba lehet tenni */ gyártó levelesládájába. H a levelesládákat használunk, az ideiglenes tárolási m e­
receive(consumer, &m); /* várjuk, hogy egy üres megérkezzen */ chanizmus világos: a célállomás levelesládájában vannak mindazok az üzenetek,
build_message(&m, item); r elküldendő üzenet összeállítása */ amelyeket már elküldtek neki, de még nem fogadta azokat.
send(consumer, &m); /* küldünk egy elemet a fogyasztónak */ A levelesládával kapcsolatos másik szélsőség az összes ideiglenes tárolás elha­
} gyása. Amikor ezt a megközelítést követjük, és a récéivé előtt a send-et hajtjuk
végre, akkor a küldő processzus blokkolódik, amíg a récéivé végrehajtódik, amikor
is az üzenet közvetlenül, közbülső tárolás nélkül m ásolódhat a küldőtől a fogadó­
void consumer(void) hoz. Hasonlóan, ha a récéivé hajtódik végre először, akkor a fogadó blokkolódik,
{ amíg a send végrehajtódik. Ezt a stratégiát gyakran randevúnak hívják. Könnyebb
int item, i;
megvalósítani, mint egy ideiglenesen tárolt üzenet tervét, de kevésbé rugalmas,
message m;
mivel a küldő és a fogadó kénytelen szorosan egymáshoz igazodva futni.
fór (i = 0; i < N; i++) send(producer, &m);/* N üres elem elküldése */ A M INIX 3 operációs rendszert alkotó processzusok a randevúeljárást használ­
while (TRUE) { ják rögzített m éretű üzenetekkel az egymással való kommunikációra. A felhasz­
receive(producer, &m); /* fogadjuk az üzenetet, amiben az elem van */ nálói processzusok is ezt a módszert használják, amikor az operációs rendszer
item = extract_item(&m); /* kibontjuk az elemet az üzenetből */ komponenseivel kommunikálnak, bár a programozó ezt nem látja, mivel könyv­
send(producer, &m); /* visszaküldjük az üres elemet */ tári eljárásokon keresztül történnek a rendszerhívások. A felhasználói processzu­
consumejtem(item); /* csinálunk valamit az elemmel */ sok kommunikációja a M INIX 3-ban (és Unixban) adatcsöveken keresztül valósul
} meg, amelyek ténylegesen levelesládák. Az egyetlen valódi különbség a leveleslá­
dákkal történő üzenetküldés és az adatcső mechanizmusa között az, hogy az adat­
csövek nem őrzik meg az üzenetek határait. Más szavakkal, ha egy processzus 10
2.17. ábra. A gyártó-fogyasztó probléma N üzenettel darab 100 bájtos üzenetet ír egy adatcsőbe, és egy másik processzus 1000 bájtot
olvas ebből az adatcsőből, akkor az olvasó egyszerre fogja megkapni mind a 10
tott m em óriában lévő tároló N rekeszéhez. A fogyasztó azzal kezdi, hogy elküld üzenetet. Egy igazi üzenetküldő rendszerben minden read-nek csak egy üzenettel
N üres üzenetet a gyártónak. Valahányszor a gyártónak van egy fogyasztóhoz kül­ kellene visszatérnie. Természetesen, ha a processzusok megegyeznek abban, hogy
dendő eleme, vesz egy üres üzenetet, és visszaküld egy telit. Ily m ódon a rendszer­ az adatcsőből mindig azonos m éretű üzeneteket olvasnak és írnak, vagy minden
ben lévő üzenetek száma időben konstans marad, így azokat egy előre megadott üzenet végét speciális karakterrel (például soremeléssel) zárják, akkor nem merül
m éretű m em óriaterületen lehet tárolni. fel ez a probléma.
H a a gyártó gyorsabban dolgozik, mint a fogyasztó, minden üzenet megtelik a fo­ Az üzenetküldés általánosan használt technika párhuzamos programozású
gyasztóra várva; a gyártó blokkolódik, arra várva, hogy egy üres jöjjön vissza. H a a rendszerekben. Egy jól ismert üzenetküldő rendszer például az M PI (Message-
fogyasztó dolgozik gyorsabban, akkor az ellenkezője történik: minden üzenet üres Passing Interface). Széles körben használják tudományos számításokhoz. Erről
lesz arra várva, hogy a gyártó feltöltse; ekkor a fogyasztó lesz blokkolva egy teli üze­ részletesebben lásd (G ropp et al., 1984; Snir et al., 1996) írtak.
netre várva.
Sok változat lehetséges üzenetek küldésére. A kezdők kedvéért nézzük meg,
hogyan címezzük az üzeneteket. Egyik módszer az, hogy m inden processzushoz
hozzárendelünk egy egyedi címet, és az üzeneteket a processzusokhoz kell címez­
ni. Egy másik módszer, hogy egy új adatszerkezetet találunk ki, amelyet leveles­
ládának nevezünk. A levelesláda néhány, általában a levelesláda létrehozásakor
specifikált számú üzenet ideiglenes tárolására szolgál. Amikor levelesládákat
104 2. PROCESSZUSOK 2.3. KLASSZIKUS IPC PROBLÉMÁK 105

#define N 5 /* a filozófusok száma */


2.3. Klasszikus IPC-problémák
Az operációs rendszerek irodalma tele van olyan processzusok közötti kommu­ void philosopher(int i) /* i: a filozófus sorszáma, 0-tól 4-ig */
nikációs problémákkal, amelyeket különféle szinkronizációs módszerek felhasz­ {
while (TRUE) {
nálásával alaposan kielemeztek. A következő részekben két jól ismert problém át
think(); /* a filozófus gondolkodik */
vizsgálunk meg. take_fork(i); /* felveszi a bal villát */
take_fork((i + 1) % N); /* felveszi a jobb villát; % a moduló osztás művelet */
eat(); /* nyam-nyam, spagetti */
2.3.1. Az étkező filozófusok probléma put_fork(i); /* visszateszi az asztalra a bal villát */
put_fork((i + 1) % N); /* visszateszi az asztalra a jobb villát */
1965-ben Dijkstra felvetett és megoldott egy szinkronizációs problém át, amelyet }
étkező filozófusok problémának nevezett el. Ettől kezdve mindenki, aki kitalált }
egy új szinkronizációs primitívet, ellenállhatatlan vágyat érzett arra, hogy az új
primitív csodálatos voltát azzal bizonyítsa, hogy felhasználásával az étkező filozó­ 2.19. ábra. Az étkező filozófusok probléma egy hibás megoldása
fusok problém ára elegáns megoldást ad. A probléma egyszerűen a következő. Öt
filozófus ül egy kerek asztal körül. Mindegyik filozófusnak van egy tányér spagetti­ készíteni a filozófusok számára, amely az elvárások szerint működik, és soha nem
je. A spagetti olyan csúszós, hogy egy filozófusnak két villára van szüksége az evés­ akad el? (Egyesek szerint a két villa követelménye kicsit m esterkélt, lehet, hogy át
hez. M inden egymás melletti két tányér között van egy villa. A 2.18. ábrán látjuk kellene térni olaszról kínai ételre, rizzsel helyettesítve a spagettit és evőpálcikával
az asztal elrendezését. a villát.)
A filozófusok élete egymást váltogató evési és gondolkodási periódusokból áll. A 2.19. ábra m utatja a nyilvánvaló megoldást. A ta k e jo rk eljárás megvárja,
(Ez most absztrakció, még akkor is, ha filozófusokról van szó. Nem fontos, hogy hogy a m egadott villa elérhető legyen, és ekkor megszerzi. Sajnos a nyilvánvaló
milyen egyéb tevékenységeket végeznek még.) Amikor egy filozófus éhes lesz, megoldás hibás. Tegyük fel, hogy mind az öt filozófus egyszerre szerzi meg a bal
valamilyen sorrendben megpróbálja megszerezni a bal és jobb oldalán lévő villát oldali villáját. Egyik se lesz képes a jobb oldalit megszerezni, és holtpont alakul ki.
is. H a sikerült mindkét villát megszereznie, akkor eszik egy ideig, majd leteszi a M ódosíthatjuk a program ot úgy, hogy a program ellenőrizze, vajon a bal oldali
villákat, és gondolkodással folytatja. A kulcskérdés az: tudunk-e olyan program ot villa megszerzése után a jobb oldali villa elérhető-e. H a nem, akkor a filozófus te­
gye le a bal oldali villát, várjon egy kicsit, majd ismételje meg a teljes eljárást. Ez a
javaslat sem vezet eredményre, bár más okból. Egy kis balszerencsével minden filo­
zófus egyszerre kezdi az algoritmust végrehajtani, felveszi a bal oldali villáját, látja,
hogy a jobb oldali villája nem elérhető, leteszi a bal oldali villáját, vár, majd megint
felveszi a bal oldali villáját a többiekkel egy időben, és így tovább a végtelenségig.
Az ilyen helyzetet, amelyben m inden program korlátlan ideig folytatja a futást, de
érdem ben nem halad előre, éhezésnek nevezzük. (Annak ellenére éhezésnek ne­
vezzük, hogy a problém a nem fordul elő egy olasz vagy kínai étterem ben.)
M ost azt gondolhatjuk, hogy ha a filozófusok véletlen ideig, és nem ugyanolyan
hosszú ideig várakoznának a jobb oldali villa megszerzésének kísérlete után, ak­
kor nagyon kicsi lenne az esélye annak, hogy az események ugyanabban az ütem ­
ben folytatódjanak egy órán keresztül. Ez az észrevétel helyes, és az alkalmazások
többségében egy későbbi időpontban történő újrapróbálkozás nem is okoz gon­
dot. Például egy E thernetet használó helyi hálózatban a gépek csak akkor kez­
denek csomagküldésbe, ha azt érzékelik, hogy éppen senki más nem küld. Mégis
előfordulhat, hogy a vezeték távolabbi pontjain elhelyezkedő két gép a jelterjedési
késleltetések m iatt időben átfedve küldi a csomagokat - ezt nevezzük ütközésnek.
Az ütközés felismerése után mindkét gép véletlen ideig vár, majd újra próbálko­
zik; a gyakorlatban ez a megoldás remekül bevált.
2.18. ábra. Ebédidő a filozófia tanszéken
106 2. PROCESSZUSOK 2.3. KLASSZIKUS IPC-PROBLÉMAK 107

#define N 5 /* a filozófusok száma */ Vannak azonban olyan alkalmazások, amikor előnyben részesítjük azokat a
#define LEFT (i + N - 1) % N /* az i bal szomszédjának a sorszáma */ megoldásokat, amelyek mindig működnek, és még véletlen számok valószínűtlen
#define RIGHT (i + 1) % N /* az i jobb szomszédjának a sorszáma */ sorozatának előfordulásakor sem hibázhatnak. Gondoljunk csak egy atom erőm ű
#defineTHINKING 0 /* a filozófus gondolkodik */ biztonsági berendezéseinek vezérlésére.
#define HUNGRY 1 /* a filozófus megpróbál villát szerezni */
A 2.19. ábra program jának holtpont és éhezés nélküli javítása lehet az, ha egy
#define EATING 2 /* a filozófus eszik */
bináris szemaforral (mutex) megvédjük a think hívást követő öt utasítást. Mielőtt
/* a szemafor az int speciális fajtája */
egy filozófus megkezdi a villák megszerzését, egy down-t kellene végrehajtania a
typedef int semaphore;
int state[N]; /* tömb az állapotok nyomon követésére */ mutex-en. M iután a villákat visszatette, egy up-ot kellene végrehajtania a mutex-en.
semaphore mutex = 1; /* a kritikus szekciók kölcsönös kizárásához */ Elméleti szempontból ez a megoldás kielégítő. Gyakorlatban azonban van egy ha­
semaphore s[N]; /* filozófusonként egy szemafor */ tékonysági hibája: csak egy filozófus tud enni egy adott pillanatban. Mivel öt vil­
lánk van, meg kellene tudnunk engedni, hogy két filozófus egy időben egyen.
void philosopher(int i) /* i; a filozófus sorszáma, 0-tól N - 1-ig */ A 2.20. ábrán bem utatott megoldás holtpontm entes, és megengedi a maximá­
{ lis párhuzamosságot tetszőleges számú filozófus esetén. Használ egy state tömböt,
while (TRUE) { /* végtelen ciklus*/ hogy nyomon kövesse, hogy egy filozófus eszik, gondolkodik vagy éhes (próbálja
think(); /* a filozófus gondolkodik */ megszerezni a villákat). Egy filozófus csak akkor m ehet át evés állapotba, ha egyik
take_forks(i); /* megszerzi mindkét villát, vagy blokkol */
szomszédja sem eszik. Az i filozófus szomszédait a L E F T és R1GHT makrók defi­
eat(); /* nyam-nyam, spagetti */
niálják. Más szavakkal, ha i értéke 2, akkor L E F T 1 és R IG H T 3.
put_forks(i); /* mindkét villát visszateszi az asztalra */
A program egy töm böt használ, amelyben filozófusonként egy szemafor van, így
}
} az éhes filozófusok blokkolódhatnak, ha a szükséges villák foglaltak. Megjegyez­
void take_forks(int i) /* i: a filozófus sorszáma, 0-tól N - 1-ig */ zük, hogy minden processzus a philosopher eljárást saját főprogram jaként futtatja,
{ de más eljárások, mint a takejorks, p u tjo r k s és test közönséges eljárások és nem
down(&mutex); /* belépés a kritikus szekcióba*/ különálló processzusok.
state[i] = HUNGRY; /* rögzítjük, hogy az i filozófus éhes */
test(i); /* megpróbál 2 villát szerezni */
up(&mutex); /* kilépés a kritikus szekcióból */
2.3.2. Az olvasók és írók probléma
down(&s[i]); /* blokkol, ha nem tudott villát szerezni */
} Az étkező filozófusok problém a hasznos, ha olyan processzusokat modellezünk,
void put_forks(i) /* i: a filozófus sorszáma, 0-tól N - 1-ig */
amelyek korlátozott számú erőforrásért, például I/O-eszközök kizárólagos eléré­
{
séért versenyeznek. Másik híres problém a az olvasók és írók probléma, amely egy
down(&mutex); /* belépés a kritikus szekcióba */
state[i] =THINKING; /* a filozófus befejezte az evést */
adatbázis elérését modellezi (Courtois et al., 1971). Képzeljük el például egy légi-
test(LEFT); /* megnézi, hogy a bal szomszéd tud-e most enni */ társaság helyfoglalási rendszerét sok versengő processzussal, amelyek az adatbá­
test(RIGHT); /* megnézi, hogy a jobb szomszéd tud-e most enni */ zist olvasni és írni szeretnék. Elfogadható, hogy több processzus egyidejűleg olvas­
up(&mutex); /* kilépés a kritikus szekcióból */ son az adatbázisból, de ha egy processzus aktualizálja (írja) az adatbázist, akkor
} azt más processzusoknak nem szabad elérniük, még az olvasóknak sem. A kérdés
az, hogy hogyan programozzuk az olvasókat és az írókat. A 2.21. ábrán láthatunk
void test(i) /* i: a filozófus sorszáma, 0-tól N - 1-ig */ egy megoldást.
{ Ebben a megoldásban az első olvasó, aki hozzáfér az adatbázishoz, végrehajt
if (state[i] = = HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) { egy down-t a db szemaforon. A következő olvasók csupán az re számlálót növelik.
state[i] = EATING;
Ha egy olvasó kilép, akkor csökkenti a számlálót, és az utolsó kilépő végrehajt egy
up(&s[i]);
} up-ot a szemaforon, lehetővé téve egy blokkolt írónak, ha van ilyen, hogy belépjen.
Az itt bem utatott megoldásban van egy kis apróság, amire érdem es kitérni.
Tegyük fel, hogy m ialatt egy olvasó használja az adatbázist, egy másik olvasó érke­
2.20. ábra. Az étkező filozófusok probléma egyik megoldása zik. Mivel nem probléma, ha két olvasó van egy időben, ezért bebocsátják. A har­
madik és további olvasókat is bebocsáthatják, ha érkeznek.
108 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 109

typedef int semaphore; /* használjuk a fantáziánkat */ párhuzamosságot enged meg, és így a hatékonyság csökken. Courtois és társai be­
semaphore mutex = 1; /*'re'elérését vezérli */ m utatnak egy olyan megoldást, amely az íróknak ad prioritást. A részleteket lásd
semaphore db = 1; /* az adatbázis elérését vezérli */ (Courtois et al., 1971).
int re = 0; /* az olvasó vagy ezt akaró processzusok száma */

void reader(void)
{
while (TRUE) { /* végtelen ciklus*/
2.4. Ütemezés
down(&mutex); /* kizárólagos elérés beállítása 'rc'-hez */
re = re + 1; /* eggyel több olvasó van */ Az előző részek példáiban gyakran kerültünk abba a helyzetbe, hogy két vagy
jf (re = = 1) down(&db); /* ha ez az első olvasó... */ több processzus (például gyártó és fogyasztó) volt logikailag futásra képes.
up(&mutex); /* kizárólagos elérés elengedése'rc'-hez */ M ultiprogram ozott számítógépben gyakran előfordul, hogy több processzus ver­
read_data_base(); /* az adatok elérése */ seng a CPU-ért. Amikor több processzus képes futni, de csak egy processzor áll
down(&mutex); /* kizárólagos elérés beállítása'rc'-hez*/ rendelkezésre, akkor az operációs rendszernek el kell döntenie, hogy mely fusson
re = re - 1; /* eggyel kevesebb olvasó van */ először. Az operációs rendszer azon részét, amelyik ezt a döntést meghozza, üte­
if (re = = 0) up(&db); /* ha ez az utolsó olvasó... */ mezőnek (scheduler) nevezzük; az erre a célra használt algoritmus pedig az üte­
up(&mutex); /* kizárólagos elérés elengedése'rc'-hez */
mezési algoritmus.
use_data_read(); /* nemkritikus szekció */
Az ütemezéssel kapcsolatos megfontolások nagy része egyaránt vonatkozik a
}
processzusokra és a szálakra is. Először a processzusütemezéssel foglalkozunk,
}
majd röviden áttekintjük a szálütemezéssel kapcsolatos speciális kérdéseket.
void writer(void)
{
while (TRUE) { /* végtelen ciklus*/ 2.4.1. Bevezetés az ütemezésbe
think_up_data(); /* nemkritikus szekció */
down(&db); /* kizárólagos elérés beállítása */ A kötegelt rendszerek idejében, amikor a bem enő adatok mágnesszalagon voltak
write_data_base(); /* az adatok aktualizálása */ lyukkártya formátumban, az ütemezési algoritmus egyszerű volt: fusson a szala­
up(&db); /* kizárólagos elérés elengedése */
gon található következő feladat. Az időosztásos rendszerekben az ütemezési algo­
}
ritmus bonyolultabb, hiszen gyakran több felhasználó vár a kiszolgálásra, és még
}
kötegelt feladatsorok is lehetnek (például egy biztosítótársaságnál a követelések
feldolgozására). Azt gondolhatnánk, hogy egy személyi számítógépen mindig csak
2.21. ábra. /4zolvasók és írók probléma egy megoldása egy aktív processzus van. Végül is nem túl valószínű, hogy a felhasználó szöveg-
szerkesztés közben még program ot is fordít a háttérben. H áttérfeladatok azonban
M ost tegyük fel, hogy egy író érkezik. Az írót nem engedhetik be az adatbázisba, gyakran előfordulnak, például az elektronikus leveleket kezelő háttérprocesszus
m ert az íróknak kizárólagos hozzáférésre van szükségük, így az író felfüggesztődik. küldhet vagy fogadhat e-maileket. Feltételezhetnénk azt is, hogy az utóbbi évek­
Később további olvasók jelennek meg. Amíg van legalább egy aktív olvasó, továb­ ben a számítógépek annyival gyorsabbak lettek, hogy a CPU m ár olyan erőforrás
bi olvasók bejöhetnek. Ennek a stratégiának az a következménye, hogy ha az olva­ lett, amelyből nincs hiány. Az új alkalmazások viszont rendszerint több erőforrást
sóknak folyamatos utánpótlása van, akkor azok megérkezésük után azonnal bejut­ igényelnek. Példának felhozhatjuk a digitális fényképek feldolgozását vagy a valós
hatnak. Az író mindaddig felfüggesztett állapotban marad, amíg az olvasók el nem idejű videolejátszást.
fogynak. H a mondjuk 2 m ásodpercenként jön egy új olvasó, és m inden olvasónak
5 m ásodperces munkája van, az író soha nem kerül be.
E nnek a helyzetnek az elkerülésére a program ot írhatjuk egy kicsit másképpen; Processzusok viselkedése
amikor egy olvasó megérkezik, és egy író m ár vár, az olvasó felfüggesztődik az író
mögött, ahelyett hogy rögtön beengednénk. így az írónak csak azt kell megvárnia, Majdnem m inden processzus váltogatva végez számításokat és I/O-műveleteket,
hogy az előtte érkezett olvasók végezzenek, de nem kell megvárnia azokat az ol­ ahogy a 2.22. ábrán látható. Az a tipikus, hogy a CPU dolgozik egy ideig folyama­
vasókat, akik utána érkeztek. Ennek a m egoldásnak az a hátránya, hogy kevesebb tosan, majd egy rendszerhíváshoz ér, hogy olvasson, vagy írjon egy fájlt. A rend­
szerhívás visszatérése után megint számol, amíg újra adatokra lesz szüksége, vagy
110 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 111

Mikor ütemezzünk?
(a) C S
/ Sok olyan helyzet van, amikor ütem ezésre sor kerülhet. Először is, feltétlenül
Hosszú számítási periódus szükséges két esetben:

Várakozás 1/0-műveletre 1. Amikor egy processzus befejeződik.


Rövid számítási periódus 2. Am ikor egy processzus blokkolódik I/O-művelet vagy szemafor miatt.

/
(b) □ ------B ------ 1------ 1------ 0----- □------EH3----- 0-------- B -----EH—0—
M indkét esetben az éppen futó processzus nem tud tovább haladni, ezért másikat
kell választani helyette.
Van további három eset, amikor rendszerint ütem ezésre kerül sor, bár logikai­
Idő lag nem feltétlenül lenne szükséges:

2.22. ábra. Számítási és i/O várakozási periódusok váltakozása, (a) CPU-igényes processzus. 1. Am ikor új processzus jön létre.
(b) l/O-igényes processzus 2. Am ikor I/O-megszakítás következik be.
3. Am ikor időzítőmegszakítás következik be.
adatokat akar írni, és így tovább. Figyeljük meg, hogy némelyik I/O-tevékenység
számításnak minősül. Például amikor képernyőfrissítéskor a CPU biteket másol a Új processzus létrehozása esetén van értelm e újraértékelni a prioritásokat. Bizo­
videomemóriába, akkor nem I/O-művelet történik, m ert a CPU dolgozik. Ebben nyos esetekben a szülő kérhet a sajátjától különböző prioritást a gyermekének.
az értelem ben I/O-művelet az, amikor a processzus blokkolt állapotba kerül, hogy Egy I/O-megszakítás rendszerint azt jelenti, hogy valamelyik I/O-eszköz befe­
megvárja, amíg egy külső eszköz befejezi a tevékenységét. jezte a feladatát, és lehet olyan processzus, amelyik éppen erre várt, és futtatható
A 2.22. ábrán fontos észrevennünk, hogy némelyik processzus, mint például a állapotba került.
2.22.(a) ábrán látható is, ideje nagy részét számítások végzésével tölti, míg mások, Időzítőmegszakítás esetén lehetőség van annak eldöntésére, hogy az éppen fu­
mint például a 2.22.(b) ábrán látható, idejük nagy részét I/O-műveletekre való tó processzus elég hosszú ideig futott-e már. Az ütemezési algoritmusok két cso­
várakozással töltik. Előbbieket számításigényesnek (CPU-igényesnek), utóbbia­ portba sorolhatók az időzítőmegszakítások kezelésének vonatkozásában. Nem
kat I/O-igényesnek nevezzük. A számításigényes processzusokra hosszú számítási m egszakítható ütemezés esetén az ütem ező a kiválasztott processzust addig en­
periódusok és ritka I/O-várakozások jellemzők, az I/O-igényesekre pedig rövid gedi futni, amíg az blokkolódik (I/O-művelet vagy másik processzusra várakozás
számítási periódusok és gyakori I/O-várakozások. Figyeljük meg, hogy a kulcs- m iatt), vagy amíg önszántából le nem mond a processzorról. Ezzel ellentétben
tényező a számítási periódusok hossza, nem pedig az I/O-periódusok hossza. Az m egszakítható ütemezés esetén a kiválasztott processzus csak legfeljebb egy előre
I/O-igényes processzusok azért azok, m ert alig végeznek számítást az I/O-kérések m eghatározott ideig futhat. H a a kiszabott időintervallum végén még mindig fut,
között, nem pedig azért, m ert különösen hosszú I/O-műveleteket végeznek. akkor felfüggesztésre kerül, és az ütem ező egy másik processzust választ helyette
Ugyanannyi ideig tart beolvasni egy lemezblokkot, függetlenül attól, hogy mennyi (ha tud). Megszakítható ütemezés csak úgy valósítható meg, ha az időintervallum
ideig tart utána feldolgozni az adatokat. végén egy időzítőmegszakítást generál, ezáltal a CPU visszakerül az ütemezőhöz.
Érdem es megjegyezni, hogy a CPU-k sebességének növekedésével a processzu­ H a nincs időzítő, akkor a nem megszakítható ütemezés az egyedüli lehetőség.
sok egyre inkább I/O-igényesekké válhatnak. Ez azért lehetséges, m ert a CPU-k
teljesítménye sokkal gyorsabban nő, m int a lemezeké. Ennek következtében az
I/O-igényes processzusok ütemezése valószínűleg fontosabb témává válik a jövő­ Ütemezési algoritm usok csoportosítása
ben. Az alapötlet ezzel kapcsolatban az, hogy ha egy I/O-igényes processzus futni
akar, akkor tehesse azt meg minél előbb, hogy kiadhassa a lemezparancsokat, és Nem meglepő módon, különböző környezetekben különböző ütemezési algorit­
kihasználva tartsa a lemezt. musokra van szükség. Ez azért fordulhat elő, m ert különböző alkalmazási terüle­
tek (és különböző fajta operációs rendszerek) esetén a célok is különböznek. Más
szavakkal nem m inden rendszerben ugyanazok az optimális ütemezési döntések.
H árom területet érdem es megkülönböztetni:
112 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 113

1. Kötegelt. Minden rendszer


2. Interaktív. Pártatlanság - minden processzusnak megfelelő hozzáférést biztosítani a CPU-hoz
Elvek betartatása - a meghatározott elvek szerinti működés biztosítása
3. Valós idejű.
Egyensúly - a rendszer minden részének egyenletes terhelése

Kötegelt rendszerekben nincsenek felhasználók, akik a termináloknál türelm et­ Kötegelt rendszerek
lenül várják a választ. Em iatt nem megszakítható ütemezési algoritmusok, vagy Áteresztőképesség - maximalizálni az időegységenként végrehajtott feladatok számát
m inden processzus számára hosszú időintervallumokat engedélyező, megszakít­ Áthaladási idő - minimalizálni a feladat-végrehajtás kezdeményezése és a befejeződés
ható ütemezési algoritmusok használata gyakran elfogadható. Ezzel a megoldás­ közt eltelt időt
sal csökken a processzusváltások száma, így nő a teljesítmény. CPU-kihasználtság - a CPU soha nem állhat tétlenül
Interaktív rendszerekben az időnkénti megszakítás nélkülözhetetlen, nehogy
valamelyik processzus kisajátítsa a CPU-t, és megakadályozza a többit a futásban. Interaktív rendszerek
Még ha nem is szándékosan történik ilyen, program hiba m iatt egy processzus ki­ Válaszidő - a kérésekre gyors válasz biztosítása
zárhatja az összes többit. A megszakításos ütem ezésre van szükség ennek megaka­ Arányosság - a felhasználók elvárásainak való megfelelés
dályozására.
Valós idejű rendszerek
Valós idejű korlátokkal működő rendszerekben furcsa m ódon nem mindig van
Határidők betartása - adatvesztés elkerülése
szükség megszakításos ütemezésre, m ert a processzusok tudatában vannak, hogy
Előrejelezhetőség - minőségromlás elkerülése multimédia-rendszerekben
nem futhatnak hosszú ideig, és rendszerint gyorsan elvégzik a feladatukat, majd
blokkolódnak. Az interaktív rendszerektől eltérően a valós idejű rendszerekben
csak a szóban forgó alkalmazás érdekeit szem előtt tartó program ok futnak. Az in­ 2.23. ábra. Az ütemezési algoritmus lehetséges céljai különböző körülmények között
teraktív rendszerek általános célúak, bármilyen program előfordulhat, még olyan
is, amely nem működik együtt a többiekkel, vagy egyenesen ártó szándékú. igényes feladatok futása alatt azok harcolnak egymással a CPU birtoklásáért, a le­
mez pedig kihasználatlanul áll. Később, amikor az I/O-igényes feladatok kerülnek
sorra, harcolni fognak egymással a lemezért, a CPU pedig tétlenségre lesz ítélve.
Ütemezési algoritm usok céljai Gondosan kiválogatott feladatkeverékkel a folyamatos kihasználtság biztosítható.
A sok kötegelt feladatot (például biztosítási igények feldolgozását) végző vál­
Ütemezési algoritmus tervezésekor jó tisztában lenni azzal, hogy az algoritmusnak lalati számítóközpontok vezetői tipikusan három mérőszám ot figyelnek, hogy
mit kell elérnie. Bizonyos célok függnek a környezettől (kötegelt, interaktív vagy megállapítsák, rendszerük mennyire működik jól. Ezek az áteresztőképesség, az
valós idejű), de vannak olyanok is, amelyek elérése mindig kívánatos. A 2.23. áb­ áthaladási idő és a CPU-kihasználtság. Az áteresztőképesség a rendszerben idő­
rán lehetséges célokat találunk, ezeket tárgyaljuk a következőkben. egységenként végrehajtott feladatok száma. M indent figyelembe véve, m ásod­
A pártatlanság m inden körülmények között fontos. Hasonló processzusoknak percenként 50 feladat jobb, mint m ásodpercenként 40 feladat. Az áthaladási idő
hasonló kiszolgálást kell kapniuk. Nem igazságos egyiknek sokkal több CPU-időt a feladat-végrehajtás kezdeményezése és a befejeződés közt eltelt idő. Azt méri,
adni, mint egy hozzá hasonlónak. Természetesen processzusok különböző cso­ hogy a felhasználóknak átlagosan mennyit kell várniuk arra, hogy megkapják az
portjait szabad különbözőképpen kezelni. Gondoljunk csak egy atom erőm ű biz­ eredményt. A szabály itt az, hogy minél kisebb, annál jobb.
tonsági berendezéseinek vezérlésére és a dolgozók fizetési listájának elkészítésére Egy olyan ütemezési algoritmus, amely maximalizálja az áteresztőképességet,
az erőm ű számítóközpontjában. nem feltétlenül tudja minimalizálni az áthaladási időt. Például ha rövid és hosszú
A pártatlansághoz némileg kapcsolódik a rendszer ütemezési elveinek betarta­ feladatok vegyesen állnak sorban, akkor a rövid feladatok futtatásával kiváló át­
tása. H a a helyi ütemezési elv az, hogy a biztonsági vezérlőprocesszusok bármikor eresztőképesség m utatható fel (sok rövid feladat m ásodpercenként), de ennek az
futhatnak, még akkor is, ha a fizetési lista 30 m ásodpercet késik, akkor az ütem e­ az ára, hogy a hosszú feladatok számára az áthaladási idő rettenetesen rossz lesz.
zőnek ezt az elvet kell kikényszerítenie. Ha a rövid feladatok folyamatosan érkeznek, akkor a hosszú feladatok soha nem
Egy másik általános cél a rendszer részeinek egységes terheltségét fenntartani, kerülnek sorra, az átlagos áthaladási idő a végtelenhez kezd közelíteni, miközben
amikor csak lehetséges. H a a CPU és az összes I/O-eszköz folyamatosan dolgozik, az átlagos áteresztőképesség magas marad.
akkor időegységenként több feladat végezhető el, mint ha a rendszer egyes ré­ A CPU-kihasználtság fontos szempont a kötegelt rendszerekben, m ert a nagy­
szei tétlenül állnak. Kötegelt rendszerekben például az ütem ező döntheti el, hogy gépeken, ahol ezek a kötegelt rendszerek rendszerint futnak, a CPU teszi ki az ár
mely feladatokat tölti be a m em óriába futtatásra. Jobb megoldás CPU-igényes és tetem es részét. Em iatt a számítóközpontok vezetői bűntudatot éreznek, ha a CPU
I/O-igényes feladatokat vegyesen futtatni, mint először az összes CPU-igényeset, nem dolgozik folyamatosan. Valójában azonban ez nem valami jó mérőszám. Ami
majd ezek befejeződése után az I/O-igényeseket. Utóbbi stratégia esetén a CPU- valóban számít, az az áteresztőképesség és az áthaladási idő. A CPU-kihasználtság
114 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 115

mérőszámként való felhasználása olyan, m intha az autókat a m otor fordulatszáma Érdem es rám utatni arra, hogy némelyik algoritmus kötegelt és interaktív rend­
alapján ítélnénk meg. szerekben is használatos, ezeket később tanulmányozzuk. Most csak azokra az al­
Az interaktív rendszerekre, különösen az időosztásos rendszerekre és a szer­ goritm usokra koncentrálunk, amelyek csak kötegelt rendszerekben használhatók.
verekre más szabályok érvényesek. A legfontosabb cél a válaszidő, vagyis egy p a­
rancs kiadása és a válasz megérkezése között eltelt idő minimalizálása. Egy olyan
személyi számítógépen, ahol háttérprocesszusok is futnak (például e-mail fogadás Sorrendi ütemezés
és küldés hálózatról), a háttértevékenységekkel szemben előnyt kell élveznie a fel­
használó parancsainak, ha mondjuk el akar indítani egy program ot, vagy meg akar Talán az ütemezési algoritmusok legegyszerűbbike a nem megszakítható sorrendi
nyitni egy fájlt. Az interaktív tevékenységek előnyben részesítését a felhasználók ütemezés. Ez az algoritmus olyan sorrendben osztja ki a CPU-t a processzusok­
értékelni fogják. nak, amilyen sorrendben azok kérik. Alapjában véve a futásra kész processzusok
Egy ehhez némileg kapcsolódó kérdés az, amit arányosságnak nevezhetnénk. egyetlen várakozó soron állnak készenlétben. Amikor reggel az első feladat belép
M inden felhasználónak van (gyakran hibás) elképzelése arról, hogy minek meny­ a rendszerbe, azonnal indulhat, és addig futhat, amíg akar. H a további feladatok
nyi ideig kellene tartania. H a egy összetettnek tűnő kérés hosszú ideig tart, akkor érkeznek, azok a várakozási sor végére kerülnek. Amikor egy futó processzus
azt elfogadják, de ha valami egyszerűnek tűnő tart sokáig, akkor bosszankodnak. blokkolódik, a sor elején álló processzus futhat helyette. Amikor egy blokkolt p ro ­
Például ha egy olyan ikonra kattint valaki, amely egy analóg m odem en keresztül cesszus újra futásra kész lesz, akkor az újonnan érkezett feladatokhoz hasonlóan
terem t kapcsolatot az internetszolgáltatóval, és a kapcsolat felépítése 45 m ásod­ a sor végére kerül.
percig tart, akkor valószínűleg a felhasználó elfogadja ezt, mint elkerülhetetlent. Ennek az algoritmusnak az a nagy erőssége, hogy könnyű megérteni és ugyan­
M ásrészt ha olyan ikonra kattint, ami bontja a kapcsolatot, és ez tart 45 m ásodper­ ilyen könnyű beprogramozni. Pártatlan is abban az értelem ben, ahogy pártatlan
cig, akkor ugyanez a felhasználó m inden bizonnyal erősen átkozódni fog 30 m á­ az, hogy a nehezen megszerezhető sport- vagy koncertjegyekhez az fér hozzá,
sodperc elteltével, 45 m ásodpercnél pedig m ár habzik a szája. M indez abból adó­ aki hajlandó hajnali két órától sorban állni a pénztárnál. Ennél az algoritmusnál
dik, hogy az általános vélekedés szerint telefonhíváskor egy kapcsolat felépítése egyetlen láncolt lista tartja nyilván a futásra kész processzusokat. Egy processzus
több ideig szokott tartani, mint amikor csak letesszük a kagylót. Bizonyos esetek­ kiválasztása azt jelenti, hogy le kell venni a sor elejéről. Új feladat vagy blokkolás
ben (mint az előzőben is) az ütem ező semmit sem tehet a válaszidő tekintetében. alól felszabadult processzus elhelyezése a lista végére történő beszúrást jelent. Mi
M áskor viszont igen, különösen akkor, ha a késlekedés a processzusok sorrendjé­ lehetne ennél egyszerűbb?
nek helytelen megválasztásából adódott. Sajnos a sorrendi ütem ezésnek van egy nagy hátránya is. Tegyük fel, hogy van
A valós idejű rendszereknek az interaktív rendszerektől eltérő tulajdonságaik egy számításigényes processzus, amely alkalm anként 1 másodpercig fut, és több
vannak, így ütemezési céljaik is mások. Fő jellemzőjük a határidők megléte, am e­ I/O-igényes processzus, amelyek kevés processzoridőt használnak, de egyenként
lyeket be kell tartani, ha lehet. Például ha a számítógép egy olyan eszközt vezérel, 1000 lemezolvasást kell elvégezniük futásuk alatt. A számításigényes processzus
amely szabályos időközönként adatokat szolgáltat, akkor az adatgyűjtő processzus fut 1 másodpercig, majd olvas egy lemezblokkot. Ekkor az összes I/O-processzus
m egkésett futtatása m iatt adatvesztés léphet fel. Ezért a valós idejű rendszerek­ fut, és mindegyik kezdeményez egy lemezolvasást. Am ikor a számításigényes pro­
ben a legfontosabb cél a határidők lehetőség szerinti betartása. cesszus megkapja a lemezblokkját, újból fut 1 másodpercig, majd ezt követik az
A legtöbb valós idejű rendszerben, főleg a m ultimédia-rendszerekben, fontos az I/O-processzusok gyors egymásutánban.
előrejelezhetőség. H a néha egy-egy határidőt nem sikerül betartani, az még nem Összesítve az lesz az eredmény, hogy az I/O-igényes processzusok m ásodpercen­
végzetes, de ha a hanglejátszó processzus túlságosan szabálytalanul fut, akkor a ként 1 blokkot tudnak olvasni, így 1000 m ásodperc alatt futnak le. H a az ütem e­
hangminőség gyorsan romlik. A videolejátszás is hasonló problém ákat vet fel, de a zési algoritmus 10 ezred m ásodpercenként megszakította volna a számításigényes
fülünk sokkal érzékenyebb az eltérésekre, mint a szemünk. Ezeket a jelenségeket processzust, akkor az I/O-igényes processzusok 1000 helyett 10 másodperc alatt
csak pontosan előre jelezhető és szabályos ütemezéssel lehet kiküszöbölni. végeztek volna, és még a számításigényes processzus sem lassult volna le nagyon.

2.4.2. Ütemezés kötegelt rendszerekben A legrövidebb feladatot először

Itt az ideje az általános ütemezési kérdésektől a konkrét algoritmusok felé for­ Most tekintsünk egy másik nem megszakítható kötegelt ütemezési algoritmust,
dulni. Ebben a részben kötegelt rendszerekben használt algoritmusokat tárgya­ amely feltételezi, hogy a futási idők előre ismertek. Egy biztosítótársaságnál pél­
lunk. A rá következőkben interaktív és valós idejű rendszereket vizsgálunk meg. dául az em ber képes elég pontosan megjósolni, hogy mennyi időt vesz igénybe
116 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 117

8 4 4 4 4 4 4 8
CPU O
A B C D B C D A

(a) (b) CPU-ütemező

2.24. ábra. Példa a legrövidebb feladatot először ütemezésre, (a) Négy feladat futtatása az Érkező
eredeti sorrendben, (b) Négy feladat futtatása a legrövidebb feladatot először feladat
Belépési
sorrendben sor

O I I IOIOIOIOI
1000 kérelem kötegelt feldolgozása, mivel a hasonló m unkák mindennaposak.
Am ikor több egyformán fontos feladat van a bem enő sorban futásra készen, ak­
kor az ütem ezőnek a legrövidebb feladatot először elvet kell használnia. Vessünk
egy pillantást a 2.24. ábrára. Itt négy feladat van, A , B, C és D, amelyek futáside­ Lemez
je rendre 8, 4, 4 és 4 perc. A m egadott sorrendben futtatva ezeket, az áthaladási ütemező ütemező
idő az A számára 8 perc, B számára 12 perc, C számára 16 perc, D számára pedig
20 perc, az átlag 14 perc. 2.25. ábra. Háromszintű ütemezés
M ost nézzük ennek a négy feladatnak a futását a legrövidebb feladatot először
elvet használva, mint azt a 2.24.(b) ábra mutatja. Az áthaladási idő most 4, 8,12 és lévő idejével. H a az új feladat kevesebb időt igényel, mint az aktuális processzus,
20 perc, az átlag 11 perc. A legrövidebb feladatot először algoritmus bizonyítha­ akkor az aktuális processzust lecseréli az új feladatra. Ezzel a megoldással az új,
tóan optimális. Tekintsük a négyfeladatos esetet, rendre a, b, c és d futásidőkkel. rövid feladatok jó kiszolgálásban részesülnek.
A z első befejezi a időpontban, a második a + b időpontban, és így tovább. Az átla­
gos áthaladási idő (4a + 3b + 2c + d)/4. Világos, hogy a többszörösen járul hozzá
az átlaghoz, mint a többi idő, ezért neki kell a legrövidebb feladatnak lennie, a b Háromszintű ütemezés
a következő, azután c és végül d, mint a leghosszabb, és így m ár csak a saját átha­
ladási idejére van hatással. Ugyanez az érvelés alkalmazható tetszőleges számú Bizonyos szempontból a kötegelt rendszerekben az ütem ezés három különböző
feladatra. szinten történhet, ahogy a 2.25. ábra mutatja. Az újonnan érkező feladatok elő­
Érdem es megjegyezni, hogy a legrövidebb feladatot először csak akkor optim á­ ször egy lemezen tárolt belépési várakozó sorba kerülnek. A bebocsátó ütemező
lis, ha a feladatok egyszerre rendelkezésre állnak. Ellenpéldaként tekintsünk 5 fel­ dönti el, hogy mely feladatok léphetnek be a rendszerbe. A többi a belépési vá­
adatot, /4-tól E -ig, amelyek futási ideje sorrendben 2, 4 ,1 ,1 és 1 perc. Az érkezési rakozó soron m arad, amíg ki nem választják őket. A bebocsátást vezérlő tipikus
idejük 0 ,0 ,3 ,3 és 3. Kezdetben csákói és B közül választhatunk, mivel a többi még algoritmus egy megfelelő számításigényes és I/O-igényes keverék előállítását kí­
nem érkezett meg. A legrövidebb feladatot először stratégia a fe la d a to k a t^ , B, sérelheti meg. Másik lehetőség, hogy a rövid feladatokat ham ar beengedi, a hosz-
C, D, E sorrendben fogja futtatni, az átlagos várakozás 4,6 perc. H a B, C, D, E ,A szabbaknak várniuk kell. A bebocsátó ütem ező m egteheti, hogy bizonyos felada­
sorrendben futtattuk volna őket, akkor viszont az átlagos várakozás csak 4,4 perc tokat a belépési sorban tart, míg később érkezőket beenged, ha úgy látja jónak.
lett volna. H a egy feladat m ár belépett a rendszerbe, akkor létre lehet hozni számára egy
processzust, és elkezdhet vetélkedni a CPU-ért. De az is m egtörténhet, hogy olyan
sok processzus van, hogy nem férnek el a memóriában. Ebben az esetben néhány
A legrövidebb maradék futási idejű következzen processzust ki kell helyezni lemezre. A z ütemezés második szintje azt dönti el, hogy
melyik processzus maradjon a memóriában, és melyik kerüljön ki lemezre. Azt a
A legrövidebb feladatot először algoritmus egy megszakítható változata a legrövi­ komponenst, amely ezt a döntést meghozza, memóriaütemezőnek nevezzük.
debb m aradék futási idejű következzen. Ennél az algoritmusnál az ütem ező min­ A döntéseket sűrűn felül kell vizsgálni, hogy a lemezen tárolt feladatoknak is
dig azt a processzust választja, amelynek a legkevesebb a befejeződésig még meg­ legyen esélyük a bekerülésre. Azonban, mivel egy feladat lemezről történő beho­
m aradt ideje. Itt megint csak ismerni kell a futási időket előre. Am ikor új feladat zatala költséges művelet, a felülvizsgálatnak valószínűleg csak legfeljebb m ásod­
érkezik, a teljes ideje összehasonlításra kerül az éppen futó processzus még hátra- percenként egyszer, esetleg ennél is ritkábban szabad m egtörténnie. H a a közpon­
118 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 119

ti m em óriát túl gyakran átszervezzük, akkor az nagy sávszélességet pazarol el a le­ Aktuális Következő Aktuális
mezegységnél, és lelassítja a fájlműveleteket. processzus processzus processzus
A rendszer egészének teljesítményére tekintettel a m em óriaütem ezőnek kö­
rültekintően kell eljárnia, hogy m eghatározza a m em óriában tartott processzusok
számát, amit a multiprogramozás mértékének is nevezünk, valamint azt, hogy mi­
lyen processzusok legyenek a m emóriában. H a van információja arról, hogy m e­ (a) (b)
lyik processzus számításigényes, illetve melyik I/O-igényes, akkor megkísérelheti
ezeknek valamilyen keverékét a mem óriában tartani. Nagyon durva becsléssel, ha 2.26. ábra. Round robin ütemezés, (a) A futtatandó processzusok listája, (b) A futtatandó
bizonyos típusú processzus idejének 20%-át számolással tölti, akkor ebből nagyjá­ processzusok listája azután, hogy B elhasználta az időszeletét
ból öt elég ahhoz, hogy a CPU-t kihasználva tartsa.
Ezeknek a döntéseknek a m eghozatalához a m em óriaütem ező rendszeres idő­ egyszerű. Az ütem ezőnek mindössze egy listát kell karbantartania a futtatandó
közönként átnézi a lemezen tárolt processzusokat. A szempontjai között az aláb­ processzusokról, amint ezt a 2.26.(a) ábrán látjuk. Amikor a processzus felhasz­
biak lehetnek: nálja az időszeletét, akkor a lista végére kerül, ahogyan a 2.26.(b) ábrán látható.
Csak egy érdekes kérdés van a round robin ütemezéssel kapcsolatban: az idő­
1. Mennyi idő telt el a processzus lemezre vitele óta? szelet hossza. Egyik processzusról a másikra való átkapcsolás bizonyos adminiszt­
2. Mennyi CPU-időt használt fel a processzus nemrégiben? rációs időt igényel - regiszterek és m em óriatérképek mentése és betöltése, külön­
3. Milyen nagy a processzus? (A kicsik nincsenek útban.) böző táblázatok és listák aktualizálása, a gyorsítótár tartalm ának visszaírása a m e­
4. Mennyire fontos a processzus? móriába, majd újratöltése stb. Tegyük fel, hogy ez a processzusátkapcsolás vagy
környezetátkapcsolás, ahogy ezt sokszor nevezik, 1 ezred másodpercig tart a fenti
Az ütemezés harm adik szintje választja ki valójában, hogy a futásra kész pro­ tevékenységeket mind beleértve. Tegyük fel azt is, hogy az időszelet 4 ezred másod­
cesszusok közül melyik fusson következőnek. Ezt gyakran CPU-ütemezőnek ne­ percre van beállítva. Ezekkel a param éterekkel a CPU 4 ezred m ásodperc hasznos
vezik, és az em berek általában erre gondolnak, amikor az ütemezőről beszélnek. munka után kénytelen 1 ezred m ásodpercet tölteni a processzusátkapcsolással.
Bármilyen megfelelő algoritmus használható itt, akár megszakítható, akár nem A CPU-idő 20%-a kárba vész az adminisztrációs költségekre. Ez nyilván túl sok.
megszakítható. A fentebb említettek, és néhány, a következő részben tárgyalandó A CPU hatékonyságának javítására beállíthatnánk az időszeletet mondjuk 100
is ezek közé tartozik. ezred m ásodpercre. Ekkor az elpocsékolt idő csak 1% lenne. De fontoljuk meg,
mi történik egy időosztásos rendszerben, ha 10 interaktív felhasználó közel egy
időben leüti az e n t e r billentyűt. Tíz processzus kerül fel a futtatható processzu­
2.4.3. Ütemezés interaktív rendszerekben sok listájára. H a a CPU éppen tétlen, az első azonnal elkezd futni, a második nem
kezdhet el futni, csak 100 ezred másodperc múlva, és így tovább. Lehet, hogy a
Most olyan algoritmusokat fogunk megnézni, amelyek interaktív rendszerekben szerencsétlen utolsónak 1 m ásodpercet is várnia kell, m ielőtt sorra kerül, feltéve,
használhatók. Ezek mindegyike alkalmas CPU-ütem ezőnek kötegelt rendszerben hogy a többiek kihasználják a teljes időszeletüket. A legtöbb felhasználó egy rövid
is. Bár a háromszintű ütemezés nem alkalmazható itt, kétszintű ütemezés (m em ó­ parancsra adott 1 másodperces válaszidőt igencsak lom hának találna.
riaütemezés és CPU-ütemezés) lehetséges, sőt gyakori. A továbbiakban a CPU- Egy másik szempont, hogy ha az időszelet az átlagos CPU használati periódus­
ütem ezőre és néhány gyakori ütemezési algoritmusra fogunk koncentrálni. nál hosszabbra van állítva, akkor időszelet lejárta miatti megszakítás ritkán fog
történni. Ehelyett a legtöbb processzus az időszelet lejárta előtt blokkolódik, ezzel
processzusátkapcsolást okozva. Az időszelet lejárta miatti megszakítások kiiktatá­
Round robin ütemezés sa javítja a teljesítményt, m ert így váltások csak akkor történnek, amikor logikai­
lag szükségesek, vagyis akkor, amikor a processzus úgysem tudná folytatni a futá­
Most nézzünk meg néhány konkrét ütem ező eljárást. Az egyik legrégebbi, leg­ sát, m ert várakoznia kell valamire.
egyszerűbb, legpártatlanabb és legszélesebb körben használt algoritmus a round A megfogalmazható következtetések tehát: az időszelet túl kicsire állítása túl
robin. M inden processzusnak ki van osztva egy időintervallum, amelyet időszelet­ sok processzusátkapcsolást okoz, és csökken a CPU hatékonysága; de túl nagyra
nek nevezünk, és amely alatt engedélyezett a futása. H a az időszelet végén a pro­ állítása rövid interaktív kérésekre gyenge válaszidőt eredményezhet. Az időszelet
cesszus még fut, akkor a CPU átadódik egy másik processzusnak. Ha a processzus 20-50 ezred másodperc körüli értéke gyakran ésszerű kompromisszum.
blokkolódik vagy véget ér, mielőtt az időszelet letelik, akkor term észetesen a CPU
átadása a processzus blokkolásakor megtörténik. A round robin megvalósítása
120 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 121

Prioritásos ütemezés Futtatható processzusok


Sorfejek ,_________._________,
A round robin ütemezés implicit m ódon feltételezi, hogy m inden processzus egy­ 4-es prioritási osztály (Legmagasabb prioritás)
formán fontos. A többfelhasználós számítógépeket használóknak és m űködtetők­
nek gyakran különböző véleményük van erről a témáról. Egy egyetemen a sorrend 3-es prioritási osztály
lehet: először a dékánok, azután a professzorok, a titkárok, a portások és végül a
2-es prioritási osztály
hallgatók. Külső tényezők figyelembevételének igénye a prioritásos ütemezéshez
vezet. Az alapötlet egyszerű: minden processzushoz rendeljünk egy prioritást, és a 1-es prioritási osztály (Legalacsonyabb prioritás)
legmagasabb prioritású futásra kész processzusnak engedjük meg, hogy fusson.
Még egy egyfelhasználós PC-n is lehet több processzus, amelyek közül némelyik
fontosabb, mint a másik. Például az elektronikus leveleket a háttérben elküldő 2.27. ábra. Egy ütemezési algoritmus négy prioritási osztállyal
processzus kaphatna alacsonyabb prioritást, mint a képernyőn valós időben video­
filmét megjelenítő processzus. osztályon belül. A 2.27. ábra egy rendszert m utat be négy prioritási osztállyal. Az
Annak megelőzésére, hogy a magas prioritású processzusok végtelen ideig fussa­ ütemezési algoritmus a következő: amíg van futtatható processzus a 4-es priori­
nak, az ütemező minden óraütem ben (vagyis minden órajel-megszakításnál) csök­ tási osztályban, mindegyik egy időszeletig fog futni, round robin módon, és nem
kentheti az éppen futó processzus prioritását. Amikor em iatt a prioritása a máso­ törődünk az alacsonyabb prioritási osztályokkal. H a a 4-es prioritási osztály üres,
dik legmagasabb prioritású processzusé alá csökken, akkor a processzusátkapcsolás akkor a 3-as prioritási osztály processzusai futnak round robin módon. H a mind
megtörténik. Másik megoldás lehet, hogy minden processzushoz hozzárendelünk a 4-es, mind a 3-as osztály üres, akkor a 2-es osztály fut round robin módon, és
egy maximális időszeletet, ameddig futhat. Amikor ezt az időszeletet kihasználta, a így tovább. H a a prioritások nincsenek időnként kiigazítva, akkor az alacsonyabb
következő legmagasabb prioritású processzus kap lehetőséget a futásra. prioritási osztályok akár mind éhen is halhatnak.
A prioritásokat a processzusokhoz statikusan vagy dinamikusan lehet hozzáren­ A M INIX 3 a 2.27. ábrán látotthoz hasonló rendszert használ, habár alapér­
delni. Egy katonai számítógépben a tábornokok által indított processzus kezdődhet telmezés szerint 16 prioritási osztálya van. A M INIX 3-ban az operációs rend­
a 100-as prioritásnál, az ezredesek által indított processzusé 90-nél, az őrnagyoké szer részei processzusként futnak. A M INIX 3 a taszkokat (I/O-m eghajtókat) és
80-nál, a századosoké 70-nél, a hadnagyoké 60-nál, és így tovább. Egy fizetős szá­ a szervereket (processzuskezelő, fájlrendszer és hálózati szerver) a legmagasabb
mítóközpontban a magas prioritású feladatok ára lehet 100 dollár óránként, a kö­ prioritási osztályokba teszi. Az egyes taszkok és szerverek kezdeti prioritása fordí­
zepes prioritásúaké 75 dollár óránként, az alacsony prioritásúaké 50 dollár órán­ tási időben dől el; egy lassabb I/O-eszközhöz kisebb prioritás rendelhető, mint egy
ként. A Unix-rendszerben van egy utasítás, a nice (udvarias), amely lehetővé teszi a gyorsabb I/O-eszközhöz vagy akár egy szerverhez. A felhasználói processzusok­
felhasználónak, hogy önkéntesen csökkentse a processzusa prioritását azért, hogy nak általában kisebb a prioritása, mint a rendszerkom ponenseknek, de az összes
a többi felhasználóval szemben udvarias legyen. Ezt soha senki nem használja. prioritási érték változhat a futás során.
A rendszer a prioritásokat dinamikusan is hozzárendelheti a processzusokhoz,
hogy elérjen bizonyos rendszercélokat. Például van néhány erősen I/O-igényes
processzus, és nagyon sok időt töltenek az I/O-műveletek befejezésére várva. Többszörös sorok
Mindannyiszor, amikor egy ilyen processzus igényli a CPU-t, azonnal meg kellene
kapnia, hogy lehetővé tegyük számára a következő I/O-kérés megkezdését, ami Az egyik legkorábbi prioritásos ütem ező a CTSS-ben volt (Corbató et al., 1962).
ezután m ár párhuzam osan hajtódhat végre egy másik processzus számításaival. A CTSS-nek az volt a problémája, hogy a processzusváltás nagyon lassú volt, m ert
H a sokáig váratjuk az I/O-igényes processzust a CPU-ra, akkor az csak szükségte­ a 7094-es csak egy processzust tudott a m em óriában tartani. Minden váltás abból
lenül hosszú ideig foglalja a memóriát. Egy egyszerű algoritmus, amely jó szolgál­ állt, hogy az aktuális processzust ki kellett tenni a lemezre, és be kellett olvasni egy
tatást nyújt az I/O-igényes processzusnak: a processzus prioritását állítsuk l//-re, újat a lemezről. A CTSS tervezői gyorsan rájöttek, hogy hatékonyabb, ha a CPU-
ahol/ az utolsó időszeletből a processzus által felhasznált rész. Egy olyan procesz- igényes processzusoknak időnként egy nagy időszeletet adnak, m intha gyakran
szusnak, amely csak 1 ezred m ásodpercet használt fel az 50 ezred másodperces adnak nekik kis időszeleteket (hogy csökkentsék a lapcserék számát). Másrészt,
időszeletéből, a prioritása 50 lesz, míg egy olyan processzusnak, amely 50 ezred ha nagy időszeletet adnánk minden processzusnak, az gyenge válaszidőt jelentene,
másodpercig futott blokkolódás előtt, a prioritása 2 lesz, és annak, amelyik a teljes mint azt m ár láttuk. M egoldásuk prioritási osztályok felállítása volt. A legmaga­
időszeletet kihasználta, a prioritása 1 lesz. sabb osztályban lévő processzusok egy időszeletig futnak. A következő legmaga­
Gyakran kényelmes a processzusokat prioritási osztályokba sorolni, és prio­ sabb osztályban lévő processzusok két időszeletig futnak. A következő osztályban
ritásos ütem ezést használni az osztályok között, de round robin ütem ezést egy lévő processzusok négy időszeletig futnak, és így tovább. Valahányszor egy pro­
122 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 123

cesszus elhasználja az összes, számára biztosított időszeletet, egy osztállyal lejjebb valamelyik term inálra az utasításonként becsült idő T0. Tegyük fel, hogy a követ­
kerül. kező futást 7,-nek mérjük. A becslésünket aktualizálhatjuk ennek a két számnak
Példaként tekintsünk egy processzust, amelynek 100 időszeletnyi folyamatos a súlyozott átlagát véve, vagyis az aT0 + (1 - a)T l képlettel. Az a megválasztásával
számolási időre van szüksége. Induláskor egy időszeletet kap, ezután lecserélik. meghatározhatjuk, hogy a processzus gyorsan elfelejtse-e a régi futásokat, vagy
A következő alkalommal két időszeletet kap, mielőtt lecserélik. Az ezután követ­ sokáig emlékezzen rájuk. Az a = 1/2 választással a következő egymás utáni becs­
kező futásokban 4, 8, 16, 32 és 64 időszeletet kap, bár az utolsó 64 időszeletből léseket kapjuk:
csak 37-et használ fel a munkája befejezéséhez. Csak 7 csere szükséges (beleértve
a kezdeti betöltést is) a 100 helyett, amit egy tiszta round robin algoritmus végez­ T0, T J2 + TJ2, T J4 + T J 4 + T2/2, T J 8 + T f i + T J 4 + T J 2.
ne. Továbbá, ahogy egy processzus egyre mélyebbre süllyed a prioritási sorok kö­
zött, egyre kisebb gyakorisággal fog futni, CPU-időt takarítva meg ezzel a rövid, H árom új futás után a T0súlya az új becslésben 1/8-ra csökken.
interaktív processzusok számára. Azt a technikát, hogy a sorozat következő elem ét úgy becsüljük, hogy vesszük az
A következő elv bevezetése azokat a processzusokat védi meg az örökös bün­ éppen m ért értéknek és az előző becslésnek a súlyozott átlagát, néha öregedésnek
tetéstől, amelyek induláskor hosszú futási időt igényeltek, de később interaktívvá nevezzük. Ez sok olyan esetben alkalmazható, amikor a becslést az előző értékekre
váltak. Valahányszor e n t e r - í ütöttek le egy term inálon, az ehhez a terminálhoz alapozva kell elvégezni. Az öregedést különösen könnyű megvalósítani, ha a = 1/2.
tartozó processzus a legmagasabb prioritási osztályba került, feltételezve róla, Csupán annyit kell tenni, hogy az új értéket hozzáadjuk a jelenlegi becsléshez, és
hogy interaktív lett. Egy szép napon egy felhasználó, akinek CPU-igényes procesz- az összeget elosztjuk 2-vel (1 bittel jobbra léptetve azt).
szusa volt, felfedezte, hogy ha csak ül a term inál előtt, és véletlenszerűen, néhány
másodpercenként e n t e r - t üt, akkor ez csodát tesz a válaszidejével. Ezt elmesélte a
barátainak is. A történet tanulsága: sokkal nehezebb jól csinálni valamit a gyakor­ Garantált ütemezés
latban, mint elméletben.
Sok más algoritmust is használtak már a processzusok prioritási osztályokba so­ Az ütemezés egy teljesen más megközelítése az, amikor ígéreteket teszünk a fel­
rolására. Például a nagy hatású berkeley-i XDS 940 rendszernek (Lampson, 1968) használónak a teljesítménnyel kapcsolatban, és be is tartjuk. Egy reális ígéret,
négy prioritási osztálya volt; ezeket terminálnak, I/O-nak, rövid időszeletnek és amelyet könnyű betartani, a következő: ha n felhasználó van bejelentkezve, ami­
hosszú időszeletnek neveztek. H a egy processzus, amely terminálról érkező adatok­ kor éppen dolgozol, akkor a CPU teljesítményének körülbelül 1/rc-ed részét fogod
ra várt, végre megkapta az ébresztést, átm ent a legmagasabb prioritási (terminál) megkapni. Hasonlóan, egy egyfelhasználós rendszerben, amelyben ti processzus
osztályba. H a egy processzus lemezművelet befejezésére várt, átm ent a második fut, és minden szempontból egyenlők, akkor mindegyiknek meg kell kapnia a
osztályba. H a egy processzus még futott, amikor elfogyott az időszelete, kezdetben CPU-ciklusok 1/tt-ed részét.
a harmadik osztályba került. Azonban ha egy processzus egymás után túl sokszor Hogy betartsuk az ígéretet, a rendszernek nyomon kell követnie, hogy egy pro­
használta el az időszeletét anélkül, hogy terminál vagy I/O m iatt blokkolódott volna, cesszus mennyi CPU-időt kapott létrehozása óta. Ezután mindegyikhez kiszámít­
lekerült a legalsó sorba. Sok más rendszer használ ehhez hasonlót, hogy kedvezzen ja a neki járó mennyiségét, nevezetesen a létrehozása óta eltelt időt osztja n-nel.
az interaktív felhasználóknak és processzusoknak a háttérben futókkal szemben. Mivel m inden processzusnak ismerjük az eddig elhasznált CPU-idejét, egyszerű
kiszámolni az aktuálisan felhasznált CPU és a neki járó CPU arányát. A 0,5 arány
azt jelenti, hogy a processzus csak a felét használta fel annak, mint amit felhasz­
Legrövidebb processzus következzen nálhatott volna, a 2,0 arány pedig azt, hogy a processzus kétszer annyit használt
fel, mint amennyi megillette volna. Az algoritmus ezután a legkisebb arányszám­
Mivel a legrövidebb feladatot először módszer mindig minimális átlagos válasz­ mal rendelkező processzust fogja futtatni, amíg az arányszám meg nem haladja a
időt ad kötegelt rendszerben, jó lenne, ha alkalm azhatnánk interaktív processzu­ legközelebbi versenytársáét.
sokra is. Bizonyos mértékig alkalmazhatjuk. Az interaktív processzusok általában
a következő sémát követik: várakozás utasításra, utasítás végrehajtása, várakozás
utasításra, utasítás végrehajtása, és így tovább. H a m inden utasítás végrehajtását Sorsjáték-ütemezés
külön „feladatnak” tekintenénk, akkor minimalizálhatnánk az összválaszidőt, a
legrövidebbet futtatva először. Az egyetlen problém a annak kitalálása, hogy a pár­ ígéretet tenni a felhasználónak, és aztán betartani, remek ötlet ugyan, de nehéz
huzamosan futtatható processzusok közül melyik a legrövidebb. megvalósítani. Egy másik algoritmust használva azonban hasonlóan megjósolható
Egy megközelítés az, hogy becsléseket végzünk a múltbeli viselkedés alapján, eredm ényt kapunk, de a megvalósítás sokkal könnyebb. Ezt sorsjáték-ütemezés­
és a processzust a legkisebb becsült futásidő alapján futtatjuk. Tegyük fel, hogy nek nevezzük (Waldspurger és Weihl, 1994).
124 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 125

Az alapötlet az, hogy minden processzusnak sorsjegyet adunk a különböző Például tekintsünk egy rendszert két felhasználóval, m indkettőnek 50% CPU-
rendszererőforrásokhoz, mint például a CPU-időhöz. H a ütemezési döntést kell időt ígértünk. Az 1-es felhasználónak négy processzusa van, A , B, C és D, a 2-es
hozni, egy sorsjegyet véletlenszerűen kiválasztunk, és az a processzus kapja meg felhasználónak csak egy, E. Round robin ütemezéssel egy lehetséges ütemezési
az erőforrást, amelynél a sorsjegy van. Am ikor ezt CPU-ütem ezésre használjuk, sorozat, amelyik figyelembe veszi a keretfeltételeket:
akkor a rendszer m ásodpercenként akár 50-szer is tarthat sorshúzást, a nyertes
20 ezred másodperc CPU-időt kap nyereményként. AEBECEDEAEBECEDE...
George Orwell nyomán: „M inden processzus egyenlő, de néhány processzus
egyenlőbb.” A fontosabb processzusok többlet sorsjegyeket kaphatnak, hogy nö­ Másrészről ha az 1-es felhasználónak kétszer annyi CPU-idő jár, mint a 2-esnek,
veljék a nyerési esélyeiket. H a 100 sorsjegyet adtunk ki, és egy processzusnak akkor ezt kaphatjuk:
20 van, akkor minden sorsolásnál 20% a nyerési esélye. Hosszú távon ez kb. 20%
CPU-időt eredményez. A prioritásos ütemezéssel ellentétben, ahol nagyon nehéz ABECDEABECDE...
megállapítani, hogy mit is jelent pontosan az, hogy a prioritás 40, itt a szabály vilá­
gos: ha egy processzus a sorsjegyek/-ed részét birtokolja, akkor meg fogja kapni a Természetesen sok más lehetőség van még, és ki is lehet használni attól függően,
kérdéses erőforrás kb. /-ed részét. hogy mit tekintünk arányosnak.
A sorsjáték-ütemezésnek számos érdekes tulajdonsága van. Például ha egy új
processzus tűnik fel, és adunk neki néhány sorsjegyet, akkor a legközelebbi húzá­
son a sorsjegyei számának arányában van esélye a nyereményre. Más szavakkal a 2.4.4. Ütemezés valós idejű rendszerekben
sorsjáték-ütemezéssel nagyon jó a válaszidő.
Együttműködő processzusok átadhatják egymásnak a sorsjegyeiket, ha akarják. Egy valós idejű rendszerben az idő alapvető szerepet játszik. Jellemzően egy vagy
Például ha egy kliens küld egy üzenetet a szervernek, és ezután blokkol, akkor több külső fizikai eszköz ingert küld a számítógép felé, amire annak megfelelően
átadhatja az összes sorsjegyét a szervernek, hogy megnövelje annak esélyeit a kö­ reagálnia kell egy adott időn belül. Például egy CD-lejátszóban lévő számítógép
vetkező futásra. Amikor a szerver befejezte, visszaadja a sorsjegyeket a kliensnek, biteket kap a meghajtótól, és ezeket nagyon rövid időn belül zenévé kell átalakíta­
így az ismét futhat. Valójában kliensek hiányában a szervernek egyáltalán nincs nia. H a a számolás túl sokáig tart, akkor a zene furcsán szól. Valós idejű rendszer
szüksége sorsjegyekre. lehet még a betegfigyelő rendszer egy kórház intenzív osztályán, a robotpilóta a
A sorsjáték-ütemezéssel olyan problém ákat is m egoldhatunk, amelyeket más repülőgépen vagy a robotvezérlő egy autom atizált gyárban. Ezekben az esetekben
módszerekkel nehéz kezelni. Egy példa a videoszerver, amelyben több procesz- egy túl későn kapott jó válasz gyakran ugyanolyan rossz, m intha egyáltalán nem
szus videofolyamot állít elő kliensei részére, de különböző sebességgel. Tegyük fel, kaptunk volna semmit.
hogy a processzusoknak m ásodpercenként 10,20 és 25 képkockára van szükségük. A valós idejű rendszereket általában két kategóriába soroljuk: szigorú valós
Azzal, hogy a processzusok létrehozásukkor 10, 20 és 25 sorsjegyet kapnak, auto­ idejű rendszerek, ami azt jelenti, hogy abszolút határidők vannak, amelyeket kö­
matikusan felosztják a CPU-időt a megfelelő, azaz 10 : 20 : 25 arányban. telező betartani, és toleráns valós idejű rendszerek, ami azt jelenti, hogy néha
egy-egy határidő elmulasztása nem kívánatos ugyan, de azért tolerálható. A valós
idejű viselkedés mindkét esetben azzal érhető el, hogy a program ot több procesz-
Arányos ütemezés szusra osztjuk, mindegyiknek a viselkedése megjósolható és előre ismert. Ezek a
processzusok általában rövid életűek, és jóval egy m ásodpercen belül befejeződ­
Eddig feltételeztük, hogy minden processzust önmagában ütemezünk, tekintet nél­ hetnek. Külső esemény észlelésekor az ütem ező feladata a processzusok olyan
kül arra, hogy ki a tulajdonosa. Ennek eredményeképpen, ha az 1-es felhasználó ütemezése, hogy m inden határidő be legyen tartva.
elindít 9 processzust, a 2-es felhasználó pedig 1 processzust, akkor round robin üte­ Az események, amelyekre egy valós idejű rendszernek esetleg válaszolni kell,
mezés és egyenlő prioritások esetén az 1-es felhasználó a CPU 90%-át kapja, a 2-es tovább csoportosíthatók: periodikusak (rendszeres intervallumonként fordul­
felhasználó pedig csak a 10%-át. nak elő) és aperiodikusak (megjósolhatatlan az előfordulásuk). Lehet, hogy egy
E nnek megakadályozására némelyik rendszer ütem ezéskor figyelembe veszi, rendszernek több periodikus eseménysorozatot kell kezelnie. Attól függően, hogy
hogy ki a processzus tulajdonosa. Ebben a m odellben m inden felhasználó kap mennyi idő szükséges az egyes események feldolgozásához, előfordulhat, hogy
valam ekkora hányadot a CPU-időből, és az ütem ező úgy választja ki a folyama­ nem tudja mindet kezelni. Például ha m darab periodikus eseményünk van, és az
tokat, hogy ezt kikényszerítse. Tehát ha két felhasználónak a CPU 50-50%-a lett i esemény periódusa P., kezelésére C másodperc CPU-időre van szükség, akkor
előirányozva, akkor ennyit fognak kapni attól függetlenül, hogy hány processzust csak abban az esetben kezelhetők a sorozatok, ha
futtatnak.
126 2. PROCESSZUSOK 2.4. ÜTEMEZÉS 127

rn 2.4.6. Szálütemezés
1=1 t'i Am ikor a processzusokon belül több végrehajtási szál van, akkor kétszintű párhu­
Azokat a valós idejű rendszereket, amelyek ezt a feltételt teljesítik, ütemezhető- zamossággal állunk szemben: processzusok és szálak. Az ilyen rendszerekben az
nek nevezzük. ütemezés alapvetően más attól függően, hogy felhasználói szintű vagy kernelszintű
Példaként tekintsünk egy toleráns valós idejű rendszert három periodikus ese­ szálakat támogat-e a rendszer (esetleg mindkettőt).
ménnyel, 100, 200 és 500 ezred másodperc periódussal. H a ezek feldolgozása Tekintsük először a felhasználói szintű szálakat. Mivel a kernel nem tud a szá­
eseményenként rendre 50, 30 és 100 ezred másodperc CPU-időt igényel, akkor a lak létezéséről, úgy működik, ahogy szokott. Kiválaszt egy processzust, mondjuk
rendszer ütemezhető, m ert 0,5 + 0,15 + 0,2 < 1. H a egy negyedik - 1 másodperces azA -i, és átadja neki a vezérlést egy időszelet erejéig. Az/1-n belül a szálütemező
periódusú - eseményt hozzáveszünk, akkor a rendszer egészen addig ütem ezhető dönti el, hogy melyik szál fusson, mondjuk az A l . Mivel a szálak párhuzam os fut­
m arad, amíg ennek az eseménynek a feldolgozása nem igényel többet 150 ezred tatásához nincs időzítőmegszakítás, a kiválasztott szál addig futhat, ameddig akar.
m ásodperc CPU-időnél. Ez a számítás közvetve feltételezi, hogy a környezetátkap­ H a elhasználja a processzus teljes időszeletét, akkor a kernel másik processzusra
csolás költsége elhanyagolhatóan kicsi. kapcsol át.
A valós idejű ütemezési algoritmusok dinamikusak vagy statikusak lehetnek. Amikor az A processzus végül újra futhat, akkor az A l szál fut tovább. Addig
Az előbbi az ütemezési döntéseket futás közben hozza, az utóbbi a rendszer futá­ fogja használni az A összes idejét, amíg be nem fejeződik. Antiszociális viselkedé­
sának megkezdése előtt. A statikus ütem ezés csak akkor működik, ha előre teljes se azonban nem érinti a többi processzust. Azok meg fogják kapni azt, amit az üte­
információnk van az elvégzendő feladatokról és a határidőkről is. A dinamikus al­ mező jogosnak tekint, függetlenül attól, hogy mi zajlik az A processzuson belül.
goritmusok esetében nincsenek ilyen korlátozások. Most tekintsük azt az esetet, amikor az A -n belüli szálaknak viszonylag kevés
tennivalójuk van, amikor rájuk kerül a sor, például 5 ezred másodpercnyi munka
egy 50 ezred m ásodperces időszeletben. Em iatt mindegyik fut egy kicsit, majd visz-
2.4.5. Elvek és megvalósítás szaadja a vezérlést a szálütemezőnek. Ez például az A l , A 2, A 3, A l , A 2, A 3, A l ,
A 2 ,A 3 ,A 1 sorozathoz vezethet, mielőtt a kernel a B processzusra vált. Ez a hely­
Mostanáig hallgatólagosan feltételeztük, hogy a rendszer m inden processzusa kü­ zet a 2.28.(a) ábrán látható.
lönböző felhasználóhoz tartozik, és így verseng a CPU-ért. Bár ez sokszor igaz, A futtató rendszer által használt ütemezési algoritmus a korábban tárgyaltak
néha mégis megtörténik, hogy egy processzusnak több gyermeke is van, amelyek közül bármelyik lehet. A gyakorlatban a round robin ütemezés és a prioritásos
a felügyelete alatt futnak. Például egy adatbázis-kezelő rendszer processzusnak
több gyermeke lehet. A gyermekek dolgozhatnak különböző lekérdezéseken, vagy A szálak A processzus 6 processzus A processzus 6 processzus
mindegyiknek lehet valamilyen speciális funkciója, amelyet végrehajt (lekérdezés­ futási
elemzés, lemezelérés stb.). Lehetséges, hogy a főprocesszus pontosan tudja, hogy sorrendje
mely gyermekei a legfontosabbak (vagy időkritikusak), és melyek legkevésbé.
Sajnos a korábban ism ertetett ütem ezők egyike sem fogad semmilyen információt 2. A futtató
a felhasználói processzusoktól az ütemezési döntésekhez. Ennek az az eredm é­ rendszer
nye, hogy csak ritkán fordul elő, hogy az ütem ező a legjobb döntést hozza meg. választ
A problém a megoldása az, hogy az ütemezés megvalósítását el kell választani egy szálat

az ütemezési elvektől. Ez azt jelenti, hogy az ütemezési algoritmust valamilyen


m ódon param éterezni kell, de a param étereket a felhasználói processzusok tölt­ 1. A kernel választ
egy processzust
hetik ki. Tekintsük ismét az adatbázis példát. Tegyük fel, hogy a kernel a prioritá­
sos ütemezési algoritmust használja, de kínál egy rendszerhívást, amellyel a pro­ Lehetséges: A1,A2, A3, A1,A2, A3 Lehetséges: A1,A2,A3,A1,A2,A3
Nem lehetséges: A1,B1, A2, B2, A3, B3 Szintén lehetséges: A1,B1, A2, B2, A3, B3
cesszus beállíthatja (és m egváltoztathatja) gyermekeinek prioritását. így a szülő
részletesen szabályozhatja gyermekei ütem ezését, még akkor is, ha ő maga nem (a) (b)
ütemez. Itt a megvalósítás a kernelben van, de az elveket a felhasználói processzus
határozza meg. 2.28. ábra. (a) Felhasználói szintű szálak egy lehetséges ütemezése 50 ezred másodperces
időszelet mellett, ha a szálak alkalmanként 5 ezred másodpercig futnak.
(b) Kernelszintű szálak lehetséges ütemezése ugyanazon feltételek mellett
128 2. PROCESSZUSOK 2.5. A MINIX 3-PROCESSZUSOK ÁTTEKINTÉSE 129

ütemezés a leggyakoribb. Az egyedüli korlátozás az, hogy nincs időzítő, amellyel tót - üzenetküldéssel. Ez a felépítés sokkal m odulárisabb és rugalmasabb szerke­
meg lehetne szakítani egy túl hosszan futó szálat. zetet eredményez, lehetővé teszi például, hogy akár az egész fájlrendszert lecse­
Most tekintsük azt a helyzetet, amikor kernelszintű szálaink vannak. Ekkor a réljük egy másikra anélkül, hogy a kernelt újra kellene fordítani.
kernel választja ki, hogy melyik szál fusson. Nem kell figyelembe vennie, hogy a
szál melyik processzushoz tartozik, de megteheti, ha akarja. A szál kap egy idősze­
letet, és erővel fel lesz függesztve, ha túllépné a kiszabott időt. H a 50 ezred m á­ 2.5.1. A MINIX 3 belső szerkezete
sodperces az időszelet, de a szálak blokkolódnak 5 ezred m ásodperc után, akkor a
sorrend egy körülbelül 30 ezred másodperces időszakra lehet példáuM /, B 1,A 2, Kezdjük a M INIX 3 tanulmányozását a rendszer vázlatos áttekintésével. A M INIX 3
B 2,A 3, B3, ami viszont nem lehetséges ugyanezekkel a feltételekkel, ha felhaszná­ négy rétegből áll, ezek mindegyike egy jól m eghatározott funkciót lát el. A négy ré­
lói szintű szálak vannak. Ez a helyzet részlegesen a 2.28.(b) ábrán látható. teg a 2.29. ábrán látható.
A felhasználói szintű és a kernelszintű szálak közötti nagy különbség a telje­ A kernel a legalsó rétegben ütemezi a processzusokat és kezeli a 2.2. ábrán lát­
sítményben van. Felhasználói szinten egy szálváltás néhány gépi utasítással meg­ ható futásra kész, futó és blokkolt állapotok közötti átm eneteket. Az üzenetke­
oldható. Kernelszintű szálak esetén teljes környezetátkapcsolásra van szükség, zeléshez szükséges a címzett érvényességének ellenőrzése, pufferek kialakítása a
m em óriatérképet kell váltani, és érvényteleníteni a gyorsítótárat, ami nagyságren­ fizikai m em óriában üzenetek küldése és fogadása esetén, valamint a bájtok átm á­
dekkel lassabb. M ásrészről kernelszintű szálak esetében, ha egy szál I/O-művelet solása a küldőtől a címzetthez. A kernel része még az I/O-kapukhoz való hozzáfé­
m iatt blokkolódik, akkor nem blokkolja az egész processzust, mint felhasználói rés és a megszakítások támogatása, amelyhez a m odern mikroprocesszorokon az
szintű szálak esetén. egyszerű processzusok számára nem elérhető, privilegizált kernel módú utasításo­
Mivel a kernel tudja, hogy az A processzus egy száláról átváltani a B processzus kat kell használni.
egy szálára költségesebb, mint az A egy másik szálára (a m em ória térkép cseréje A kernel mellett ez a réteg tartalm az még két modult, amelyek az eszközmeg­
és a gyorsítótár tartalm ának elvesztegetése m iatt), ezt figyelembe veheti, amikor a hajtókhoz hasonlóan működnek. Az időzítőtaszk egy I/O-eszközmeghajtó abban
döntéseit meghozza. Például ha van két szál, amelyek egyébként egyformán fonto­ az értelem ben, hogy az időzítőjeleket generáló hardverrel áll kapcsolatban, de
sak, de az egyik ugyanahhoz a processzushoz tartozik, mint az éppen blokkolódon nem lehet hozzáférni úgy, mint egy lemez- vagy kommunikációs vonal m eghajtójá­
szál, a másik pedig egy másik processzushoz, akkor az előző előnyt élvezhet. hoz - csak a kernelhez kapcsolódik.
Egy másik fontos szempont, hogy a felhasználói szintű szálak használhatnak Az 1-es réteg egyik legfőbb funkciója az, hogy elérhetővé teszi a kernelhívásokat
alkalmazásfüggő szálütemezőt. Például tekintsünk egy webszervert egy diszpé­ a fölötte elhelyezkedő eszközmeghajtóknak és szervereknek. Ezek között találha­
cserszállal, amely a beérkező kéréseket fogadja és kiosztja feldolgozószálaknak. tó az I/O-kapuk írása/olvasása, címtartományok közötti adatmozgatás stb. A hí­
Tegyük fel, hogy egy feldolgozószál éppen blokkolódott, és hogy a diszpécserszál vások megvalósítását a rendszertaszk tartalmazza. H abár a rendszertaszk és az
és két további feldolgozószál kész a futásra. Melyik legyen a következő? A futtató időzítőtaszk bele van fordítva a kernel címtartományába, külön processzusként
rendszer ismeri az egyes szálak feladatait, és könnyen választhatja a diszpécsert, ütem eződnek és saját hívási vermük van.
hogy az elindíthasson egy újabb feldolgozót. Ez a stratégia maximalizálja a p ár­ A kernel nagy része, az időzítő- és a rendszertaszk teljes egészében C-ben van
huzamosságot olyan környezetben, ahol a feldolgozók gyakran blokkolódnak le­ megírva. A kernel egy kis része assembly kódban van. Az assembly kódú részek a
mezműveletek miatt. Kernelszintű szálak esetén a kernel nem ism erheti a szálak
tevékenységi körét (habár prioritást lehet hozzájuk rendelni). Á ltalában azonban Réteg
az alkalmazásfüggő szálütemezők jobban be tudják hangolni az alkalmazásokat, Felhasználói Felhasználói Felhasználói
Init Felhasználói
mint a kernel. processzus processzus processzus processzusok
Processzus­ Fájl- Info- Hálózati Szerver­ Felhasználói
kezelő rendszer szerver szerver processzusok szint
TTY- Eszköz-
2.5. A MINIX 3-processzusok áttekintése Lemez-
meghajtó
meg-
Ethernet-
meghajtó
meghajtók
hajtó
M iután tanulmányoztuk a processzuskezelés, a processzusok közötti kom m uniká­ Időzítő- i Rendszer­ Kernel­
Kernel Kernel
ció és az ütemezés alapjait, áttekinthetjük, hogyan alkalmazzuk ezeket a M INIX 3 taszk 1 taszk szint
esetében. Míg a Unix magja monolitikus, azaz nincs m odulokra bontva, addig a
M INIX 3-processzusok együttese, melyek egymással és a felhasználói processzu­ 2.29. ábra. A MINIX 3 négy rétegbe van rendezve. Csak a legalsó réteg processzusai
sokkal egyetlen kommunikációs alapmechanizmus segítségével tartanak kapcsola- használhatnak privilegizált (kernel módú) utasításokat
130 2. PROCESSZUSOK 2.5. A MINIX 3-PROCESSZUSOK ÁTTEKINTÉSE 131

megszakításkezeléssel, a processzusátkapcsolás alacsony szintű részleteivel (re­ követési és állapotinformációt szolgáltat más meghajtókról és szerverekről. Ez
giszterek mentése/visszatöltése és hasonlók) és az MMU- (Memory M anagem ent fontosabb egy olyan operációs rendszerben, mint a M INIX 3, amely kísérletezésre
U nit - m emóriakezelő egység) hardver alacsony szintű kezelésével foglalkoznak. készült, és kevésbé fontos egy kereskedelmi célú operációs rendszerben, amelyet a
Nagyjából az assembly kód a kernelnek azokat a részeit érinti, amelyek nagyon ala­ felhasználó nem m ódosíthat. A reinkarnációs szerver (reincarnation server, RS)
csony szinten közvetlenül a hardvert érik el, és nem lehet megírni C-ben. Ezeket a elindít, és ha kell, újraindít olyan taszkokat, amelyek nem a kernellel együtt kerül­
részeket újra kell írni, ha a M INIX 3-at új architektúrára akarjuk átvinni. tek betöltésre. Konkrétan, a reinkarnációs szerver észreveszi, ha egy eszközmeg­
A kernel fölött elhelyezkedő három réteget egy rétegnek is tekinthetjük, m ert hajtó hibásan működik, leállítja, ha még nem állt le, és egy új példányt indít, ezzel
alapvetően a kernel mindegyiket ugyanúgy kezeli. Mindegyik korlátozva van fel­ nagyban hibatűrővé téve a rendszert. A legtöbb operációs rendszerből hiányzik
használói módú utasításokra, és mindegyiket a kernel ütemezi. Egyik sem férhet ez a funkcionalitás. H álózatba kötött rendszerben az opcionális hálózati szerver
hozzá közvetlenül az I/O-kapukhoz. Ezen túlmenően mindegyik csak a hozzáren­ (inét) is a 3-as rétegben helyezkedik el. A szerverek közvetlenül nem végezhetnek
delt memóriaszegmenseket érheti el. I/O-műveleteket, de kommunikálhatnak eszközmeghajtókkal, és I/O-műveleteket
Némelyik processzusnak azonban különleges kiváltságai vannak (például joga kérhetnek. A szerverek a kernellel is kommunikálhatnak a rendszertaszkon ke­
van kernelhívásokhoz). Ez a valódi különbség a 2-es, 3-as és 4-es rétegben elhe­ resztül.
lyezkedő processzusok között. A 2-es réteg processzusainak van a legtöbb kivált­ Ahogy az első fejezet elején említettük, az operációs rendszerek két dolgot
sága, a 3-as rétegnek kevesebb, a 4-es rétegben lévőknek pedig egyáltalán nincs. tesznek: kezelik az erőforrásokat és kiterjesztik a gép funkcióit a rendszerhívások
A 2-es rétegben lévő processzusok, az ún. eszközmeghajtók (device driver), kér­ segítségével. A M INIX 3-ban az erőforrás-kezelést nagyrészt a 2-es rétegbeli meg­
hetik például a rendszertaszkot, hogy a nevükben adatot olvasson vagy küldjön hajtók végzik, a kernelréteg besegít, amikor I/O-kapukhoz kell hozzáférni, vagy
valamelyik I/O-kapura. M inden eszköztípushoz külön m eghajtóra van szükség, a a megszakításrendszerre van szükség. A rendszerhívások értelmezését a procesz-
lemezekhez, nyomtatókhoz, terminálokhoz és hálózati csatolókhoz. H a más I/O- szuskezelő és a fájlrendszerszerverek végzik a 3-as rétegben. A fájlrendszer gon­
eszközök is vannak a rendszerben, akkor azokhoz is kell meghajtó. Az eszközmeg­ dos tervezéssel „szervereként lett kialakítva, ezért kis módosítással távoli gépre is
hajtók más kernelhívásokat is igénybe vehetnek, például kérhetik, hogy az éppen áthelyezhető lenne.
beolvasott adatok egy másik processzus címtartományába másolódjanak át. Új szerver beillesztésekor a kernelt nem kell újrafordítani. A processzuskeze­
A 3-as réteg szervereket tartalmaz; ezek olyan processzusok, amelyek a fel­ lőt és a fájlrendszert ki lehet egészíteni egy hálózati szerverrel és más szerverek­
használói processzusok számára hasznos szolgáltatásokat nyújtanak. Két nélkü­ kel is, akár a M INIX 3 betöltésekor, vagy akár később is. Az eszközkezelők és a
lözhetetlen szerver van. A processzuskezelő (process manager, PM) hajtja végre szerverek is közönséges végrehajtható állományként helyezkednek el a lemezen,
mindazokat a M INIX 3-rendszerhívásokat, amelyek processzusok indításával/ de megfelelő m ódon indítva megkapják a működésükhöz szükséges privilégiumo­
leállításával járnak, m int például a fork, exec és exit, illetve a szignálok kezelésével kat. Egy szolgáltatás (service) nevű felhasználói program nyújtja a felületet az
kapcsolatosakat, m int például az alarm és a kill, m ert ezek m egváltoztathatják a ezt kezelő reinkarnációs szervernek. Jóllehet a m eghajtók és a szerverek önálló
processzusok állapotát. A processzuskezelő a memória kezeléséért is felelős, pél­ processzusok, abban különböznek a felhasználói processzusoktól, hogy a rendszer
dául a brk rendszerhívás tartozik ide. A fájlrendszer (file system, FS) hajtja végre működése alatt soha nem állnak le.
a fájlrendszerrel kapcsolatos összes rendszerhívást, mint a read, mount és chdir. A 2-es és 3-as rétegben elhelyezkedő m eghajtókat és szervereket együtt gyak­
Fontos megérteni a kernelhívások és a POSIX-rendszerhívások közötti különb­ ran rendszerprocesszusként fogjuk emlegetni. A rendszerprocesszusok nyilván az
séget. A kernelhívások a rendszertaszk által nyújtott alacsony szintű funkciók, operációs rendszer részei. Nem tartoznak egyetlen felhasználóhoz sem, és jósze­
amelyek a taszkoknak és a s z e rv e re k re segítséget nyújtanak feladatuk elvég­ rével mindegyik még azelőtt elindul, hogy az első felhasználó bejelentkezne. A fel­
zésében. Egy hardver I/O-kapu olvasása tipikusan kernelhívást igénylő művelet. használói és rendszerprocesszusok közötti másik különbség, hogy a rendszerpro­
Ezzel szemben a POSIX read, fork és unlink magas szintű hívások, amelyeket a cesszusok magasabb prioritással futnak. Valójában az eszközmeghajtóknak a szer­
POSIX szabvány definiál; ezek a 4-es réteg felhasználói program jainak rendel­ verekénél magasabb prioritása van, de ez nem automatikus. A prioritás egyedileg
kezésére állnak. A felhasználói program ok sok POSIX-hívást tartalmaznak, de kerül m eghatározásra a M INIX 3-ban; lehetséges, hogy egy lassú eszközt kezelő
kernelhívást egyáltalán nem. Néha amikor nem fogalmazunk elég körültekintően, meghajtó alacsonyabb prioritást kap, mint egy olyan szerver, amelynek gyorsan
akkor kernelhívás helyett esetleg rendszerhívásról beszélünk. A kettőnek hasonló kell reagálnia.
a mechanizmusa, és a kernelhívások a rendszerhívások speciális fajtájának tekint­ Végül a 4-es réteg tartalmazza a felhasználói processzusokat - parancsértel­
hetők. mezőket, szövegszerkesztőket, fordítóprogram okat és a felhasználók által írt
A PM és FS m ellett más szerverek is vannak a 3-as rétegben. Ezek M INIX 3 a.out programokat. Sok felhasználói processzus jön létre és szűnik meg, ahogy a
specifikus feladatokat végeznek. Azt kijelenthetjük, hogy processzuskezelő és fájl- felhasználók bejelentkeznek, dolgoznak és kijelentkeznek. A működő rendszer
rendszer minden operációs rendszerben van. Az információs szerver (IS) nyom­ általában tartalm az néhány olyan processzust, amelyek a rendszer indítása után
2. PROCESSZUSOK 2.5. A MINIX 3-PROCESSZUSOK ÁTTEKINTÉSE 133
132

állandóan futnak. Ezek egyike az init, amelyet a következő részben fogunk leírni. lemez lesz az indítólemez. A sorrend átállítható is lehet, ha bekapcsolás után belé­
Valószínűleg sok dém on is futni fog. A démon egy olyan háttérprocesszus, amely pünk a BlOS-ba. Más, különösen hordozható eszközöket is meg lehet adni.
periodikusan fut, vagy állandóan valamely esemény bekövetkezésére vár, példá­ Am ikor a számítógépet bekapcsoljuk, és az indítólemez egy hajlékonylemez, ak­
ul hálózati csomag érkezésére. Bizonyos értelem ben a démon egy olyan szerver, kor a hardver beolvassa a m em óriába az indítólemez első sávjának első szektorát,
amely önállóan indul, és felhasználói processzusként fut. A valódi, induláskor ak­ és végrehajtja az ott található programot. Hajlékonylemez esetében a kérdéses
tivizált szerverekhez hasonlóan a dém onok konfigurálhatók úgy, hogy a közönsé­ szektor az indító- (bootstrap) program ot tartalmazza. Ez egy nagyon rövid prog­
ges felhasználói processzusokénál magasabb prioritást kapjanak. ram, mivel el kell férnie egyetlen szektorban (512 bájt). A M INIX 3-indítóprogram
A taszk (task) és az eszközmeghajtó (device driver) elnevezésekkel kapcsolat­ betölti a nagyobb boot programot, amely aztán betölti magát az operációs rend­
ban egy megjegyzést kell tennünk. A M INIX régebbi verzióiban az összes meghaj­ szert.
tó a kernellel együtt volt fordítva, ami elérhetővé tette számukra a kernel és egy­ Az előzőkkel ellentétben a merevlemezek egy közbenső lépést igényelnek. Egy
más adatszerkezeteit. Az I/O-kapukat is közvetlenül elérhették. A nevük „taszk” merevlemez partíciókra van osztva, az első szektor egy rövid program ot és a lemez
volt, hogy meg lehessen különböztetni őket a sima felhasználói processzusoktól. partíciós tábláját tartalmazza. Ezeket együtt elsődleges indítórekordnak (master
A M INIX 3-ban az eszközmeghajtók teljesen a felhasználói területen lettek imp­ boot record) nevezzük. A programrész végrehajtásra kerül, ennek során kiolvassa
lementálva. Az egyedüli kivétel az időzítőtaszk, amely nyilván nem olyan esz­ a partíciós táblát és beállítja az aktív partíciót. Az aktív partíció első szektora tar­
közmeghajtó, mint azok, amelyeket a felhasználói processzusok eszközfájlokon talmaz egy indítóprogramot, amely betöltése és elindítása után megkeresi és fut­
keresztül elérhetnek. A rra törekedtünk, hogy a szövegben a „taszk” szó csak az tatja a partíció boot program ját ugyanúgy, mint a hajlékonylemez esetében.
időzítő- és a rendszertaszkkal összefüggésben forduljon elő, amelyek be vannak A CD-ROM -ok később jelentek meg, mint a hajlékonylemezek és a merev­
fordítva a kernelbe a megfelelő működés érdekében. Fáradságot nem kímélve le­ lemezek. H a CD-ről lehet indítani a rendszert, akkor több lehetőség van, mint
cseréltük a „taszk” előfordulásait „eszközmeghajtó”-ra, amikor felhasználói terü­ egyetlen szektor betöltése. CD-ROM -ról induláskor a számítógép egy nagy adat­
leten futó eszközmeghajtóról esik szó. A függvények és változók neveit, valamint blokkot képes azonnal a m em óriába tölteni. Rendszerint a CD-ről egy indító­
a forráskódban található megjegyzéseket azonban nem írtuk át teljeskörűen. így a lemez tartalm ának pontos m ásolatát töltik a memóriába, ezt a területet RAM-
M INIX 3 tanulmányozása közben előfordulhat, hogy a forráskódban a „task” szót lemezként (RAM disk) használja a rendszer a továbbiakban. Az első lépés után
találjuk ott, ahol „device driver”-nek kellene állni. a vezérlés a RAM -lemezre adódik át, és m inden pontosan úgy történik, m intha
fizikailag egy hajlékonylemez lenne az indítólemez. Olyan régebbi számítógépe­
ken, amelyekben van ugyan CD-meghajtó, de nem lehet róluk rendszert indítani,
a C D-ről az indítólemez tartalm át egy hajlékonylemezre kell másolni, amelyet az­
2.5.2. Processzuskezelés a M INIX 3-ban
tán indítólem ezként lehet használni. A CD-nek term észetesen a meghajtóban kell
A M INIX 3-processzusok megfelelnek annak az általános modellnek, amelyet e lennie, m ert a hajlékonylemezes indításkor szükség van rá.
fejezet korábbi részében részletesen ismertettünk. A processzusok létrehozhat­ M inden esetben a boot a hajlékonylemezen vagy a partícióban megkeres egy
nak alprocesszusokat, ezek szintén létrehozhatnak újabb alprocesszusokat, így egy több részből álló állományt, és az egyes részeket a m em ória megfelelő részeibe
processzusfához jutunk. Valójában a rendszer m inden felhasználói processzusa tölti. Ez a betöltési memóriakép (boot image). A legfontosabb részek a kernel (ez
része annak a processzusfának, amelynek gyökere az init (lásd 2.29. ábra). A szer­ tartalm azza az időzítőtaszkot és a rendszertaszkot), a processzuskezelő és a fájl-
verek és az eszközmeghajtók term észetesen speciális esetek, m ert némelyiket az rendszer. Ezenkívül még legalább egy lemezmeghajtót is be kell tölteni a m em ó­
összes felhasználói processzus előtt kell elindítani, beleértve az init-et is. riakép részeként. Sok más program is van még, közöttük a reinkarnációs szerver,
a RAM-lemez, konzol, naplózó m eghajtók és az init.
Hangsúlyozni kell, hogy a betöltési mem óriakép részei különálló programok.
A M IN IX 3 elindulása M iután az alapvető kernel, processzuskezelő és fájlrendszer betöltődött, a rend­
szer további részeit egyenként be lehet tölteni. Kivétel a reinkarnációs szerver;
Hogyan indul egy operációs rendszer? A M INIX 3 indulási lépéseit a következő ennek a mem óriakép részének kell lennie. Ez ad az inicializáció után betöltött
néhány oldalon összefoglaljuk. Néhány másik operációs rendszer indulásával kap­ közönséges processzusoknak különleges jogokat, hogy rendszerprocesszusok le­
csolatban lásd (Dodge et al., 2005). hessenek. A valamilyen hiba m iatt m űködésképtelenné vált eszközmeghajtókat is
A legtöbb lemezegységgel ellátott számítógépen van egy indítólemez- (boot újra tudja indítani, erre utal a neve is. Ahogy korábban említettük, legalább egy le­
disk) hierarchia. Jellemzően, ha van lemez a hajlékonylemezes m eghajtóban, az mezmeghajtó m indenképpen szükséges. Ha a gyökérfájlrendszert RAM-lemezre
lesz az indítólemez. H a nincs hajlékonylemez, de van CD a meghajtóban, akkor a akarjuk másolni, akkor a m em óriam eghajtóra is szükség van, egyébként később
CD lesz az indítólemez. H a se hajlékonylemez, se CD nincs, akkor az első m erev­ is betölthető. A tty és a lóg m eghajtók opcionálisak a betöltési memóriaképben.
134 2. PROCESSZUSOK 2.5. A MINIX 3-PROCESSZUSOK ÁTTEKINTÉSE 135

Komponens Leírás Betöltő (időzítő-) és a SYSTEM (rendszer-) taszkok különleges processzusok, a kernelen
kernel Kernel + időzítő- és rendszertaszk (betöltési memóriaképben van) belül futnak, és kívülről nem látszanak. Nincs PID-jük, és nem részei semmilyen
pm Processzuskezelő (betöltési memóriaképben van) processzusfának. A processzuskezelő az első felhasználói processzus; a PID-je 0,
fs Fájlrendszer (betöltési memóriaképben van) és nem gyermeke és nem is szülője egyetlen más processzusnak sem. A reinkar­
rs (Újra)indítja a szervereket és meghajtókat (betöltési memóriaképben van) nációs szerver lesz a szülője az összes többi, a betöltési memóriaképben található
memory RAM-lemezmeghajtó (betöltési memóriaképben van) processzusnak (például szerverek, meghajtók). Em ögött az a logika, hogy a rein­
lóg Puffereli a naplózási üzeneteket (betöltési memóriaképben van) karnációs szervernek értesülnie kell róla, ha az előbbiek közül valamelyiket újra
Konzol- és billentyűzetmeg hajtó (betöltési memóriaképben van) kell indítani.
tty
driver Lemez- (at, bios, hajlékonylemez) meghajtó (betöltési memóriaképben van) Ahogy látni fogjuk, még az init indulása után is vannak különbségek a M INIX 3
init Az összes felhasználói processzus szülője (betöltési memóriaképben van) és a hagyományos processzusfa-építési módszerek között. A Unix-szerű rend­
floppy Hajlékonylemez-meghajtó /etc/rc szerekben az init PID-je 1, és habár a M INIX 3-ban az init nem az első elindí­
is Információs szerver (nyomkövetési listákhoz) /etc/rc tott processzus, a hagyományos 1-es PID -t megkapja. Mint az összes, a betöltési
cmos A CMOS-órát olvassa az idő beállításához /etc/rc m em óriaképben elhelyezkedő felhasználói processzus (a processzuskezelő kivé­
random Véletlenszám-generátor /etc/rc telével), az init a reinkarnációs szerver egyik gyermeke lesz. A szabványos Unix-
printer Nyomtatómeghajtó /etc/rc rendszerekhez hasonlóan az init először az /etc/rc parancsfájlt hajtja végre. Ez to ­
vábbi eszközmeghajtókat és szervereket indít, amelyek nem részei a betöltési m e­
2.30. ábra. Néhány fontos MINIX 3-rendszerkomponens. Egyéb komponensek, mint például móriaképnek. Az re parancsfájl által indított összes program az init gyermeke lesz.
Ethernet-meghajtó vagy az inét szerver is szerepelhetnek itt Az elsők egyike a service nevű segédprogram. A service is az init gyermeke, ahogy
az várható. De itt a dolgok megint a megszokottól eltérően alakulnak.
Azért töltődnek be korán, m ert hasznos, ha üzeneteket tudunk megjeleníteni a A service a reinkarnációs szerver felhasználói interfésze. A reinkarnációs szer­
konzolon, és naplózni a történéseket m ár a betöltés minél koraibb szakaszában. ver elindít egy közönséges program ot, amelyet aztán rendszerprocesszussá változ­
Az init később is betölthető lenne, de ez vezérli a rendszer kezdeti konfigurálását, tat. Elindítja a floppy-í (ha betöltés közben nem volt rá szükség) a emos-1 (amelyre
és a betöltési memóriaképben volt a legegyszerűbb elhelyezni. a valós idejű óra kiolvasásához van szükség), és az w-t, az információs szervert;
Az indítás nem triviális művelet. A boot program nak kell végrehajtania az ez azokat a nyomkövetési listákat kezeli, amelyeket a konzolbillentyűzet funkció-
egyébként a lemeztaszk és a fájlrendszer hatáskörébe tartozó műveleteket, mielőtt billentyűinek (F I, F2 stb.) lenyomásakor kapunk. A reinkarnációs szerver egyik
ez utóbbiak aktivizálódnak. Később még visszatérünk a M INIX 3 elindítására. ténykedése, hogy a processzuskezelő kivételével gyermekeiként örökbe fogadja az
Egyelőre elég annyi, hogy m iután a betöltés befejeződött, a kernel elkezd futni. összes rendszerprocesszust.
Az inicializálás során a kernel elindítja a taszkokat, majd a processzuskezelőt, M iután a cmos eszközmeghajtó elindult, az re parancsfájl inicializálhatja a va­
a fájlrendszert és minden más, a 3-as rétegben futó szervert. A processzuskezelő lós idejű órát. Eddig a pontig a szükséges fájloknak azon az eszközön kell lenniük,
és a fájlrendszer ezután együttműködnek a betöltési m em óriaképben lévő más ahol a gyökérfájlrendszer is van. A kezdetben szükséges meghajtók és a szerverek
szerverek és meghajtók elindításában. Ezek elindulnak és beállítják kezdeti álla­ az /sbin könyvtárban vannak; az indításhoz szükséges többi program a Ibin-ben. Az
potukat, majd blokkolnak, és várnak arra, hogy valamilyen tennivalójuk legyen. indítás első lépéseinek befejeződése után m egtörténik a többi fájlrendszer felcsa­
A M INIX 3-ütemezés prioritásokat rendel a processzusokhoz. Amikor az összes tolása. Az re parancsfájl egyik fontos feladata annak ellenőrzése, hogy előző rend­
taszk és szerver blokkolt állapotban van, elindul az init, az első felhasználói pro­ szerleállások nem okoztak-e esetleg fájlrendszerhibákat. Az ellenőrzés egyszerű
cesszus. A betöltési m em óriaképben lévő és az inicializáció során elindított rend­ - ha a rendszer rendben áll le a shutdown parancs végrehajtásával, akkor a lusrl
szerkomponenseket a 2.30. ábra mutatja. adm/wtmp bejelentkezési naplófájlba bekerül egy bejegyzés. A shutdown -C parancs
ellenőrzi, hogy a wtmp utolsó bejegyzése megfelelő-e. Ha nem, akkor feltételezi,
hogy nem szabályszerűen állt le a rendszer, és az fsek segédprogrammal ellenőrzi
A processzusfa inicializációja a fájlrendszereket. Az léteire utolsó feladata a démonok elindítása. Ez történhet
kiegészítő parancsfájlokkal is. H a megnézzük a ps axl parancs outputját, amelyen a
Az in it a legelső felhasználói processzus, de legutolsóként töltődik be a betöltési PID-k és a szülő PID-k (PPID-k) is látszanak, akkor láthatjuk, hogy a démonok,
memóriaképből. Azt gondolhatnánk, hogy az 1.5. ábrán láthatóhoz hasonló pro­ mint például az update és a usyslogd, az elsők között vannak az állandó processzu­
cesszusfa felépítése azonnal megkezdődik, ahogy az init elindul. Nem egészen sok csoportjában, amelyek az init gyermekei.
így van. Igaz lenne egy hagyományos operációs rendszerben, de a M INIX 3 más. Legvégül az init a potenciális termináleszközök listáját tartalm azó /ete/ttytab ál­
Először is, m ár jó néhány rendszerprocesszus fut, mire az init elindul. A CLOCK lományt olvassa be. A bejelentkező term inálként szóba jöhető eszközök (a szabvá­
136 2. PROCESSZUSOK 2.5. A MINIX 3-PROCESSZUSOK ÁTTEKINTÉSE 137

nyos disztribúcióban ez csak a fő konzol és még legfeljebb három virtuális konzol, üzenetet fogad a souree processzustól (A N Y esetén bármelyiktől), és
de soros vonali és hálózati term inálokat is fel lehet venni) esetében az /etc/ttytab
tartalm az bejegyzést a getty mezőben, és az init minden ilyen terminál számára el­ sendrec(src_dst, &message);
indít egy alprocesszust. Normál esetben m inden ilyen alprocesszus a /usr/bin/getty
program ot futtatja, amely egy üzenet kiírása után egy név begépeléséig várakozik. üzenetet küld egy processzusnak, majd várakozik, hogy ugyanaz a processzus
H a valamelyik term inál speciális elbánást igényel (például telefonvonali összeköt­ választ küldjön. M indhárom esetben a második param éter az üzenet lokális cí­
tetés esetén), akkor az /etc/ttytab olyan program ot (például lusr/bin/stty) is m egad­ me. A kernelben lévő üzenetküldő mechanizmus az üzenetet a küldőtől a foga­
hat, amely elvégzi a vonal kezdeti állapotának beállítását a getty futtatása előtt. dóhoz másolja. A válasz (sendrec esetében) felülírja az eredeti üzenetet. Elvileg
Amikor a felhasználó begépelte az azonosítóját, akkor ezzel a névvel mint argu­ ezt a kernelmechanizmust le lehetne cserélni egy olyanra, amely hálózaton ke­
mentummal meghívódik a lusr/bin/login program. A login eldönti, hogy kell-e jel­ resztül az üzeneteket eljuttatja egy másik géphez, osztott rendszert megvalósítva.
szó, ha igen, akkor bekéri és ellenőrzi. Sikeres bejelentkezés után a login elindítja a Gyakorlatban ezt egy kicsit bonyolítaná az, hogy az üzenetek gyakran tartalm az­
felhasználó parancsértelm ezőjét (ez alapértelm ezésben a /bin/sh, de az /etc/passwd nak nagyobb adatszerkezetekre m utató pointert, és egy osztott rendszernek az
állományban mást is be lehet állítani). A parancsértelm ező parancsok begépelésé­ egész adatszerkezet átvitelét meg kellene oldania.
re várakozik, és elindít egy alprocesszust m inden egyes parancs számára. így min­ M inden taszk, eszközmeghajtó és szerverprocesszus csak bizonyos m eghatáro­
den parancsértelm ező az init gyermeke, a felhasználói processzusok az init unokái, zott processzusokkal válthat üzeneteket. Később tárgyaljuk annak részleteit, hogy
és az összes felhasználói processzus egyetlen processzusfában helyezkedik el. ezt hogyan lehet kikényszeríteni. Az üzenetek általában a 2.29. ábra rétegeiben
Tulajdonképpen a kernelbe fordított taszkok és a processzuskezelő kivételével a felülről lefelé haladnak, és egymásnak az egy rétegben vagy szomszédos rétegben
processzusok, a rendszerprocesszusok és a felhasználói processzusok is, egyetlen lévő processzusok üzenhetnek. A felhasználói processzusok nem küldhetnek egy­
fát alkotnak. De a hagyományos Unix-rendszer processzusfájától eltérően nem az másnak üzenetet. A 4-es rétegben lévő felhasználói processzusok kezdeményez­
init a fa gyökere, és a fa szerkezetéből nem lehet megállapítani, hogy a rendszer­ hetnek üzenetküldést a 3-as réteg szerverei felé, a 3-as réteg szerverei pedig kez­
processzusok milyen sorrendben lettek elindítva. deményezhetnek üzenetküldést a 2-es réteg eszközmeghajtói felé.
A két legfontosabb, processzusok kezelésére szolgáló M INIX 3-rendszerhívás a H a egy processzus üzenetet küld egy olyan processzusnak, amely éppen nem vár
fork és az exec. A fork az egyetlen módja annak, hogy új processzust hozzunk létre. üzenetre, akkor a küldő blokkolódik, amíg a fogadó végre nem hajt egy récéivé hí­
Az exec segítségével egy processzus végrehajthat egy m egadott programot. A prog­ vást. Más szóval, a M INIX 3 a randevúeljárást használja abból a célból, hogy elejét
ram végrehajtása közben a programfájl fejlécében meghatározott mennyiségű me­ vegye a m ár elküldött, de még nem fogadott üzenetek puffereléséből adódó prob­
móriával rendelkezik. Ez a mennyiség futás közben végig változatlan, habár az adat­ lémáknak. Ennek a megközelítésnek az az előnye, hogy egyszerű, és nincs szükség
szegmens, a veremszegmens és a szabad memória közötti arányok változhatnak. pufferkezelésre (beleértve azt is, hogy nem fogyunk ki a pufferekből). Ezen túlm e­
A processzusokról m inden információt a processzustábla tartalm az, amelyet a nően az üzenetek hossza kötött, fordítási időben kerül m eghatározásra, ezért nem
kernel, a processzuskezelő és a fájlrendszer közösen használ, mindegyik a számára következhet be puffertúlírás sem, ami egyébként a program hibák gyakori oka.
szükséges mezőket birtokolja. Egy új processzus létrejöttekor (fork hatására) vagy Az üzenetváltásokra bevezetett korlátozások alapvető célja az, hogy ha az
egy létező processzus befejeződésekor (exit vagy megszakítás hatására) a procesz- A processzusnak megengedjük, hogy send vagy sendrec hívást kezdeményezzen a
szuskezelő először beállítja a saját mezőit a processzustáblában, majd üzenetet B processzus felé, akkor a ő-nek engedélyezhessünk récéivé hívást, amelyben A-\
küld a fájlrendszernek és a kernelnek, hogy azok is tegyenek hasonlóképpen. jelöli meg küldőként, de B ne küldhessenv4-nak. Világos, hogy ha A blokkolódik,
amikor küldeni próbál fi-nek, és B is blokkolódik, amikor küldeni próbáM -nak,
akkor holtpontba jutottunk. Az „erőforrás”, amelyre m indkettőnek szüksége vol­
2.5.3. Processzusok közötti kommunikáció a MINIX 3-ban na a művelet befejezéséhez, nem fizikai jellegű, mint egy I/O-eszköz, hanem a
címzett egy récéivé hívása. A holtpontról bővebben a 3. fejezetben lesz szó.
Üzenetek küldésére és fogadására három elemi művelet áll rendelkezésre. Ezek Néha egy blokkoló üzenetküldés helyett m ásra van szükség. Van még egy fontos
az alábbi C könyvtári eljárásokkal hívhatók: üzenetkezelő alapművelet, amelyet a

send(dest, &message); notify(dest);

üzenetet küld a dest processzusnak, C könyvtári függvénnyel hívhatunk, és arra használható, hogy a címzett figyelmét
felhívjuk arra, hogy valamilyen fontos esemény bekövetkezett. A notify nem blok­
receive(source, &message); koló, ami azt jelenti, hogy a küldő folytatja a futását függetlenül attól, hogy a cím­
zett várakozik-e az értesítésre. Mivel nem blokkol, holtpontot sem okozhat.
138 2. PROCESSZUSOK 2.5. A MINIX 3-PROCESSZUSOK ÁTTEKINTÉSE 139

Az értesítés az üzenetküldési mechanizmust felhasználva kerül kézbesítésre, Van még néhány, a processzusok közötti kommunikációhoz tartozó alapműve­
de az átadható információ korlátozott. Általános esetben az ilyen üzenet csak a let. Ezekről a későbbiekben fogunk szót ejteni. Kevésbé fontosak, mint a send, a
küldő azonosítóját és egy kernel által hozzáadott időbélyegzőt tartalmaz. Néha récéivé, a sendrec és a notify.
ez minden, amire szükség van. Például a billentyűzet notify-t használ, amikor vala­
melyik funkcióbillentyűt (F l-től F12-ig, illetve ugyanezek SHiFT-tel együtt) leütik.
A M INIX 3-ban a funkcióbillentyűkkel nyomkövetési listák készítését lehet kez­ 2.5.4. Processzusok ütemezése a MINIX 3-ban
deményezni. Az Ethernet-m eghajtó olyan processzusra példa, amely csak egyfajta
nyomkövetési listát generál, és más üzenetet soha nem is kell kapnia a konzolmeg­ Egy m ultiprogram ozott operációs rendszert a megszakításrendszer tart életben.
hajtótól. így a d u m p - E t h e r n e t - stats billentyű leütésekor a konzoltól az Ethernet- A bevitelt kérő processzusok blokkolódnak, így más processzusok is lehetőséget
meghajtóhoz érkező értesítés félreérthetetlen. Más esetekben egy értesítés nem kapnak a futásra. Amikor a kért adat rendelkezésre áll, az éppen futó processzust
elég, de annak megérkezése után a címzett küldhet egy üzenetet az értesítés fel­ megszakítja a lemez-, billentyűzet- vagy más hardver. Az időzítő szintén állít elő
adójának, további információt kérve. megszakításokat; ezek arra használatosak, hogy a bevitelt nem kérő felhasználói
Van oka annak, hogy az értesítések ilyen egyszerűek. Mivel a notify nem blok­ processzusok is átadják végül a CPU-t más processzusoknak. A M INIX 3 legalsó
kol, akkor is használható, amikor a címzett még nem ért a receive-hez. De az rétegének feladata a megszakítások elrejtése olyan módon, hogy üzenetekké ala­
egyszerűsége lehetővé teszi, hogy a nem kézbesíthető értesítés könnyen tárol­ kítja őket. A processzusok (és taszkok) szempontjából az I/O-eszközök a műve­
ható legyen, majd a címzettet azonnal értesíthetjük, amint a receive-et meghívta. letek befejezésekor üzenetet küldenek valamelyik processzusnak, felélesztve és
Tulajdonképpen egyetlen bit elég. Az értesítéseket arra szántuk, hogy egymás futtathatóvá téve azt.
között használják a rendszerprocesszusok, ezekből pedig aránylag kevés van. Megszakítások szoftverből is generálódnak, ebben az esetben ezeket gyakran
Minden rendszerprocesszusnak van egy bittérképe a kézbesítetlen értesítésekhez, csapdának nevezik. Az előzőkben leírt send és récéivé hívások a rendszerkönyv­
1 bit tartozik minden rendszerprocesszushoz. így ha az A processzus olyankor tár által szoftvermegszakítássá alakulnak át; ezek hatása pontosan megegyezik a
akar értesítést küldeni a B processzusnak, amikor az nincs blokkolva egy receive- hardvermegszakításokéval - a szoftvermegszakítást végrehajtó processzus azon­
nél, akkor az üzenetkezelő rendszer B bittérképében beállítja az/1-nak megfelelő nal blokkolódik, a kernel pedig megkezdi a megszakítás feldolgozását. A felhasz­
bitet. Amikor a B később végrehajt egy receive-et, akkor az első teendő a kézbe­ nálói programok nem hivatkoznak közvetlenül a send-re és a receive-re, hanem
sítetlen értesítések bittérképének ellenőrzése. Ilyen módon több forrásból meg­ valahányszor az 1.9. ábra valamelyik rendszerhívása aktivizálódik, akár közvetle­
kísérelt értesítésekről is tudomást szerezhet. Az egyetlen bit elegendő az értesí­ nül, akár valamelyik könyvtári függvény útján, akkor a sendrec hívódik meg, és egy
tés inform ációtartalm ának előállításához. M eghatározza a küldő kilétét, a kernel szoftvermegszakítás generálódik.
üzenetkezelő kódja pedig a kézbesítéskor hozzáteszi az időbélyegzőt. Az időbé­ Valahányszor egy processzus futása közben megszakítás érkezik (akár egy I/O-
lyegzők elsősorban időzítők lejártának ellenőrzésére használatosak, így nincs nagy eszköz, akár az időzítő m iatt), vagy szoftvermegszakítás m iatt felfüggesztődik,
jelentősége, ha az időbélyegző egy kicsit későbbi időpontot tartalm az annál, mint lehetőség adódik megvizsgálni, hogy melyik processzus érdem es leginkább a fu­
amikor a küldő először próbálkozott az értesítés elküldésével. tásra. Ezt term észetesen a processzusok befejeződésekor is meg kell tenni, de a
Vannak még további részletei is az értesítési mechanizmusnak. Bizonyos ese­ M INIX 3-hoz hasonló rendszerekben az I/O-eszköz vagy időzítő miatti megszakí­
tekben az értesítési üzenet egy további mezője is használatos. H a az értesítés egy tások sokkal gyakoribbak, mint a processzusbefejeződések.
megszakítás bekövetkeztéről informálja a címzettet, akkor az összes lehetséges A M INIX 3-ütemező egy többszintű sorban állásos rendszert alkalmaz. V ára­
megszakításforrás bittérképe is bekerül az üzenetbe. Ha pedig a küldő a rend­ kozósorból 16 van, de újrafordítással ennél több vagy kevesebb is könnyen beál­
szertaszk, akkor még az összes, a címzett részére még kézbesítetlen szignál bittér­ lítható. A legalacsonyabb prioritású soron csak az ID L E processzus van, amely
képe is része lesz az üzenetnek. Természetesen felmerül a kérdés, hogyan lehet akkor fut, amikor nincs semmi más teendő. A felhasználói processzusok alapértel­
m indezeket a kiegészítő információkat elküldeni egy olyan processzusnak, amely mezés szerint a legalsónál jó néhány sorral feljebb kerülnek.
éppen nem akar üzenetet fogadni. A válasz az, hogy ezek az információk kernel­ A szerverek alapesetben a felhasználói processzusok számára engedélyezett­
adatszerkezetekben vannak tárolva. Nem kell semmit másolni ahhoz, hogy meg­ nél magasabb prioritású sorokba kerülnek, az eszközmeghajtók a szervereknél
őrződjenek. H a egy értesítést el kell halasztani, és egyetlen bitté kell zsugorítani, magasabb, az időzítő- és a rendszertaszk pedig a legmagasabb prioritásúba. Nem
akkor abban az időpontban, amikor a címzett végrehajtja a récéivé utasítást, és az valószínű, hogy bármikor is a 16 sor mindegyike egyszerre használatban legyen.
értesítést újra kell generálni, az értesítés forrása alapján lehet tudni, hogy milyen Processzusok csak némelyikben indulnak. Egy processzust a rendszer vagy (bi­
többletinformációt kell elhelyezni az üzenetben. A fogadó fél számára ugyancsak zonyos korlátokkal) a felhasználó a nice parancs használatával áthelyezhet másik
a küldő kiléte mondja meg, hogy számítson-e többletinform ációra, illetve ha igen, prioritási sorba. A sok sor lehetőséget ad a kísérletezésre, illetve ahogy további
akkor azt hogyan kell értelmezni. eszközmeghajtók kerülnek be a M INIX 3-ba, az alapértelm ezés szerinti beállítá­
140 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 141

sok hangolhatok a legjobb teljesítmény elérése érdekében. Például ha a hálóza­ hatására aktivizálódnak, idővel m inden magas prioritású processzus be kell hogy
ton digitális audio- vagy videoadást szolgáltató szerverre lenne szükség, akkor egy fejezze a munkát, amit kértek tőle. Ezután blokkolódnak mindaddig, amíg a fel­
ilyen szervernek a jelenlegieknél magasabb kezdeti prioritást lehetne adni, vagy használói processzusok megint lehetőséget kapnak a futásra, és további kéréseket
egy jelenlegi szerver, vagy meghajtó kezdeti prioritását lehetne csökkenteni, hogy generálnak. H a nincs futtatható processzus, akkor az ID L E (tétlen) processzus
az új szerver jobb teljesítményt nyújthasson. kerül kiválasztásra. Ez alacsony fogyasztású üzemmódba kapcsolja a CPU-t a kö­
A processzus ütemezési sora által m eghatározott prioritás m ellett más m echa­ vetkező megszakítás beérkezéséig.
nizmus is segít bizonyos processzusokat abban, hogy egy kis előnyre tegyenek Valahányszor az időzítő megszakítást idéz elő, a rendszer megvizsgálja, hogy az
szert a többivel szemben. Az időszelet, vagyis az egy processzus által egyszerre fel­ éppen futó processzus olyan felhasználói processzus-e, amely már hosszabb ideje
használható időintervallum, nem ugyanakkora minden processzus esetén. A fel­ fut, mint a hozzárendelt időszelet. H a igen, akkor az ütem ező a sor végére teszi
használói processzusoknak viszonylag rövid az időszeletük. Az eszközmeghajtók­ (lehet, hogy semmit nem kell csinálni vele, m ert egyedül van a soron). Ezután a
nak és a szervereknek alapesetben addig kellene futniuk, amíg blokkolódnak. Az következő processzus kiválasztása a fent leírtaknak megfelelően történik. Az ak­
esetleges hibás működés elleni védekezésként azonban ezek is megszakíthatok, tuális processzus csak akkor folytathatja a futását, ha egyedül van a során, és a
de hosszú időszeletet kapnak. Hosszú ideig futhatnak, de ha felhasználták a tel­ magasabban lévő sorokban nincs egyetlen processzus sem. M áskülönben a legma­
jes időszeletüket, akkor felfüggesztődnek, nehogy lefagyasszák a rendszert. Ilyen gasabb prioritású, nem üres sor elején lévő processzus futhat. A nélkülözhetetlen
esetben az időtúllépés m iatt felfüggesztett processzust futásra késznek kell tekin­ eszközmeghajtók és szerverek olyan hosszú időszeletet kapnak, hogy alapesetben
teni, és a várakozósor végére lehet helyezni. H a azonban kiderül, hogy az időt soha nem az időzítő m iatt szakad meg a futásuk. H a azonban valami elromlik, ak­
túllépő processzus ugyanaz, amely legutóbb futott, akkor ez annak a jele lehet, kor a prioritásuk ideiglenesen csökkenhet, hogy ne fogják meg a rendszert telje­
hogy beragadt egy ciklusba, és akadályozza az alacsonyabb prioritásúakat a futás­ sen. Valószínűleg semmi érdem legeset nem lehet tenni, ha ilyesmi egy létfontos­
ban. Ebben az esetben a prioritása csökkentésre kerül úgy, hogy egy alacsonyabb ságú szerverrel történik meg, de legalább a rendszert szabályosan le lehet állítani,
prioritású sor végére kerül át. H a a processzus megint túllépi az idejét, és másik amivel meg lehet előzni az adatvesztést, és esetleg információt lehet gyűjteni an­
processzus még mindig nem tudott futni, akkor megint lejjebb kerül. Előbb vagy nak kiderítéséhez, hogy mi okozta a problémát.
utóbb el kell jutnunk addig a pontig, hogy valami más is futhat.
Egy prioritásban lejjebb léptetett processzusnak van lehetősége visszatérni m a­
gasabb prioritású sorba. H a egy processzus felhasználja a teljes időszeletét, de
nem akadályoz más processzusokat a futásban, akkor visszakerül a számára enge­ 2.6. Processzusok megvalósítása MINIX 3-ban
délyezett legmagasabb prioritáshoz tartozó sorba. Egy ilyen processzusnak látha­
tólag szüksége van a teljes időszeletére, és tekintettel van másokra is. Közeledünk a tényleges program kód megvizsgálásához, ezért érdemes néhány
M áskülönben a processzusok ütemezése egy kism értékben módosított round szót ejteni a használt jelölésekről. Az „eljárás”, „függvény” és „rutin” kifejezése­
robin m ódszerrel történik. H a egy processzus nem használta fel a teljes időszele­ ket azonos értelem ben fogjuk használni. A változók, eljárások és állományok ne­
tét, akkor ezt úgy tekintjük, hogy I/O-művelet miatt blokkolódott, és amikor újra vei dőlt betűkkel szerepelnek, mint például rw jlag. Ezek a nevek valójában mind
futásra kész állapotba kerül, akkor a sora elejére kerül, de úgy, hogy csak annyi kisbetűsek, ha azonban a szövegben m ondat elejére kerülnek, akkor nagybetűvel
időt használhat, amennyi az időszeletéből még megmaradt. Em ögött az a szándék írjuk őket. Van néhány kivétel, a kernelbe fordított eszközmeghajtók nevei nagy­
húzódik meg, hogy a felhasználói processzusok gyorsan tudjanak reagálni az I/O- betűsek, mint például CLOCK, SYSTE M és IDLE. A rendszerhívások Helvetica
eseményekre. Az időszeletét teljesen felhasználó processzus a sora végére kerül stílusú kisbetűvel fognak szerepelni, mint például read.
az eredeti round robin ütem ezésnek megfelelően. A M INIX 3 teljes verziója a mellékelt CD-ROM -on található. A M INIX 3 web-
Mivel rendszerint a taszkoknak van a legmagasabb prioritása, majd az eszköz- oldaláról (www.minix3.org) letölthető az aktuális verzió, amelyben új funkciók, ki­
meghajtók, ezután a szerverek, végül a felhasználói processzusok következnek. egészítő szoftver és dokumentáció is található.
A felhasználói processzusok csak akkor futhatnak, ha egyetlen rendszerprocesz-
szusnak sincs dolga, és egy rendszerprocesszust nem akadályozhat meg a futásban
egyetlen felhasználói processzus sem. 2.6.1. A M INIX 3 forráskódjának szerkezete
Új processzus kiválasztásakor az ütem ező ellenőrzi, hogy van-e futtatható pro­
cesszus a legmagasabb prioritású sorban. H a van legalább egy ilyen, akkor a sor Az ebben a könyvben bem utatott M INIX 3-implementáció IBM PC típusú, kor­
elején lévőt futtatja. H a nincs ilyen, akkor egy sorral lejjebb végzi el ugyanezt az szerű 32 bites processzorral (például 80386, 80486, Pentium, Pentium Pro, II, III,
ellenőrzést, és így tovább. Mivel az eszközmeghajtók a szerverektől érkező kéré­ 4, M vagy D) ellátott számítógépre készült. M indezekre Intel 32 bites processzor­
sekre reagálnak, a szerverek pedig a felhasználói processzusoktól érkező kérések ként fogunk hivatkozni. Egy szabványos Intel-alapú rendszerben a teljes C forrás­
142 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 143

kód a lusr/src/ könyvtárban van (az elérési utak végén szereplő „ / ” jelzi, hogy ezek Sok program nak olyan definíciókra is szüksége van helyi definíciós fájlokban,
könyvtárak). Más platform ok esetén a forráskód könyvtárai máshol is lehetnek. amelyeket nem kell az egész rendszer számára elérhetővé tenni. Egy ilyen definí­
A könyvben a M INIX 3 forráskódfájljaira mindvégig az src/ alatt kezdődő elérési ciós fájlnak a neve lehet ugyanaz, mint egy szabványos definíciós fájlnak, és elkép­
úttal hivatkozunk. Egy fontos alkönyvtár az src/include/, ahol a C definíciós fájlok zelhető, hogy éppen annak leváltására vagy kiegészítésére szánták. Amikor a fájl
m esterpéldányai találhatók. Erre a könyvtárra include/-ként hivatkozunk. neve szokásos idézőjelek között van ("..."), akkor a fordítóprogram először abban a
Minden könyvtár tartalm az egy Makefile nevű fájlt, amely a szabványos Unix könyvtárban keresi, amelyikben a forrásfájl is van, majd ha ott nem találja, akkor
make segédprogram működését irányítja. A Makefile vezérli a saját könyvtárában az alapértelmezés szerinti könyvtárban. így az
található fájlok fordítását, és az is előfordulhat, hogy egyes alkönyvtáraiban is irá­
nyítja a fordítást. A make működése összetett, teljes leírása m eghaladja ennek a #include "fájlnév"
szakasznak a kereteit, de összefoglalható úgy, hogy a make megoldja a több for­
rásfájlból álló programok hatékony lefordítását. A make biztosítja, hogy minden egy lokális fájlt illeszt be.
szükséges fájl lefordításra kerüljön. Ellenőrzi a korábban fordított modulokat, és Az include/ könyvtár számos szabványos POSIX definíciós fájlnak (POSIX
újrafordítja azokat, amelyek forráskódjában változás történt az utolsó fordítás header files) ad helyet. Ezen túl három alkönyvtárai tartalmaz:
óta. Időt lehet m egtakarítani azzal, hogy feleslegesen nem fordít le egyetlen fájlt
sem. Végül, a make irányítja a külön lefordított modulok végrehajtható program ­ sys/ - ez a könyvtár további szabványos POSIX definíciós fájlokat tartal­
má szerkesztését, és esetleg az elkészült program telepítését is elvégzi. maz;
Az src/ könyvtárfa egésze vagy bármelyik része is áthelyezhető, mivel a könyv­ minix/ - a M INIX 3 operációs rendszer által használt definíciós fájlokat tar­
tárak Makefile-jai relatív elérési utakat használnak a többi C forráskönyvtárhoz. talmazza;
Például a gyors fordítás érdekében egy RAM-lemez gyökérkönyvtárában is el le­ ibm/ - csak IBM PC esetén használt definíciós fájlokat tartalmaz.
het helyezni (/src/). H a speciális változatot fejlesztünk, akkor az src/ egy másolatát
más néven is létrehozhatjuk. Elősegítendő a M INIX 3-rendszer és a program ok fejlesztését, további állomá­
A C definíciós fájlok elérési útja speciális eset. Fordítás közben minden nyok és könyvtárak találhatók az include/ könyvtárban, a CD-n, és elérhetők a
Makefile feltételezi, hogy a definíciós fájlokat a /usr/include/ könyvtárban találja M INIX 3 weboldalán is. Például az include/arpa/, az include/net/ és ennek alkönyv­
(vagy ennek megfelelő másikban, ha nem Intel-platform ra történik a fordítás). tára, az include/net/gen/ a hálózati kiterjesztéseket támogatja. Ezek nem szüksége­
Az /src/tools/Makefile azonban azt feltételezi, hogy (Intel-platform esetén) a /usr/ sek a M INIX 3-alaprendszer lefordításához.
src/include/ könyvtárban megtalálja a definíciós fájlok m esterpéldányait. A teljes Az src/include/ mellett az src/ könyvtár három fontos alkönyvtárban tartalmazza
rendszer újrafordítása előtt azonban először a teljes /usr/include/ törlődik, majd az operációs rendszer forráskódját:
a lusr/src/includel átmásolódik a /usr/include/-ba. E rre azért volt szükség, hogy a
M INIX 3 fejlesztéséhez szükséges összes fájlt egy helyen lehessen tartani. Ez a kernel/ - 1-es réteg (ütemezés, üzenetek, időzítő- és rendszertaszk).
megoldás azt is megkönnyíti, hogy a forráskódot és a definíciós fájlokat tároló drivers/ - 2-es réteg (lemez, konzol, nyomtató stb. eszközmeghajtók).
könyvtárfákból több példányt tarthassunk egymás mellett, ha a M INIX 3-rendszer servers/ - 3-as réteg (processzuskezelő, fájlrendszer, egyéb szerverek).
különböző beállításaival szeretnénk kísérletezni. Figyelni kell azonban arra, hogy
ha szerkeszteni akarunk egy kísérlethez tartozó fájlt, akkor azt az /src/includel Van három további könyvtár, amelyek egy működő rendszerhez alapvető fon­
alatt tegyük, és ne a /usr/include/ alatt. tosságúak, de a könyvben nem tárgyaljuk:
Ez megfelelő alkalom, hogy a C nyelvben járatlanok figyelmébe ajánljuk a fájl­
nevek megadási módját az #include direktíván belül. M inden C fordítónak van egy src/lib/ - könyvtári eljárások forráskódja (például open, read).
alapértelmezés szerinti definíciós könyvtára, ahol a definíciós fájlokat keresi. Ez src/tools/ - Makefile és parancsfájlok a M INIX 3 fordításához.
gyakran a lusr/include/. Ha egy beilleszteni kívánt fájl neve kisebb és nagyobb jelek src/boot/ - a M INIX 3 betöltésére és telepítésére szolgáló programkód.
közé van zárva (<...>), akkor a fordítóprogram a fájlt az alapértelm ezés szerinti
könyvtárban vagy annak egy alkönyvtárában keresi, például az A M INIX 3 alapváltozata számos olyan további forrásfájlt tartalmaz, ame­
lyeket a könyvben nem tárgyalunk. A processzuskezelő és fájlrendszer forrás­
#include <fájlnév> kódja m ellett az /src/servers/ rendszerkönyvtár tartalmazza az init program és az
rs reinkarnációs szerver forráskódját, mindkettő nélkülözhetetlen része a futó
a /usr/include/-ból veszi a fájlt. M INIX 3-rendszernek. A hálózati szerver forráskódja az /src/servers/inetl-ben van.
144 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 145

Az Isrcldriversl a könyvben nem tárgyalt meghajtók forráskódját tartalmazza, töb­ A make image futtatásakor az src/include/-ból a definíciós fájlok friss példányai
bek között alternatív lemezmeghajtókhoz, hangkártyákhoz és hálózati kártyákhoz. átm ásolódnak az /usr/include/-ba. Ezután az src/kemel/, valamint az src/servers/ és
Mivel a M INIX 3 egy kísérleti operációs rendszer, az src/test/ könyvtár olyan az src/drivers/ alkönyvtáraiban található forrásállományokból tárgykódot állítunk
program okat tartalm az, amelyek az operációs rendszert módosítás és újrafordítás elő. Az src/kemel/ tárgykódjait összeszerkesztve kapjuk a végrehajtható kernel
után alaposan letesztelik. Egy operációs rendszer term észetesen azért van, hogy program ot. Az src/servers/pm/ és src/servers/fs/ tárgykódjaiból kapjuk a pm, vala­
parancsokat (program okat) futtassunk, itt van mindjárt a m éretes src/commands/ mint az fs program okat. A 2.30. ábrán a betöltési mem óriakép részeként feltün­
könyvtár, amely a kisegítőprogramok forráskódját tartalm azza (például cat, cp, tetett többi program is lefordítódik és összeszerkesztődik a saját könyvtárában.
date, Is, pw d és még több mint 200 másik). Néhány nagy, eredetileg a GNU- és a Ezek között van az rs és az init az src/servers/ és memory/ alkönyvtáraiban, a lóg/,
BSD-projektek keretében kifejlesztett nyílt forráskódú alkalmazás forráskódja is valamint a tty/ az src/drivers/ alkönyvtáraiban. A 2.30. ábra „driver” sorában talál­
m egtalálható itt. ható komponens több lemezmeghajtó valamelyike lehet; most egy merevlemezről
A továbbiakban az egyszerűség kedvéért általában csak a fájlneveket fogjuk indítható M INIX 3-rendszert tárgyalunk, amely a szabványos a tjv in i eszközmeg­
használni, ha a szövegkörnyezetből világos, hogy mi a teljes elérési út. Meg kell hajtót használja; ez az src/drivers/a tjv in i/-ben található. Más meghajtók is hoz­
azonban jegyezni, hogy néhány fájlnév több könyvtárban is szerepel. Például több záadhatok a rendszerhez, de a legtöbbjüket nem kell a betöltési mem óriaképbe
const.h nevű fájl is van. Az src/kemel/const.h a kernelben használt konstansokat belefordítani. Ugyanez igaz a hálózati tám ogatásra is; az alap M INIX 3-rendszer
definiálja, míg az src/serversIpm/const.h a processzuskezelő által használt konstan­ fordítása szempontjából a hálózatos részek használata mellékes.
sokat definiálja stb. Egy betölthető M INIX 3-rendszer telepítéséhez az installboot program (en­
Az egy könyvtárba tartozó állományokat együtt tárgyaljuk, így nem kell félreér­ nek forrása az src/boot/-bán található) neveket ad a kernel, a pm, az fs, az init és a
téstől tartani. A C D -n és a weboldalon a teljes forráskód megtalálható, és mindkét többi komponenshez, az állományokat a könnyebb betöltés érdekében kiegészíti
helyen a függvények, definíciók és globális változók m egtalálását segítő tárgymu­ úgy, hogy hosszuk a lemez szektorhosszának többszöröse legyen (hogy könnyebb
tatót is elhelyeztünk. legyen a részeket egymástól függetlenül betölteni), majd összefűzi őket egy közös
A Függelék F.3. alfejezete tartalm azza a CD-n található fájlok neveit ábécésor­ állományba. Ez a fájl a betöltési m emóriakép, ezt másolhatjuk rá egy hajlékony-
rendben, definíciós fájlok, eszközmeghajtók, kernel, fájlrendszer és processzuske­ lemezre vagy egy merevlemez-partícióra a /boot/ vagy a /boot/image/ könyvtárba.
zelő részekkel. A Függelék ezen része, valamint a weboldal és a CD tárgymutatója Később a betöltési felügyelőprogram ezt be tudja tölteni, és a vezérlést át tudja
a forráskódbeli sorszámmal hivatkozik az egyes tételekre. adni az operációs rendszernek.
Az 1-es réteg kódját az src/kemell könyvtár tartalmazza. Ebben a könyvtár­ A 2.31. ábra m utatja a memória kiosztását, miután az egyes részek külön-külön
ban olyan fájlok vannak, amelyek a processzusok kezelését támogatják; ezek a betöltődtek. A kernel a memória alsó részébe töltődik, a betöltési memóriakép
M INIX 3 legalsó rétegében helyezkednek el, ahogy a 2.29. ábrán is láthattuk. E összes többi része 1 MB fölé. A felhasználói program ok futtatásakor a kernel fö­
réteg feladata a rendszerinicializálás, megszakításkezelés, üzenetküldés és pro­ lötti m em ória lesz elsőként felhasználva. H a egy új program ott nem fér el, akkor
cesszusütemezés. Ezekhez szorosan kapcsolódik két olyan modul, amelyekkel a m em ória felső részébe, az init fölé kerül. A részletek term észetesen a rend­
fordítás után egy tárgymodulba kerülnek, de azok önálló folyamatként futnak. szer konfigurációjától függenek. A 2.31. ábra egy olyan M INIX 3-konfigurációt
Egyik a rendszertaszk, amely a kernel szolgáltatásai és a felsőbb rétegek közötti m utat, amelyben a fájlrendszer 512 darab 4 KB-os lemezblokk tárolására képes
interfészt biztosítja, a másik pedig az időzítőtaszk, amely időzítőjelekkel látja el a gyorsítótárral rendelkezik. Ez nem túl sok; nagyobb javasolt, ha van elég m em ó­
kernelt. A 3. fejezetben tanulmányozzuk az srcldrivers/ több alkönyvtárában talál­ ria. Másrészt ha a lemezblokkok gyorsítótárát jóval kisebbre vennénk, akkor az
ható állományokat, amelyek a 2.29. ábra 2-es rétegének eszközmeghajtóit tartal­ egész rendszer elférne 640 K-ban, még néhány felhasználói processzusnak is m a­
mazzák. A 4. fejezetben a processzuskezelőhöz tartozó állományokat tekintjük át radna hely.
az src!serversip m ! könyvtárban, az 5. fejezetben pedig a fájlrendszer kerül terítékre Világosan kell látnunk, hogy a M INIX 3 több teljesen független, egymással ki­
az src!'servers/fs/ könyvtárban. zárólag üzenetküldéssel kommunikáló programból áll. Az src/servers/fs/ és src/ser­
vers/pm/ könyvtárban lévő panic eljárások nem ütköznek, mivel végül különböző
végrehajtható állományba kerülnek. Csak néhány olyan könyvtári eljárás van az
2.6.2. A MINIX 3 fordítása és futtatása src/lib/ könyvtárban, amelyet az operációs rendszer m indhárom része tartalmaz.
Ez a moduláris szerkezet nagyon megkönnyíti, hogy például a fájlrendszert úgy
A M INIX 3 fordításához az src/tools/-bán kell indítani a make-et. Számos opció ad­ módosítsuk, hogy az ne legyen kihatással a processzuskezelőre. Az is lehetséges,
ható meg, ezek segítségével a M INIX 3 sokféleképpen telepíthető. H a a make-et hogy a fájlrendszert teljes egészében eltávolítsuk, és egy másik gépen helyezzük
argumentumok nélkül indítjuk, akkor kilistázza a lehetőségeket. A legegyszerűbb el, ott fájlszerverként a kliensgépekkel hálózaton keresztül üzenetekkel kommu­
m ódszer a make image. nikálhat.
146 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 147

A memória felső határa vei indított M INIX 3-rendszer távoli term inálként vagy ftp- és webszerverként is
használható. A könyvben leírtak szerinti M INIX 3-rendszert csak akkor kell m ó­
Felhasználói programok dosítani, ha meg akarjuk engedni a hálózaton keresztüli bejelentkezést: a módosí­
számára rendelkezésre
álló memória tandó rész a tty, a konzol eszközmeghajtója, amelyet a távoli bejelentkezésekhez a
virtuális term inálok használatát engedélyezve újra kell fordítani.
3549 K
src/servers/init/init Init
3537 K
src/drivers/at_wi ni/at_wi ni Lemezmeghajtó
3489 K 2.6.3. A közös definíciós fájlok
src/drivers/log/log Naplózómeghajtó
3416 K
src/drivers/memory/memory Memóriameghajtó Az includel könyvtár és alkönyvtárai számos olyan állományt tartalmaznak, am e­
3403 K
src/drivers/tty/tty Konzolmeghajtó lyek konstansok, makrók és típusok definícióit tartalmazzák. Ezen definíciók nagy
3375 K
src/servers/rs/rs Reinkarnációs szerver részének meglétét és helyét (includc/ és include/sys/) a POSIX szabvány előírja.
3236 K (A fájlrendszer által
használt puffer Ahogy a .h kiterjesztés jelzi, ezek az ún. definíciós fájlok (vagy állományok), és a
src/servers/fs/fs Fájlrendszer méretétől függ) C forrásprogram ba az #include direktíva segítségével illeszthetők be. Ezek a direk­
1093 K tívák a C nyelv beépített eszközei. A definíciós állományok megkönnyítik a nagy
src/servers/pm/pm Processzuskezelő
1024 K rendszerek karbantartását.
Csak olvasható A felhasználói program ok fordításához gyakran szükséges definíciós fájlok az
memória és l/O-adapter-
memória
includel könyvtárban, míg az elsődlegesen a rendszer részét képező program ok
(nem érhető el fordításához használt definíciós fájlok az include/sys/ könyvtárban helyezkednek el.
a MINIX 3 számára) Ez a megkülönböztetés nem olyan borzasztóan fontos, egy tipikus fordítás m ind­
640 K
[Betöltési felügyelőprogram] két könyvtárt használja, legyen az akár egy felhasználói program vagy az operációs
590 K
rendszer részének fordítása. Azokat az állományokat vesszük most sorra, először
az includel, majd az include/sys/ könyvtárból, amelyek az alap M INIX 3-rendszer
Felhasználói programok fordításához szükségesek. A következő részben az include/minix/ és az includel
számára rendelkezésre ibm/ könyvtárakkal ism erkedünk meg. Ezek, mint a nevük is mutatja, kifejezetten
álló memória
a M INIX 3-rendszerhez, illetve annak IBM PC-n (valójában Intel-alapú PC-n)
történő megvalósításához kötődnek.
55 K Az elsők között néhány olyan általános célú definíciós fájl van, amelyeket köz­
Rendszertaszk
vetlenül a M INIX 3 egyetlen C nyelvű forrásprogram ja sem használ. Ehelyett ezek
src/kernel/kernel Időzítőtaszk
más definíciós fájlokba kerülnek beillesztésre. A M INIX 3 mindegyik nagy kom-
Kernel
2 K (A kernel kezdete)
[A BIOS használja] #include <minix/config.h> /* MUST be first - Ennek KELL lennie az elsőnek */
1K #include <ansi.h> /* MUST be second - Ennek KELL lennie a másodiknak */
[Megszakítási címek]
#include <limits.h>
#include <errno.h>
2.31. ábra. A memória kiosztása, miután a MINIX3 betöltődött a lemezről. A kernel, a szerverek #include <sys/types.h>
és az eszközmeghajtók külön fordított és szerkesztett programok; ezeket a bal #include <minix/const.h>
oldalon láthatjuk. A méretek megközelítők és nem arányosak #include <minix/type.h>
#include <minix/syslib.h>
#include "const.h"
A M INIX 3 m odularitására másik példa, hogy a processzuskezelőt, a fájlrend­
szert és a kernelt egyáltalán nem érinti, hogy a rendszert hálózati támogatással 2.32. ábra. Az elsődleges definíciós fájlokban megtalálható kódrészlet, amely biztosítja
vagy anélkül fordítjuk-e le. Egy Ethernet-m eghajtó és az inét szerver is aktiválható az összes C forrásprogram számára szükséges definíciós fájlok beillesztését.
a betöltés után; a 2.30. ábrán az léteire által indított processzusok között jelenné­ Figyeljük meg, hogy két const.h is szerepel, az egyik az include/ fából, a másik
nek meg, és a 2.31. ábra valamelyik „felhasználói program ok számára rendelke­ az aktuális könyvtárból kerül beillesztésre
zésre álló m em ória” régiójába kerülnének. A hálózati funkciók engedélyezésé-
148 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 149

ponensének van egy elsődleges definíciós állománya; ezek az src/kemel/kemel.h, eleget tegyünk, ezért a C lehetővé teszi a függvények prototípusának megadását,
az src!serversIpmlpm.h és az src/servers/fs/fs.h, amelyek minden fordítás során beil­ vagyis a függvények argumentumainak és a visszatérési érték típusának deklará­
lesztésre kerülnek. Az eszközmeghajtók forráskódja is tartalm az egy valamennyi­ lását azelőtt, hogy a függvényt definiálnánk. Ebben az állományban a legfontosabb
re hasonló fájlt; ez az src/drivers/drivers.h. M inden elsődleges definíciós fájl a meg­ makró a PROTOTYPE, amely lehetővé teszi, hogy a függvények prototípusát
felelő M INIX 3-komponenshez van összeállítva, de az első néhány soruk a 2.32.
ábrán látható részlethez hasonló, és az ott látott fájlok többségét beilleszti. Az _PROTOTYPE (return-typefunction-name, (argument-type argument,...))
elsődleges definíciós fájlok később még előkerülnek. Ez a kis előretekintés csak
azt szeretné hangsúlyozni, hogy különböző könyvtárakban található definíciós fáj­ form ában írjuk, amit egy szabványos fordító előfeldolgozója
lokat együtt használunk. Ebben és a következő szakaszban a 2.32. ábrán látható
állományok mindegyikét megemlítjük. return-typefunction-name(argument-typeargument,...)
Az includel könyvtárban az első fájl az ansi.h (0000. sor).* A M INIX 3-rendszer
bármelyik részének fordításakor ez a fájl kerül az include/minix/config.h után m á­ form ára alakít, míg egy régi vágású (vagyis Kernighan-Ritchie-féle) fordítóprog­
sodiknak beillesztésre. Az ansi.h célja az, hogy ellenőrizze, vajon a fordítóprog­ ram esetén
ram megfelel-e a Nemzetközi Szabványügyi Hivatal C nyelvre vonatkozó szabvá­
nyának. A szabványos C nyelvet néha ANSI C-nek is nevezik, m ert a szabványt return-type function-name()
eredetileg az Amerikai Szabványügyi Hivatal (American National Standards
Institute) készítette, majd később vált nemzetközileg elfogadottá. Egy szabványos alakot kapunk.
C fordító számos olyan m akrót definiál, amelyek a fordítás alatt álló program ok­ M ielőtt az ansi.fi tárgyalását befejezzük, térjünk ki még egy jellegzetességre. Az
ban tesztelhetők. A z __STDC__egy ilyen makró, a szabványos fordítóprogram egész fájl (a kezdő megjegyzéseket kivéve)
ennek 1 értéket ad, m intha az előfeldolgozó az alábbi sort olvasta volna
#ifndef_ANSI_H
#define__ STDC__ 1
és
A M INIX 3 jelenlegi változataiban található fordító megfelel a szabványnak, de
korábbi változatait a szabvány elfogadása előtt fejlesztették ki, és lehetőség van #endif/*_ANSI_H */
arra, hogy a rendszert egy klasszikus (Kernighan & Ritchie) C fordítóval fordít­
suk. Szándékunk szerint a M INIX 3-nak könnyen átvihetőnek kell lennie új gé­ sorok közé van zárva.
pekre, ennek az erőfeszítésnek része a régebbi fordítók tám ogatása is. A 0023. és Az #ifndef sor utáni sorban rögtön következik az _ANSLH definíciója. Egy definí­
0025. sor közötti ciós fájl m inden fordítás során csak egyszer kerülhet beillesztésre; az előbbi konst­
rukció biztosítja, hogy a fájl tartalm át a fordító figyelmen kívül hagyja, amennyi­
#define_ANSI ben az többször is beillesztésre kerülne. Az includel könyvtárban található összes
definíciós fájl is ilyen m ódon védett.
definíció akkor kerül feldolgozásra, ha szabványos fordítót használunk. Az ansLh Két részletre érdem es kitérnünk ezzel kapcsolatban. Egyrészt az elsődleges de­
számos m akrót különbözőképpen definiál attól függően, hogy az A N S I makró finíciós állományok könyvtáraiban található fájlok elején az #ifndef... #define soro­
definiált-e, vagy sem. Ez egy példa ellenőrző makróra. zatban a fájl neve ki van egészítve egy aláhúzásjellel. Ugyanilyen nevű definíciós
Egy másik itt definiált ellenőrző m akró a P O SIX SOURCE (0065. sor). Ezt fájl lehet a C forráskód más könyvtáraiban is, és ugyanezt a módszert használtuk
a POSIX követeli meg. Itt gondoskodunk a definiálásáról, ha valamelyik másik ott is, de aláhúzásjel nélkül. Az elsődleges definíciós fájl beillesztése nem akadá­
m akró m iatt a POSIX szabványnak meg kell felelni. lyozza meg az ugyanolyan nevű definíciós fájl beillesztését egy lokális könyvtárból.
C program ok fordításakor a függvények által fogadott argumentumok és a visz- Másrészt, figyeljük meg, hogy az #endif után az I* _ANSI_H */ megjegyzés nem kö­
szatérési értékek típusainak ismertnek kell lennie ahhoz, hogy az ilyen adatokra telező. Ilyen megjegyzések használatával javíthatjuk az egymásba ágyazott #ifndef
hivatkozó program kód lefordítható legyen. Egy összetett rendszerben nehéz a ... #endif és #ifdef ... #endif szakaszok átláthatóságát. De az ilyen megjegyzésekkel
függvénydefiníciókat olyan sorrendben elhelyezni, hogy ennek a követelménynek vigyázni kell: ha hibásak, akkor rosszabbak, mint ha egyáltalán nem is lennének.
Az includel könyvtárból a második, m inden M INIX 3-forrásállományba közve­
* Az itt megadott számok a CD mellékleten található MINIX 3-forráskód soraira vonat­ tett m ódon beillesztett definíciós fájl a limits.h (0100. sor). Ez a fájl definiál alap­
koznak.
150 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 151

vető C nyelvi m éreteket, mint például a bitek száma egész mennyiségekben, és az adatátviteli sebességet meghatározó változókat és egy tömböt tartalmaz, utóbbi
operációs rendszerhez kapcsolódó korlátokat is, mint például a fájlnevek hossza. olyan speciális karakterek tárolására szolgál, mint az IN T R vagy a K ILL. Ez a struk­
Az ermo.h (0200. sor) szintén szerepel majdnem az összes elsődleges definíciós túra számos makróval és függvényprototípussal együtt a POSIX szabvány része.
fájlban. Ez tartalm azza azokat a hibakódokat, amelyeket a sikertelen rendszerhí­ Egy mégoly teljességre törekvő szabvány, mint a POSIX, sem nyújt mindent,
vások adnak vissza a felhasználói program oknak a globális ermo változóban. Az amire vágyunk, így a fájl utolsó része az 1140. sortól kezdve POSIX-kiterjesztéseket
ermo néhány belső hiba azonosítására is szolgál, ilyen például, ha egy nem létező tartalmaz. Ezek egy részének haszna nyilvánvaló, mint például az 57 600 és ennél
taszknak találnánk üzenetet küldeni. A rendszeren belül nem lenne hatékony, ha nagyobb baudértékek, valamint a term inálokon használható képernyőablakok tá­
mindig meg kellene vizsgálni egy globális változót, valahányszor olyan függvényt mogatása. A POSIX szabvány nem tiltja a kiterjesztéseket, egy ésszerű szabvány
hívunk meg, amely hibázhat, de a függvényeknek gyakran kell visszaadniuk egyéb úgysem lehet mindent magába foglaló. H a azonban más környezetben is használ­
egész értékeket, például I/O-művelet esetén az átvitt bájtok számát. A M INIX 3 ható, hordozható program okat akarunk írni, akkor óvatosnak kell lennünk, és el
megoldása erre a problém ára az, hogy a hibakódokat negatív értékek reprezentál­ kell kerülnünk a M INIX 3-kiterjesztések használatát. Ezt könnyen megtehetjük,
ják a rendszeren belül, de a felhasználói program ok számára pozitívvá alakítjuk m ert a kiterjesztések definíciói minden állományban egy
őket. E rre azt a trükköt alkalmazzuk, hogy a hibakódokat az alábbihoz hasonló
m ódon definiáljuk (0236. sor): #ifdef_MINIX

#define EPERM (_SIGN 1) direktívával védettek. H a a M IN IX nincs definiálva, akkor a fordító nem is látja a
M INIX 3-kiterjesztéseket; teljesen figyelmen kívül hagyja őket.
Az operációs rendszer részeinek elsődleges definíciós állományai definiálják a A felügyeleti időzítők tám ogatására a timers.h (1300. sor) szolgál, amelyet a
SYSTE M makrót, de a felhasználói program ok nem. H a SYSTEM definiált, ak­ kernel elsődleges definíciós állománya is felhasznál. Definiál egy struct timer adat­
kor SIG N értéke lesz, különben nem kap értéket. típust, valamint időzítők listáján működő függvények prototípusait. Az 1321. sor­
Az állományok következő csoportja nem kerül be m inden elsődleges definí­ ban találjuk a t m r j u n c j típus definícióját (typedef); ez egy függvényre mutató
ciós fájlba, de azért a M INIX 3-rendszer sok forrásállományában megtalálhatók. pointer. Az 1332. sorban láthatjuk a felhasználását: egy timer struktúra időzítők
A legfontosabb az unistd.h (0400. sor), amely számos, a POSIX által megkövetelt listájának elem eként tartalm az egy t m r j u n c j - 1, amely az időzítő lejártakor kerül
konstans definícióját tartalmazza. Ezenkívül egy sor C függvény prototípusa is itt meghívásra.
található, többek között a M INIX 3-rendszerhívások elérésére szolgáló függvé­ Megemlítünk még négy állományt az includel könyvtárból. Az stdlib.h olyan tí­
nyeké is. Egy másik sokat használt fájl a string.h (0600. sor), amely a karakterlán­ pusokat, m akrókat és függvényprototípusokat definiál, amelyek a legegyszerűbb C
cok kezelését végző C függvények prototípusainak ad helyet. A sig n a lh (0700. sor) program ok kivételével szinte mindig szükségesek. A felhasználói program ok fordí­
tartalm azza a szabványos szignálok definícióját. Definiálásra került több olyan tása során ez az egyik leggyakrabban használt definíciós fájl, a M INIX 3-rendszer
szignál is, amelyre csak a M INIX 3-nak van szüksége. Mivel monolitikus kernel forráskódjában azonban csak a kernelben hivatkozunk rá néhány helyen. Az
helyett az operációs rendszer részfunkcióit egymástól független processzusok stdio.h mindenkinek ismerős, aki a C nyelv tanulását a híres „Hello, World!” prog­
valósítják meg, ezért a rendszerkom ponensek között szükség van egy, a szignál­ ram megírásával kezdte. A rendszerfájlokban alig használjuk, de az stdlib.h-hoz
kezeléshez hasonló speciális kommunikációs mechanizmusra. A signal.h szignálok hasonlóan szinte minden felhasználói program ban m egtalálható. Az a.out.h defi­
kezelésével kapcsolatos függvények prototípusait is tartalmazza. A későbbiekben niálja a lemezen tárolt végrehajtható program ok fájlformátumát. Egy exec struk­
ki fog derülni, hogy a szignálok kezelése a M INIX 3 m inden részét érinti. túra található benne, a processzuskezelő az ebben tárolt információ alapján tölti
Az fc n tlh (0900. sor) számos, fájlművelethez szükséges szimbolikus nevet defi­ be a program okat exec hívás hatására. Végül, az stddef.h néhány gyakran használt
niál. Például lehetővé teszi, hogy az open hívásakor az 0 _ R D 0 N L Y m akrót hasz­ m akrót definiál.
náljuk a 0 numerikus param éter helyett. H abár erre az állományra a fájlrendszer Folytassuk az include/sys/ könyvtárral. Ahogy a 2.32. ábrán látható, a M INIX 3
hivatkozik a legtöbbször, a benne szereplő definíciók a kernel és a processzuske­ összes elsődleges definíciós állományában mindjárt az ansi.h után szerepel a sys/
zelő számára is fontosak. types.h (1400. sor), amelyben adattípusok vannak definiálva. Sok hiba származhat
Ahogy a 3. fejezetben a taszkok tárgyalása során látni fogjuk, egy operációs rend­ abból, ha félreértjük, hogy egy bizonyos helyen melyik alap adattípus szerepel.
szer konzol- és terminálcsatoló komponense meglehetősen összetett, m ert az ope­ Ezeket kiküszöbölhetjük, ha az itt m egadott definíciókat használjuk. A 2.33. áb­
rációs rendszernek és a felhasználói programoknak sokféle hardvereszközzel kell ra m utatja néhány típus bitekben m ért hosszát 16 és 32 bites processzor esetén.
együttműködniük szabványosított módon. A termios.h (1000. sor) a terminál jellegű Figyeljük meg, hogy m inden típusnév végződése „_t”. Ez nem egyszerűen csak
I/O-eszközök kezeléséhez szükséges konstansokat, makrókat és függvényproto­ konvenció; a POSIX szabvány írja elő. Ez egy foglalt végződés, nem használható
típusokat definiál. A legfontosabb a termios struktúra. Ez üzemmódjelző biteket, olyan név esetén, amely nem típusnév.
152 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 153

16 bites M IN IX 32 bites M IN IX
Az ebben a részben utolsóként tárgyalt fájlok nem olyan gyakran használtak,
Típus
8 8
mint az előzők. A sys/dir.h (1800. sor) definiálja egy M INIX 3-könyvtárbejegyzés
gid_t
szerkezetét. Csak egyszer hivatkozunk rá közvetlenül, de ezáltal egy olyan definí­
dev t 16 16
ciós fájlba kerül be, amely a rendszerben széles körben használt. Egyebek mellett
pid_t 16 32
azért fontos, m ert megadja, hogy egy fájlnév hány karaktert tartalm azhat (60-at).
ino_t 16 32
A sys/wait.h (1900. sor) a processzuskezelőben megvalósított wait és waitpid rend­
2.33. ábra. Néhány típus bitekben mért hossza 16 és 32 bites rendszerben szerhívások által használt m akrókat definiál.
Az include/sys/ sok más állományát is megemlíthetnénk. A M INIX 3 tám ogat­
A M INIX 3 jelenleg 32 bites mikroprocesszorokon fut, de a 64 bitesek egyre ja a végrehajtható program ok nyomkövetését és a hibás program ok m em óriatér­
fontosabbak lesznek a jövőben. A hardver által nem tám ogatott típusok szinteti­ képének elemzését egy nyomkövető programmal. Ehhez a sys/ptrace.h definiálja
zálhatok, ha szükséges. Az 1471. sorban az u 6 4 j típus definíciója struct {u32_t[2]J. a ptrace rendszerhívás lehetséges műveleteit. A sys/svrctl.h az svrctl rendszerhívás
Erre a típusra nincs túl gyakran szükség a jelenlegi implementációban, de hasznos által használt adatszerkezeteket és m akrókat definiálja. Az svrctl igazából nem is
lehet - például m inden lemez- és partícióadat (eltolási címek és m éretek) 64 bites rendszerhívás, de úgy használjuk, m intha az lenne. Az svrctl a szerverprocesszusok
számként van tárolva, em iatt nagyon nagy lemezek is megengedettek. koordinálására használatos a rendszer indításakor. A select rendszerhívás segítsé­
A M INIX 3 sok olyan típusdefiníciót használ, amelyeket a fordítóprogram vé­ gével több csatornán várakozhatunk bejövő adatra - például virtuális term inálok
gül a kisszámú alaptípus egyikeként értelmez. Ezzel a kódot szerettük volna ol­ várakozhatnak hálózati kapcsolatra. A szükséges definíciókat a sys/select.h tartal­
vashatóbbá tenni; például egy d e v j típusú változóról azonnal látszik, hogy egy mazza.
I/O-eszközt azonosító fő- és alárendelt eszközszám tárolására szánták. A fordí­ Szándékosan hagytuk a sys/ioctl.h és a kapcsolódó fájlok vizsgálatát a végére,
tóprogram számára ezzel egyenértékű lenne, ha ezt a változót short típusúnak m ert nem érthetők meg teljesen, ha nem tekintjük át előbb a minix/ioctl.h állo­
deklarálnánk. Megjegyezzük még, hogy sok itt definiált típusnak van nagybetűvel mányt. Az ioctl rendszerhívással a különböző eszközöket vezérelhetjük. Egyre nö­
kezdődő alakja is, például d e v j és D e v j. A fordítóprogram számára a nagybetűs vekvő számú új, a m odern számítógépes rendszerekhez illeszthető eszköz jelenik
változatok mind egyenértékűek az int típussal. Ezek a K&R fordítóprogram okhoz meg, ezek is valamiféle vezérlést igényelnek. A könyvben leírt M INIX 3-rendszer
készült olyan függvényprototípusokban fordulnak elő, amelyekben az előforduló valójában abban különbözik más változatoktól, hogy aránylag kevés I/O-eszközt
típusoknak kompatibilisnek kell lenniük az int típussal. A types.h megjegyzései to­ m utat be. Sok más eszköz, mint például hálózati csatolók, SCSI-vezérlők és hang­
vábbi magyarázatokkal szolgálnak. kártyák beillesztésére van lehetőség.
Em lítésre méltó még az a feltételes kódrészlet, amely az A könnyebb kezelhetőség érdekében több kisebb állományt használtunk, m ind­
egyikben egy definíciócsoport található. A sys/ioctlh (2000. sor) mindegyiket be­
#if _EM_WSIZE ==2 illeszti, ennyiben a 2.32. ábra elsődleges definíciós állományához hasonlít. Az
egyik ilyen definíciós fájl a sys/ioc_disk.h (2100. sor). Ez és a sys/ioctlh által beil­
sorral kezdődik (1502-1516. sor). Ahogy korábban jeleztük, a legtöbb feltételes lesztett többi fájl az include/sys/ könyvtárban van, m ert a „nyilvános programozói
kódrészletet eltávolítottuk a könyv kedvéért. A fenti részlet azért m aradt benne, felület” részének tekintjük, ami azt jelenti, hogy a program ozók felhasználhatják
hogy megmutassuk a feltételes definíciók egyik lehetséges felhasználási módját. a M INIX 3-környezetbe szánt programjaikban. Mindegyik függ azonban olyan
Az itt használt E M J V S IZ E m akró egy újabb példája a fordítóprogram által de­ makródefinícióktól, amelyek a minix/ioctih állományban (2200. sor) vannak el­
finiált ellenőrző makrónak. A célarchitektúra szóm éretét tartalm azza bájtokban helyezve, ezért ezt mindegyik be is illeszti. Programíráskor a minix/ioctl.h-1 nem
mérve. Az # if... #else ... #endif sorozat használata egy módja annak, hogy bizonyos szabad önm agában használni, ezért van az include/minix/-ben, és nem az include/
definíciók mindig helyesek legyenek, ezzel biztosítva, hogy az utána következő sys/-ben.
programrész helyesen forduljon le 16 és 32 bites rendszeren is. Az ezekben a fájlokban definiált makrók együtt azt határozzák meg, hogy a le­
Az include/sys/ könyvtár sok más állom ánya is széles körben használt a hetséges funkciókhoz tartozó különböző adatokat hogyan csomagoljuk be az ioctl
M INIX 3-rendszerben. A sys/sigcontext.h (1600. sor) olyan adatszerkezeteket de­ argum entum aként használt 32 bites egész számba. Például a lemezeknek öt műve­
finiál, amelyeket a kernel és a processzuskezelő arra használnak, hogy a szignál­ letük van, ahogy a sys/ioc_disk.h 2110-től 2114-ig terjedő soraiban látható. A „d”
kezelő rutinok előtt a rendszer állapotát elm entsék, utána pedig visszaállítsák. karakter azt jelzi az ioctl-nek, hogy lemezműveletről van szó, 3-tól 7-ig terjedő
Asys/stat.h (1700. sor) definiálja az 1.12. ábrán m ár bem utatott struktúrát, amely­ egész szám kódolja a műveletet, a harmadik param éter pedig olvasás vagy írás ese­
ben a stat és fstat rendszerhívások adnak vissza információt. Itt található még a tén m egadja az adatátadásra használt struktúra m éretét. A minix/ioctl.h 2225. és
stat, fstat és más, az állományok jellemzőit m anipuláló függvények prototípusa is. 2231. sorai között azt láthatjuk, hogy a karakterkód 8 bitje 8 hellyel balra tolódik,
E rre az állományra a fájlrendszer és a processzuskezelő sok helyen hivatkozik. a struktúra m éretének legkisebb helyi értékű 13 bitje 16 bittel balra tolódik, majd
154 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 155

ezek logikai VAGY műveletben egyesítődnek a műveleti kóddal. A 32 bites érték A M AC H INE értéke M AC H IN E IB M PC lesz a sys_config.h-bán; a 2330. és
legnagyobb helyi értékű 3 bitjében kerül kódolásra a visszatérési érték típusa. 2334. sor között a lehetséges nevek rövid alternatíváit találjuk. A M INIX korábbi
Bár sok m unkának tűnik, mindez fordítási időben történik, futás közben pe­ verziói Sun-, Atari- és M acintosh-platformokon is futottak, és a teljes forráskód
dig nagyon hatékony kapcsolódást ad a rendszerhívásnak, mivel a felhasznált ar­ tartalm az alternatívákat ezekhez a hardverekhez is. A forráskód nagy része gép-
gumentum a CPU legtermészetesebb adattípusa. Eszünkbe juttathat viszont egy független, de egy operációs rendszer mindig tartalm az gépfüggő kódot is. Azt is
híres megjegyzést, amelyet Ken Thompson írt a Unix egyik korai verziójának for­ meg kell jegyeznünk, hogy mivel a M INIX 3 m eglehetősen új, a könyv megírá­
ráskódjába: sakor még további m unkára van szükség ahhoz, hogy a M INIX 3-at nem Intel-
platform okra is át lehessen vinni.
/* You are nőt expected to understand this */ A config.h más definíciói segítségével a telepítés során egyéb igényeinket állít­
hatjuk be. Például a fájlrendszer által gyorsítótárnak használt pufferek száma álta­
(Többféleképpen is értelmezhető: „Ezt nem kell m egértened”, vagy „Ezt úgysem lában a lehető legnagyobb kell hogy legyen, de sok pufferhez nagyon sok memória
fogod m egérteni”.) kell. A 2345. sorban beállított 128 blokk minimáhsnak tekinthető, és csak 16 MB-
A minix/ioctl.h tartalm azza az ioctl rendszerhívás prototípusát is (2241. sor). nál kevesebb RAM-mal rendelkező gépen kielégítő. Nagy memóriával rendelkező
Ezt általában a programozók nem hívják közvetlenül, m ert az include/termios.h gépeken sokkal nagyobb számot érdem es ideírni. H a m odem et akarunk használ­
állományban definiált szabványos POSIX-függvények sok esetben kiváltják a ré­ ni vagy hálózaton keresztül is be akarunk jelentkezni, akkor az NR_RS_LIN ES
gi ioctl könyvtári függvényt terminálok, konzolok és hasonló eszközök kezelése és az N R PTYS definíciós sorokban kell az értékeket megnövelni és a rendszert
esetén. Ennek ellenére szükség van rá. Tulajdonképpen a terminálkezelő POSIX- újrafordítani. A config.h utolsó része olyan definíciókat tartalmaz, amelyek szük­
függvények belül az ioctl rendszerhívást használják. ségesek, de nem változtathatók meg. Sok definíció csak alternatív neveket ad a
sys_config.h-ban definiált konstansoknak.
A sys_config.h (2500. sor) olyan definíciókat tartalmaz, amelyek a rendszerprog­
2.6.4. A MINIX 3 definíciós állományok ramozók érdeklődésére tarthatnak számot, például ha valaki egy új eszközmeg­
hajtót ír. Egyébként valószínűleg nem kell megváltoztatni semmit, talán kivételt
Az include/minix/ és include/ibm/ könyvtár M INIX 3-specifikus definíciós fájlo­ képez az N R PROCS konstans (2522. sor). Ez a processzustábla m éretét adja
kat tartalm az. Az include/minix/ állományai között vannak olyanok, amelyeknek meg. H a a M INIX 3-rendszert hálózati szervernek akarjuk használni sok távoli
architektúrától függő változatai vannak, de többségük minden megvalósításhoz felhasználóval vagy sok egyidejűleg futó szerverprocesszussal, akkor esetleg meg
szükséges. Egy ezek közül az ioctl.h, amit éppen az előbb láttunk. Az include/ibm/ kell növelni ezt az értéket.
könyvtárban az IBM PC-n történő megvalósításhoz tartozó struktúrák és makrók A következő fájl a const.h (2600. sor), amely a definíciós fájlok egy másik gyakori
találhatók. felhasználási módját illusztrálja. Számos olyan gyakran használt konstans definícióját
Kezdjük a minix/ könyvtárral. Az előző részben láttuk, hogy a config.h (2300. találjuk itt, amelyet új kernel fordításakor valószínűleg nem változtatunk meg. Ezek
sor) a M INIX 3-rendszer m inden részének elsődleges definíciós állományába egy helyre gyűjtése megelőzi azokat a nehezen felderíthető hibákat, amelyek több
bekerül, így ez a fordító által legelőször feldolgozott fájl. H a m ódosítanunk kell helyen megadott, egymásnak ellentmondó definíciókból származnának. Más const.h
hardvereltérések miatt, vagy m ert az operációs rendszert másképpen akarjuk nevű állományok is vannak a M INIX 3 forráskódkönyvtáraiban, de ezek használata
használni, akkor sok esetben mindössze ezt az állományt kell kijavítani és a rend­ korlátozottabb. A csak a kernelben használt definíciókat az src/kemel/const.h tartal­
szert újrafordítani. Azt javasoljuk, hogy ha módosítunk ebben a fájlban, akkor a mazza, a csak a fájlrendszerben használt definíciókat pedig az src/servers/fs/const.h.
2303. sorban a megjegyzésben utaljunk a módosítás céljára. A processzuskezelő lokális definíciói peidg az src/servers/pm/const.h állományban
A felhasználó által beállítható param éterek mind a fájl első részében találhatók, vannak. Az include/minix/const.h csak azoknak a definícióknak ad helyet, amelyeket
de nem mindegyiket ajánlatos itt módosítani. A 2326. sorban egy másik definíciós a M INIX 3-rendszer több helyén is felhasználunk.
fájl, a minix/sys_config.h kerül beillesztésre, és némelyik param éter definíciója in­ A const.h néhány definíciója figyelemre méltó. Az E X T E R N egy makró, amely­
nen öröklődik. A program ozók ezt így látták jónak, m ert a rendszer néhány állo­ nek kifejtése extern (2608. sor). A definíciós fájlban deklarált, és több állományba
mányában szükség van a sys_config.h definícióira, de a többire a config.h-ból nincs. is beillesztett globális változókat E X T E R N előzi meg, mint például
Sok olyan név van a config.h-bán, amelyek nem aláhúzásjellel kezdődnek (például
CHIP vagy IN T E L), és könnyen előfordulhatna, hogy ütköznek olyan általánosan EXTERN int who;
használt nevekkel, amelyeket nagy valószínűséggel megtalálunk a M INIX 3 alá
más operációs rendszerekből áthozott programokban. A sys_config.h nevei mind H a a deklaráció csak
aláhúzásjellel kezdődnek, ezért a névütközés esélye kisebb.
int who;
156 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 157

lenne, és több állományba is beillesztésre kerülne, akkor némelyik szerkesztőprog­ void lock_dequeue(rp)
ram többszörösen definiált változóra panaszkodna. Ezenkívül a C referencia kézi­
könyv (Kernighan és Ritchie, 1988) is egyértelműen megtiltja ezt a konstrukciót. alakra fejti ki, ami a C hatásköri szabályok szerint azt jelenti, hogy a lock_dequeue név
A hiba elkerülésének módja, hogy egyetlen hely kivételével exportálódik, és más, a programba beleszerkesztett állományokból is hívható, ebben
az esetben bárhonnan a kernelből. Egy másik függvény ugyanabból a fájlból a
extern int who;
PRIVÁTÉ void dequeue(rp)
szerepeljen. Az E X T E R N használata biztosítja ezt olyan módon, hogy a const.h
m inden beillesztése során extern helyettesítődik be, kivéve, ha valahol az üres ka­ ami előfeldogozás után
rakterláncot adva értékül újradefiniáljuk. Ez úgy történik, hogy a globális definí­
ciók a M INIX 3 m inden részében egy speciális glo.h állományban vannak, mint static void dequeue(rp)
például src/kemel/glo.h, amely közvetett m ódon m inden fordításkor beillesztődik.
M inden glo.h tartalm azza az lesz. Ez a függvény csak ugyanabban a fájlban található programkódból hívható.
A PRIVÁTÉ és a PUBLIC nem feltétlenül szükséges, csak egy próbálkozás arra,
#ifdef_TABLE hogy a C hatásköri szabályok által okozott kárt enyhítse (alapértelm ezés szerint a
#undefEXTERN nevek exportálódnak; ennek éppen fordítva kellene lennie).
#defineEXTERN A const.h m aradék részében a rendszerben sokat használt numerikus kons­
#endif tansok definíciói vannak. A const.h egy szekciója a gép- vagy konfigurációfüggő
definícióknak van szentelve. Például a forráskód egészében a memóriafoglalás
sorokat, és a M INIX 3 minden részében a table.c állományokban van egy alapegysége a m emóriaszelet (click). A memóriaszelet m érete függhet a procesz-
szortól, az Intel processzorokhoz 1024 az értéke. Az Intel, M otorola 68000 és Sun
#define_TABLE SPARC architektúrához tartozó értékek a 2673. és 2681. sor között találhatók. Ez
a fájl tartalmazza a M A X és a M IN m akrókat is, így a
sor az #include szekció előtt. így amikor a definíciós fájlok a table.c fordítása során
beillesztésre és kifejtésre kerülnek, nem kerül extern az E X T E R N helyére (mivel z = MAX(x, y);
ez utóbbi értéke itt m ár az üres karakterlánc). Em iatt a globális változók részére
m em óriát csak egy helyen, a table.o tárgykódú állományban foglalunk le. utasítással z-hez hozzárendelhetjük x és y közül a nagyobbikat.
A C program ozásban járatlan olvasót szeretnénk megnyugtatni, hogy nem baj, Az elsődleges definíciós fájlok segítségével a type.h (2800. sor) is beillesztésre
ha nem ért mindent ezekből a dolgokból, a részletek nem igazán fontosak. Ez Ken kerül minden fordítás során. Kulcsfontosságú típusokat és a hozzájuk tartozó nu­
Thom pson korábbi híres megjegyzésének egy udvarias formája. Néhány szerkesz­ merikus értékeket tartalmaz.
tőprogram nak problém át okozhat a definíciós fájlok többszöri beillesztése, m ert Az első két struktúra két különböző m em óriatérképet definiál, egyiket a loká­
ez bizonyos változók többszöri deklarációját eredményezheti. Ennek az egcsz lis m emóriarégiók számára (a processzus adatterületén belül), a másikat a távoli
E X T E R N játéknak egyszerűen az a célja, hogy a M INIX 3 hordozhatóbb legyen, régiók, mint például a RAM-lemez számára (2828-2840. sor). Itt megemlíthetjük
és olyan gépeken is használhassuk, ahol a szerkesztőprogram nem fogad el több­ a memóriahivatkozások mögötti elveket. Ahogy az előbb említettük, a m em ó­
szörösen definiált változókat. riaszelet a m em ória alapmértékegysége, M INIX 3-ban Intel processzorokra egy
A PRIVÁTÉ astatic szinonimájaként van definiálva. A PRIVÁTÉ szerepel m ind­ memóriaszelet 1024 bájt. A memória m érésének egyik egysége a phys_clicks, ezt
azoknak az eljárásoknak és adatoknak a deklarációjában, amelyekre nem hivat­ a kernel használhatja, így bármelyik m em óriaelem et meg tudja címezni a rend­
kozunk más állományokban, így ezek nevei nem is láthatók azon az állományon szerben. A másik lehetőség a vir_clicks, amelyet a processzusok használnak. Egy
kívül, ahol deklaráltuk őket. Általános szabály, hogy minden változót és eljárást a vir_clicks hivatkozás mindig egy processzushoz rendelt memóriaszegmens kezdő­
lehető legkisebb hatáskörrel kell deklarálni. A PUBLIC definíciója az üres karak­ címéhez viszonyított, és a kernelnek gyakran kell konvertálnia a virtuális (vagyis
terlánc, így a processzusalapú) és fizikai (RAM -alapú) címek között. A kényelmetlenséget el­
lensúlyozza, hogy a processzusok összes memóriahivatkozása vir_clicks egységben
PUBLIC void lock_dequeue(rp) történhet.
Azt feltételezhetnénk, hogy ugyanaz az egység megfelel mindkét típusú hivat­
deklarációt a C preprocesszor a kozáshoz, de előnyösebb, ha a vir_clicks a processzusokhoz rendelt memória egy-
158 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 159

ségét jelenti, m ert ebben az esetben ellenőrizhető, hogy a processzushoz rendelt


m em órián kívülre nem történik hivatkozás. Ez a m odern Intel processzorok (pél­ m_source m_source m_source m_source m_source
dául a Pentium család) védett üzemmódjának egy fontos szolgáltatása. Ennek hiá­
nya a régebbi 8086-os és 8088-as processzorokon okozott némi fejfájást a korábbi
MINIX-verziók tervezésekor.
Egy másik fontos itt definiált struktúra a sigmsg (2866-2872. sor). Amikor egy m_type m_type m_type m type m_type
szignál érkezik, akkor a kernelnek úgy kell intézni a dolgokat, hogy a szignált ka­
pó processzus a legközelebbi futásakor a szignálkezelőjét hajtsa végre, és ne ott
folytatódjon, ahol előzőleg a futása megszakadt. A processzuskezelő elvégzi a ml J1 m2_i1 m3J1 m7_i1 m8_i1
szignálok kezelésével kapcsolatos legtöbb feladatot; egy ilyen struktúrát ad át a
kernelnek, amikor szignált kap.
A kinfo struktúra (2875-2893. sor) arra szolgál, hogy információt adjon a
kernelről a rendszer többi részének. A processzuskezelő ezt az információt hasz­ m1_i2 m2_i2 m3_i2 m7_i2 m8_i2

nálja, amikor a processzustábla rá eső részét beállítja.


Az ipc.h (3000. sor) adatszerkezeteket és függvényprototípusokat definiál a pro­
cesszusok közötti kommunikációhoz. A legfontosabb a message definíciója a 3020. ml _i3 m2_i3 m3_p1 m7_i3 m8_p1
és 3032. sor között. Definiálhattuk volna egy bizonyos hosszúságú bájtvektorként
is, de helyesebb programozási gyakorlat az, ha egy olyan struktúrát használunk,
amely tartalm azza a lehetséges üzenettípusok unióját. H ét üzenetform átum ot de­
m1_p1 m2J1 m7_i4 m8_p2
finiálunk, mess_l-tő\ messJS-ig (a mess_6 m ár elavult). Egy üzenetstruktúra tar­
talmazza a küldőt azonosító m jo u rce , az üzenet típusát tartalm azó m jy p e mezőt
(például SYS_EXEC a rendszertaszkhoz), valamint az adatmezőket.
A hét üzenettípus a 2.34. ábrán látható. Négy üzenettípus, az első kettő, illetve m1_p2 m 2J2 m7_p1 m8_p3
az utolsó kettő azonosnak látszik. Az adatelem ek m éretét tekintve ez így is van, m3_ca1
de az elemek típusa különböző. Egy 32 bites Intel processzor esetén az int, long és
pointer típusok is 32 bitesek, de nem feltétlenül ez a helyzet más hardver esetén.
m1_p3 m2_p1 m7_p2 m8_p4
H ét típust használva könnyebb egy másik architektúrára áttérni.
H a mondjuk három egészet és három m utatót (vagy három egészet és két m uta­
tót) tartalm azó üzenetet kell küldeni, akkor a 2.34. ábrán látható első form átum ot
használjuk. Ugyanez érvényes a többi form átum ra is. Hogyan rendelünk értéket 2.34. ábra. A MINIX3-ban használt hét üzenettípus. Az üzenetek részeinek mérete
az első egészhez az első form átum ban? Tegyük fel, hogy az üzenetet jc-szel jelöljük. architektúránként változó; ez a diagram a 32 bites pointert használó gépen érvényes
Ekkor x.m_u az üzenetstruktúra unió részét jelöli. Az unió hét alternatívája közül méreteket mutatja, ilyenek például a Pentium család tagjai
az elsőt a z x .m ju .m jn l jelöli ki. Végül az első egészet a z x . m j i .m j n l .m l i l kife­
jezés azonosítja. Ez egész nagy falat, ezért az üzenetek után valamivel rövidebb szült, hogy a M INIX 3-fordító az unsigned és az int típusokat a bitminta megváltoz­
mezőneveket definiálunk makróként. í g y x . m l j l használható x . m j i .m j n l .m l i l tatása és túlcsordulás ellenőrzése nélkül másolja át egymásba. A pontosabb meg­
helyett. A rövid nevek mind „m” betűvel kezdődnek, majd a formátum száma és oldás az lenne, ha minden int mezőt egy int és egy unsigned uniójára cserélnénk.
egy aláhúzás karakter áll. Ezután egy vagy két karakter jelzi, hogy a mező egész Az előbbi érvényes az üzenetek long mezőire is; néha unsigned long adatok továb­
(integer), m utató (pointer), hosszú egész (long), karakter (char), karaktertöm b bítására használjuk őket. Hogy ez csalás? M ondhatjuk úgy is, de a MINIX 3 új ar­
(char array) vagy függvény (function). Végül egy sorszám következik, amely az egy chitektúrára történő átvitele során az üzenetek pontos szerkezetének m eghatáro­
üzeneten belül előforduló több azonos típus megkülönböztetésére szolgál. zása nyilván nagy figyelmet igénylő munka; most pedig felhívtuk a figyelmet arra,
Az üzenetform átum ok tárgyalása közben remek alkalom nyílik megjegyezni, hogy a fordítóprogram viselkedése is egy újabb figyelembe veendő szempont.
hogy az operációs rendszer és a fordítóprogram gyakran „tud” olyan dolgokról, Az ipc.h definiál még prototípusokat a korábban leírt üzenetkezelő alapm ű­
mint a struktúrák szerkezete, és ez megkönnyítheti a rendszer készítőjének dolgát. veletekhez (3095-3101. sor). A fontos send, récéivé, sendrec és notify m ellett több
A M INIX 3-ban az üzenetek int mezőit néha unsigned típusú értékek tárolására másik is látható itt. Ezek nem sok helyen fordulnak elő, tulajdonképpen azt is
használjuk. Ez túlcsordulást okozhatna, de a program kód annak ismeretében ké- m ondhatnánk, hogy a M INIX 3 korábbi fejlesztési fázisaiból itt maradt relikviák.
| 60 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 161

A régi számítógépprogramokban rem ek régészeti ásatásokat lehet folytatni. Ezek ja, amire a kom ponenseknek szükségük van. A fordítóprogram ezt a platformtól
eltűnhetnek a jövőbeni verziókban. Ennek ellenére, ha nem magyarázzuk el őket, függő helyen találja meg; 32 bites Intel-rendszereken ez az /usr/lib/i386/libsysutil.a.
akkor néhány olvasó biztosan aggódni fog miattuk. A nem blokkoló nb_send és Am ikor a fájlrendszer, a processzuskezelő vagy az operációs rendszer más része
nb_receive hívásait jórészt leváltotta a notify, amelyet később vezettünk be, m ert szerkesztődik össze könyvtári függvényekkel, akkor a szerkesztő az egyszerűsített
jobb megoldásnak tekintettük a blokkolás nélküli küldés, illetve blokkolás nélkü­ változatot találja meg, még mielőtt a szabványos könyvtárban keresne.
li üzenet-ellenőrzés problém ájára. Az echo prototípusának nincs küldő és fogadó A következő sorban a kputc prototípusát találjuk. Ezt a prin tf rendszerszintű
mezője. Nincs semmi haszna végleges programban, de fejlesztés közben hasznos verziója hívja, hogy karaktereket jelenítsen meg a konzolon. Itt azonban trükkös
volt az üzenetküldések és -fogadások időszükségletének m eghatározására. dolgok történnek. A kputc több helyen is definiálva van. Van egy példány a rend­
Van még egy, az elsődleges definíciós fájlok beillesztése útján általánosan hasz­ szerkönyvtárban, alapesetben ez használatos, de a rendszer különböző részei saját
nált fájl az include/minix/ könyvtárban. Ez a syslib.h (3200. sor), amely a M INIX 3 verziót definiálnak. Látni fogunk egyet, amikor a következő fejezetben a konzol
szinte összes felhasználói szintű kom ponensébe azok elsődleges definíciós állomá­ programozói felületet fogjuk tanulmányozni. A naplózó eszközmeghajtó (amit
nyain keresztül kerül beillesztésre. Ez a fájl nem kerül be az src/kemel/kemel.h- nem részletezünk) szintén definiálja a saját verzióját. Még a kernelben is van egy
ba, a kernel elsődleges definíciós állományába, m ert a kernelnek nincs szüksége kputc verzió, de az egy speciális eset. A kernel nem használja a printf-el. Egy spe­
könyvtári függvényekre önm aga elérésére. A syslib.h olyan C könyvtári függvé­ ciális kiíró függvény, a kprintf van definiálva erre a célra, a kernel ezt hívja, ha ki
nyek prototípusait tartalmazza, amelyeket az operációs rendszer azért hív, hogy kell írnia valamit.
más operációsrendszer-szolgáltatásokat vegyen igénybe. H a egy processzus egy M INIX 3-rendszerhívást akar végrehajtani, akkor üzene­
A C könyvtárakat nem tárgyaljuk részletesen a könyvben, de sok ezek közül tet küld a processzuskezelőnek vagy a fájlrendszernek. M inden üzenet tartalm az­
szabványos, és m inden C fordítóhoz rendelkezésre áll. A syslib.h függvényei azon­ za az igényelt rendszerhívás számát. Ezek a számok a callnr.h állományban (3500.
ban term észetesen a M INIX 3-hoz kötődnek, és más fordítót használó gépre tör­ sor) vannak definiálva. Némelyik szám nem használt, ezek vagy később kerülnek
ténő átvitel esetén ezeket újra kell írni. Szerencsére ez nem nehéz, m ert a függvé­ csak im plementálásra, vagy korábbi verziók olyan hívásait jelölik, amelyeket már
nyek mindössze annyit tesznek, hogy elhelyezik a param étereket egy üzenetstruk­ könyvtári függvények kezelnek. A fájl vége felé olyan hívási számokat találunk,
túrában, majd elküldik az üzenetet, és a válasz alapján összeállítják az eredményt. amelyek nem felelnek meg az 1.9. ábrán látott hívások egyikének sem. A (koráb­
Ezeknek a könyvtári függvényeknek a többsége tíz-egynéhány sorból álló C prog­ ban em lített) svrctl és a ksig, unpause, revive, valamint a task_reply csak az operációs
rammal van definiálva. rendszeren belül használatos. A rendszerhívás mechanizmus nagyon kényelmes
Em lítést érdem el még ebben a fájlban négy makró, amelyekkel bájt vagy szó ezek megvalósítására. Valójában mivel külső program ok nem használhatják eze­
hosszúságú adatokat tudunk I/O-kapukra küldeni, vagy onnan fogadni. Itt találha­ ket a „rendszerhívásokat”, későbbi verziókban anélkül módosíthatók, hogy ez a
tó a sys sdevio függvény prototípusa is, erre mind a négy m akró hivatkozik (3241- felhasználói program ok viselkedését befolyásolná.
3250. sor). A M INIX 3-projekt lényeges része volt az eszközmeghajtók átvitele A következő állomány a com.h (3600. sor). A név egyik értelmezése az lehetne,
felhasználói szintre, ehhez pedig a kernelbe be kellett építeni olyan funkciókat, hogy „common”, vagyis „általános”, egy másik, hogy „kommunikáció”. Ez a fájl
amelyek segítségével az eszközmeghajtók az I/O-kapuk írását és olvasását kezde­ szerverek és eszközmeghajtók közötti kommunikációhoz általános definíciókat
ményezhetik. tartalmaz. A 3623. és 3626. sor között taszksorszámok definíciói vannak. Negatí­
Asysutil.h-ba (3400. sor) került néhány olyan függvény, amelyek a syslib.h-bán is vak, hogy meg lehessen különböztetni őket a processzusoktól. A 3633. és 3640. sor
lehetnének, ezért tárgykódjuk külön modult alkot. Két függvény, amelyek prototí­ között processzusszámok definíciói találhatók, olyan processzusokéi, amelyek a be­
pusa itt van elhelyezve, további magyarázatot igényel. Az egyik a printf (3442. sor). töltési memóriaképben találhatók. Figyeljünk arra, hogy ezek a számok a procesz-
Akinek van C programozási tapasztalata, az azonnal felismeri a szabványos printf szustábla indexei, nem szabad összekeverni őket a processzusazonosítókkal (PID).
könyvtári függvényt, amely szinte m inden program ban szerepel. A com.h következő része azt definiálja, hogy hogyan kell üzeneteket konst­
Ez viszont nem az a printf függvény. A szabványos könyvtári printf nem hasz­ ruálni notify művelethez. A processzusszámból egy olyan érték kerül előállításra,
nálható a rendszerkom ponenseken belül. Többek között a szabványos printf a amelyet az üzenet m jy p e mezőjébe helyezünk. Az ebben a fájlban definiált értesí­
szabványos kim enetre akar írni, és képesnek kell lennie lebegőpontos számok tések és más üzenetek üzenettípusai úgy képződnek, hogy egy típusosztályt jelölő
formázására is. A szabványos kimenet használata azt jelentené, hogy át kell m en­ bázisértéket kom binálunk egy konkrét típust jelölő kis számmal. A fájl m aradék
ni a fájlrendszeren, de amikor a rendszerkom ponens valamilyen problém a miatt része olyan m akrók gyűjteménye, amelyek értelmes azonosítókat alakítanak át az
hibaüzenetet akar kiírni, akkor szerencsésebb, ha ezt meg tudja tenni más rend­ üzenettípusokat és mezőneveket azonosító mágikus számokká.
szerkomponensek segítsége nélkül. A szabványos verzió teljes formázási képessé­ Az /include/minbc/ tartalmaz még néhány állományt. A devio.h (4100. sor) olyan tí­
geinek beépítése is csak szükségtelenül növelné a kód m éretét. Ezért a printf egy­ pusokat és konstansokat definiál, amelyek az I/O-kapuk elérését teszik lehetővé fel­
szerűsített verziója kerül befordításra a rendszerkönyvtárba, amely csak azt tud­ használói szintről, illetve néhány olyan makrót, amelyekkel egyszerűsödik a kapuk
162 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 163

és egyéb értékek megadása. A dmap.h (4200. sor) egy struktúrát és ennek tömbjét 2.6.5. Processzusok adatszerkezetei és definíciós állományai
definiálja, mindkettő neve dmap. E z a táblázat segít összerendelni a fő eszközszámo­
kat a hozzájuk tartozó függvényekkel. A memory eszközmeghajtó fő- és alárendelt Most pedig m erüljünk bele az src/kemel/ program kódjának tárgyalásába. Az elő­
eszközszáma, illetve más fontos eszközök fő eszközszáma van még itt definiálva. ző két szakaszban egy tipikus definíciós fájlból vett néhány soros kivonat vezette
Az /include/minix/ tartalm az olyan speciális állományokat is, amelyekre a rend­ a gondolatm enetünket; most nézzük a kernel valódi elsődleges definíciós állo­
szer lefordításához van szükség. Az egyik az u64.h, amelyben 64 bites aritm etikai mányát, ez a kernel.h (4600. sor). H árom m akró definíciójával kezdődik. Az első
műveletekhez találunk támogatást; ezekre a nagy kapacitású lemezeken végzett a PO SIX SOURCE, amely a POSIX szabvány által definiált ellenőrző m akró
címszámításokhoz van szükség. Ezekről még nem is álm odtak akkor, amikor a (feature test macro). Az ilyen makrók nevének mindig az aláhúzás karakterrel
UNIX, a C nyelv, a Pentium-processzorok vagy a M INIX ötlete megszületett. El­ (_) kell kezdődnie. A m akró definiálása biztosítja azt, hogy a szabvány által meg­
képzelhető, hogy a M INIX 3 jövőbeli verziói olyan nyelven lesznek írva, amelyek­ követelt, valamint a nem kötelező, de kifejezetten m egengedett makrók láthatók
ben van beépített tám ogatás 64 bites egész számok kezelésére 64 bites regiszterek­ legyenek, míg a nem hivatalos kiterjesztésként definiált szimbólumok ne legyenek
kel ellátott CPU-kon. Addig az u64.h definícióival át lehet hidalni a problémát. elérhetők. A következő két definíciót m ár em lítettük, a _M IN IX makró felülbírál­
H árom állományt említünk még. A keymap.h a különböző nyelvek által használt ja a P O SIX SOURCE hatását a M INIX 3 által definiált kiterjesztések használ­
karakterkészletekhez speciális billentyűzetelrendezéseket megvalósító struktúrá­ hatósága érdekében. A _SYSTEM m akró segítségével pedig különbséget tehetünk
kat definiál. A fájl az ilyen táblázatokat előállító és betöltőprogram ok számára is a felhasználói kód és rendszerkód fordítása között, például a hibakódok előjelé­
szükséges. A bitmap.h néhány olyan m akrót definiál, amelyekkel bitek beállítása, nek megváltoztatása érdekében. A kemel.h más definíciós fájlokat is beilleszt az
törlése és ellenőrzése egyszerűbben megoldható. Végül, a partition.h definiálja a include/ könyvtárból, illetve ennek include/sys/, include/minix/ és include/ibm/ al­
M INIX 3 számára a lemezpartíciók definiálásához szükséges információkat, akár könyvtáraiból, beleértve a 2.32. ábrán látható állományok mindegyikét. Ezeket
abszolút lemezeim és m éret alakban, akár cilinder, fej és szektorcím alakban. Az az előző két szakaszban tárgyaltuk. Végül a lokális src/kemel/ könyvtárból további
u 6 4 j típust használjuk a cím és a m éret megadásához, hogy nagy lemezek is ke­ hat definíciós fájl kerül beillesztésre, ezeknek a neve idézőjelek között található.
zelhetők legyenek. A partíciók szerkezetét nem ez a fájl írja le, hanem egy másik A kem elh teszi lehetővé, hogy az
a következő könyvtárban.
Az utolsóként megvizsgált speciális include/ibm/ könyvtár több olyan definíciós #include "kemel.h"
fájlnak ad helyet, amelyek az IBM PC-számítógépekhez tartozó definíciókat tar­
talmaznak. Mivel a C nyelv csak mem óriacím eket ismer, és nincs felkészítve I/O- sor megadásával a nagyszámú fontos definíció az összes kernel-forrásállomány
kapuk címének elérésére, ez a függvénykönyvtár olyan assembly nyelvű rutinokat rendelkezésére áll. Mivel a beillesztések sorrendje néha fontos, a kem elh ezt a
tartalmaz, amelyek I/O-kapukat tudnak írni és olvasni. A különféle rutinokat az sorrendet is egyszer s m indenkorra meghatározza. Ez magasabb szintre emeli a
ibm/portio.h (4300. sor) definiálja. Bájtokat, egész számokat és hosszú egészeket definíciós fájlok mögött rejlő koncepciót, amit úgy lehetne megfogalmazni, hogy
lehet egyesével vagy adatsorozatként olvasni és írni is, inb-tői (egy bájt beolva­ „csináld meg egyszer jól, aztán felejtsd el a részleteket”. Hasonló elsődleges defi­
sása) outsl-ig (hosszú egészek sorozatának kiírása) terjedő rutinokkal. A kernel níciós fájlok találhatók a fájlrendszer és a processzuskezelő forrásállományai kö­
alacsony szintű rutinjainak a CPU-megszakítások letiltására és engedélyezésére zött is.
is szükségük lehet, ezeket a C szintén nem tudja kezelni. A függvénykönyvtárban Most nézzük meg a kemel.h által használt lokális definíciós állományokat.
ehhez megvannak az assembly nyelvű rutinok, az intr_disable és az intr_enable a Először egy újabb config.h nevű fájlt találunk, amelynek a rendszerszintű include/
4325. és a 4326. sorban van definiálva. minix/config.h-hoz hasonlóan az összes többi #include előtt kell állnia. Ahogy az
A következő fájl az interrupt.h (4400. sor), amely a PC-kompatibilis rendszerek include/minix/ közös definíciós könyvtárban, úgy az src/kemel/ forráskönyvtárban
megszakításvezérlője, és BlOS-a által használt kapu- és memóriacímeket definiál. is van const.h és type.h nevű fájl. Az include/minix/ olyan állományokat tartalmaz,
Végül a ports.h (4500. sor) további kapukat definiál. Olyan címeket határoz meg, amelyek a rendszer sok eleme számára szükségesek, beleértve a rendszer felügye­
amelyek a billentyűzetinterfész és az időzítőlapka kezeléséhez szükségesek. lete alatt futó program okat is. Az src/kemel/ könyvtár állományai olyan definíció­
Több IBM-specifikus információt tartalm azó fájl van még az include/ibm/ alatt. kat tartalm aznak, amelyek csak a kernel fordításához szükségesek. A fájlrendszer,
A bios.h, a memory.h és a partition.h bőségesen tartalm az megjegyzéseket, és ér­ a processzuskezelő és más rendszerszintű forráskönyvtárban is van const.h és
demes elolvasni annak, aki többet akar tudni a m emóriakezelésről és a lemezek type.h nevű fájl; ezek a rendszer megfelelő részéhez szükséges konstansokat és tí­
partíciós tábláiról. A cmos.h, a cpu.h és az int86.h további információkat tartal­ pusokat definiálnak. Az elsődleges definíciós fájl által beillesztett további két fájl a
maz a kapukkal, CPU-jelzőbitekkel, valamint a BIOS és a 16 bites m ódú DOS- proto.h és a glo.h; ezeknek nincs megfelelőjük az include/ könyvtárakban, de mint
szolgáltatások hívásával kapcsolatban. Végül a diskparm.h egy, a hajlékonyleme­ látni fogjuk, a fájlrendszer és a processzuskezelő esetében van. A kemel.h-ba utol­
zek formázásához szükséges adatszerkezetet tartalmaz. sóként beillesztett definíciós állomány az ipc.h.
164 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 165

Mivel most először találkozunk ezzel a jelenséggel, figyeljük meg a kernel/ struktúra (4979-4986. sor); ez része annak a védelmi mechanizmusnak, amely a
config.h elején álló #ifndef ... #define sorozatot, amely kiküszöböli az esetleges processzusokat megakadályozza abban, hogy a hozzájuk rendelt m em óriaterüle­
többszöri beillesztésekből adódó problémákat. Az alapötletet láttuk már korábban ten kívüli régiókhoz hozzáférjenek. Más CPU esetén a seg d escj talán egyáltalán
is. De láthatjuk, hogy az itt definiált makró neve C O N F IG H , kezdő aláhúzásjel nem is létezne, ez attól függ, hogy a m emóriavédelmet az hogyan oldja meg.
nélkül. így ez különbözik az include/minix/config.h-bán definiált CONFIG H Ezekkel a struktúrákkal kapcsolatban még azt jegyezzük meg, hogy a szüksé­
makrótól. ges adatok jelenléte még nem elegendő az optimális teljesítmény szempontjából.
A kernel config.h verziója olyan definíciókat gyűjt egy helyre, amelyeket minden A sta ckfra m ej kezelését assembly nyelvű program nak kell végeznie, ezért olyan
valószínűség szerint nem kell módosítani, ha a célunk egy operációs rendszer m ű­ formában kell definiálni, hogy minél gyorsabban lehessen írni és olvasni, ezáltal a
ködésének megértése, vagy annak használata szokványos számítógépes környezet­ processzusváltások ideje csökkenthető.
ben. De tételezzük fel, hogy egy nagyon kisméretű M INIX 3-verziót akarunk készí­ A következő fájl, a proto.h (5100. sor) tartalm azza az összes olyan függvény
teni egy tudományos műszer vagy házi készítésű mobiltelefon számára. A 4717. és a prototípusát, amelyeknek ismertnek kell lenniük azon az állományon kívül is,
4743. sor között egyenként letilthatjuk a kernelhívásokat. A szükségtelen funkciók ahol definiálva vannak. Mindegyik az előző részben tárgyalt PROTOTYPE m ak­
kihagyása a memóriaigényt is csökkenti, m ert az egyes kernelhívásokhoz szükséges ró segítségével van megadva, így a M INIX 3-kernel fordítható akár klasszikus
programkód a 4717. és a 4743. sor közötti definíciókat felhasználó feltételes for­ C (Kernighan-Ritchie) fordítóval, mint amilyen az eredeti M INIX C fordító,
dítási direktívák közé van helyezve. H a valamelyik funkciót letiltjuk, akkor a vég­ vagy egy m odern, szabványos ANSI C fordítóval, mint amilyen a M INIX 3-ban
rehajtásához szükséges kód kimarad a tárgykódból. Például egy mobiltelefonban is található. Ezeknek a prototípusoknak egy része rendszerfüggő, mint például a
esetleg nincs szükség arra, hogy új processzusokat hozzunk létre, ezért az ezt meg­ megszakításkezelők, a kivételkezelők és az assembly nyelven írt függvények.
valósító kód kimaradhat a végrehajtható programból, kisebb memóriafelhasználást A glo.h (5300. sor) állományban a kernel globális változóit találjuk. Az E X T E R N
eredményezve. A fájlban előforduló többi konstans közül a legtöbb alapparam éte­ makró célját megismertük az include/minix/const.h leírásakor, rendes körülm é­
reket határoz meg. Például megszakításkezelés közben a rendszer egy K_STACK_ nyek között behelyettesítéskor extern lesz az eredménye. Figyeljük meg, hogy a
B YTES m éretű speciális vermet használ. Ez az érték a 4772. sorban kerül beállítás­ glo.h sok definícióját megelőzi ez a makró. H a ezt az állományt a table.c fájl illeszti
ra. A veremnek az mpx386.s nevű assembly nyelvű fájlban foglaljuk le a helyet. be, akkor az E X T E R N üres értéket kap, m ert ott a TABLE m akró definiálva van.
A const.h-ban (4800. sor) található egy m akró a 4814. sorban, amely a kernel E zért az így definiált változók számára a tárolóhely lefoglalásra kerül, amikor a
m em óriaterületéhez viszonyított virtuális címeket alakít fizikai címekké. A kernel table.c fordításakor beilleszti aglo.h-t. A glo.h más kernelm odulok C forrásállom á­
kódjában máshol definiálva van egy u m a p jo ca l nevű C függvény, amellyel a nyába történő beillesztése esetén a table.c változóit ott is ism ertté teszi.
kernel végre tudja hajtani ugyanezt a konverziót más rendszerkom ponensek szá­ Az itt elhelyezett információs struktúrák közül néhányra szükség van indításkor.
mára, de a kernelen belül a m akró hatékonyabb. Több más hasznos m akró is Az aout (5321. sor) a M INIX 3 összes rendszerkom ponensének címét tartalm azó
definiálva van itt, többek között bittérképek manipulálására szolgálók. Az Intel fejléc pointerét hordozza. Jegyezzük meg, hogy ezek fizikai címek, vagyis a pro­
hardverbe épített fontos biztonsági funkció aktivizálása is két makróval történik. cesszor teljes címtartományának kezdetétől számítottak. Ahogy később látni fog­
A processzor állapotszó (processor status word, PSW) egy CPU-regiszter, ezen juk, a M INIX 3 indulásakor az aout fizikai címét a betöltési felügyelőprogram át­
belül az I/O védelmi szint (I/O Protection Level, IOPL) bitek határozzák meg, adja a kernelnek, így a kernel inicializációs rutinjai az összes M INIX 3-komponens
hogy a megszakításrendszerhez és az I/O-kapukhoz engedélyezett-e a hozzáférés. címéhez hozzájuthatnak a felügyelőprogram memóriájából. A kinfo (5322. sor) is
A 4850. és a 4851. sorban különböző PSW -értékek vannak definiálva, amelyek fontos információt hordoz. Emlékezzünk vissza, hogy ez a struktúra az includel
normál és privilegizált processzusok számára m eghatározzák a hozzáférést. Ezek minix/type.h-ba.n van definiálva. Ahogy a betöltési felügyelőprogram az aout struk­
az értékek új processzus indításának részeként a verembe kerülnek. túrán keresztül ad át információt a processzusokról a kernelnek, a kinfo mezőit
A type.h (4900. sor) olyan prototípusokat és struktúrákat definiál, amelyek min­ a kernel tölti fel, hogy magáról információt adjon a rendszer többi komponense
den M INIX 3-megvalósításban szükségesek. Például két struktúra is definiálva számára.
van, a kmessages a kernel diagnosztikai üzenetei számára, illetve a randomness, A glo.h következő szakasza a processzusok vezérlésével és a kernel m űködésé­
amelyet a véletlenszám -generátor használ. vel kapcsolatos változókat tartalmaz. A prev j?tr, a proc_ptr és a nextj>tr a procesz-
A type.h tartalm az számos gépfüggő típusdefiníciót is. A kód rövidebbé és ol­ szustábla bejegyzéseire m utatnak, sorrendben az előzőleg futott, az éppen futó és
vashatóbbá tétele érdekében eltávolítottunk más CPU-kat érintő, feltételesen a következőnek futó processzusra. A bilijptr is egy processzustábla bejegyzésre
fordított részeket, de tudnunk kell, hogy az olyan definíciók, mint például a mutat, azt jelzi, hogy melyik processzusnak számolja el a rendszer a felhasznált
stackframe_s struktúra (4955-4974. sor), amely a regiszterek verembe mentését időt. Amikor egy felhasználói processzus meghívja a fájlrendszert, és a fájlrend­
határozza meg, Intel-specifikusak. Más platform on a sta ckfra m ej struktúra az ott szer fut, akkor a proc j>tr a fájlrendszer processzusra fog mutatni. A bilij ) t r azon­
használt CPU regisztereinek megfelelően épülne fel. Egy másik példa a segdescj ban a hívást kezdeményező felhasználóra fog m utatni, m ert a fájlrendszer által
166 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 167

felhasznált időt rendszeridőként a hívóra kell terhelni. Nem hallottunk még olyan M ielőtt továbbmennénk, meg kell említenünk, hogy a M INIX 3 mikrokernel-
M INIX-rendszerről, amelynek a tulajdonosa m egfizettette volna másokkal a fel­ architektúrája miatt a processzustáblához hasonló form ában a processzuskeze­
használt gépidőt, de meg lehetne tenni. A következő változó a k_reenter, és az lő és a fájlrendszer is tart nyilván ezen kom ponensek működése szempontjából
egymásba ágyazott kernelhívások mélységét tartja nyilván. Ilyen például akkor lényeges információt a processzusokról. Ez a három táblázat együtt megfelel a
történik, ha olyankor érkezik megszakítás, ha nem egy felhasználói processzus, monolitikus operációs rendszerek processzustáblájának, de egyelőre, ha procesz-
hanem maga a kernel fut. Ez fontos, m ert a felhasználói processzusok és a kernel szustábláról beszélünk, akkor a kernel processzustábláját értjük ezalatt. A többit
közötti környezetváltások különböznek attól (és időigényesebbek), mintha újra később tárgyaljuk.
belépnénk a kernelbe. Am ikor egy megszakításkezelő befejeződik, akkor fontos A processzustábla egy elem ének típusát a proc struktúra (5516-5545. sor) ad­
megállapítani, hogy felhasználói processzust kell-e aktivizálni, vagy a kernelben ja. Minden ilyen táblaelem tartalm az tárolóhelyet a regiszterek, a veremmutató,
kell maradni. Ezt a változót a megszakításokat engedélyező és letiltó függvények az állapotinformáció, a m em óriatérkép, a maximális verem m éret, a processzus­
is vizsgálják, mint például a lock_enqueue. H a egy ilyen függvény olyankor hajtó­ azonosító, az elszámolási információ, a beállított időzítőadatok és az üzenetek­
dik végre, amikor a megszakítások m ár le vannak tiltva, akkor a végén nem biztos, kel kapcsolatos információk számára. M inden processzustábla-bejegyzés elején
hogy újra engedélyezni kell őket. Végül ebben a részben van egy elveszett órajele­ a sta ckfra m ej struktúra található. Egy m ár a mem óriában lévő processzust úgy
ket számláló változó. Az időzítőtaszk tárgyalása során térünk ki arra, hogy hogyan hozunk futtatható állapotba, hogy a verem m utatójába betöltjük a hozzá tartozó
veszhet el ilyesmi, és mit lehet tenni, ha elveszett. processzustábla-bejegyzés címét, majd a CPU-regisztereket veremműveletekkel
A glo.h utolsó változói azért kerültek ide, m ert a kernelben mindenhol látha­ feltöltjük ebből a struktúrából.
tónak kell lenniük, de deklarációjuk sorában az E X T E R N helyett extern áll, m ert Egy processzus állapotához azonban több m inden tartozik, mint a regiszterek és
ezek ún. inicializált változók. Ez a konstrukció a C nyelv része. Az E X T E R N m ak­ a m em ória tartalm a. A M INIX 3-ban minden processzus táblabejegyzésében van
ró használata nem egyeztethető össze a C nyelvi inicializációval, m ert minden vál­ egypriv struktúrára m utató pointer (5522. sor). Ez a struktúra egyebek mellett en­
tozó kezdeti értéke csak egyszer állítható be. gedélyeket tartalm az arra nézve, hogy a processzus kinek küldhet és kitől fogad­
A kernel területén futó taszkoknak, jelenleg az időzítőtaszknak és a rendszer­ hat üzenetet. Ennek részleteit később tárgyaljuk. Egyelőre annyit jegyezzünk meg,
taszknak, saját verem áll rendelkezésére a t stack tömbben. Megszakításkezelés hogy a rendszerprocesszusok mind egyedi engedélystruktúrával rendelkeznek, a
közben a kernel egy külön vermet használ, ez azonban nem itt van deklarálva, felhasználói processzusok engedélyei viszont megegyeznek, ezért az ő pointereik
m ert csak a megszakításkezelést végző assembly nyelvű rutin használja, így nem mind ugyanarra az egyetlen struktúrára m utatnak. Van egy bitcsoportot összefogó
kell globálisnak lennie. A kem elh által utolsóként beillesztett fájl, amely azért bájt m éretű mező, a p_rtsjlags (5523. sor). E bitek jelentését alább megadjuk. Ha
még mindig szerepel az összes fordításban, az ipc.h (5400. sor). A processzusok bármelyik bitbe 1 kerül, akkor a processzus nem futtatható, tehát a mező 0 értéke
közötti kommunikáció során használt különböző konstansokat definiál. Később, a a futtathatóság feltétele.
felhasználásuk helyén fogjuk ezeket tárgyalni, amikor a kemel/proc.h kerül sorra. A processzustábla bejegyzéseiben olyan információknak van hely fenntartva,
Több, széles körben használt kernel definíciós fájl van még; ezeket azonban a amelyre a kernelnek szüksége lehet. Például a pjnax_priority mező (5526. sor) azt
kem elh nem illeszti be. Ezek közül az első a proc.h (5500. sor), amely egy procesz- határozza meg, hogy a processzus melyik ütemezési sorra kerüljön fel, amikor első
szustábla-bejegyzést definiál. Egy processzus állapotát a processzushoz tartozó alkalommal futásra kész állapotba kerül. Mivel a processzus prioritása csökken­
m em ória tartalm a és a processzustáblában róla tárolt információ együttese telje­ het, ha más processzusokat akadályoz, van egyp_priority mező is, amelynek kezde­
sen meghatározza. A CPU-regiszterek tartalm a itt tárolódik, amikor a processzus ti értéke megegyezik a p_max_priority értékével. Ténylegesen a p_priority határoz­
nem fut, majd innen töltődnek fel, amikor a futása folytatódik. Ez teszi lehetővé za meg, hogy a processzus melyik sorra kerül, valahányszor futásra kész.
annak az illúziónak a fenntartását, hogy több processzus fut egyszerre, és kölcsön­ A processzusok által elhasznált időt két c lo c k j típusú változó tárolja (5532. és
hatásban van egymással, habár bármelyik időpillanatban egy CPU csak egyetlen 5533. sor). Ezekhez a kernelnek hozzá kell férnie, és nem volna hatékony, ha a
processzus utasításaival tud foglalkozni. A CPU által a környezetváltások során a processzusok saját m em óriaterületén tárolnánk, habár elvileg úgy is megoldható
processzus állapotának m entésére és visszaállítására felhasznált idő szükséges, de lenne. A pjiextrea d y (5535. sor) segítségével vannak összeláncolva a processzusok
nyilván ezalatt a processzusok tevékenysége fel van függesztve. Em iatt a struktú­ az ütemezési sorokon.
rák szerkezetét hatékonysági szempontból határozták meg. Ahogy a proc.h elején A következő néhány mező a processzusok közötti üzenetekkel kapcsolatos in­
található megjegyzésből is kitűnik, sok assembly nyelvű rutin is hozzáfér ezekhez formációt tárol. H a egy processzus nem tudja befejezni a send műveletet, m ert a
a struktúrákhoz, ezért egy másik definíciós fájl, az sconst.h olyan eltolási címeket fogadó nem várakozik az adatátvitelre, akkor ez a küldő a címzett p_caller_q m u­
definiál, amelyeket assembly program ok használnak a processzustábla mezőinek tatója (5536. sor) által azonosított várakozó sorba kerül. Ilyen módon, amikor a
használata közben. Em iatt ha a proc.h-bán változtatunk, akkor változtatásra kény­ célprocesszus végül belefog egy récéivé műveletbe, akkor könnyű megtalálni az
szerülhetünk az sconst.h-bán is.
168 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 169

összes neki küldeni szándékozó processzust. A p _ q jin k mezőt (5537. sor) hasz­ így rp értékül kapja az n-edik processzushoz tartozó táblabejegyzés címét, legyen
náljuk a várakozósor tagjainak összefűzésére. n akár pozitív, akár negatív.
A randevú jellegű üzenetátadást az 5538. és 5540. sor között lefoglalt tárolóhely Itt található a processzustábla definíciója is, proc struktúrák tömbjeként, mint
teszi lehetővé. H a egy processzus récéivé m űveletet végezne, de nincs várakozó proc[NR_TASKS + N R P R O C S ] (5593. sor). Figyeljük meg, hogy az N R TASKS
üzenet a számára, akkor a processzus blokkolódik, és annak a processzusnak a definícióját az includeIminixlcom.h (3630. sor) tartalmazza, az N R PROCS defi­
száma, amelytől üzenetet szeretne kapni, a p_getfrom mezőbe kerül. Hasonlóan, nícióját pedig az include/minix/config.h (2522. sor). Ezek együtt határozzák meg a
a p je n d to a címzett processzus számát tartalmazza, ha a processzus küldeni akar, kernel-processzustábla m éretét. Az N R PROCS megváltoztatásával olyan rend­
de a címzett nem várakozik. Az üzenetpuffer címe a p jn e s s b u f m ezőben van tá­ szert lehet létrehozni, amely több processzus kezelésére képes, ha szükséges (pél­
rolva. A processzustábla utolsó előtti bejegyzése a p jjen d in g (5542. sor), egy bit­ dául egy nagyobb szerveren).
térkép, amely azt tárolja, hogy mely beérkezett szignálokat nem dolgozta még fel Végül a sebesség növelését célzó makrók definíciója került még ide. A p ro­
a processzuskezelő (m ert nem fogad éppen üzenetet). cesszustáblára gyakoriak a hivatkozások, egy tömbelem címének m eghatározása
Végül a processzustábla utolsó mezője egy karaktertöm b, a p jia m e , amely a pedig lassú szorzási művelet elvégzését igényli, ezért a processzustábla elem ei­
processzus nevét tárolja. A kernelnek a processzuskezeléshez nincs szüksége erre re m utató pointerek pproc_addr tömbjét (5594. sor) hozzuk létre. A rdyjiea d és
a mezőre. A M INIX 3 különböző nyomkövetési listákat tud készíteni, ha a konzo­ rd yja il töm böket az ütemezési sorok tárolására használjuk. Például a felhasználói
lon speciális billentyűt ütünk le. Némelyik lista tartalm azhat információt az összes processzusok alapértelmezés szerinti sorának első elem ére a rdy_head[USER_Q\
futó processzusról, ilyenkor egyéb adatok mellett a processzus neve is megjelenik. mutat.
H a m inden processzusnak értelmes neve van, akkor a kernel m űködését köny- Ahogy a proc.h tárgyalásának elején em lítettük, van egy másik, sconst.h nevű
nyebb nyomon követni és megérteni. fájl (5600. sor), amit a proc.h-val szinkronban kell tartani, ha a processzustáblá­
A processzustábla-struktúra után a mezők értékeiként használható különböző ban változtatunk. Az sconst.h assembly program ok által használt konstansokat
konstansok következnek. A p_rts_flags bitjeinek beállításához használható érté­ tartalm az, az assembler által felhasználható formában. Ezek mind relatív címek
kek találhatók az 5548. és az 5555. sor között. H a a bejegyzés nem használt, akkor a processzustábla stackframe_s struktúrájának kezdetéhez képest. Egyszerűbb
S L O T FREE van beállítva. Egy fork után a N O _M A P \t\z\, hogy a gyermekprocesz- ezeket a definíciókat külön állományban tartani, m ert az assembly kódot a C for­
szus mindaddig nem futhat, amíg a m em óriatérképe nincs beállítva. A SEN D IN G dító úgysem dolgozza fel. M ásrészt ezek a definíciók mind gépfüggők is, ezért
és REC EIVIN G jelzi, hogy a processzus üzenet küldése vagy fogadása m iatt blok­ külön állományban tárolva egyszerűbb a M INIX 3 átvitele más gépre, m ert
kolva van. A SIG N ALED és a S IG P E N D IN G azt jelzi, hogy valamilyen szignál egy másik processzorhoz úgyis másik sconst.h kell. Figyeljük meg, hogy sok re­
érkezett, a P STOP pedig a nyomkövetéshez nyújt segítséget. A N O P R IV arra latív cím az előző plusz W alakban van megadva, ahol W a szóhosszal egyen­
használható, hogy egy újonnan létrehozott rendszerprocesszus átmenetileg ne fut­ lő (5601. sor). Ezzel a m ódszerrel ugyanaz a fájl használható a 16 és a 32 bites
hasson, amíg a beállítása teljeskörűen meg nem történt. M INIX 3-verziókhoz is.
Ezt követően (5562-5567. sor) az ütemezési sorok száma és a p_priority mező A többszörös definíciók okozhatnak problém át. A definíciós fájlokat azért al­
megengedett értékei vannak definiálva. A fájl jelenlegi verziójában a felhasználói kalmazzuk, hogy egyetlen konzisztens definíciókészletünk legyen, amelyet aztán
processzusok hozzáférhetnek a legnagyobb prioritású sorhoz is. Ez m inden bi­ számos helyen használhatunk anélkül, hogy a részletekre különösebb figyelmet
zonnyal a m eghajtók felhasználói módú tesztelésének kezdeti időszakából m aradt fordítanánk. A több helyen előforduló definíciók, mint például amelyeket a proc.h
vissza, a M AXJU SER Q értékét valószínűleg kisebb prioritásra (nagyobb számra) és az sconst.h tartalm az, nyilván ellentm ondanak ennek az alapelvnek. Ez term é­
kell beállítani. szetesen egy speciális eset, de mint ilyen, speciális figyelmet igényel. H a bármelyik
Ezután néhány makró következik, amelyek segítségével a processzustábla fon­ fájl megváltozik, akkor ügyelnünk kell arra, hogy a kettő konzisztens maradjon.
tos részeinek címeit fordítási idejű konstansként lehet definiálni, hogy futás köz­ A rendszerprivilégiumok struktúrája a priv, amelyet röviden em lítettünk a
ben gyorsabb legyen a hozzáférés. Ezután pedig további, futási idejű számítások processzustábla ism ertetése során, a priv.h-bán van definiálva (5718-5735. sor).
végzésére és tesztelésre alkalmas makrók következnek. Először van néhány jelzőbit, az sjlags, majd jönnek az s_trap_mask, s jp c jr o m ,
A proc addr makró (5577. sor) azért kell, m ert C-ben nem lehetséges nega­ s j p c j o és s_call_mask mezők, amelyek meghatározzák, hogy mely rendszerhí­
tív tömbindexeket használni. A proc tömb indexhatárai elvileg -N R T A S K S és vások kezdeményezhetők, mely processzusokkal történhet üzenetátadás (-küldés
+NR PROCS lennének, de sajnos C-ben 0-val kell kezdődnie, így proc[0] a legne­ vagy -fogadás), és mely kernelhívások megengedettek.
gatívabb taszkhoz tartozik, és így tovább. Az egymáshoz tartozó processzusok és A priv struktúra nem része a processzustáblának, hanem minden processzus­
bejegyzések megállapítását megkönnyítendő írhatjuk, hogy tábla-bejegyzés tartalm az egy ilyen típusú pointert. Csak a rendszerprocesszusok­
nak van saját példányuk; a felhasználói processzusok mind ugyanarra a példányra
rp = proc_addr(n); mutatnak. így egy felhasználói processzus számára a fennm aradó bitek nem érdé­
170 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 171

kesek, hiszen a megosztásnak nincs értelme. Ezek a mezők függőben lévő értesí­ ábrán csak 16 bit látszik, hogy jobban elférjen a lapon.) Az összes felhasználói
tések, hardvermegszakítások és szignálok bittérképei, illetve van egy időzítő is. A processzus osztozik a 0-s azonosítón, amely a bal szélső bitpozíció. A bittérkép azt
rendszerprocesszusok számára azonban van értelme ezeket definiálni. A felhasz­ m utatja, hogy a felhasználói processzusok, mint például az init, csak a processzus­
nálói processzusok értesítéseit, szignáljait és időzítőit a processzuskezelő kezeli kezelőnek, a fájlszervernek és a reinkarnációs szervernek küldhetnek üzenetet, il­
helyettük. letve csak a sendrec-et használhatják. Az ábrán látható szerverek és eszközmeghaj­
A priv.h szerkezete hasonló a proc.h szerkezetéhez. A priv struktúra definíciója tók bármelyik ipc alapműveletet használhatják, és a memory kivételével mindegyik
után a jelzőbitekhez tartozó makródefiníciók jönnek, majd néhány fontos, fordí­ küldhet bármelyik processzusnak.
tási időben ismert cím, végül futási idejű címszámítást végző makrók. Ezután egy Egy másik, sok helyre beillesztett definíciós fájl a protect.h (5800. sor). Ebben
priv struktúrákból álló táblázat, a priv[NR_SYS_PROCS] következik, amit egy po­ m ajdnem minden azoknak az Intel processzoroknak az architekturális részletei­
interekből álló tömb követ, a ppriv_addr[NR_SYS_PROCS\ (5762-5763. sor). A vel kapcsolatos, amelyek támogatják a védett üzemmódokat (80286, 80386, 80486
pointertöm b gyors elérést biztosít, a processzustábla bejegyzéseinek elérését meg­ és a Pentium sorozat). Ezeknek a processzoroknak a részletes leírása túlm utat e
könnyítő pointertöm bhöz hasonlóan. Az 5738. sorban definiált STACK GUARD könyv keretein. Elég annyi, hogy olyan belső regisztereket tartalmaznak, amelyek
értéke egy könnyen felism erhető bitminta. A felhasználását később fogjuk látni. A a m em óriában elhelyezkedő leírótáblákra m utatnak. A leírótáblák határozzák
kedves olvasót egy kis internetes keresésre bátorítjuk, hogy többet megtudjon en­ meg a rendszer erőforrásainak használatát, és megakadályozzák, hogy egyes pro­
nek az értéknek a történetéről. cesszusok mások m em óriaterületéhez hozzáférjenek.
A priv.h-bán az utolsó tétel egy ellenőrzés, hogy az N R S Y S P R O C S értéke na- Ezenkívül a 32 bites Intel processzorok négy jogosultsági szint használatát te­
gyobb-e, mint a betöltési m em óriaképbe kerülő processzusok száma. Az #error di­ szik lehetővé, ezek közül a M INIX 3 hárm at használ. Ezek szimbolikus definíciója
rektíva hibaüzenetet ír ki, ha a feltétel igaz. Bár a különböző C fordítóprogram ok az 5843. és 5845. sor között található. A kernel központi részei, amelyek a megsza­
eltérően viselkedhetnek, a szabványos M INIX 3 C fordítóprogram ennek hatására kításokat kezelik és a processzusok között váltanak, mindig IN T R P R IV IL E G E
ki is lép. jogosultsággal futnak. Nincs olyan CPU-regiszter vagy memóriarekesz, amely
Az F4 billentyű hatására egy olyan nyomkövetési listát kapunk, amely megmutat nem érhető el ezzel a jogosultsággal. A taszkok TASK P RIVILEG E szinten fut­
valamennyit a jogosultságtáblában tárolt információkból is. A 2.35. ábrán láthat­ nak, ezzel elvégezhetik az I/O-műveleteket, de nem m ódosíthatnak például olyan
juk a tábla egy-két sorát néhány jellegzetes processzussal. A „flags” oszlop bejegy­ speciális regisztereket, mint a leírótábla-mutatók. A szerverek és a felhasználói
zéseinek magyarázata: P: időszelet lejárta m iatt megszakítható (Preem ptable); B: processzusok USER PRIV1LEGE jogosultsági szinten futnak. Ezek nem hajthat­
számlázási információ gyűjthető róla (Billable); S: rendszer (System). A „traps” nak végre bizonyos utasításokat, ilyenek például az I/O-műveletek, memória-hoz-
bejegyzések magyarázata: E: echo; S: send; R: récéivé; B: m indkettő (Both); N: zárendelések vagy a jogosultsági szint megváltoztatása.
értesítés (Notification). A bittérképben az összes N R SYS PROCS darab (32) A jogosultsági szintek elve ismerős lesz a m odern CPU-k felépítését ismerők­
rendszerprocesszushoz tartozik egy bit, a sorrend az „id” mezőnek felel meg. (Az nek, de nem biztos, hogy találkoztak m ár ilyen megszorításokkal azok, akik a szá­
m ítógépek felépítését kis teljesítményű mikroprocesszorok assembly nyelvének
~nr- -id- -name- -flags- -traps- -ipc_to mask--- tanulmányozásával ism erték meg.
(-4) (01) IDLE P-BS- 00000000 00001111 A kernelI könyvtár egy definíciós állományáról még nem esett szó: ez a system.h,
[-3] (02) CLOCK — S- --R— 00000000 00001111 ennek tárgyalását elhalasztjuk a fejezet későbbi részére, ahol a rendszertaszkkal
[-2] (03) SYSTEM — S- --R— 00000000 00001111 foglalkozunk. A rendszertaszk önálló processzusként fut annak ellenére, hogy a
[-1] (04) KERNEL — S- 00000000 00001111
0 (05) pm P--S- ESRBN 1111111111111111
kernellel együtt fordítódik. M ostanra végigértünk a definíciós fájlokon, és készen
1 (06) fs P--S- ESRBN 1111111111111111 állunk, hogy a * c végződésű C nyelvű forrásállományokat áttekintsük. Elsőként
2 (07) rs P--S- ESRBN 1111111111111111 a table.c állományt nézzük meg (6000. sor). Lefordítása nem eredményez végre­
3 (09) memory P--S- ESRBN 00110111 01101111 hajtható program ot, de a tárgykód (table.o) tartalmazni fogja az összes kernel­
4 (10) lóg P--S- ESRBN 1111111111111111 adatszerkezetet. Ezen adatszerkezetek közül m ár soknak a definícióját láttuk a
5 (08) tty P--S- ESRBN 1111111111111111
6 driver P--S- ESRBN 1111111111111111
glo.h és más definíciós fájlok áttekintése során. A 6028. sorban, közvetlenül az
(11)
7 (00) init P-B- - E--B- 00000111 00000000 #include direktívák előtt van a _TABLE makró definíciója. Ahogy korábban ismer­
tettük, em iatt az E X T E R N az üres értéket kapja, és minden deklaráció, amelyben
2.35. ábra. A jogosultságtábla nyomkövetési listájának részlete. Az időzítőtaszk, a fájlszerver, ez szerepel, tárolóhelyet is lefoglal az adott változó számára.
a tty és az init processzus jogosultságaijellemzők sorrendben a taszkokra, A definíciós fájlokban található változódeklarációkon kívül van még két hely,
a szerverekre, az eszközmeghajtókra és a felhasználói processzusokra. A bittérkép ahol globális tárolóhely lefoglalása történik. Néhány definíciónak közvetlenül a
16 bitre lett rövidítve table.c ad helyet. A 6037-6041. sorokban a rendszerkom ponensek verem tárainak
172 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 173

m éreteit definiáljuk, és a taszkok számára szükséges teljes verem tárat lefoglaljuk fogja használni. Példaként erre, tekintsük a 6096. sor megjegyzésében „qs”-nek
a ts ta c k [TO T STACK SPACE] tömbbel (6045. sor). nevezett mezőt. Ez az egyes processzusokhoz rendelt időszelet m éretét mutatja. A
A table.c fennm aradó része a processzusok tulajdonságaihoz kapcsolódó szá­ közönséges felhasználói processzusok az init gyermekeiként 8 óraütem et kapnak
mos konstanst definiál, mint például jelzőbitek kombinációit, híváscsapdákat (call a futásra. A CLOCK és a SYSTEM taszk 64 óraütem ig futhatnak, ha szükséges.
traps) és olyan bitmaszkokat, amelyekkel m eghatározható, hogy ki kinek küldhet Igazából nem várható, hogy olyan sokáig fussanak blokkolódás nélkül, de a fel­
üzeneteket és értesítéseket (6048-6071. sor). Ilyet láttunk a 2.35. ábrán is. Ezt használói szintű szerverektől és az eszközmeghajtóktól eltérően ezeket nem lehet
követően olyan maszkok következnek, amelyek definiálják a különféle procesz- egyre alacsonyabb prioritású sorokba áthelyezni, ha akadályoznak más processzu­
szusoknak engedélyezett kernelhívásokat. A processzuskezelő és a fájlszerver is sokat a futásban.
egyedi engedélyt kap. A reinkarnációs szerver m inden kernelhívást elérhet, nem H a új processzust akarunk tenni a betöltési memóriaképbe, akkor az image táb­
a saját használatára, hanem azért, m ert mint a többi rendszerprocesszus szülője, lába fel kell venni egy új sort. M egengedhetetlen, hogy az image tábla m érete ne
gyermekeinek csak olyan jogosultságokat adhat, ami neki is megvan. Az eszköz- legyen összeegyeztethető más konstansok értékével. A table.c végén egy kis trük­
meghajtók közös engedélykészletet kapnak a kernelhívásokhoz, kivétel ez alól a kel ellenőrizzük, hogy ez a hiba bekövetkezett-e. Kétszer is deklaráljuk a dummy
RAM-lemezmeghajtó, amelynek szokatlan memória-hozzáférésre van szüksége. tömböt, amely hiba esetén lehetetlen m éretű lenne, így fordítási hibát okozna.
(Figyeljük meg, hogy a 6075. sorban lévő megjegyzés „system services m anager”- Mivel e felesleges töm b előtt extern áll, így nem foglalunk neki helyet itt (és m ás­
re hivatkozik, de helyette „reincarnation server” kellene - a név megváltozott fej­ hol sem). A program kódban sehol sem hivatkozunk rá; ez a fordítót nem fogja
lesztés közben, néhány megjegyzés még a régi nevet tartalmazza.) zavarni.
Végül a 6095. és a 6109. sor között az image tábla definíciója található. Azért További globális helyfoglalás történik az assembly nyelvű mpx386.s nevű fájl
helyeztük el itt a definíciós fájl helyett, m ert a többszörös deklarációt m egakadá­ végén. Bár ez később következik, mégis itt érdem es tárgyalnunk, m ert a globális
lyozó E X T E R N trükk az inicializált változók esetében nem működik; vagyis nem helyfoglalás a témánk. A 6822. sorban a .sect .rom assembly direktíva egy (a va­
írhatjuk bárhol azt, hogy lódi M INIX 3-kemel azonosítására szolgáló) mágikus számot helyez el a kernel-
adatszegmens legelején. Egy .sect bss assembler direktíva és a .space pszeudoutasí-
extern int x = 3; tás is található itt a kernel verem tárának lefoglalásához. A .comm pszeudoutasítás
a verem tetején címkével lát el néhány memóriaszót, hogy közvetlenül is m anipu­
Az image tábla tartalm azza azokat a részleteket, amelyek a betöltési m em ória­ lálhatók legyenek. Az mpx386.s-hez visszatérünk még néhány oldallal később, mi­
képben tárolt processzusok inicializálásához szükségesek. A rendszer induláskor után a M INIX 3 elindulását áttekintettük.

2.6.6. A MINIX 3 indítása

M ár majdnem itt az idő, hogy szemügyre vegyük a végrehajtható program ot - de


még nem egészen. M ielőtt ezt m egtennénk, tekintsük át röviden, hogyan töltő­
dik be a M INIX 3 a memóriába. A betöltés term észetesen egy mágneslemezről
történik, de a folyamat nem teljesen magától értetődő, és az események pontos
sorrendje a lemez fajtájától függ. A 2.36. ábra m utatja egy hajlékonylemez és egy
partíciókra osztott merevlemez szerkezetét.
Amikor a rendszer indul, a hardver (pontosabban egy ROM -ban lévő program)
beolvassa az indítólemez első szektorát, és végrehajtja az ott található programot.
Egy partíciók nélküli M INIX 3-hajlékonylemezen az első szektor egy indító­
blokk, amely betölti a boot program ot, ahogy az a 2.36.(a) ábrán látható. A m e­
revlemezek particionáltak, és az első szektorban lévő program (a M INIX-rend-
szerekben masterboot a neve) először áthelyezi magát egy másik m em óriaterü­
letre, majd beolvassa a vele együtt az első szektorból betöltött partíciós táblát.
2.36. ábra. Indításhoz használt lemezek szerkezete, (a) Particionálás nélküli lemez. Ezután betölti és végrehajtja az aktív partíció első szektorát, ahogy az a 2.36.(b)
Az első szektor az indítóblokk, (b) Particionált lemez. Az első szektor az elsődleges ábrán látható. (Rendszerint pontosan egy partíció van aktívként megjelölve.)
indítórekord (masterboot) Egy M INIX 3-partíciónak ugyanolyan a szerkezete, mint egy particionálás nél­
174 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 175

küli M INIX 3-hajlékonylemeznek, azaz van egy indítóblokkja, amely betölti a vű állományban kell lennie. A M INIX 3 azonban arra bátorítja a felhasználókat,
boot programot. A particionált és a nem particionált lemezek indítóblokkjának hogy módosítsák és hozzanak létre új kísérleti verziókat. A felhasználók számára
programkódja megegyezik. Mivel a masterboot program áthelyezi magát, az in­ hasznos, hogy többféle változat közül választhatnak, így visszatérhetnek egy ko­
dítóblokk megírható úgy, hogy ugyanazon a memóriacímen kezdődjön, ahova a rábbi működő változathoz, ha netán egy kísérlet kudarcot vall.
masterboot eredetileg betöltődik. Terjedelmi okokból nem tudunk részletesebben foglalkozni a betöltési felügye­
A valóságban a helyzet az ábrán láthatónál egy kicsit bonyolultabb is lehet, lőprogrammal. Ez egy összetett program, m ajdnem egy m iniatűr operációs rend­
m ert egy partíció alpartíciókat is tartalm azhat. Ebben az esetben a partíció el­ szer önm agában is. Együttműködik a M IN IX 3-mal, és ez kapja vissza a vezérlést,
ső szektora az alpartíciók partíciós tábláját tartalm azó elsődleges indítórekord amikor a M INIX 3-at szabályszerűen állítjuk le. H a az olvasó többet akar tudni
lesz. Végül azonban a vezérlés m indenképpen átadódik egy indítószektorra, egy róla, a M INIX 3 honlapjáról elérhető a betöltési felügyelőprogram forráskódja
olyan egység első szektorára, amely nincs tovább osztva. Egy hajlékonylemezen részletes magyarázatokkal.
az első szektor mindig egy indítószektor. A M INIX 3 ekkor is megenged egy bi­ A M INIX 3 betöltési memóriakép (más néven rendszer-memóriakép) több
zonyosfajta particionálást, de csak az első partíció lehet betölthető; nincs külön programfájl egymáshoz illesztésével keletkezik: kernel, processzuskezelő, fájl-
elsődleges indítórekord, és alpartíciók sem lehetségesek. Ez lehetővé teszi, hogy rendszer, reinkarnációs szerver, eszközmeghajtók és az init, ahogy az a 2.30. ábrán
a particionált és particionálás nélküli lemezeket ugyanolyan m ódon lehessen csa­ látható. Megjegyezzük, hogy az itt ism ertetett M INIX 3-konfiguráció csak egyet­
tolni. Egy particionált hajlékonylemez legfőbb haszna abban van, hogy az indító­ len lemezes eszközmeghajtót tartalm az a betöltési m em óriaképben, de több is
lemez felosztható egy RAM -lemezre másolható alaprészre és egy csatolható ki­ lehetne benne, amelyek közül egy címkével választható ki az aktív. Mint minden
egészítő részre. Ez utóbbi leválasztható, ha m ár nincs rá tovább szükség, és így a bináris program, a betöltési m em óriaképben eltárolt fájlok is tartalm aznak egy
lemezmeghajtó felszabadul a telepítés folytatásához. rövid fejlécet, amely meghatározza, hogy betöltés után mennyi m emóriát kell le­
A M INIX 3 indítószektorát egy installboot nevű speciális program hozza létre. foglalni az adatoknak és a veremnek, így a következő program mindig a megfelelő
Ez a lemezre íráskor az indítószektorba beleírja az (al)partícióján elhelyezkedő címre kerülhet.
boot nevű program lemezeimét. A M INIX 3 boot program jának szabványos helye A hardvertől függ, hogy a memória mely területei állnak rendelkezésre a betöl­
egy ugyanilyen nevű könyvtárban van, vagyis /boot/boot. Bárhol lehet azonban - tési felügyelőprogram és a M INIX 3 komponensei számára. Ezenkívül némelyik
az installboot a lemezeimet helyezi el, ahonnan be kell tölteni. Ez azért szükséges, architektúra esetén a végrehajtható program ban lévő címeket ki kell igazítani a
m ert a boot betöltése előtt nem lehet könyvtárakat és fájlneveket használni egy konkrét betöltési cím függvényében. Az Intel processzorok szegmentált architek­
állomány megtalálásához. túrája ezt szükségtelenné teszi.
A boot a M INIX 3 másodlagos betöltője. Az operációs rendszer betöltésénél A betöltés részletei a gép típusától függően változnak. Az a fontos, hogy így
azonban egy kicsit többet tud, m ert ez egy felügyelőprogram is egyben, amelynek vagy úgy, az operációs rendszer betöltődik a memóriába. M iután a betöltés befe­
segítségével a felhasználó m egváltoztathat, beállíthat, és elm enthet különféle pa­ jeződött, kisebb előkészületeket kell tenni a M INIX 3 elindításához. Először is,
ram étereket. A boot a partíciója második szektorában keresi az érvényben lévő betöltés közben a boot kiolvas néhány bájtot a betöltési m emóriaképből, amelyek­
param étereket. A M INIX 3 ugyanúgy, mint a szabványos UNIX, lefoglalja min­ ből kiderül néhány fontos tulajdonsága, például az, hogy 16 vagy 32 bites módban
den lemez első 1 K m éretű blokkját indítóblokknak, de a ROM -indító vagy az el­ kell-e futtatni. Ezután a kernel megkap néhány, a rendszer indításához szükséges
sődleges indítórekord csak az első 512 bájtot tölti be, így 512 bájt rendelkezésre param étert. A M INIX 3 betöltési mem óriakép kom ponenseinek a.out fejlécei át­
áll a param éterek tárolására. Ezek vezérlik a betöltési műveletet, és maga az ope­ kerülnek a boot m em óriaterületén elhelyezkedő tömbbe, amelynek báziscíme a
rációs rendszer is megkapja őket. Az alapértelmezés szerinti beállítás egyetlen m e­ kernelnek is átadódik. A M INIX 3 vissza tudja adni a vezérlést a betöltési felügye­
nüpontot kínál fel, ez a M INIX 3 elindítása, de ki lehet bővíteni, így például más lőprogramnak, ezért a visszatérési címet is meg kell határozni. Ezek az elemek a
operációs rendszereket lehet indítani (más partíciók indítószektorának betöltése verembe kerülnek, ahogy később látni fogjuk.
és elindítása révén), vagy a MINIX 3-at különféle beállításokkal is lehet indítani. A betöltési felügyelőprogramnak még sok egyéb információt - az indítópara­
Az alapértelm ezés szerinti beállításokat úgy is megváltoztathatjuk, hogy a menü métereket - is át kell adnia az operációs rendszernek. Ezek közül néhányra szük­
kihagyásával a M INIX 3 azonnal induljon. sége van a kernelnek, mások csak kiegészítő információt hordoznak, mint például
A boot nem az operációs rendszer része, de elég okos ahhoz, hogy a fájlrendszer a betöltési mem óriakép neve. Ezek a param éterek mind megadhatók név=érték
adatszerkezeteit felhasználva megtalálja az operációs rendszert a lemezen. A boot alakban, táblázatuk címe a veremben kerül átadásra. A 2.37. ábra egy tipikus in-
az image= indítóparam éter által megadott fájlt keresi, amely alapértelm ezés sze­ dítóparam éter-listát m utat abban a formában, ahogy a M INIX 3-parancssorból
rint a /boot/image. H a ilyen névvel létezik egy közönséges fájl, akkor azt tölti be, indítható sysenv parancsa megjeleníti.
ha azonban ez egy könyvtár, akkor abból a legújabb állományt választja ki. A leg­ Ebben a példában ham arosan újra felbukkan a fontos memory param éter. Ez
több operációs rendszernél a betöltési m em óriaképnek egy előre m egadott ne­ esetben azt jelzi, hogy a betöltési felügyelőprogram két memóriaszegmenst talált a
176 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 177

rootdev=904 #include <minix/config.h>


ramimagedev=904 #if _WORD_SIZE == 2
ramsize=0 #include "mpx88.s"
#else
processor=686
bus=at #include "mpx386.s"
video=vga #endif
chrome=color 2.38. ábra. Alternatív assembly nyelvű forrásállományok közötti választás
memory=800:92540,100000:3DF0000
label=AT
szereken használható. Nem működik 16 bites módban, és 16 bites verzió létreho­
controller=cO
image=boot/image zása bizonyos funkciók eltávolítását teheti szükségessé. Többek között a 32 bites
tárgykódok nagyobbak a 16 biteseknél, és az egymástól független felhasználói
2.37. ábra. A kernelnek átadott indítóparaméterek egy tipikus MINIX 3-rendszerben szintű eszközmeghajtók nem használhatnak közösen program kódot olyan módon,
ahogy egyetlen tárgykódú állományba fordítva tehetnék. M indazonáltal ugyanazt
M INIX 3 számára. Az egyik a hexadecimális 800 (decimális 2048) címen kezdődik, a C forráskódot használhatjuk mindkét esetben, a kim enet attól függ, hogy a 16
és m érete hexadecimális 0x92540 (decimálisán 599 360) bájt. A másik a 0x100000 vagy 32 bites verziójú fordítóprogram m al fordítunk-e. A fordítóprogram által de­
(1 048 576) címen kezdődik, és 0x3df00000 (64 946 176) bájt m éretű. Ez a legré­ finiált m akró határozza meg az include/minix/sys_config.h állományban definiált
gebbi PC-kompatibilis gépeket leszámítva tipikus. Az eredeti IBM PC-ben csak WORD S IZ E értékét is.
olvasható m emória került a felhasználható m emória felső végébe, amit 1 M B-ra A M INIX 3 először végrehajtódó része assembly nyelven íródott, és különböző
korlátozott a 8088-as CPU. A mai PC-kompatibilis gépeknek az eredeti PC-nél forrásállományokat kell használnunk a 16 bites, illetve a 32 bites fordító esetén. A
több memóriájuk van, de kompatibilitási okokból a régi gépekkel megegyező cí­ kezdeti értékeket beállító 32 bites program kódot az mpx386.s fájl tartalmazza. A
men ezeknek is csak olvasható memóriájuk van. így az írható-olvasható m emória 16 bites alternatíva az mpx88.s. M indkettő tartalm az még assembly nyelvű tám o­
nem folytonos, egy ROM -tartom ány van az alsó 640 KB és az 1 MB feletti felső gatást más alacsony szintű kernelműveletekhez is. A választás autom atikusan tö r­
rész között. A betöltési felügyelőprogram az alsó m em óriatartom ányba tölti a ténik az mpx.s segítségével. Ez a fájl olyan rövid, hogy az egész elfér a 2.38. ábrán.
kernelt, de a szervereket, a meghajtókat és az init-et lehetőség szerint a R O M fölé. Az mpx.s a C előfeldolgozó #include direktívájának ritkán előforduló felhasz­
Ez elsődlegesen a fájlrendszer érdekében történik, m ert az így nagy gyorsítótárat nálását illusztrálja. A szokásos #include direktívát használhatjuk állományok beil­
használhat a lemezblokkokhoz anélkül, hogy a ROM -részbe ütközne. lesztésére, de alternatív forráskódrészek közötti választásra is. H a #if direktívákkal
Meg kell jegyeznünk, hogy az operációs rendszerek nem mindig lokális lemez­ akarnánk ezt megtenni, akkor az egyenként is nagyméretű mpx88.s és mpx386.s fájl
ről töltődnek be. Lemez nélküli munkaállomások hálózaton keresztül, távoli le­ tartalm át egyetlen állományba kellene bezsúfolni. Ez nemcsak nehezen kezelhe­
mezről is betölthetik az operációs rendszerüket. Ehhez term észetesen ROM -ban tő lenne, de szükségtelenül nagy lem ezterületet is foglalna, m ert valószínűleg egy
elhelyezett hálózati szoftverre van szükség. Bár a részletekben lehetnek különb­ adott gépre történő telepítéskor csak az egyikre van szükség, a másikat törölni vagy
ségek, ennek a folyamatnak a fázisai valószínűleg hasonlók az általunk elm ondot­ archiválni lehet. A következőkben az mpx386.s 32 bites változatot használjuk.
takhoz. A ROM -program nak annyira kell okosnak lennie, hogy a hálózatról sze­ Most fogunk először találkozni a végrehajtható programmal, ezért néhány szót
rezzen egy végrehajtható fájlt, amely aztán behozza a teljes operációs rendszert. szólunk arról, hogyan fogjuk ezeket bem utatni a könyvben. Egy nagy C program
H a a M INIX 3 ilyen m ódon töltődne be, nagyon kevés változtatásra lenne szükség fordítása során használt sok forrásfájl nehezen átlátható. Általában egyszerre egy
az operációs rendszer kódjának m em óriába töltése utáni inicializálási folyamat­ állományra fogunk koncentrálni. Az állományokon abban a sorrendben haladunk
ban. Szükség lenne term észetesen egy hálózati szerverre és egy m ódosított fájl- végig, ahogy a CD-n lévő forráskódban megjelennek. A M INIX 3-rendszer részei­
rendszerre, amely a hálózaton keresztül is el tud érni állományokat. nek belépési pontjaival kezdjük, és a végrehajtás fő vonalát fogjuk követni. Ha
egy kisegítő függvény hívásához érünk, akkor a hívás céljáról mondunk néhány
szót, de a hívott függvény belső m űködését illetően általában nem megyünk bele
2.6.7. A rendszer inicializálása a részletekbe, ezt majd a függvény definíciójánál tesszük meg. A fontos aláren­
delt függvények általában a magasabb szintű hívó függvények után ugyanabban
A M INIX korábbi verziói 16 bites m ódban is lefordíthatok voltak, ha szükséges az állományban vannak definiálva, ahol hívjuk őket, de kisebb vagy általános célú
volt a régebbi processzorokkal való kompatibilitás, és a M INIX 3 is tartalm az még függvények néha külön állományba kerülnek összegyűjtve. Nem kíséreljük meg
valamennyit a 16 bites módú forráskódokból. Az itt ism ertetett és a CD-n talál­ az összes függvény belső működését leírni. Próbáltuk a gépfüggő és gépfüggetlen
ható verzió csak 80386-os, vagy annál jobb processzorral felszerelt 32 bites rend- részeket külön állományokba elhelyezni, ezzel is elősegítve a hordozhatóságot.
178 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 179

A mellékelt CD forráskönyvtáraiban és a M INIX 3 weboldalán az összes fájl teljes sek definiálásához használt táblázatokat, valamint be kell állítania egyéb regiszte­
verziója rendelkezésre áll. reket. Am int ez megvan, az inicializáció a cstart C függvény (a .start.c-ben van, ez
Nagy gondot fordítottunk arra, hogy a programkód em beri fogyasztásra alkal­ következik) hívásával folytatódik (6481. sor). Figyeljünk arra, hogy az assembly
mas legyen. Ennek ellenére egy nagy program ban sok elágazás van, egy függvény program ban erre _cstart néven hivatkozunk. Ez am iatt van, m ert minden, a C for­
megértéséhez néha el kell olvasnunk az általa hívott függvényeket is, ezért az dító által fordított függvény neve elé egy aláhúzás karakter kerül a szimbólum­
anyag általunk megadottól eltérő sorrendben történő tanulmányozása is segíthet táblákban, és a szerkesztőprogram ilyen neveket keres, amikor a külön fordított
a megértésben. m odulokat összeszerkeszti. Mivel az assembler nem tesz aláhúzásjelet a nevek elé,
M iután lefektettük a program kód tanulmányozásának alapelveit, rögtön azzal ezt az assembly nyelvű program írójának kell megtennie, hogy a C fordító által lét­
kell kezdenünk, hogy miért tettünk kivételt egy esetben. A M INIX 3 elindulása so­ rehozott tárgykódú állományban a szerkesztőprogram megtalálja őket.
rán a vezérlés az mpx386.s assembly rutinjai, valamint a start.c és a main.c állomá­ A cstart egy másik rutint hív, amely inicializálja a globális leírótáblát (Global
nyok C rutinjai között kalandozik. Ezeket a rutinokat a végrehajtás sorrendjében Descriptor Table), amely a 32 bites Intel processzorok m emóriavédelmet fel­
írjuk le, még akkor is, ha ezáltal ide-oda kell ugrálnunk az állományok között. ügyelő központi adatszerkezete, valamint a megszakításleíró táblát (Interrupt
Am int az operációs rendszer betöltése befejeződött, a vezérlés a M IN IX címké­ Descriptor Table), amely a lehetséges megszakítások beérkezése esetén végrehaj­
re adódik (mpx386.s, 6420. sor). Az első utasítás átugrik néhány adatbájtot; ezek tandó program ok kiválasztására használatos. A cstart végrehajtása után az Igdt és
között vannak a korábban em lített betöltési felügyelőprogram jelzőbitjei (6423. lidt utasítások (6487. és 6488. sor) feltöltik a megfelelő regisztereket a táblák címé­
sor). M ostanra ezek betöltötték funkciójukat, a felügyelőprogram beolvasta őket, vel, és ezáltal használatba veszik őket. A
amikor a kernelt betöltötte a memóriába. Azért vannak éppen itt, m ert ez egy
könnyen m egadható memóriacím. Elsődlegesen a kernel jellegzetességeinek azo­ jmpf CS_SELECTOR:csinit
nosítására szolgálnak, m indenekelőtt arra, hogy 16 bites vagy 32 bites rendszerrel
állunk-e szemben. A betöltési felügyelőprogram mindig 16 bites m ódban indul, de utasítás úgy néz ki, m intha nem lenne semmi hatása, m ert pontosan oda adja a ve­
szükség esetén átkapcsolja a CPU-t 32 bites módba. Ez még azelőtt történik, mie­ zérlést, ahova akkor kerülne, ha nop utasítások lennének a helyén. Ez azonban az
lőtt a vezérlés a M IN IX címkéhez ér. inicializálás fontos része. Ez az ugrás kikényszeríti az előbb inicializált adatszerke­
Könnyebben megértjük a következő programrészeket, ha ismerjük a verem álla­ zetek használatát. A processzor regisztereinek némi további manipulációja után,
potát ezen a ponton. A felügyelőprogram számos param étert ad át a M INIX 3-nak a 6503. sorban a M IN IX egy ugrással (nem függvényhívással) a kernel main fő be­
a vermen keresztül. A felügyelőprogram először az aout változó címét helyezi el a lépési pontjára (lásd main.c) adja a vezérlést. Ennél a pontnál az mpx386.s inicia­
verembe, ez egy tömb címét tartalmazza, amelyben a betöltési mem óriakép kom ­ lizáló programja teljesen lefutott. A fájl m aradék része olyan kódrészleteket tar­
ponenseiből kinyert fejléc-információk találhatók. Ezt követően az indítóparam é­ talmaz, mint például egy taszk vagy processzus indítása és újraindítása, megszakí­
terek m érete és címe kerül a verembe. Ezek mind 32 bites mennyiségek. U tána táskezelés és más kisegítő rutinok, amelyeket a hatékonyság érdekében assembly
jön a felügyelőprogram kódszegmensének címe, és az a hely, ahol a végrehajtást nyelven kellett írni. Ezekhez még visszatérünk a következő részben.
folytatni kell a felügyelőprogramban, amikor a M INIX 3 kilép. Ezek mind 16 bites Most a legfelső szinten elhelyezkedő C inicializáló függvényeket tekintjük át. Az
mennyiségek, mivel a felügyelőprogram 16 bites védett üzemmódban működik. az általános alapelv, hogy amit csak lehet, magas szintű C programmal valósítsunk
Az mpx386.s első néhány utasítása a felügyelőprogram által használt 16 bites ve­ meg. Amint láttuk, m ár eddig is két mpx fájl van, így ha innen bármit is C program ­
rem m utatót konvertálja a védett üzemmódban használatos 32 bitesre. Ezután a mal tudunk helyettesíteni, azzal két assembly kódrészletet küszöbölünk ki. A cstart
(lásd start.c, 6920. sor) első dolgai között van a CPU védelmi rendszerének és meg­
mov ebp, esp szakítástábláinak beállítása a p r o tjn it hívásával. Ezután az indítóparam étereket
átmásolja a kernel memóriájába, majd a get_value függvényt (6997. sor) felhasz­
utasítás (6436. sor) a verem m utató értékét az ebp regiszterbe másolja, hogy így nálva param éternevekhez tartozó értékeket keres.
báziscímként használva a veremből ki lehessen olvasni a felügyelőprogram által Ez a folyamat m eghatározza a monitor típusát, a processzor típusát, a sín típu­
ott elhelyezett értékeket, ahogy a 6464. és a 6467. sor között látható. Figyeljünk sát, és ha 16 bites m ódban fut, akkor a processzor működési módját (valós vagy
arra, hogy az Intel processzoroknál a verem lefele növekszik, ezért a 8(ebp) arra védett). M indez az információ globális változókban kerül tárolásra abból a célból,
az értékre hivatkozik, amelyet a 12(ebp) által hivatkozott érték után tettünk a ve­ hogy a kernel bármelyik részének rendelkezésére álljon, ha szükséges.
rembe. A main (lásd main.c, 7130. sor) befejezi az inicializálást, és megkezdi a rend­
Az assembly nyelvű program nak tekintélyes mennyiségű m unkát kell elvégez­ szer normális működését. Az in trjn it hívásával konfigurálja a megszakításvezérlő
nie, előkészíteni egy vermet, hogy a C fordító által lefordított program megfelelő hardvert. E rre azért itt kerül sor, m ert addig nem lehetséges, amíg a gép típusát
környezetben futhasson, létre kell hoznia a processzor által a m emóriaszegmen­ nem ismerjük. (Az eljárás annyira gépfüggő, hogy külön állományba került, ez
180 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 181

ham arosan sorra kerül.) A hívás param étere (1) azt jelenti az intr_in.it számára, ra. Ezt később megvizsgálva el lehet dönteni, hogy a verem túlcsordult-e. Ezután
hogy a M INIX 3 inicializálását kell elvégezni. A (0) param éterrel híva a M INIX 3 a taszkok kezdeti verem m utatói kerülnek beállításra. Minden taszknak külön ve­
leállásakor visszaállítja a hardvert az eredeti állapotra, hogy vissza lehessen térni rem m utató kell. Mivel a verem az alacsonyabb memóriacímek felé növekszik, a
a betöltési felügyelőprogramba. Az in trjn it biztosítja, hogy az inicializáció befeje­ verem m utató kezdőértékét úgy lehet kiszámítani, hogy a báziscímhez hozzáadjuk
zése előtt érkezett megszakításoknak ne legyen semmilyen hatása. Később elm a­ a m éretet (7190. és 7191. sor). Van egy kivétel: a KE RN EL processzust (néhány
gyarázzuk, hogyan teszi ezt. helyen H ARD W ARE a neve) soha nem tekintjük futásra késznek, soha nem fut
A main legnagyobb része a processzustábla és a jogosultsági tábla felépítésének hagyományos processzusként, ezért nincs szüksége verem m utatóra.
van szentelve, így amikor az első taszkok és processzusok beütem eződnek, a m e­ A betöltési mem óriakép kom ponenseinek tárgykódjai ugyanúgy fordítódnak,
m óriatérképük, a regisztereik és a jogosultságaik megfelelően be lesznek állítva. A mint bármelyik másik M INIX 3-program, a fordító a fájlok elején egy fejlécet hoz
processzustábla m inden bejegyzését szabadra állítjuk, és a gyors elérést biztosító létre, amelyet az includela.out.h definiál. A betöltési felügyelőprogram a fejléceket
pproc_addr töm böt is feltöltjük a 7150. és 7154. sor közötti ciklusban. A 7155. és a a M INIX 3 indulása előtt a saját m em óriaterületére másolja, majd amikor átadja
7159. sor közötti ciklus törli a jogosultsági tablet, és feltölti a pprivjiddr tömböt, a vezérlést a M IN IX belépési pontra az mpx386.s-ben, akkor a fejlécek táblázatá­
a processzustáblához és az elérését gyorsító tömbhöz hasonlóan. Mind a procesz- nak fizikai címe a vermen keresztül az assembly programhoz kerül, ahogy azt már
szustáblában, mind a jogosultsági táblában elegendő az egyik mezőt egy meg­ láttuk. A 7202. sorban a fejlécek egyike egy lokális exec típusú e jid r struktúrába
határozott értékkel feltölteni ahhoz, hogy egy bejegyzés szabad voltát jelezzük. kerül, a hdrindexr-et használva indexként a fejlécek táblázatában. Ezután az adat­
Azonban mindkét táblában m inden bejegyzést inicializálni kell egy indexértékkel, szegmens és a kódszegmens címek memóriaszelet egységekre konvertálása követ­
akár szabad, akár nem. kezik, hogy a processzus m em óriatérképébe elhelyezhessük (7205-7214. sor).
M ellékesen egy apróság a C nyelvvel kapcsolatban: a 7153. sorban a Meg kell említenünk néhány dolgot, mielőtt továbbmennénk. Először is, a
kernelprocesszusok esetén a hrindex mindig 0 értéket kap a 7194. sorban. Ezek
(pproc_addr + NR_TASKS)[i] = rp; a processzusok a kernellel egy fájlba fordítódnak, a veremszükségletükkel kap­
csolatos információk pedig az image táblában vannak. Mivel egy kernelbe fordí­
utasítást írhattuk volna tott taszk a kernel cím területén lévő bármilyen kódot meghívhat, illetve bármely
adatot elérhet, ezért egy taszk m éretéről nincs értelm e beszélni. így az aout-nak
pproc_addr[i + NR_TASKS] = rp; ugyanaz az eleme vonatkozik a kernelre és a taszkokra is, a taszkok méretmezői
pedig a kernel adataival kerülnek feltöltésre. A taszkok a vereminformációkat
alakban is, m ert a C nyelvben a[i\ csak egy alternatív jelölés *(a + i) helyett. így az image táblából kapják, amely pedig fordításkor a table.c-ben inicializálódik. A
mindegy, hogy a-hoz vagy i-hez adunk hozzá egy állandót. Némelyik C fordítóprog­ kernelprocesszusok feldolgozása után a hrindex a ciklus m inden lefutásakor nö­
ram egy kicsit jobb kódot generál, ha az állandót a tömbhöz adjuk hozzá, és nem az vekszik eggyel (7196. sor), tehát a felhasználói szintű rendszerprocesszusok mind­
indexhez. Hogy esetünkben van-e különbség, azt nem tudjuk megmondani. egyike a saját fejlécéből kapja a megfelelő adatokat.
Elérkeztünk a 7172. és 7242. sor között található hosszú ciklushoz, amely a Egy másik megemlítendő részlet, hogy az adatmásoló függvények nem feltétle­
betöltési m em óriaképben elhelyezkedő processzusok futtatásához szükséges in­ nül konzisztensek a forrás és a célterület megadását illetően. E ciklus értelmezése­
formációkkal tölti fel a processzustáblát. (Figyeljük meg, hogy van egy idejét­ kor próbáljuk meg elkerülni a félreértéseket. A szabványos C könyvtár stmcpy függ­
múlt megjegyzés a 7161. sorban, amely csak taszkokat és szervereket említ.) Ezen vényének első argumentuma a célterület: strncpy(to, from, count). Ez hasonló egy ér­
processzusok mindegyikének jelen kell lennie induláskor, és normális működés tékadó utasításhoz, amelyben a bal oldalon áll a változó, amelynek értéket akarunk
közben nem is állnak le. A ciklus elején az ip értékül kapja egy bejegyzés címét adni, a jobb oldalon pedig a kifejezés, amely az értéket szolgáltatja. Ezt a függvényt
a table.c-ben létrehozott image táblából (7173. sor). Mivel az ip egy struktúrára a 7179. sorban arra használjuk, hogy a processzus nevét a processzustábla-bejegy-
m utató pointer, a struktúra elemei az ip->proc_nr és ehhez hasonló jelölésekkel zésbe másoljuk, nyomkövetési és egyéb célokra. Ezzel ellentétben aphys_copy függ­
érhetők el, ahogy az a 7174. sorban is látható. Ezt a fajta jelölést kiterjedten hasz­ vény fordítva használja az argumentumokat: phys_copy(from, to, quantity). A phys_
náljuk a M INIX 3-forráskódban. Hasonlóan, az rp egy processzustábla-bejegyzés- copy a 7202. sorban felhasználói processzusok programjainak fejléceit másolja.
re m utató pointer, a priv(rp) pedig a jogosultsági tábla egy bejegyzésére mutat. Folytatva a processzustábla inicializációjának tárgyalását, a 7220. és a 7221. sor­
A hosszú ciklusban található processzustábla- és jogosultságitábla-inicializáció ban az utasításm utató és a processzor állapotszó kezdeti értéke kerül beállításra.
nagy része abból áll, hogy az image táblából átírunk értékeket a processzustáblába A taszkok állapotszava más, mint az eszközmeghajtóké és a szervereké, m ert a
és a jogosultsági táblába. taszkok magasabb jogosultsági szinten futnak, hogy az I/O-kapukat elérhessék.
A 7185. sorban ellenőrizzük, hogy az aktuális processzus a kernel része-e, és ha Ezt követően a verem m utató inicializálása következik, ha felhasználói szintű pro­
igen, akkor a speciális STACK GUARD bitminta kerül be a taszk vermének aljá­ cesszusról van szó.
182 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 183

A processzustáblának van egy eleme, amelyet nem kell (és nem is lehet) beüte­ getty processzust. Ezek a processzusok blokkolódnak, amíg valamelyik terminálról
mezni. Ez a HARD W ARE processzus, amely csak nyilvántartási célból létezik - a input nem érkezik, amikor is az első felhasználó bejelentkezhet.
megszakítások kiszolgálása alatt eltelt időt neki számítja fel a rendszer. Az összes Végigkövettük a M INIX 3 elindulását három állományon keresztül, ebből ket­
többi processzus a megfelelő ütemezési sorba kerül a 7234. és 7235. sorban. A tő C-ben, egy pedig assembly nyelven volt írva. Az mpx386.s assembly nyelvű fájl
lock_enqueue függvény letiltja a megszakításokat a sorok módosítása előtt, majd további, megszakításokat kezelő program kódot is tartalm az, ezt a következő sza­
újra engedélyezi őket a sorok módosítása után. Erre nincs még szükség most, ami­ kaszban vizsgáljuk meg. M ielőtt azonban továbbmennénk, lássuk a két C fájl ed­
kor semmi sem fut, de egyébként ez a szabályos eljárás, és nincs értelm e külön kó­ dig nem em lített rutinjainak rövid leírását. A start.c nem tárgyalt függvénye a get
dot írni csak azért, hogy egyszer lefusson. value (6997. sor). Ez bejegyzéseket tud megkeresni a kernelkörnyezetben, amely
A processzustábla bejegyzéseinek inicializációjában az utolsó lépés az alloc_ az indítóparam éterek másolata. A függvény a szabványos könyvtári függvény egy­
segments hívása a 7241. sorban. Ez egy gépfüggő rutin, amely a megfelelő mezőkbe szerűsített változata, amely azért szerepel itt, hogy a kernel egyszerűbb lehessen.
tölti a processzusok által használt memóriaszegmensek helyét, m éretét és hoz­ Van három további eljárás a main.c-ben. Az announce egy copyright-üzenetet
záférési jogait. A régebbi, védett üzemm ódot nem tám ogató Intel processzorok jelenít meg, és közli azt is, hogy a M INIX 3 valós módban, avagy 16 bites vagy
esetén csak a szegmensek helyét definiálja. Más memóriakezelési módot használó 32 bites védett üzemm ódban fut-e, valahogy így:
processzortípus esetén újra kell írni.
Amikor a taszkok, a szerverek és az init processzustábla bejegyzései fel vannak MINIX 3.1 Copyright 2006, Vrije Universiteit, Amsterdam, The Netherlands
töltve, a rendszer m ár m ajdnem működőképes. A bili_ptr pointer mutatja, hogy Executing in 32-bit protected mode
melyik processzusnak számlázzuk a processzoridőt; szükségünk van egy kezdeti
értékre, ehhez az ID L E megfelelő választásnak tűnik (7250. sor). A kernel most Amikor ez az üzenet megjelenik, akkor tudhatjuk, hogy a kernel inicializációja
már készen áll, hogy elkezdje azt, ami a feladata, a processzusok vezérlését és üte­ befejeződött. A preparejhutdow n (1213. sor) SIGKSTOP szignált küld az összes
mezését, ahogy az a 2.2. ábrán látható. rendszerprocesszusnak (a rendszerprocesszusoknak nem lehet úgy szignált kül­
A rendszer még nem m inden része áll készen a szabályos működésre, de m ind­ deni, ahogy a felhasználói processzusoknak). Ezután elindít egy időzítőt, hogy a
ezek a részek független processzusként futnak, és futásra kész állapotban várakoz­ rendszerprocesszusoknak legyen idejük leállni, mielőtt a végső shutdown eljárást
nak. Inicializálni fogják magukat, amikor elindulnak. Csak annyi van hátra, hogy a meghívja. A shutdown alapesetben a M INIX 3 betöltési felügyelőprogramnak ad­
kernel az announce meghívásával bejelentse, készen áll, majd meghívja a restart-ot ja vissza a vezérlést. Ehhez a megszakításvezérlőket vissza kell állítani a BIOS sze­
(7251-7252. sor). Sok C program ban a main egy ciklus, de a M INIX 3-kernelben rinti helyzetbe az intr_init(0) meghívásával (7339. sor).
csak az inicializációt kell elvégeznie. A 7252. sorban a restart hívása elindítja az el­
ső várakozó processzust. A main nem fogja visszakapni a vezérlést ezután.
A je sta rt az mpx386.s egy assembly nyelvű rutinja. Tulajdonképpen a je sta rt 2.6.8. Megszakításkezelés a M INIX 3-ban
nem egy teljes függvény, csak egy nagyobb eljárás egyik közbenső belépési pontja.
A következő részben részletesen fogjuk tárgyalni; most elég annyi, hogy a _restart A megszakítások kezelésére szolgáló hardvereszközök nyilván gépfüggők, de min­
egy processzusátkapcsolást fog kiváltani, így a proc_ptr által kijelölt processzus fog den rendszerben kell lennie olyan komponenseknek, amelyek az itt tárgyalt 32 bi­
futni. Am ikor a je s ta r t először végrehajtódott, azt mondhatjuk, hogy a M INIX 3 tes Intel CPU-val felszerelt rendszerek elemeivel funkcionálisan megegyeznek.
m ár fut - egy processzust hajt végre. A je sta r t újra és újra végrehajtódik, ahogy A hardvereszközök által generált megszakítások elektromos jelek, amelyeket el­
a taszkok, szerverek és felhasználói processzusok lehetőséget kapnak a futásra, ső lépésben egy megszakításvezérlő kezel. Ez egy integrált áramkör, amely képes
majd felfüggesztődnek üzenetre várakozás miatt, vagy m ert át kell adniuk a pro­ ilyen jeleket érzékelni és a processzor adatsínén az azoknak megfelelő adatm intát
cesszort más processzusoknak. létrehozni. E rre azért van szükség, m ert a processzornak csak egy bem enő vonala
A je s ta r t első futásakor az inicializáció term észetesen csak a kernel számára fe­ van az összes eszköz érzékelésére, így nem tudja megállapítani, hogy melyik esz­
jeződött be. Emlékezzünk vissza, hogy a M INIX 3-processzustábla három részből közt kell kiszolgálnia. A 32 bites Intel processzorral felszerelt PC-k általában két
áll. Vajon hogyan futhat akár egyetlen processzus is addig, amíg a processzustáb­ ilyen vezérlő áram körrel vannak ellátva. M indkettő 8 bem enő jelet tud kezelni, de
la fontos részei még nem is lettek feltöltve? A teljes választ későbbi fejezetekben az egyik alá van rendelve a másiknak, azaz kimenő vonala a másik egy kiválasztott
fogjuk megkapni. A rövid válasz úgy hangzik, hogy a betöltési memóriakép pro­ bem enő vonalára csatlakozik. Ezzel a kombinációval 15 különböző külső eszközt
cesszusainak utasításm utatója kezdetben inicializációs program kódra mutat, és lehet érzékelni, ahogy a 2.39. ábrán látható. A 15 bem enet között vannak előre
mindegyik elég ham ar blokkolódik. Végül a processzuskezelő és a fájlrendszer is lefoglaltak. Az időzítőbem enet (IR Q 0) például nincs kivezetve csatlakozóhoz,
lehetőséget kap az inicializációs kód lefuttatására, amikor is a processzustábla ná­ ezért semmi mást nem rendelhetünk hozzá. Más bem enetekhez tartozik csatlako­
luk lévő része is beállításra kerül. Végül az init m inden term inálhoz létrehoz egy zó; ezeket bármilyen eszközhöz használhatjuk, amit bedugunk a csatlakozóba.
184 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 185

assembly nyelvű utasítás végrehajtása. Az egyedüli különbség az, hogy hardver­


megszakítás esetén az <nnn> a megszakításvezérlő áram kör egyik regiszteréből
származik, és nem a program mem ória egy utasításából.
IRQ 0 (óra) A 32 bites Intel processzor bonyolult processzusváltási mechanizmust használ a
IRQ 1 (billentyűzet)
megszakításokra adott válasz során, az utasításm utató beállítása egy másik függ­
IRQ 3 (tty 2) vény végrehajtásához csak egy része ennek. Amikor a CPU egy processzus futása
IRQ 4 (tty 1)
IRQ 5 (XT merevlemez) alatt megszakítást érzékel, akkor létrehoz egy vermet, amelyet a megszakítás ki­
■IRQ 6 (hajlékonylemezes egység) szolgálása közben használ. Ennek a verem nek a helyét a folyamatállapot-szeg-
■IRQ 7 (nyomtató)
mens (Task State Segment, TSS) egyik bejegyzése határozza meg. Egyetlen ilyen
IRQ 8 (valós idejű óra) struktúra van az egész rendszerben, ezt a cstart inicializálja a p r o tjn it hívásakor,
IRQ 9 (átirányított IRQ 2) ami aztán m inden processzus indításakor m ódosításra kerül. Ennek az a hatása,
IRQ 10
hogy a megszakítás esetén létrehozott verem mindig a megszakított processzus
IRQ 11
IRQ 12 sta ckfra m ej struktúrájának végén, a processzustábla-bejegyzésben jön létre. A
IRQ 13 (FPU-kivételek) CPU autom atikusan betesz néhány kulcsfontosságú regisztert az új verembe, köz­
IRQ 14 (AT merevlemez)
IRQ 15 tük azokat is, amelyek a megszakított processzus vermének és utasításm utatójá­
nak visszaállításához szükségesek. A megszakításkezelő programrész futása kez­
detén ezt a processzustáblában elhelyezkedő területet használja veremnek, eddig­
re a megszakított processzushoz való visszatéréshez szükséges információ nagy ré­
sze m ár elm entésre került. A megszakításkezelő a sta ckfra m ej struktúrát kitöltve
további regisztereket tesz ebbe a verembe, majd ezután átvált egy, a kernel által
2.39. ábra. 32 bites Intel PC megszakításkezelő hardvere biztosított verem használatára, és megkezdi a megszakítás kiszolgálását.
A megszakítást kiszolgáló rutin befejeződésekor a kernelverem helyett újra
Az ábrán a megszakításjelek a jobb oldalon látható IR Q n vonalakon ér­ egy processzustáblában lévő verem re váltunk át (nem szükségképpen ugyanarra,
keznek. A CPU az INT vonalán kap értesítést a megszakítás bekövetkeztéről. amely az utolsó megszakítás hatására jött létre), kiemeljük a pluszban elhelyezett
A CPU-tól az INTA (interrupt acknowledge - megszakítás nyugtázása) vonalon regisztereket, majd végrehajtunk egy iretd (return from interrupt - visszatérés
érkező jel hatására a megszakításért felelős megszakításvezérlő olyan adatot he­ megszakításból) utasítást. Az iretd visszatér a megszakítás előtti állapothoz, visz-
lyez az adatsínre, amely a CPU számára azonosítja a végrehajtandó kezelőru­ szaállítva a hardver által elm entett regisztereket és a megszakítás előtt használt
tint. A megszakításvezérlőket az inicializálás során programozzuk fel, amikor vermet. Tehát egy megszakítás megállítja a futó processzust, a megszakítás kiszol­
a main meghívja az in trjn it eljárást. Ez meghatározza, hogy a különböző meg­ gálásának befejeződése pedig újraindít egy processzust; ez esetleg különbözhet a
szakítások esetén a CPU milyen adatot kap, ezenkívül a vezérlő m űködését be­ legutoljára megállítottól. Az assembly nyelvű programozási könyvekben olvasható
folyásoló számos egyéb param étert is beállít. Az adatsínre helyezett adat egy egyszerűbb megszakításkezelési mechanizmusoktól eltérően a megszakított p ro­
8 bites szám, amelyet egy legfeljebb 256 elemű táblázat indexelésére használunk. cesszus vermébe a megszakítás kezelése során semmit sem teszünk. Ezen túlm e­
A M INIX 3-táblázatnak 56 eleme van. Ezek közül 35-öt használunk ténylegesen; nően, mivel megszakítás után egy új verem jön létre egy (a TSS által m eghatáro­
a többi a jövőben kifejlesztett Intel processzorokhoz és a M INIX 3 további fejlesz­ zott) ismert helyen, több processzus vezérlése leegyszerűsödik. Egy másik procesz-
téséhez van fenntartva. A 32 bites Intel processzorokon ez a táblázat megszakítá- szus elindításához csak a verem m utatót kell a sta ckfra m ej struktúrájára állítani,
si kapuleírókat tartalmaz; ezek mindegyike egy 8 bájt hosszú, több mezőből álló kiemelni az odatett regisztereket, és végrehajtani egy iretd utasítást.
struktúra. A C PU megszakítás érzékelése esetén letiltja a megszakításokat. Ez biztosítja,
Sokféle m ódon lehet reagálni a megszakításokra; a M INIX 3 esetében a ben­ hogy semmi nem történhet, ami a processzustáblában lévő verem túlcsordulását
nünket leginkább érdeklő kapuleíró mezők a végrehajtandó kiszolgálórutin kód­ okozhatná. Ez automatikus, de vannak megszakítást letiltó és engedélyező as­
szegmensére, azon belül pedig a kezdőcímre mutatnak. A CPU a kiválasztott leíró sembly utasítások is. A megszakítások letiltva maradnak, míg a processzustáblán
által m eghatározott rutint hajtja végre. Az eredm ény ugyanaz, mint egy kívül elhelyezkedő kernelverem van használatban. Van egy olyan mechanizmus,
amely lehetővé teszi, hogy kivételkezelő (a CPU által észlelt hibára adott válasz)
int <nnn> fusson, amikor a kernelverem van használatban. A kivételek hasonlók a megsza­
kításokhoz, de a kivételeket nem lehet letiltani. így a kivételek miatt szükség van
arra, hogy kezeljük ezt a helyzetet, amikor lényegében egymásba ágyazott meg­
186 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 187

szakításaink vannak. Ebben az esetben nem jön létre új verem. Ehelyett a CPU zik. Ez pazarlásnak tűnhet, de a keletkező program kód nagyon tömör. A kifejtett
a megszakított program újraélesztéséhez szükséges létfontosságú regisztereket a makrókból keletkező tárgykód 40 bájtnál is kevesebb helyet foglal. A megszakítá­
m ár használatban lévő verem re helyezi. A kernel futása közben nem szabad kivé­ sok kiszolgálásánál a sebesség nagyon fontos, és a fenti módszerrel kiküszöböljük
telnek előfordulnia, ha mégis megtörténik, akkor „pánik” tör ki, azaz a kernel a a param éter betöltéséből, a szubrutin meghívásából és a visszatérési érték átvéte­
panic eljárással kilép. léből eredő időveszteséget.
Amikor a kernel futása közben iredt utasításra kerül a sor, akkor egyszerűbb A hw intjnaster tárgyalását úgy folytatjuk, m intha függvény lenne, és nem egy
visszatérési mechanizmust alkalmazunk, mint felhasználói processzus megsza­ nyolc helyen kifejtett makró. Emlékezzünk arra, hogy mielőtt a hw intjnaster el­
kításakor. A processzor meg tudja állapítani, hogyan kezelje az iretd utasítást; kezd futni, a CPU létrehozott egy új vermet a megszakított processzus sta ckfra m ej
ezt úgy éri el, hogy megvizsgálja az iretd végrehajtása során a veremből kikerülő struktúrájában. Elm entett benne számos kulcsfontosságú regisztert, és a megsza­
kódszegmensszelektort. kítások le vannak tiltva. A hw intjnaster első dolga a savé meghívása (6516. sor).
A korábban em lített jogosultsági szintek határozzák meg a megszakítások ál­ Ez a szubrutin a megszakított processzus újraindításához szükséges összes többi
tal kiváltott különböző reakciókat, amikor egy processzus fut, és amikor a kernel regisztert elmenti. A sebesség növelése érdekében a savé lehetne a makró része is,
(ideértve a megszakításkezelő rutinokat is) fut. Az egyszerűbb mechanizmust de ez körülbelül megkétszerezte volna a m akró m éretét, ezenkívül más függvény
használjuk, ha a megszakított program jogosultsága megegyezik a megszakítás ha­ is hívja. Látni fogjuk, hogy a savé trükközik a veremmel. Visszatérése után m ár a
tására végrehajtott program jogosultságával. A gyakoribb eset azonban az, hogy a kernelverem van használatban, nem a processzustábla-bejegyzésben lévő.
megszakított program alacsonyabb jogosultságú, mint a megszakítást kezelő prog­ A glo.h-bó\ két táblát használunk. Az JrqJiandlers tartalm azza az átirányítás­
ram, ekkor a TSS-t és az új vermet alkalmazó bonyolultabb változatot kell alkal­ hoz szükséges információt, beleértve a kezelő rutinok címeit is. A kiszolgálás alatt
maznunk. Egy kódszegmens jogosultsági szintje a kódszegmens szelektorában van lévő megszakítás száma egy JrqJiandlers-en belüli címmé alakul át. Ez a cím az­
tárolva, és mivel megszakítás esetén ez is a verem re kerül, a megszakítás kiszolgá­ tán a verem re kerül, hogy az JntrJia n d le param éterként megkaphassa, majd az
lása után megvizsgálhatjuk, hogy eldöntsük, mit kell tennie az iretd utasításnak. JntrJiandle meg is hívódik. Az JntrJia n d le működését később vizsgáljuk meg.
A megszakítások kiszolgálása alatt használt verem létrehozásakor a hardver Egyelőre csak annyit mondunk, hogy nemcsak a kért megszakítási kiszolgálórutint
még egy szolgáltatást nyújt. A hardver megvizsgálja, hogy a verem elég nagy-e ah­ hívja meg, hanem az J rq jic tid s töm bben is beállítja a kiszolgálási kísérlet sikeres­
hoz, hogy legalább a minimálisan elhelyezésre kerülő adatok elférjenek benne. Ez ségét jelző bitet, illetve a várakozósor többi elem ének is lehetőséget ad arra, hogy
megóvja a magasabb jogosultságú kernelt attól, hogy egy felhasználói processzus fussanak és lekerüljenek a sorról. Attól függően, hogy pontosan mi volt a kérés a
véletlenül (vagy rosszindulatúan) hibát okozzon azáltal, hogy egy rendszerhívást kezelő felé, az Jn trJia n d le visszatérése után a megszakítás kiszolgálása még nem
nem megfelelő veremmel kezdeményez. Ezeket a mechanizmusokat kifejezetten feltétlenül fejeződött be. Ezt az J rq jic tid s megfelelő bejegyzésének megvizsgálá­
a több processzust egyszerre futtató operációs rendszerek megvalósításának elő­ sával lehet eldönteni.
segítésére építették be a processzorba. Nemnulla érték az J r q jic tid s -ben azt jelzi, hogy az aktuális megszakítás ki­
Ez a viselkedés zavarba ejtő lehet, ha az olvasó nem ismeri a 32 bites Intel szolgálása még nem fejeződött be. H a ez a helyzet, akkor m egtörténik a megsza­
CPU-k belső működését. Rendesen nem m ennénk ennyire a részletekbe, de egy kításvezérlő beállítása úgy, hogy ugyanarról a vonalról ne fogadjon el újabb meg­
megszakítás beérkezése és az iretd utasítás végrehajtásakor történő események szakítást (6522-6524. sor). Ez a művelet a megszakításvezérlő egy m eghatározott
m egértése létfontosságú annak megértéséhez, hogy a kernel hogyan vezérli a bem enő vonalát tiltja le. A CPU megszakításbemenete már a megszakításjel beér­
2.2. ábra „futó” állapotának átm eneteit. Nagyon megkönnyíti a programozó dol­ kezésekor letiltódott, és még nem került újra engedélyezésre.
gát, hogy a hardver elvégzi a munka nagy részét, ezenkívül vélhetően az elkészült Az assembly nyelvet nem ismerők számára hasznos lehet néhány szót szólnunk
rendszer is hatékonyabb lesz. Mindez a hardversegítség azonban megnehezíti a az assembly nyelvű kódról. A 6521. sorban látható
program működésének m egértését, ha csak a programszöveget olvassuk.
A megszakításkezelő rendszer leírása után most visszatérünk az mpx386.s-hez, jz Of
és a M INIX 3-kernelnek azt a kicsiny részét nézzük meg, amelyik ténylegesen ta­
lálkozik a hardvermegszakításokkal. M inden megszakításhoz tartozik egy belé­ utasítás nem az átugrandó bájtok számát adja meg. A Of nem egy hexadecimális
pési pont. A JiwintOO és _hwint07 közötti belépési pontoknál (6531-6560. sor) a szám, és nem is egy normál címke. A közönséges címkék nem kezdődhetnek nu­
hw intjnaster (6515. sor) hívása található, míg a Jiw int08 és _hwintl5 közötti be­ merikus karakterrel. A M INIX 3-assembler ezt a jelölést használja lokális címke
lépési pontoknál a h w in tjla ve (6566. sor) hívása látható. Mindegyiknél van egy megadására; a Of előre (forward) ugrást jelent a következő 0 címkéhez a 6525. sor­
param éter, amely a kiszolgálásra váró eszközt azonosítja. Ezek csak látszólag pa­ ban. A 6525. sorban kiírt bájt hatására a megszakításvezérlő visszatérhet normál
ram éteres eljáráshívások, valójában makróhívásokról van szó, így a hw intjnaster üzemmódba, az aktuális megszakításvonal azonban esetleg letiltva maradhat.
és a h w in tjla ve is nyolcszor kerül kifejtésre, mindig csak az irq param éter válto­
188 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 189

Egy másik érdekes és esetleg zavaró tény, hogy a 6525. sor 0: címkéje újra elő­ egy processzus sem. A felhasználói szintű eszközmeghajtók részére, vagyis az
fordul ugyanabban az állományban, a hw initjlave-ben a 6576. sorban. A helyzet időzítőmeghajtó kivételével az összes hardvermegszakításra aktiválódó eszköz-
még bonyolultabb, mint első ránézésre gondolnánk, m ert ezek a címkék m ak­ meghajtó részére, a láncolt lista egy közös kezelő, a genericjiandler címét tartal­
rók belsejében vannak, a m akrók pedig kifejtődnek, m ielőtt az assembler látná a mazza. Ennek a függvénynek a forráskódja a rendszertaszk állományaiban van,
programot. így tulajdonképpen 16 darab 0: címke van az assembler által fordított de mivel a rendszertaszk a kernellel együtt fordítódik, és mivel ez a programrész
programban. Valójában a m akrókban definiált címkék elburjánzásra való hajlama megszakítás bekövetkezésekor hajtódik végre, nem igazán tekinthető a rendszer­
az oka annak, hogy az assembly nyelv lokális címkéket is megenged; lokális címke taszk részének. A láncolt lista elemeiben tárolt egyéb információk között van a
feloldásakor az assembler a m egadott irányban legközelebb lévőt választja, a többi megfelelő eszközmeghajtó processzusszáma. A genericjiandler hívásakor üze­
előfordulást figyelmen kívül hagyja. netet küld ennek az eszközmeghajtónak, aminek hatására az egy m eghatározott
Az Jn trJia n d le hardverfüggő, kódjának részleteit akkor tárgyaljuk, amikor az kezelő függvényét hívja meg. A rendszertaszk a fent leírt eseménysorozat m á­
Í8259.C állományhoz érünk. Néhány szót azonban érdem es ejtenünk a m űködésé­ sik végét is támogatja. Amikor egy felhasználói szintű eszközmeghajtó befejezi a
ről. Az JntrJia n d le olyan struktúrák láncolt listáján halad végig, amelyek egye­ feladatát, akkor egy sysjrqctl rendszerhívást kezdeményez, amelynek hatására a
bek között az egyes eszközök által generált megszakításokat kezelő függvények rendszertaszk az eszközmeghajtó nevében meghívja az enablejrq-1, hogy az fo­
címét és az eszközkezelők processzusszámát tartalmazzák. A zért láncolt lista, gadhassa a további megszakításokat.
m ert egy megszakításvonalon több eszköz is osztozhat. Az egyes eszközökhöz tar­ Visszatérve a hw intjnaster-hez, figyeljük meg, hogy egy rét utasítással fejező­
tozó kezelőknek ellenőrizniük kell, hogy az ő eszközüket kell-e kiszolgálni éppen. dik be (6527. sor). Nem azonnal szembetűnő, hogy itt valami trükk van. H a egy
Természetesen erre nem mindig van szükség, például az időzítőmegszakítások processzust szakítottunk meg, akkor éppen a kernelvermet használjuk, és nem
(IR Q 0) esetében sem, m ert ez a vonal be van drótozva az időzítőjeleket előállító azt, amelyiket a hardver állított be a processzustáblában a hw intjnaster indulá­
lapkához, itt más eszköz nem küldhet megszakításjelet. sa előtt. Ebben az esetben a savé veremmanipulációi a je sta rt címét hagyták a
A megszakításkezelők kódját úgy illik megírni, hogy ham ar vissza tudjanak tér­ kernelveremben. Ez egy taszk, eszközmeghajtó, szerver vagy felhasználói pro­
ni. H a nincs semmilyen elvégzendő feladat, vagy ha a kiszolgálás azonnal befeje­ cesszus újbóli futtatását jelenti. Lehet, sőt igen valószínű, hogy ez nem ugyan­
ződött, akkor a visszatérési érték TRUE. A kezelő végrehajthat bizonyos művele­ az a processzus lesz, amelyik a megszakítás beérkezésekor futott. Ez attól függ,
teket, például beolvashat az input eszközről egy adatbájtot, és azt elhelyezheti egy hogy a megszakításkezelő rutin által létrehozott üzenet okozott-e változást az
olyan pufferben, amelyet az eszközmeghajtó legközelebbi futásakor elér. A kezelő ütemezési sorokban. Hardvermegszakítás esetén szinte mindig ez fog történni. A
ezután kezdeményezheti üzenetek küldését az eszközmeghajtónak, amely ennek megszakításkezelők általában üzenetet küldenek valamelyik eszközmeghajtónak,
hatására majd közönséges processzusként futásra ütemeződik. H a a kiszolgálás az eszközmeghajtók viszont általában magasabb prioritású ütemezési soron h e­
nem fejeződött be, akkor a kezelő a FALSE értékkel tér vissza. Az J rq jic tid s lyezkednek el, mint a felhasználói processzusok. Éppen ez annak a mechanizmus­
tömb m inden eleme egy olyan bittérkép, amely a listán lévő kezelők visszatérési nak a lényege, amely a processzusok egyszerre történő végrehajtásának illúzióját
értékeit úgy összegzi, hogy az eredm ény pontosan akkor lesz nulla, ha m inden ke­ létrehozza.
zelő TRUE értékkel tért vissza. H a nem ez a helyzet, akkor a 6522. és 6524. sor kö­ A teljesség kedvéért megemlítjük, hogy ha a kernel futása közben érkezik meg­
zötti programrész letiltja a vonalat, mielőtt magát a megszakításkezelőt a 6526. sor szakítás, akkor a kernelverem van használatban, és a savé a restartl címét hagyja
utasítása újra engedélyezi. benne. Ennek hatására a h w intjnaster végén lévő rét után a kernel folytatja azt,
Ez a módszer biztosítja, hogy egy megszakításvonalhoz tartozó láncon lévő ke­ amit a megszakítás előtt csinált. Tehát a megszakítások egymásba lehetnek ágyaz­
zelők egyike sem aktiválódhat újra, amíg a megfelelő eszközmeghajtók el nem vé­ va, de az összes alacsony szintű kiszolgáló rutin befejeződése után a je s ta r t fog
gezték a feladatukat. Világos, hogy szükség van a megszakítások más m ódon való végrehajtódni, és ezáltal a megszakított processzus helyett egy másik kaphat lehe­
újra engedélyezésére. Ezt a később tárgyalt enablejrq teszi lehetővé. Egyelőre tőséget a futásra.
elég annyi, hogy m inden eszközmeghajtónak biztosítania kell, hogy feladata vé­ Egymásba ágyazott megszakítások nem fordulhatnak elő a M INIX 3-ban, m ert
geztével az enablejrq meghívódik. Az is egyértelmű, hogy az enablejrq-nak elő­ a kernel futása közben a megszakítások le vannak tiltva. Azonban, ahogy korábban
ször az eszközmeghajtó bitjét törölnie kell az J rq jic tid s adott megszakításvonal­ is em lítettük, szükség van erre a mechanizmusra is, mégpedig a kivételek kezelé­
hoz tartozó elemében, majd ellenőriznie kell, hogy minden bit nulla-e már. Csak sénél. Amikor egy kivétel hatására az összes szükséges kernel rutin lefutott, akkor
ekkor szabad a megszakításvezérlő adott vonalát engedélyezni. végül a je s ta r t-ra kerül a vezérlés. A kernelkód végrehajtása közben egy kivétel
Az előbb leírtak a legegyszerűbb formában csak az időzítőmeghajtójára igazak, hatása majdnem biztosan az lesz, hogy az utolsónak futott processzus helyett egy
m ert ez az egyetlen megszakításvezérelt eszköz, amelyik a kernelbe van fordítva. másik futhat. A kernelben keletkező kivétel hatása „pánik”: a panic függvény meg­
Egy másik folyamat megszakításkezelőjének címe nem értelm ezhető a kernelen próbálja a rendszert azonnal leállítani, hogy a lehető legkisebb kár keletkezzen.
belül, és a kernel enablejrq függvényét nem hívhatja saját m em óriaterületéről
190 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 191

A hwint_slave (6566. sor) majdnem ugyanolyan, mint a hwintjnaster, de neki


m indkét megszakításvezérlőt újra kell engedélyeznie, m ert mind a kettő letiltott
állapotba kerül, amikor az alárendelt vezérlő megszakítást kap.
Most térjünk rá a savé vizsgálatára (6622. sor), amelyet m ár többször is emlí­
tettünk. Ahogy a neve is utal rá, egyik funkciója a megszakított processzus álla­
potának m entése a CPU által a processzustáblában előkészített verembe. A savé
a k je e n te r változót használja a megszakítások egymásba ágyazási mélységének
megállapítására. H a az aktuális megszakítás beérkezésekor egy processzus futott,
akkor a 6635. sorban a

mov esp, k_stktop

utasítás átvált a kernelveremre, a következő utasítás pedig ráteszi a je sta r t címét.


H a olyankor érkezett megszakítás, amikor m ár úgyis a kernelverm et használtuk,
akkor a restartl címét tesszük bele (6642. sor). Természetesen megszakítás nem
következhet be itt, mindez a kivételek kezelése érdekében van. Akárhogy is ju ­
tunk el idáig, m ostanra a belépéshez képest esetleg másik verm et használunk, és (a) (b)
a hívó rutin visszatérési címe az éppen elm entett regiszterek alatt van eltemetve,
tehát egy normál return utasítással nem tudunk visszatérni a hívóhoz. A 6638. és 2.40. ábra. (a) Egy hardvermegszakítás feldolgozása, (b) Egy rendszerhívás lefolyása
a 6643. sorban található a savé két kilépési pontja; ezekben a
az utasításban található nnn param éter, és nem egy megszakításvezérlő áram kör
jmp RETADR-P_STACKBASE(eax) szolgáltatja. így amikor az j j a l l elindul, akkor a CPU m ár átváltott egy (a fo-
lyamatállapot-szegmens által m eghatározott) processzustáblában lévő veremre,
utasítás a savé meghívásakor elm entett címet használja. és számos regisztert elhelyezett benne. Azáltal, hogy átfolyik a je sta rt elejére, az
Az újrabeléptethetőség (reentrancy) a kernelben sok problém át okoz, kiküszö­ j j a l l végül is egy iretd utasítással ér véget, így a hardvermegszakítással megegye­
bölése sok helyen egyszerűsítette a programkódot. A M INIX 3-ban a _ kjeen ter ző m ódon a proc j ) t r által azonosított processzust indítja el. A 2.40. ábrán összeha­
változónak van értelme, m ert jóllehet közönséges megszakítások nem érkezhet­ sonlítjuk egy hardvermegszakítást és egy szoftvermegszakítást használó rendszer-
nek be a kernel futása közben, de kivételek igen. Egyelőre azt kell megjegyez­ hívás kezelését.
nünk, hogy a 6634. sorban található ugrás norm ál körülmények közben nem kö­ Most nézzük az j j a l l néhány részletét. Az alternatív j > j j a l l címke a 16 bi­
vetkezhet be. De szükség van rá a kivételek miatt. tes MINIX-verzió maradványa, amelynek külön rutinjai vannak a valós módú és
M ellékesen be kell vallanunk, hogy a M INIX 3 fejlesztésében az újrabelép­ a védett módú működéshez. A 32 bites verzióban mindkét címkéhez irányuló hí­
tethetőség kiküszöbölése egy olyan eset, amikor a programozás leelőzte a doku­ vás ide kerül. M INIX 3-rendszerhívást használó programozó a program jába egy
mentálást. Bizonyos értelem ben a dokum entálás nehezebb, mint a programozás szokványos C függvényhívást ír, olyat, mint egy lokális függvény vagy könyvtárbeli
- a fordítóprogram , vagy maga a program előbb-utóbb felszínre hozza a hibákat. rutin meghívásakor. A rendszerhívásban közrem űködő könyvtári eljárás összeállít
A megjegyzések kijavítására nincs hasonló mechanizmus. Van egy elég hosszú egy üzenetet, regiszterekbe tölti az üzenet címét és a címzett processzusazonosító­
megjegyzés az mpx386.s elején, ami sajnos pontatlan. A 6310. és a 6315. sor kö­ ját, majd végrehajt egy int SYS386 VECTOR utasítást. Ahogy fentebb leírtuk, ennek
zötti résznek úgy kellene szólnia, hogy a kernelbe újrabelépés csak kivétel esetén hatására a vezérlés az j j a l l elejére adódik át, miközben számos regiszter m ár a
történhet. processzustáblában elhelyezkedő veremben van elmentve. A megszakítások is le
Az mpx386.s következő eljárása az j j a l l , amely a 6649. sorban kezdődik. vannak tiltva, ugyanúgy, mint hardvermegszakítás esetén.
Mielőtt elm erülnénk a részletekbe, nézzük, hogyan fejeződik be. Nincs rét vagy Az j j a l l első része úgy néz ki, m intha a savé függvényt illesztettük volna be, és
jmp a végén. Valójában a je sta rt végrehajtásával folytatódik (6681. sor). Az j j a l l azokat a m aradék regisztereket m enti el, amelyeknek az értékét meg kell őrizni.
a megszakításkezelő mechanizmus rendszerhívásos megfelelője. A vezérlés egy Ahogy a savé esetében is, a
szoftvermegszakítás, vagyis egy int <nnn> utasítás végrehajtása után kerül ide. A
szoftvermegszakításokat ugyanúgy kezeljük, mint a hardvermegszakításokat, ter­ mov esp, k_stktop
mészetesen ekkor a megszakításleíró tábla (Interrupt Descriptor Table) indexe
192 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 193

utasítás a CPU-verem mutató regiszterét erre a verem re állítja. Az

lldt P_LDT_SEL(esp)

utasítás ezután feltölti a processzor lokális leírótáblájának (local descriptor table,


LDT) regiszterét a veremből. Ez felkészíti a processzort arra, hogy a következő
futtatandó processzus memóriaszegmenseit használja. Ezt követően egy utasítás
beírja a következő megszakításkor használt verem címét a soron következő pro­
cesszus processzustábla-bejegyzésébe, majd a következő utasítás ezt a címet a
TSS-be írja.
A restart első részére nem lenne szükség, ha a kernel (beleértve a megszakítást
kiszolgáló rutint is) futása közben érkezne megszakítás, m ert ekkor a kernelverem
van használatban, és a megszakításkezelő lefutása után a kernel folytatódhatna.
D e a M INIX 3-kernel valójában nem újrabeléptethető, és közönséges megsza­
kítások nem érkezhetnek ilyen módon. A megszakítások letiltása azonban nem
akadályozza meg a processzort abban, hogy kivételeket észleljen. A restart 1 címke
(6694. sor) jelzi a helyet, ahol a végrehajtás folytatódik, ha kernelkód végrehajtása
2.41. ábra. A restart a rendszerindítás, a megszakítások és a rendszerhívások utáni közös közben kivétel történik (reméljük azonban, hogy ilyesmi soha nem következik be).
pont. Az a processzus fog futni, amely a leginkább megérdemli (ez lehet különböző Ennél a pontnál a kje e n te r változót csökkentjük annak jelzésére, hogy az esetleg
az utolsónak megszakított processzustól, gyakran az is). Ezen a diagramon nem egymásba ágyazott megszakítások egy szintjével végeztünk, a többi utasítás pedig
látszanak a kernel futása közbeni megszakítások visszaállítja a processzort abba az állapotba, amelyben a futtatandó processzus
utolsó futásakor volt. Az utolsó előtti utasítás módosítja a verem m utatót, így a
utasítás átvált a kernelveremre. (A szoftver- és hardvermegszakítások hasonlósá­ savé hívásakor elm entett visszatérési címet figyelmen kívül hagyjuk. Ha az utolsó
ga odáig terjed, hogy m indkettőben letiltjuk az összes megszakítást.) Ezt követő­ megszakítás egy processzus végrehajtása közben történt, akkor az utolsó iretd uta­
en a sys_call hívása található (6672. sor); ezt a következő részben tárgyaljuk. Most sítás újraindítja a futásra most kiválasztott processzust, visszaállítva a m aradék re­
csak annyit m ondunk róla, hogy egy üzenet továbbítását váltja ki, az pedig az üte­ gisztereit a veremszegmenssel és a veremmutatóval együtt. H a viszont az iretd-hez
mező aktiválódását okozza. így a sys_call visszatérésekor a proc_ptr valószínűleg a restartl címkén keresztül jutottunk, akkor éppen nem egy processzusvermet, ha­
nem a rendszerhívást kezdeményező processzusra fog mutatni. Ezután a vezérlés nem a kernelverm et használjuk, és nem is egy processzushoz térünk vissza, hanem
átcsorog a restart elejére. a megszakított kernel végrehajtása folytatódik. A CPU akkor érzékeli ezt, amikor
Láttuk, hogy a je s ta r t (6681. sor) többféle m ódon elérhető: az iretd végrehajtásakor a kódszegmensleírót kiveszi a veremből. Ekkor az utasítás
hatása csak annyi, hogy a kernelverem marad használatban.
1. A rendszer indulásakor a main hívja. Ideje egy kicsit többet m ondanunk a kivételekről. A kivételeket (exception) a
2. Hardvermegszakítás után a hw intjnaster vagy a h w in tjla ve ide ugrik. CPU működése során fellépő különböző hibák okozzák. A kivételek nem feltét­
3. Rendszerhívás után az j j a l l itt folytatódik. lenül rosszak. Használni lehet őket arra, hogy az operációs rendszert különféle
szolgáltatások nyújtására ösztönözzük, például arra, hogy egy processzusnak több
A 2.41. ábrán egy egyszerűsített összefoglaló látható arról, hogy a jesta rt-on ke­ m em óriát adjon, vagy behozzon egy pillanatnyilag lemezen lévő m emórialapot,
resztül a vezérlés hogyan vándorol oda-vissza a processzusok és a kernel között. bár ezek a funkciók nincsenek benne a M INIX 3-alaprendszerben. Kivételeket
A megszakításokat a je s ta rt elérésekor minden esetben letiltjuk. Mire a 6690. programozási hibák is okozhatnak. A kernelben egy kivétel nagyon súlyos, és
sorhoz érünk, a következő futtatandó processzus már egyértelműen ki van választ­ „pánik”-ra ad okot. H a felhasználói program ban keletkezik kivétel, akkor lehet,
va, a letiltott megszakítások miatt m ár nem változhat meg. A processzustáblát hogy azonnal le kell állítani, de az operációs rendszernek ettől még nem szabad­
körültekintően úgy terveztük, hogy a veremnek fenntartott résszel kezdődik, így az na leállnia. A kivételeket a megszakításleíró tábla segítségével ugyanaz a m echa­
ebben a sorban található nizmus kezeli, mint a megszakításokat. A tábla kivételekhez tartozó bejegyzései
a 16 kivételkezelő belépési pontjaira m utatnak, az első a jliv id e jrro r, az utolsó
mov esp, Lproc_ptr) a jo p r jr r o r ; ezek az mpx386.s vége felé találhatók (6707-6769. sor). Ezek mind
az exception (6774. sor) vagy az errexception (6785. sor) belépési pontokra ugranak
194 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 195

attól függően, hogy az adott körülmények között bekerül-e a verembe egy hiba­ címzett nem várakozik a küldő üzenetére, akkor a küldő blokkolódik, és a címzett­
kód, vagy sem. Az assembly nyelvű program hasonló az eddig látottakhoz, a re­ nek küldeni szándékozó processzusok várakozási sorába kerül.
giszterek a verembe kerülnek, majd a C nyelvű _exception (figyeljünk az aláhúzás­ Amikor egy processzus egy récéivé m űveletet hajt végre, akkor a kernel ellenőr­
ra) rutint hívjuk az esemény kezelésére. A kivételek következményei különbözők. zi, hogy van-e processzus a neki küldeni szándékozók sorában. H a van, akkor az
Némelyiket figyelmen kívül hagyjuk, mások „pánikot” okoznak, megint mások üzenetet átmásolja a blokkolt küldőtől a fogadóhoz, és m indkettőt futtathatóvá
hatására esetleg szignált küldünk valamelyik processzusnak. Az exceptioti m űkö­ teszi. H a nincs küldésre várakozó processzus, akkor a fogadó blokkolódik, amíg
désére később még visszatérünk. üzenet nem érkezik.
Van még egy belépési pont, a _levelO_call (6814. sor), amelyet úgy kezelünk, A M INIX 3-ban az operációs rendszer komponensei egymástól teljesen függet­
m intha megszakítás lenne. Akkor használjuk, amikor a kódnak a 0-s szintű, leg­ lenül futnak, és a randevúeljárás nem mindig teljesen megfelelő. Éppen ezekre a
magasabb jogosultsági szinten kell futnia. Azért van az mpx386.s állományban a helyzetekre vezették be a notify alapműveletet, amely egy minimalista üzenetet, egy
megszakítások és kivételek belépési pontjai között, m ert maga is egy int <nnn> uta­ értesítést küld. A küldő nem blokkolódik, ha a címzett éppen nem vár üzenetre.
sítás hatására hívódik meg. A kivételkezelő rutinokhoz hasonlóan meghívja a savé Az értesítés azonban nem vész el. Amikor a címzett legközelebb receive-hez ér, ak­
eljárást, majd a vezérlés végül egy rét utasítás hatására a _restart belépési pontra kor a várakozó értesítések a közönséges üzenetek előtt kézbesítődnek. Az értesí­
kerül. Használatára később térünk ki, amikor olyan kódrészlethez érünk, amely­ tések olyan esetekben is használhatók, amikor a közönséges üzenetek holtponthoz
nek norm ál körülmények között nem (néha még a kernel számára sem) elérhető vezethetnének. Korábban felhívtuk a figyelmet arra, hogy el kell kerülni az olyan
jogosultságokkal kell futnia. helyzeteket, amikor az A processzus blokkolódik, m ert /i-nek akar üzenetet kül­
Végül egy adatok tárolására szolgáló területet foglalunk le az assembly fájl vé­ deni, és a fi processzus is blokkolódik, m ert/1-nak akar üzenetet küldeni. H a azon­
gén. Két adatszegmenst definiálunk itt. A ban az egyik üzenet egy nem blokkoló értesítés, akkor nincs semmi probléma.
A legtöbb esetben egy értesítés a feladóján kívül nem sokat árul el a címzettnek.
.sect .rom Néha csak ennyire van szükség, de van két speciális eset, amikor az értesítés kiegé­
szítő információt is hordoz. M indenesetre a címzett küldhet üzenetet az értesítés
deklaráció a 6822. sorban biztosítja, hogy a lefoglalt terület a kernel adatszeg­ feladójának, ha több információra van szüksége.
m ensének legelejére kerül, valamint azt, hogy ez a rész csak olvasható terület lesz. A kommunikáció magas szintű program kódja a proc.c állományban található.
A fordítóprogram egy mágikus számot helyez el itt; ezt megvizsgálva a boot el tud­ A kernelnek az a dolga, hogy a hardver- és a szoftvermegszakításokat üzenetekké
ja dönteni, hogy valóban egy kernelt próbál-e betölteni. Teljes rendszer fordítása­ konvertálja. Az előbbit hardvereszközök generálják, az utóbbiak pedig a rendszer
kor különböző karakterlánckonstansok kerülnek ide. A másik adatterület a szolgáltatásai iránti kérelmek, azaz rendszerhívások eredm ényeképpen jutnak el
a kernelhez. A két eset elég hasonló ahhoz, hogy egy közös függvény kezelhetné
.sect .bss őket, de hatékonyabb megoldás, ha specializált függvényeket hozunk létre.
A fájl elejéről egy megjegyzés és két makródefiníció említést érdemel. Listák
deklarációnál (6825. sor) a kernel inicializálatlan változói között helyet biztosít kezelésénél pointerre m utató pointerek gyakran előfordulnak; ezek előnyeit és
a kernelveremnek, afölött pedig a kivételkezelők változóinak. A szerverek és a használatát taglalja a 7420. és a 7436. sor közötti megjegyzés. Két hasznos m ak­
közönséges processzusok vermei számára a végrehajtható fájlok összeszerkeszté- ró is definiálva van. Bár a neve általánosabbra utal, a BuildMess (7458-7471. sor)
sekor kerül lefoglalásra tárolóhely; ezeknek végrehajtás előtt a kernel állítja be a csak a notify számára hoz létre üzeneteket. Az egyedüli függvényhívás a get_uptime,
veremszegmens-leírót és a verem m utatót. Ugyanezt a kernelnek saját maga szá­ amely az időzítőtaszk által kezelt változót olvas ki, hogy az értesítések időbélyeg­
m ára is el kell végeznie. zőt is tartalmazhassanak. A priv függvény hívásának látszó részek egy priv.h-beli
makrót takarnak:

2.6.9. Processzusok közötti kommunikáció a M INIX 3-ban #define priv(rp) ((rp)—


>p_priv)

A M INIX 3-processzusok a randevú elv alapján üzenetekkel kommunikálnak egy­ A másik makró a CopyMess; ez a klib386.s-ben lévő cp jn ess assembly nyelvű rutin
mással. Am ikor egy processzus egy send m űveletet hajt végre, akkor a kernel leg­ felhasználóbarát felülete.
alsó rétege ellenőrzi, hogy a címzett vár-e üzenetet a feladótól (esetleg hajlandó-e A BuildMess-ről többet kellene mondanunk. A priv makró két speciális esetben
bármelyik processzustól fogadni). H a igen, akkor az üzenetet a feladó pufferéből használatos. H a az értesítés forrása a HARDWARE, akkor rakománya is van, még­
a fogadó pufferébe másolja, és mindkét processzust a futtathatók közé teszi. H a a pedig a címzett processzus függőben lévő megszakítási kérelmeinek bittérképe.
H a a forrás a SYSTEM, akkor a rakomány a függőben lévő szignálok bittérképe.
196 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 197

Mivel ezek a bittérképek rendelkezésre állnak a címzett processzustáblájának priv r qr


r 1
bejegyzésében, ezért bármikor hozzáférhetők. Az értesítések később is kézbesít­ 4 p_q_link = 0
hetők, ha az elküldésük pillanatában a címzett éppen nem várakozik üzenetre. i p_q_link = 0 P _ q J in k
Hagyományos üzenetek esetében ehhez valamilyen puffer kellene, amelyben a
2
kézbesítetlen üzenetet eltárolhatnánk. Egy értesítés eltárolásához csak egy olyan
1
bittérkép kell, amelyben m inden olyan processzusnak van egy bitje, amelyik ér­ —J
0 p_caller_q — p_caller_q —
tesítést küldhet. H a egy értesítés nem kézbesíthető, akkor a küldőnek megfelelő
bit beállítódik a címzett bittérképében. H a a récéivé meghívásakor a bittérkép el­
lenőrzése azt mutatja, hogy a küldő bitje be lett állítva, akkor az értesítés újrage­
nerálható. A bit elárulja a küldő kilétét, ha pedig a küldő a HARD W ARE vagy a (a) (b)
SYSTEM, akkor a kiegészítő információk is hozzáadódnak. Ezenkívül csak az idő­
bélyegzőre van szükség, ami szintén az újrageneráláskor adódik hozzá. Azokra a 2.42. ábra. A 0-s processzusnak küldeni akaró processzusok várakozási sora
célokra, amikre felhasználják, az időbélyegzőnek nem szükséges azt az időt m utat­
nia, amikor az értesítést először elküldték, a kézbesítés ideje is megfelelő. a címzett éppen nem egymásnak próbálnak meg üzenetet küldeni.* A m in ije n d
A proc.c első függvénye a sys_call (7480. sor), amely szoftvermegszakítást (ez a kulcsfontosságú ellenőrzése a 7615. és 7616. sorban van. Itt azt vizsgáljuk, hogy a
rendszerhívásokat kezdeményező int SYS386_VECTOR utasítás) alakít át üzenetté. címzett récéivé m iatt blokkolva van-e, amit a processzustábla-bejegyzés p j t s jl a g s
A lehetséges küldők és a fogadók köre elég nagy, szükség lehet küldésre, fogadás­ mezőjének R EC EIVING bitje árul el. H a éppen várakozik, akkor a kérdés már
ra vagy küldésre és fogadásra is. Több m indent ellenőrizni kell. A 7490. és 7491. csak az, hogy kire. H a a mostani küldőre vagy bárkire (ANY), akkor a CopyMess
sorban a funkciókódot (SEND, RÉC ÉIVÉ stb.) és egyéb jelzőbiteket nyerünk m akró segítségével az üzenetet átmásoljuk, a fogadót pedig felszabadítjuk a blok­
ki az első argumentumból. Az első ellenőrzés arra irányul, hogy a hívó procesz- kolás alól a R EC EIVING bitjének törlésével. Az enqueue-1 hívjuk, hogy a fogadó
szus jogosult-e a hívásra. A 7501. sorban felhasznált iskemeln egy makró, amely a újból lehetőséget kapjon a futásra (7620. sor).
proc.h-bán (5584. sor) van definiálva. A következő ellenőrzés során azt vizsgáljuk, H a azonban a címzett nincs blokkolva, vagy blokkolva van, de valaki mástól vár
hogy a m egadott forrás vagy címzett érvényes processzus-e. Ezután még az üze­ üzenetet, akkor a 7623. és 7632. sor közötti programrész hajtódik végre, ami blok­
net m utatóját kell ellenőrizni, hogy a memória érvényes területére hivatkozik-e. kolja és a várakozási sorba teszi a küldőt. Egy adott címzettnek küldeni akaró pro­
A M INIX 3-ban a jogosultságok meghatározzák, hogy egy adott processzus mely cesszusok egy láncolt listába vannak fűzve, a címzett p ja lle r q mezője a lista legele­
másik processzusoknak küldhet üzenetet, a következő részben ez is ellenőrzésre jén álló processzushoz tartozó processzustábla-bejegyzésre mutat. A 2.42.(a) ábra
kerül (7537-7541. sor). Végül még azt ellenőrizzük, hogy a címzett processzus mutatja, hogy mi történik, ha a 0-s processzus nem tudja fogadni a 3-as processzus
még fut és nem kezdeményezett rendszerleállást (7543-7547. sor). H a minden üzenetét. Ha később a 0-s a 4-es üzenetét sem tudja fogadni, akkor a 2.42.(b) ábrán
ellenőrzés rendben lezajlott, akkor a mini_send, mini_receive és a m inijiotify kö­ látható helyzet áll elő.
zül hívjuk meg az egyiket, hogy az érdem i m unkát végezze el. H a a kért funkció A m inijeceive (7642. sor) eljárást a s y s ja ll hívja, ha a function param étere
ECHO, akkor a CopyMess m akrót használjuk, megegyező forrással és címzettel. RÉC ÉIVÉ vagy BO TH. Korábban m ár em lítettük, hogy az értesítéseknek maga­
Ahogy azt korábban említettük, az ECHO csak tesztelési célokat szolgál. sabb prioritásuk van, mint a közönséges üzeneteknek. Egy értesítés azonban soha
A sys_call által ellenőrzött hibalehetőségek valószínűsége kicsi, de az ellenőrzé­ nem megfelelő válasz egy send-re, ezért a kézbesítetlen értesítések bittérképe csak
sek könnyen elvégezhetők, m ert a fordítás során olyan program ot kapunk, amely akkor kerül megvizsgálásra, ha a SEN D REC B U SY bit nincs beállítva. H a talál
kis egész számok összehasonlítását végzi. Az operációs rendszer ezen legalsó értesítést a rendszer, akkor megjelöli, hogy m ár nem kézbesítetlen, és kézbesíti
szintjén tanácsos a legvalószínűtlenebb hibákat is ellenőrizni. Ez a programrész (7670-7685. sor). A kézbesítés során a proc.c első részében definiált BuildMess és
szinte biztosan sokszor végre fog hajtódni a rendszer futásának m inden m ásod­ CopyMess m akró is felhasználásra kerül.
percében. Mivel a notify üzenetek tartalm aznak időbélyegzőt is, azt gondolhatnánk, hogy
A m in ijen d , m inijeceive és m inijiotify függvény a M INIX 3 norm ál üzenete­ ezáltal hasznos információhoz juthatunk, például ha a fogadó egy ideig nem tudta
ket kezelő mechanizmusának központi eleme, megérdemlik, hogy alaposan tanul­ meghívni a receive-et, akkor az időbélyegző elárulja neki, hogy az értesítés mennyi
mányozzuk őket. ideig várakozott. Az értesítés azonban kézbesítéskor generálódik (és kerül bele az
A mini send (7591. sor) három param étert vár; ezek sorban: a hívó, a címzett időbélyegző), nem pedig az elküldéskor. Van azonban célja annak, hogy az értesí­
processzus és a küldendő üzenetet tartalm azó puffer címe. A s y s ja ll által elvég­
zett ellenőrzések után m ár csak egy szükséges, arra az esetre, ha küldők holtpont­ * Am int a program listából kiderül, valójában ennél többről van szó: azt ellenőrizzük, hogy a küldeni
ba kerülnének. A 7606. és 7610. sor között meggyőződünk arról, hogy a hívó és szándékozó processzusok között nem alakul-e ki körben várakozás. (A fordító megjegyzése.)
198 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3 BAN 199

tés csak a kézbesítéskor generálódik. Nincs szükség olyan program kódra, amely az rdy_head rdyjail
azonnal nem kézbesíthető értesítéseket eltárolja. Csak egy em lékeztető bit beál­
15 15
lítása szükséges, hogy egy értesítést kell generálni, ha a kézbesítés lehetővé válik.
Ennél gazdaságosabb tárolás elképzelhetetlen: minden kézbesítetlen értesítéshez
1 bitre van szükség.
Az is igaz, hogy általában az aktuális időre van szükség. Például a processzus­
kezelő értesítésként kapja a SIG _A LARM üzenetet, és ha az időbélyegző nem a
kézbesítéskor lenne generálva, akkor a processzuskezelőnek le kellene kérnie azt
a kerneltől, hogy az időzítő várakozási sorát ellenőrizni tudja.
Jegyezzük meg, hogy egyszerre csak egy értesítés kézbesítődik, a m in ije n d a
7684. sorban visszatér a kézbesítés után. A fogadó azonban nincs blokkolva, így
megteheti, hogy újabb receive-et hajtson végre közvetlenül az értesítés kézhezvéte­
le után. H a nincs egy értesítés sem, akkor megnézzük, hogy a hívó soraiban van-c
más típusú üzenet (7690-7699. sor). H a van, akkor a CopyMess makró kézbesíti,
majd a küldő blokkoltságát az enqueue hívásával megszüntetjük a 7694. sorban.
Ebben az esetben a hívó nem blokkolódik.
H a sem értesítés, sem másfajta üzenet nem áll rendelkezésre, akkor a 7708. sor­
ban a dequeue blokkolja a hívót.
A m in ijio tify (7719. sor) kézbesíti az értesítéseket. Hasonló a m in ije n d -\íez,
és röviden tárgyalható. H a egy üzenet címzettje blokkolva van és kész a foga­
dásra, akkor a BuildMess legenerálja az értesítést, majd kézbesítődik. A cím­
zett REC EIVIN G bitje törlődik, majd az enqueue-val az ütemezési sorra kerül 2.43. ábra. Az ütemező mind a tizenhat prioritási szinthez egy várakozási sort rendel.
(7738-7743. sor). H a a címzett éppen nem várakozik, akkor az sjio tifyjjen d in g Itt a processzusok MINIX 3 indulása utáni elhelyezkedését láthatjuk
bittérképében beállítódik egy bit, ami jelzi a kézbesítetlen értesítést, és azonosít­
ja a küldőt. A küldő ezután folytatja munkáját. H a az értesítés feldolgozása előtt rétegében elhelyezkedő időzítőtaszknak és rendszertaszknak van a legmagasabb
ugyanannak a címzettnek újabb értesítést kell küldeni, akkor ugyanaz a bit játszik prioritása. A 2-es réteg eszközmeghajtói alacsonyabb prioritást kapnak, de nem
szerepet, m int az előbb. Tulajdonképpen az ugyanattól a feladótól származó több mindegyik ugyanakkorát. A szerverek a 3-as rétegben az eszközmeghajtóknál ala­
értesítés egyetlen értesítéssé egyesül. Ez a módszer szükségtelenné teszi a puffere­ csonyabb prioritást kapnak, de megint csak van olyan, amelyik a többinél kisebbet.
lést, miközben aszinkron üzenetküldést tesz lehetővé. A felhasználói processzusok az összes rendszerprocesszusnál alacsonyabb, kez­
H a a m inijio tify szoftvermegszakítás és az azt követő s y s ja ll m iatt hívódik detben ugyanakkora prioritással indulnak, de a nice parancs emelheti vagy csök­
meg, akkor ezen a ponton a megszakítások le lesznek tiltva. Elképzelhető azon­ kentheti egy felhasználói processzus prioritását.
ban, hogy az időzítő-, a rendszertaszk vagy a M INIX 3-hoz egy a jövőben hozzá­ Az ütemező a futtatható processzusokat 16 várakozási sorba osztja be, habár
adandó taszk olyankor akar értesítést küldeni, amikor a megszakítások nincse­ egy adott pillanatban nem biztos, hogy mindegyik használatban van. A 2.43. ábrán
nek letiltva. A lockjiotify (7758. sor) egy biztonságos belépő a m inijiotify-hoz. láthatók a sorok és azok a processzusok, amelyek m ár a helyükön vannak, amikor
Ellenőrzi a k je e n te r változót, hogy lássa, le vannak-e tiltva a megszakítások. H a a kernel inicializációja befejeződik, és elkezd működni, vagyis a main.c 7252. so­
igen, akkor hívja a m inijiotify-1 azonnal. H a a megszakítások engedélyezve van­ rában a restart hívásakor. Az rdyjiead töm bnek m inden eleme egy ütemezési sor
nak, akkor a lock hívásával letiltja őket, meghívja a m inijiotify-1, majd az unlock- első processzusára mutat. Hasonlóan az rd yja il egy olyan tömb, amelynek elemei
kal újra engedélyezi a megszakításokat. a sorok utolsó elemeire m utatnak. Ezek a proc.h 5595. és 5596. sorában vannak
definiálva az E X T E R N makró felhasználásával. A processzusok kezdeti elhelyez­
kedését a sorokon a table.c-beli image táblázat (6095-6019. sor) határozza meg.
2.6.10. Ütemezés a MINIX 3-ban Az ütemezés soronként round robin módszerrel történik. H a egy futó procesz-
szus felhasználja a teljes időkeretét, akkor átkerül a sora végére, és egy új idő­
A M INIX 3 egy többszintű ütemezési algoritmust használ. A processzusok a 2.29. szeletet kap. H a azonban egy blokkolt processzust felélesztünk, akkor az a sora
ábrán látható szerkezetnek megfelelő kezdeti prioritásokat kapnak, de most több elejére kerül, amennyiben van még hátra valamennyi az időkeretéből. Nem kap
réteg van, és a processzusok prioritása futás közben változhat is. A 2.29. ábra 1-es azonban egy új, teljes időszeletet, csak annyi időt használhat fel, amennyi a biok-
200 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 201

koláskor m aradt neki. Az rd yja il tömb segítségével hatékonyan lehet procesz- anélkül, hogy másik processzusnak lehetősége lett volna futni. H a ez történt, ak­
szusokat a sorok végére tenni. Valahányszor a futó processzus blokkolódik, vagy kor úgy tekintjük, m intha végtelen, de legalábbis túlságosan hosszú ciklusban len­
egy futtatható processzust meg kell szüntetni egy beérkező szignál miatt, akkor az ne, és a processzus kap +1 pont büntetést. H a azonban úgy használta fel az időke­
érintett processzust az ütem ező eltávolítja a sorból. Csak futtatható processzusok retét, hogy az előző futása óta más processzus is sorra került, akkor a büntetési té­
vannak a sorokon. tel -1 lesz. Természetesen mindez nem segít, ha kettő vagy több processzus együtt
Az előbb leírt várakozási sorok felhasználásával az ütemezési algoritmus egy­ fut ciklusban. Nyitott kérdés, hogy az ilyen helyzetet hogyan lehetne felismerni.
szerű: keressük meg a legnagyobb prioritású nem üres sort, és futtassuk a sor Ezután a sor kerül kiválasztásra. A 0-s sor a legmagasabb prioritású, a 15-ös a
legelején álló processzust. Az ID L E processzus mindig futtatható, és a legalacso­ legkisebb prioritású. Lehetne érvelni amellett, hogy fordítva kellene lennie, de
nyabb prioritású sorban van. H a m inden magasabb prioritású sor üres, akkor az így konzisztens a hagyományos nice parancs param étereként használt értékek­
ID L E fut. kel, ahol egy pozitív érték azt jelenti, hogy a processzus alacsonyabb prioritáson
Előzőleg láttunk m ár sok hivatkozást az enqueue-m és a dequeue-ra. Most néz­ fusson. A kernelprocesszusok (az időzítőtaszk és a rendszertaszk) immúnisak, de
zük meg őket közelebbről. Az enqueue argum entum a egy processzustábla-bejegy­ m inden más processzus prioritása csökkenthető azáltal, hogy nagyobb sorszámú
zés pointere (7787. sor). Hív egy másik függvényt, a sched-et, olyan változókra sorba helyezzük át büntetőpontok adásával. Alsó korlátja is van a prioritásnak,
m utató pointereket ad át neki, amelyek meghatározzák, hogy a processzusnak közönséges processzusok soha nem kerülhetnek az ID L E sorába.
melyik sorra kell kerülnie, és hogy az elejére vagy a végére kell tenni. H árom le­ Elérkeztünk a pick j>roc-hoz (7910. sor). E függvény fő feladata a nextj>tr beál­
hetőség van; ezek klasszikus adatszerkezetekkel kapcsolatos példák. H a a kivá­ lítása. A pick j>roc-ot meg kell hívni, ha a sorokban bármilyen változás következik
lasztott sor üres, akkor hozzáadás után az rdyjiead és az rd yja il is a processzus­ be, ami befolyásolhatja, hogy melyik processzus fusson legközelebb. Amikor az
ra fog m utatni, a pjiextready kapcsolómező pedig a speciális N IL P R O C értéket aktuális processzus blokkolódik, a pick j)ro c meghívódik, hogy a CPU-t m egkap­
fogja felvenni, ezzel jelezve, hogy nincs következő. H a a processzus a sor elejére hassa egy másik. Lényegében a pick jjr o c az ütemező.
kerül, akkor a pjiextready mezőjébe átmásolódik az rdyjiead aktuális értéke, az A p ickjjro c egyszerű. Minden sort megvizsgál. Először a TASKjQ vizsgálata
rdyjiead pedig ettől kezdve az új processzusra fog mutatni. H a a processzus a sor történik meg; ha nem üres, akkor a proc j ) t r beállítódik a legelsőre, és a pick j>roc
végére kerül, akkor a sor utolsó elem ének pjiextready mezője az új processzusra azonnal visszatér. Egyébként a következő, eggyel alacsonyabb prioritású sor követ­
fog irányulni, ahogy az rd yja il is. Az új processzusban a p jiextready kapcsolóme­ kezik, egészen addig, amíg az ID L E Q-hoz nem ér. A bilij i t r m utatót a kiválasz­
ző a N IL PROC értéket fogja kapni. Végül a pick j?roc hívódik meg, amely eldön­ tott felhasználói processzusra állítjuk be, hogy az általa elhasznált processzoridőt a
ti, hogy melyik processzus fusson következőnek. számlájára tudjuk írni (7694. sor). Ez biztosítja, hogy az utolsónak futtatott felhasz­
Amikor egy processzus futásra képtelenné válik, akkor a dequeue-t (7823. sor) nálói processzusnak számlázzuk a rendszer által az ő érdekében felhasznált időt.
kell hívni. Egy processzusnak futnia kell ahhoz, hogy blokkolódni tudjon, tehát az A proc.c többi eljárása a lock send, a lo ckjn q u e u e és a lock dequeue. Ezek
eltávolítandó processzus m inden bizonnyal a sora elején lesz. Azonban szignált a megfelelő alapfüggvényhez nyújtanak hozzáférést, kiegészítve a lock-kai és az
egy nem futó processzus is kaphat. Ezért a soron elindulva meg kell keresni az ál­ unlock-kal, ugyanúgy, ahogy a lo ckjio tify esetében láttuk.
dozatot, nagy valószínűséggel a legelső lesz az. Amikor megvan, akkor a szükséges Összefoglalva, az ütemezési algoritmus több prioritási sort kezel. Mindig a leg­
pointereket megfelelően át kell állítani a sorról való eltávolításhoz. H a éppen fu­ nagyobb prioritású sor legelső processzusát futtatjuk következőnek. Az időzítő­
tott, akkor a pick jjr o c -ot is meg kell hívni. taszk felügyeli a processzusok által felhasznált időt. H a egy felhasználói procesz-
Még egy érdekesség is van ebben a függvényben. Mivel a kernelben futó tasz­ szus elhasználja a teljes időszeletét, akkor a processzus a sora végére kerül, így egy
koknak közös, hardver által m eghatározott verem területe van, ezeknek az integ­ egyszerű round robin ütem ezést valósítunk meg a versengő felhasználói procesz-
ritását érdem es néha megvizsgálni. A dequeue elején van egy vizsgálat, ami meg­ szusok között. A taszkok, az eszközmeghajtók és a szerverek többnyire blokkoló-
nézi, hogy a sorból eltávolított processzus a kernel területén működik-e. H a igen, dásig futhatnak, m ert hosszú időszeleteket kapnak, de ha túl sokáig futnának,
akkor le lehet ellenőrizni, hogy a hozzá tartozó verem végén elhelyezett megkü­ akkor ezek is megszakíthatok. Ez valószínűleg nem gyakran történik meg, de így
lönböztető bitm inta érintetlen-e, nem lett-e felülírva (7835-7838. sor). problémás magas prioritású processzusok sem tudják lefagyasztani a rendszert.
A sched-hez értünk, amely meghatározza, hogy az újra futtathatóvá váló pro­ Másokat a futásban akadályozó processzusok átm enetileg alacsonyabb prioritású
cesszus melyik sorra, annak is melyik végére kerüljön. A processzustáblában min­ sorba is kerülhetnek.
den processzushoz tárolva van az időszelet hossza, az időszeletéből aktuálisan
m egm aradt ideje, a prioritása és a m egengedhető legnagyobb prioritása. A 7880.
és a 7885. sor között ellenőrizzük, hogy a teljes időszeletét felhasználta-e. H a nem,
akkor folytatódhat még annyi ideig, amennyi m aradt neki. H a felhasználta az idő­
keretét, akkor ellenőrzésre kerül, hogy a processzus egymás után kétszer futott-e
202 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 203

2.6.11. Hardverfüggő kernelkomponensek dúl, vagy leáll. Ezt a függvényt az induláskori inicializálásra és leálláskor a BIOS-
értékek visszaállítására is lehet használni.
Sok C függvény is függ a hardvertől. A M INIX 3 más rendszerekre történő átvite­ M iután a hardver beállítása befejeződött, az in trjn it utolsó lépésként a BIOS-
lének megkönnyítése érdekében ezeket a függvényeket nem az általuk tám ogatott megszakításvektorokat átmásolja a M INIX 3-vektortáblába.
magas szintű programrészekkel egy helyre, hanem az exception. c, az 18259.c és a Az i8259.c második függvénye a p u tjr q jia n d le r (8162. sor). Inicializáláskor a
protect.c állományokban helyeztük el, amelyeket ebben a szakaszban tárgyalunk. p u tjr q jia n d le r m inden olyan processzusra meghívódik, amelynek reagálnia kell
Az exception. c a kivételkezelő exception rutint tartalm azza (8012. sor), am e­ valamilyen megszakításra. Ez a glo.h-bán E XTER N -ként definiált irqjiandlers
lyet a rutin assembly nyelvű része hív (mint _exception-1) az mpx386.s állomány­ táblázatba elhelyezi a megszakításkezelő rutin címét. A m odern számítógépek­
ból. A felhasználói processzusoktól eredő kivételeket szignálokká konvertáljuk. ben 15 megszakításvonal nem mindig elég (m ert 15-nél több I/O-eszköz is lehet),
A felhasználókról feltételezzük, hogy hibáznak programjaikban, de egy operá­ ezért előfordulhat, hogy két I/O-eszköz közösen használ egy vonalat. Ez a könyv­
ciós rendszerből eredő kivétel valami komoly problém át jelez, és pánikot vált ki. ben ism ertetett M INIX 3 által tám ogatott alapvető eszközök esetében nem for­
Az ex_data töm b (8022-8040. sor) határozza meg pánik esetén a kiírandó üzene­ dul elő, de amikor hálózati kártyákat, hangkártyákat vagy ezeknél különlegesebb
tet, vagy egyébként kivételenként a felhasználói processzushoz küldendő szignált. I/O-kártyákat kell támogatni, akkor előfordulhat a vonalmegosztás. Ezt úgy tesz-
A korábbi Intel processzorok nem állították elő az összes kivételt, a bejegyzések szük lehetővé, hogy a megszakítástábla nem egyszerűen címeket tartalmaz. Az
harmadik mezője jelzi, hogy melyik az a legkorábbi modell, amely képes az adott irqJiandlers[NR_IRQ_VECTORS] egy olyan tömb, amely a kemel/type.h-bán defi­
kivétel előállítására. Ez a tömb érdekes összefoglalását nyújtja azon Intel procesz- niált irq jio o k struktúrákra m utató pointereket tartalmaz. Ezeknek a struktúrák­
szorok fejlődésének, amelyekre a M INIX 3-implementációk készültek. A 8065. nak van egy ugyanilyen struktúra címét tartalm azó mezőjük, így az irqjiandlers
sorban egy alternatív üzenetet írunk ki, ha a kivételt az adott processzor elvileg elemeiből kiinduló láncolt listák alakíthatók ki. A p u tjr q jia n d le r egy elem et ad
nem generálhatta volna. egy ilyen listához. A struktúrák legfontosabb tagja egy megszakításkezelő pointer,
annak a függvénynek a címe, amelyet meg kell hívni megszakítás beérkezésekor,
például ha egy I/O-művelet befejeződött.
Hardverfüggő megszakítástámogatás A p u tjrq jia n d le r néhány részletére érdem es kitérnünk. Figyeljük meg az id
változót, amelyet 1-re állítunk, m ielőtt a láncolt listát egy while ciklussal bejárjuk
Az i8259.c három függvénye a rendszer inicializálása során az Intel 8259 meg­ (8176-8180. sor). A ciklus törzsében minden lefutáskor az id értéke eggyel balra
szakításvezérlő áram körök beállítására szolgál. A 8119. sorban található m ak­ tolódik. A 8181. sorban található ellenőrzés a lista hosszát az id m éretére korlá­
ró egy haszontalan függvényt definiál, az igazira csak akkor van szükség, ha tozza, vagyis 32-re egy 32 bites rendszerben. Alapesetben a lista bejárása során
a M INIX 3-at 16 bites processzorra fordítjuk. Az in trjn it (8124. sor) inicializálja elérjük a végét, ahova egy új kezelőt felvehetünk. Amikor ez kész, az id is bekerül
a vezérlőket. Két lépésben biztosítjuk, hogy ne érkezhessen megszakítás m indad­ az új listaelem megegyező nevű mezőjébe. A p u tjr q jia n d le r a globális irq jise egy
dig, amíg az inicializáció teljesen be nem fejeződött. Először az intr_disable hívó- bitjét is beállítja, ezzel jelzi, hogy az adott megszakításhoz létezik kezelő.
dik meg a 8134. sorban. Ez egy C-ből hívott assembly nyelvű könyvtári függvény, Ha az olvasó m egértette a M INIX 3-nak azt a tervezési célját, hogy az esz­
amely egyetlen cli utasítást tartalmaz, ami megakadályozza, hogy a CPU reagáljon közmeghajtókat a felhasználói területre vigyük át, akkor az előző leírás a
a megszakításokra. Ezután mindkét megszakításvezérlő regisztereibe egy sor báj­ megszakításkezelők aktivizálásáról egy kicsit zavarba ejtő lehetett. A struktúrák­
tot írunk ki, aminek hatására a vezérlők nem veszik figyelembe a bem enő jeleket. ban tárolt megszakításkezelők címei csak akkor használhatók, ha a kernel cím­
A 8145. sorban kiírt bájt egy kivételével csupa 1-est tartalmaz, az alárendelt ve­ területén elhelyezkedő függvényekre mutatnak. A kernel cím területén azonban
zérlőtől az elsődleges vezérlőhöz futó bem eneti vonalat nem tiltjuk le (lásd 2.39. csak egyetlen megszakítást használó eszközmeghajtó van, az időzítő. Mi a helyzet
ábra). A 0 engedélyezi a bem enetet, az 1 letiltja. Az alárendelt vezérlőbe kiírt bájt azokkal az eszközmeghajtókkal, amelyeknek saját cím területe van?
csupa 1-est tartalmaz. A válasz az, hogy azokat a rendszertaszk kezeli. Sőt a kernel- és a felhasználói
Az i8259-es megszakításvezérlő lapkán van egy táblázat, amely 8 bites inde­ processzusok közötti kommunikációra vonatkozó legtöbb kérdésre is ugyanez a
xeket generál; ezek alapján a CPU meg tudja határozni az egyes forrásokhoz (a válasz. Az a felhasználói területen elhelyezkedő eszközmeghajtó, amely megszakí­
2.39. ábra jobb oldalán látható jelek) tartozó megszakítási kapuleírókat. Ezeket tásokat akar kezelni, egy sysjrqctl rendszerhívással jelzi a rendszertaszknak, hogy
a BIOS inicializálja a számítógép bekapcsolásakor, és majdnem mindegyiket megszakításkezelőt akar bejegyezni. A rendszertaszk ekkor meghívja a p u tjrq _
változtatás nélkül lehet hagyni. A megszakításokat igénylő eszközmeghajtók el­ handler-t, de az eszközmeghajtó címtartományában lévő függvény helyett a rend­
indulásakor meg lehet változtatni, amit kell. Ezután m inden meghajtó kérheti a szertaszk területén elhelyezkedő genericjiandler címe kerül a megszakításkezelő
megszakításvezérlőben a hozzá tartozó bit törlését, hogy a saját vonala engedé­ mezőbe. A genericjiandler az irq jio o k struktúrában található processzusszámot fel­
lyezetté váljon. Az in trjn it param étere, a mine jelzi, hogy a M INIX 3 éppen in­ használva előkeresi a meghajtó priv táblabejegyzését, és a meghajtó függőben lévő
204 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 205

megszakításait tároló bittérképben az aktuális megszakításhoz tartozó bitet beállítja. egy adatszegmens-leírót - emlékezzünk arra, hogy most hardverszegmensekről
Ezután a genericjiandler értesítést küld az eszközmeghajtónak. Az értesítés feladó­ beszélünk; ezek nem ugyanazok, mint az operációs rendszer által kezelt szegmen­
jaként HARDW ARE szerepel, és a függőben lévő megszakítások bittérképe is beke­ sek. Az operációs rendszer a hardveradatszegmenseket tovább osztja adat- és ve­
rül az üzenetbe. A bittérkép miatt tulajdonképpen egyetlen értesítés az összes füg­ remszegmensre. A 8444. és 8450. sor között m inden LDT-leírója bekerül a GDT
gőben lévő megszakításról informál. Az irq jio o k struktúra tartalmaz még egypolicy megfelelő bejegyzésébe. Az initjlataseg és az in itjo d eseg függvény állítja elő eze­
mezőt is, amely azt szabályozza, hogy a megszakítást azonnal újra engedélyezni kell, ket a leírókat. Az egyes LDT leírók a processzusok m em óriatérképének változása­
vagy letiltva kell maradnia. Utóbbi esetben az eszközmeghajtó dolga, hogy a meg­ kor inicializálódnak (vagyis amikor egy exec rendszerhívás történik).
szakítás kiszolgálása után egy sysjrqenable rendszerhívással újra engedélyezze azt. Egy másik, inicializálást igénylő processzor-adatszerkezet a folyamatállapot-
A M INIX 3 egyik tervezési célja az I/O-eszközök futási időben történő átkonfi­ szegmens (Thsk State Segment, TSS). A struktúrát a fájl elején (8325-8354. sor)
gurálásának támogatása. A következő függvény az rm jrqjiandler, amely eltávo­ definiáljuk, a processzor regisztereinek és olyan egyéb információnak ad helyet,
lít egy megszakításkezelőt, amire szükség is van, ha egy eszközmeghajtót el aka­ amelyeket processzusváltás esetén el kell m enteni. A M INIX 3 csak azokat a m e­
runk távolítani és esetleg fel akarunk váltani egy másikkal. Ennek hatása éppen a zőket használja, amelyek megszakítás esetén megadják az új verem helyét. Az
p u tjr q jia n d le r ellentéte. initjlataseg hívása (8460. sor) biztosítja, hogy ezt a helyet a G D T segítségével meg
A fájl utolsó függvénye az intrjiandle (8221. sor), amelyet az mpx386.s-beli lehet találni.
hw intjnaster és h w in tjla ve m akró hív. A bittérképek irqjictids töm bjének a ki­ A M INIX 3 legalsó szintű működésének megértéséhez talán legfontosabb azt
szolgálás alatt álló megszakításhoz tartozó elem ét használja arra, hogy az egy megértenünk, hogy a kivételek, hardvermegszakítások és int <nnn> utasítások ho­
listán lévő megszakításkezelők aktuális állapotát nyilvántartsa. Az intrjiandle a gyan vezetnek a kiszolgálásukra írt különféle programrészek végrehajtásához. Ez a
lista minden függvényéhez beállítja a hozzá tartozó bitet az irq_actids-ben, majd megszakítási kapuleíró (interrupt gate descriptor) révén valósul meg. A gatejirray
meghívja a kezelőt. H a a kezelőnek nem kell tennie semmit, vagy azonnal be tudja (8383-8418. sor) töm böt a fordítóprogram feltölti a kivételek és a hardvermegsza­
fejezni a m unkát, akkor „true” értékkel tér vissza, és az irqjictids megfelelő bitje kítások kiszolgálórutinjainak címeivel, majd ez alapján a 8464. és 8468. sor között
törlődik. A hw intjnaster és a h w in tjla ve vége felé az egész bittérkép mint egész egy ciklus az int_gate függvény hívásaival beállítja a kapuleírókat.
szám ellenőrzésre kerül, hogy engedélyezni lehet-e az adott megszakítást, mielőtt Jó okai vannak annak, ahogy az adatokat a leírókban tároljuk. Ezek az okok
a következő processzus futása elkezdődik. a hardver részleteitől a fejlett processzorok és a 16 bites 286-os processzor kö­
zötti kompatibilitás m egtartásának szükségességéig terjednek. Szerencsére eze­
ket a részleteket általában az Intel tervezőm érnökeire hagyhatjuk. Legnagyobb
Intel védett mód tám ogatás részben a C nyelv is lehetővé teszi a részletek figyelmen kívül hagyását. Egy igazi
operációs rendszer megvalósítása során azonban előbb-utóbb szembekerülünk
A protect.c az Intel processzorok védett üzemmódjával kapcsolatos rutinokat tar­ a részletekkel. A 2.44. ábrán egy bizonyosfajta szegmensleíró belső szerkezetét
talmaz. A globális leírótábla (Global Descriptor Table, GDT), lokális leírótábla láthatjuk. Figyeljük meg, hogy a báziscím, amelyre a C program ok egy egyszerű
(Local Descriptor Table, LDT) és a megszakításleíró tábla (Interrupt Descriptor 32 bites egészként hivatkozhatnak, itt három részre van bontva; ezek közül kettő
Table, IDT) mindegyike a mem óriában helyezkedik el, és a rendszer erőforrásainak el van választva egymástól néhány 1, 2 és 4 bites értékkel. A szegmenshatár egy
védettségét biztosítja. A G D T és az IDT helyét egy speciális CPU-regiszter m utat­ 20 bites mennyiség, amely egy 16 bites és egy 4 bites részből áll össze. A szeg­
ja, a G D T bejegyzései LDT-kre mutatnak. A G D T m inden processzusnak rendel­ m enshatárt lehet értelmezni bájtok számaként vagy 4096 bájtos lapok számaként
kezésére áll, és az operációs rendszer által használt m em óriaterületekhez szeg­ a G (granularity - szemcsézettség) bitértékétől függően. Más leírók, mint például
mensleírókat tartalmaz. Rendes körülmények között minden processzushoz egy a megszakítások kezelését m eghatározók, szerkezete ettől eltérő, de ugyanilyen
LDT tartozik, amely a processzushoz rendelt m em óriaterületek szegmensleíróit bonyolult. Ezeket a 4. fejezetben tárgyaljuk részletesebben.
tartalmazza. Egy leíró egy sok komponensből álló 8 bájtos struktúra, a szegmens­
leíró legfontosabb részei azok a mezők, amelyek egy m em óriaterület báziscímét és Határ
Báziscím 24-31 G D 0 P DPL S Típus Báziscím 16-23
felső korlátját határozzák meg. Az IDT is 8 bájtos leírókból áll, a legfontosabb ré­ 16-19
sze a megfelelő megszakítás beérkezésekor végrehajtandó programrész címe.
A p r o tjn it (8368. sor) eljárás a G D T beállítását végzi a 8421. és 8438. sor között, Báziscím 0-15 Határ 0-15
a start.c állomány cstart függvénye hívja. Az IBM PC BIOS megköveteli, hogy egy
előre m egadott sorrendben legyenek a bejegyzések, a megfelelő indexek definícióit
a protect.h fájl tartalmazza. M inden processzushoz a hozzá tartozó LDT a procesz-
szustáblában van elhelyezve. Ezek két leírót tartalm aznak, egy kódszegmens- és 2.44. ábra. Egy Intel szegmensleíró szerkezete
206 2. PROCESSZUSOK 2.6. PROCESSZUSOK MEGVALÓSÍTÁSA MINIX 3-BAN 207

A protect.c többi függvényének nagy része a C változók és a leírók meglehe­ visszaállítja a különböző szegmensszelektorokat és a M INIX 3 elindításakor el­
tősen csúnya gépi ábrázolása (lásd 2.44. ábra) közötti konverziónak szentelt. Az m entett verem m utatót, és visszatér mint egy normális szubrutin.
init_codeseg (8477. sor) és az initjlataseg (8493. sor) feladata hasonló: a kapott Az int86 (8864. sor) BlOS-hívásokat támogat. A BIOS alternatív lemezmeghaj­
param étereket szegmensleírókká konvertálják. Feladatuk befejezéséhez mind a tókat nyújt, amelyeket itt nem tárgyalunk. Az int86 a betöltési felügyelőprogram­
kettő hívja a soron következő sdesc függvényt (8508. sor). Ez az a hely, ahol a 2.44. hoz irányítja a hívást, az kezeli a védett mód és a valós mód közötti átm enetet,
ábrán látható rendetlen struktúra részleteivel foglalkozunk. Az initjodeseg és az végrehajtja a BlOS-hívást, majd visszavált védett módba, és visszatér a 32 bites
initjlataseg nem csak a rendszer inicializálásakor kap szerepet. A rendszertaszk M INIX 3-ba. A betöltési felügyelőprogram a hívás során eltelt időt is visszaadja.
processzusok létrehozásakor is meghívja őket a megfelelő m em óriaterületek le­ Ennek felhasználását az időzítőtaszk tárgyalása során fogjuk látni.
foglalásához. A seg2phys (8533. sor) eljárást csak a start.c hívja, az sdesc által vég­ Jóllehet az üzenetek másolására a jp h y s jo p y (lásd alább) is alkalmas lett vol­
rehajtott művelet fordítottját végzi el: egy szegmensleíróból kiveszi a báziscímet. na, mégis a gyorsabb, specializált j p j n e s s eljárást (8952. sor) használjuk erre a
A phys2seg-re (8556. sor) m ár nincs szükség, m ert a sys_segctl rendszerhívás keze­ célra. Hívása a
li a távoli memóriaszegmensekhez történő hozzáférést, például a PC fenntartott
területeihez 640 K és 1 M között. Az int_gate (8571. sor) funkciója hasonló az cp_mess(source, src_clicks, src_offset, dest_clicks, dest_offset);
in itjo d eseg és az initjlataseg funkciójához: a megszakításleíró táblában tölt fel
bejegyzéseket. form ában történik, ahol a source a küldő processzus száma, amely a fogadó puffe­
A protect.c függvénye, az enablejop (8589. sor) egy elég piszkos trükköt képes rének m jo u r c e mezőjébe másolódik. A címek, amelyek előírják, hogy az üzenetet
elvégezni. M egváltoztatja az I/O-műveletek prioritási szintjét, így a futó procesz- honnan hova kell másolni, egy memóriaszelet sorszámmal (ez tipikusan az üzene­
szusnak lehetősége nyílik az I/O-kapuk írását és olvasását végző utasítások végre­ tet tartalm azó szegmens eleje) és a memóriaszeleten belüli relatív címmel vannak
hajtására. A függvény céljának magyarázata bonyolultabb, m int maga a függvény; megadva. Ez a megadási mód hatékonyabb, mint a jp h y s jo p y által használt 32 bi­
ez csak beállít két bitet a hívó processzus vermében tárolt egyik szóban, amely a tes címek.
processzus legközelebbi futásakor a CPU állapotregiszterébe kerül. Nincs szükség Az j x i t , __exit és _ _ j x i t eljárások (9006-9008. sor) azért vannak definiál­
az előbbi hatását megszüntető függvényre, m ert az csak a hívó processzusra vo­ va, m ert a M IN IX 3 fordításakor esetleg olyan könyvtári rutinokat használunk,
natkozik. Ezt a függvényt jelenleg nem használjuk, és felhasználói területen futó amelyek hívják az exit szabványos C függvényt. A kernelből való kilépésnek nincs
program nak nincs lehetősége rá, hogy meghívja. értelme; nincs hova menni. Következésképpen itt a szabványos exit nem használ­
A protect.c utolsó függvénye az alloc jeg m e n ts (8603. sor), amelyet a dojiew m ap ható. A megoldás az, hogy engedélyezzük a megszakításokat, és belépünk egy
hív. A kernel main rutinja is meghívja inicializáláskor. Nagyon hardverfüggő. A végtelen ciklusba. Valamikor egy I/O-művelet vagy az időzítő megszakítást fog
processzustáblában található szegmens-hozzárendelések alapján beállítja azokat okozni, és a normális rendszerm űködés helyreáll. A ___ main (9012. sor) belépé­
a regisztereket és leírókat, amelyeket a Pentium processzor a védett szegmensek si pont is kísérlet a fordítóprogram egy másik olyan akciójának hatástalanítására,
hardverszintű tám ogatása során használ. A 8629. és 8633. sorban látható többszö­ amely felhasználói program ok fordítása esetén értelmes lehet, de semmi haszna a
rös értékadás a C nyelv egyik jellemzője. kernelben. Egy assembly nyelvű rét (visszatérés szubrutinból) utasítás áll itt.
A jjh y s J n s w (9022. sor), a j)hys_insb (9047. sor), a j)hysj> utsw (9072. sor) és
a j> hysj)utsb (9098. sor) lehetőséget adnak az I/O-kapuk elérésére; ezek az Intel-
2.6.12. Kiegészítő eljárások és a kernelkönyvtár alapú gépek esetén a mem óriától elkülönített címtartományban helyezkednek el,
és külön műveletekkel lehet őket írni és olvasni. Az itt használt I/O-utasítások, az
Legvégül, a kernelnek van egy assembly nyelven írt segédfüggvényeket tartalm a­ ins, insb, outs és outsb, úgy lettek megtervezve, hogy hatékonyak legyenek tömbök
zó könyvtára, amelyet a klib.s lefordításával hozunk létre. Ezenkívül van néhány (sorozatok) használata esetén, valamint 16 bites szavak vagy 8 bites bájtok esetén
C-ben írt kiegészítő eljárás a misc.c állományban. Nézzük először az assembly fáj­ is. A függvényekben a többi utasítás arra szolgál, hogy beállítsa azokat a param é­
lokat. A klib.s (8700. sor) egy rövid fájl, és ugyanazt a szerepet játssza, mint a ko­ tereket, amelyek szükségesek a m egadott számú bájt vagy szó átmozgatására a
rábban látott mpx.s: kiválasztja a megfelelő gépfüggő változatot a WORD SIZ E fizikai címmel m egadott puffer és egy I/O-kapu között. Ez a függvény képes a le­
értéke alapján. Az általunk tárgyalt változat a klib386.s (8800. sor). Ez körülbelül mezek nagy sebességű kiszolgálására, ugyanezt bájtonkénti vagy szavankénti adat­
két tucat olyan kisegítő rutint tartalmaz, amelyet assembly nyelven írtunk, egyrészt átvitellel nem lehetne elérni.
a hatékonyság miatt, másrészt azért, m ert nem is lehet m indent C-ben megírni. Egyetlen gépi utasítás elegendő a megszakítások letiltásához vagy engedélyezé­
A jn o n ito r (8844. sor) lehetővé teszi a betöltési felügyelőprogramhoz való visz- séhez. Az j n a b l e j r q (9126. sor) és a jlis a b le jr q (9162. sor) ennél összetettebb.
szatérést. A felügyelőprogram szempontjából a M INIX 3 csak egy szubrutin, a Utóbbiak a megszakításvezérlő áram köröket manipulálják, egyes hardvermegsza­
visszatérési címet a verem ben hagyja, amikor a rendszert elindítja. A jn o n ito r kításokat engedélyeznek vagy tiltanak le.
208 2. PROCESSZUSOK 2.7. A MINIX 3-RENDSZERTASZK 209

A _phys_copy (9204. sor) eljárást C program ból a lyezi. Később, amikor a kputc megkapja az E N D OF KM ESS kódot, akkor érte­
síti a processzust, amely az ilyen üzeneteket kezeli. Ez az include/minix/config.h-
phys_copy(source_address, destination_address, bytes); ban van definiálva, és akár a naplózómeghajtó, akár a konzolmeghajtó is lehet.
A naplózómeghajtó a konzolnak is átadja az üzenetet.
formában hívhatjuk, és a fizikai m em ória bármelyik részéből bármelyik másik ré­
szébe másol át egy adatblokkot. M indkét cím abszolút, azaz a 0 cím valóban a cím-
tartom ány legelső bájtját jelenti, mind a három param éter előjel nélküli hosszú
egész (unsigned long). 2.7. A MINIX 3-rendszertaszk
Biztonsági okokból egy program által használni kívánt m em óriaterületről töröl­
ni kell m inden adatot, amelyet más program ok hagytak ott. Ezt teszi a M INIX 3 Annak a döntésnek, hogy nagy rendszerkom ponenseket a kernelen kívül, önálló
exec rendszerhívása is, a klib386.s következő függvényét, a physjnemset-eX (9248. processzusként valósítunk meg, következményei vannak. Az egyik következmény,
sor) felhasználva. hogy ezek a komponensek nem végezhetnek konkrét I/O-műveleteket, nem m a­
A következő két rövid függvény speciálisan az Intel processzorokhoz készült. nipulálhatják a kernel táblázatait, és nem tehetnek meg még egy sor olyan dolgot,
A j n e m j d w (9291. sor) függvény egy 16 bites szót ad vissza a memória bármelyik amit az operációsrendszer-funkciók általában elvégeznek. Például a fork rendszer-
részéből. Az eredmény nullákkal kiegészítve a 32 bites eax regiszterbe kerül. A je s e t hívást a processzuskezelő intézi. Új processzus létrehozásáról a kernelnek is tudo­
függvény (9307. sor) alaphelyzetbe állítja a processzort. Ezt úgy éri el, hogy a pro­ mást kell szereznie, hogy az ütemezésnél figyelembe tudja venni. Hogyan közli a
cesszor megszakításleíró tábla regiszterét a null mutatóval tölti fel, és végrehajt egy processzuskezelő a kernellel?
szoftvermegszakítást. Ennek ugyanaz a hatása, mint egy hardver-„reset”-nek. A problém a megoldása az, hogy a kernel szolgáltatásokat kínál az eszközmeg­
Az id le ja sk (9318. sor) akkor hívódik meg, amikor nincs semmi más teendő. hajtóknak és a szervereknek. Ezek a szolgáltatások nem állnak a közönséges fel­
Végtelen ciklusként van megírva, de nem egyszerűen egy aktív ciklus (aminek használói processzusok rendelkezésére, de lehetővé teszik az eszközmeghajtók és
ugyanez lenne a hatása). Az id leja sk kihasználja a hit utasítást, amely energia- a szerverek számára, hogy I/O-műveleteket végezzenek, hozzáférjenek a kernel
takarékos üzemmódba kapcsolja a processzort a következő megszakítás beérke­ táblázataihoz, és megvalósítsanak egyéb szükséges funkciókat anélkül, hogy a
zéséig. A hit azonban egy privilegizált utasítás, 0-s szintű jogosultság hiányában kernel részei lennének.
végrehajtása kivételt okoz. Ezért az id le ja sk egy hit utasítást tartalm azó szubrutin Ezeket a speciális szolgáltatásokat a rendszertaszk (system task) kezeli, am e­
címét teszi a verembe, majd meghívja a leveli) függvényt (9322. sor). Ez a függvény lyet a 2.29. ábra 1-es rétegében láthatunk. Bár a kernel tárgykódjába van fordít­
kiveszi a halt szubrutin címét a veremből, és egy fenntartott területre másolja (a va, valójában egy külön processzusként ütemeződik. A rendszertaszk feladata az,
glo.h-ban van definiálva, és a table.c-ben lefoglalva). hogy az eszközmeghajtóktól és a szerverektől kéréseket fogadjon, és azokat végre­
A JevelO a fenntartott területen elhelyezett címet egy megszakításkezelő címé­ hajtsa. Mivel a rendszertaszk a kernel címtartományának része, ezért jogos, hogy
nek tekinti, amelyet a legmagasabb, 0-s szintű jogosultsággal kell futtatni. itt tanulmányozzuk.
Az utolsó két függvény a rea d jsc és a readJlags. Az első az rdtsc (read time A fejezet korábbi részében láttunk példát a rendszertaszk által nyújtott szolgál­
stamp counter) utasítás végrehajtásával egy tsc nevű CPU-regiszter tartalm át ol­ tatásra. A megszakításkezelés tárgyalásakor leírtuk, hogy egy felhasználói szin­
vassa ki. Ez a CPU-ciklusokat számlálja, és teljesítménymérésre, illetve nyomkö­ tű eszközmeghajtó a sysjrqctl rendszerhívást használva hogyan küld üzenetet a
vetéshez használható fel. Ezt az utasítást nem ismeri fel a M INIX 3-assembler, rendszertaszknak, amelyben kéri egy megszakításkezelő rutin regisztrálását. Egy
ezért a hexadecimális műveleti kódja segítségével illesztettük a programba. felhasználói szintű eszközmeghajtó nem férhet hozzá azokhoz a táblázatokhoz,
Végül a readJlags kiolvassa a processzus jelzőbitjeit, és C változóként adja vissza. ahol a megszakításkezelő rutinok címei vannak, de a rendszertaszk igen. Továbbá,
A programozó fáradt volt, és a függvény célját leíró megjegyzés hibás. mivel a megszakításkezelő rutin címének a kernel címtartományában kell lennie,
Ebben a fejezetben utolsóként a utility.c nevű fájlt nézzük meg, amely három ezért a rendszertaszk a genericjiandler függvény címét tárolja el. Ez úgy reagál
fontos függvényt tartalmaz. Amikor valami nagyon nagy baj történik a kernel­ egy megszakításra, hogy értesítést küld az eszközmeghajtónak.
ben, akkor a panic (9429. sor) hívódik meg. Ez kiír egy üzenetet, és meghívja a Most jó alkalom nyílik a terminológia tisztázására. Hagyományos, monolitikus
preparejhutdow n függvényt. Amikor a kernel ki akar írni valamit, akkor nem kernelű operációs rendszerben a rendszerhívás (system call) kifejezést minden
használhatja a szabványos könyvtári printf-et, ezért egy speciális kprintf találha­ olyan hívásra alkalmazzák, amikor a kernel valamilyen szolgáltatást nyújt. M odern,
tó itt (9450. sor). A könyvtári verzió összes formázó opciójára itt nincs szükség, a Unixhoz hasonló operációs rendszerben a POSIX szabvány előírja, hogy milyen
de a funkcionalitás nagy része rendelkezésre áll. Mivel a kernel nem használhat­ rendszerhívások álljanak a processzusok rendelkezésére. Természetesen lehetnek
ja a fájlrendszert egy fájl vagy I/O-eszköz eléréséhez, ezért m inden karaktert egy a szabványosakon kívül a POSIX-ot kibővítő hívások is, a program ozók a rend­
másik függvénynek, a kputc-nek (9525. sor) ad át, amely ezeket egy pufferbe he­ szerhívásokra rendszerint valamilyen C könyvtári függvényen keresztül hivatkoz­
210 2. PROCESSZUSOK 2.7. A MINIX 3-RENDSZERTASZK 211

nak, m ert ezek könnyen használható interfészt nyújtanak. Az is előfordulhat, hogy 2.7.1. A rendszertaszk áttekintése
a programozó számára külön „rendszerhívás”-nak tűnő könyvtári függvények be­
lül ugyanazzal a módszerrel fordulnak a kernelhez. A rendszertaszk 28 üzenetfajtát fogad, ahogy az a 2.45. ábrán látható. Ezek m ind­
A M INIX 3-ban máshogy néznek ki a dolgok: az operációs rendszer kom ponen­ egyike tekinthető kernelhívásnak, bár látni fogjuk, hogy néha különböző névvel
sei felhasználói szinten futnak, habár rendszerprocesszusként speciális jogosultsá­ definiált makrók ugyanazt az ábrán látható üzenetfajtát eredményezik. Más ese­
gaik vannak. A rendszerhívás kifejezést továbbra is használni fogjuk a POSIX által tekben pedig az ábra üzenetfajtái közül több is szerepel egy eljárásban, amely az
definiált rendszerhívásokra (és néhány M INIX-kiterjesztésre), amelyek az 1.9. áb­ adott feladatot elvégzi.
rán láthatók, de a felhasználói processzusok nem kérnek közvetlenül a kerneltől A rendszertaszk főprogramja a többi taszkhoz hasonló szerkezetű. A szükséges
szolgáltatást. A M INIX 3-ban a felhasználói processzusok rendszerhívásai a szer­ inicializálások után belép egy ciklusba. H a kap egy üzenetet, átadja a megfelelő
verprocesszusok felé irányuló üzenetekké alakulnak. A szerverprocesszusok üze­ kiszolgáló eljárásnak, majd küldi a választ. Néhány általános kisegítő függvény ta-
neteket használnak az egymással, az eszközmeghajtókkal és a kernellel történő
kommunikációra. Ennek a résznek a tém ája a rendszertaszk, ez kapja meg az ösz- Üzenettípus Kitől Jelentés
szes kernelszolgáltatásra irányuló kérést. Pontatlanul fogalmazva nevezhetnénk sys_fork PM Egy processzus kettévált
ezeket a kéréseket rendszerhívásoknak, de az egyértelműség kedvéért a kernel­ sys_exec PM Veremmutató beállítása EXEC után
hívás (kernel call) kifejezést fogjuk használni. A felhasználói processzusok nem sys_exit PM Egy processzus kilépett
használhatják a kernelhívásokat. Sok esetben egy felhasználói processzus által sys_nice PM Ütemezési prioritás beállítása
kezdeményezett rendszerhívás egy szerver által kezdeményezett, hasonló nevű sys_privctl RS Jogosultságok beállítása, módosítása
kernelhíváshoz vezet. Ez m inden esetben azért történik így, m ert a kérésnek olyan sys_trace PM PTRACE egy műveletének végrehajtatása
része van, amely kizárólag a kernel hatáskörébe tartozik.

in
PM, FS, TTY

t/l
Szignál küldése processzusnak KILL hívása után

1
Például egy felhasználói processzus által kezdeményezett fork rendszerhívás a sys_getksig PM A PM a kezeletlen szignálokat ellenőrzi
processzuskezelőhöz kerül, amely a munka egy részét elvégzi. D e az új processzus sys_endksig PM A PM befejezte egy szignál feldolgozását
létrehozásához szükség van a processzustábla kernelben tárolt részének módosí­ sys_sigsend PM Szignál küldése egy processzusnak
tására is, ezért a processzuskezelő egy sys_fork hívással jelez a rendszertaszknak, sys_sigreturn PM Szignál feldolgozása utáni takarítás
amely aztán a kernel táblázatait módosítani tudja. Nem m inden kernelhívásnak sysjrqctl meghajtók Megszakítás engedélyezése, tiltása és konfigurálása
van ilyen egyértelmű megfelelője a rendszerhívások között. Például van egy sys_ sys_devio meghajtók 1/0-kapu írása vagy olvasása
devio kernelhívás az I/O-kapuk írására és olvasására. Ez a kernelhívás eszközmeg­ sys_sdevio meghajtók Adatsorozat írása vagy olvasása 1/0-kapura/kapuról
hajtóktól érkezik. Az 1.9. ábrán felsorolt összes rendszerhívásnak több m int fele sys_vdevio meghajtók l/O-kérések vektorának végrehajtása
eredményezheti valamelyik eszközmeghajtó aktivizálását, és ezáltal egy vagy több sys_int86 meghajtók Valós módú BlOS-hívás végrehajtása
sys_devio hívást. sys_newmap PM Processzus memóriatérképének beállítása
Technikailag (a rendszerhívásokon és a kernelhívásokon kívül) beszélhetünk sys_segctl meghajtók Szegmens hozzáadása és szelektor lekérése (távoli
egy harmadik hívásfajtáról is. A processzusok közötti kommunikációt megvalósí­ adatelérés)
tó send, récéivé és notify üzenetkezelő alapművelet (message primitive) tekinthető sys_memset PM Memóriaterület feltöltése karakterrel
rendszerhívás jellegűnek. Valószínűleg hivatkoztunk is rájuk m ár így a könyv egyes sys_umap meghajtók Virtuális cím konvertálása fizikai címre
részeiben - végül is a rendszert hívják. D e igazából meg kellene különböztetni sys_vircopy FS, meghajtók Másolás tisztán virtuális címzéssel
őket a rendszerhívásoktól és a kernelhívásoktól is. Használhatunk más kifejezést. sys_physcopy meghajtók Másolás fizikai címzéssel
Előfordul néha az IPC alapművelet (IPC primitive) vagy a csapda (trap) kife­ sys_virvcopy bárki VCOPY kérések vektora
jezés, m indkettő m egtalálható a forráskód megjegyzéseiben is. Az üzenetkezelő sys_physvcopy bárki PHYSCOPY kérések vektora
alapműveletre úgy kell gondolni, m intha egy rádiókommunikációs rendszer vivő­ sys_times PM Uptime és processzusidők lekérése
hulláma lenne. Á ltalában m odulációra van szükség ahhoz, hogy a rádióhullám ot sys_setalarm PM, FS, meghajtók Szinkron riasztás beállítása
hasznosítani lehessen; az üzenet típusa és egyéb komponensei teszik lehetővé, sys_abort PM, TTY Pánik: a MINIX nem tud tovább működni
hogy a hívás információt hordozzon. Ritkán a modulálás nélküli hullám is hasznos sys_getinfo bárki Rendszer-információ lekérése
lehet; például a repülőgépek leszállását segítő sugárnyaláb a repülőtereken. Ez a
notify alapművelettel rokon, amely a feladótól eltekintve csak kevés információt 2.45. ábra. A rendszertaszk által elfogadott üzenettípusok. A „bárki" azt jelenti, hogy
hordoz. bármelyik rendszerprocesszus; a felhasználói processzusok közvetlenül nem
hívhatják a rendszertaszkot
212 2. PROCESSZUSOK 2.7. A MINIX 3-RENDSZERTASZK 213

lálható a system.c nevű főállományban, de a főciklus a kemellsysteml könyvtárban A 2.45. ábrán látható következő három kernelhívás különféle módokon a m e­
lévő külön fájlokban elhelyezett eljárásoknak adja át a feladatokat. A rendszer­ móriával kapcsolatos. Az első a sys_newmap, amelyet a processzuskezelő hív, ami­
taszk megvalósításának tárgyalásakor látni fogjuk, hogy ez hogyan működik, és kor változik valamelyik processzus által használt memória, így a kernelben lévő
miért így van szervezve. processzustábla rész is aktualizálható. A sys_segctl és a sys memset biztonságos
Először röviden leírjuk az egyes kernelhívások funkcióját. A 2.45. ábra üzenettí­ hozzáférést nyújtanak a processzusoknak a sajátjukon kívül eső m em óriaterüle­
pusai több csoportba sorolhatók. Az első néhány a processzuskezeléssel kapcsola­ tekhez. A OxaOOOO-tól Oxfffff-ig terjedő címtartomány az I/O-eszközök számára
tos. A sysjork, sys_exec, sys_exit és a sys_trace nyilván szorosan kötődik a megfelelő van fenntartva, ahogy azt m ár a M INIX 3 indulásával kapcsolatos részben emlí­
szabványos POSIX-rendszerhíváshoz. Bár a nice nem része a POSIX szabványnak, tettük. Egyes eszközök ennek a m em óriaterületnek egy részét I/O-műveletekre
ez a parancs végül a sys_nice kernelhíváshoz vezet, amivel a processzusok prio­ használják - például a videokártyák feltételezik, hogy a kártya memóriájának erre
ritását meg lehet változtatni. Ebből a csoportból egyedül talán a sys_privctl lehet a területre leképezett részébe írt adatok megjelennek a képernyőn. A sys_segctl
ismeretlen. Ezt a reinkarnációs szerver (RS) használja, a M INIX 3-nak az a kom­ segítségével az eszközmeghajtók hozzájuthatnak olyan szegmensszelektorhoz,
ponense, amely a közönséges felhasználói processzusként indított processzusok amellyel a hozzá tartozó m em óriát megcímezhetik. A másik, a sys_memset akkor
rendszerprocesszusokká történő konvertálásáért felelős. A sys_privctl megváltoz­ használható, amikor egy szerver olyan m em óriaterületre akar adatokat írni, amely
tatja egy processzus jogosultságait, például azért, hogy kernelhívást kezdeményez­ nem hozzá tartozik. A processzuskezelő arra használja, hogy új processzus indulá­
zen. A sys_privctl-t akkor használjuk, amikor olyan eszközmeghajtót vagy szervert sakor kinullázza a mem óriát, ezzel megakadályozza, hogy az új processzus másik
indítunk az léteire parancsfájlból, amely nem része a betöltési memóriaképnek. processzus által otthagyott adatokat olvashasson.
A M INIX 3-eszközmeghajtók bármikor indíthatók (vagy újraindíthatok); ilyen A kernelhívások következő csoportja m emóriamásolásra való. A sys_umap vir­
esetekben azonban szükség van a jogosultság módosítására. tuális címeket fizikai címekké konvertál. A sys_vircopy és a sys_physcopy m em ó­
A kernelhívások következő csoportja a szignálokhoz kapcsolódik. A sys_kill riarégiókat másol virtuális, illetve fizikai címeket felhasználva. A következő két
a felhasználók által elérhető (és félrekeresztelt) kill rendszerhíváshoz tartozik. hívás, a sys_virvcopy és a sys_physvcopy az előzők vektoros verziói. Ugyanúgy, mint
A csoport többi tagja, a sys_getksig, sys_endksig, sys__sigsend és sys_sigreturn a pro­ a vektoros I/O-kérések esetében, ezekkel egy m ásolássorozatot lehet kérni a rend­
cesszuskezelőnek van fenntartva, hogy igénybe tudja venni a kernel segítségét a szertaszktól.
szignálok kezeléséhez. A sys_times nyilvánvalóan az idővel kapcsolatos, a POSIX times rendszerhívás­
A sysjrqctl, sys_devio, sys_sdevio és sys_vdevio kernelhívások csak a M INIX 3-ban nak felel meg. A sys_setalarm a POSIX alarm rendszerhívással rokon, de csak távol­
találhatók meg. Ezek nyújtják a felhasználói szintű eszközmeghajtókhoz szüksé­ ról. A POSIX-hívást nagyrészt elintézi a processzuskezelő, amely a felhasználói
ges támogatást. A sysjrqctl-t m ár em lítettük a fejezet elején. Egyik funkciója egy processzusok számára karbantart egy időzítőkből álló sort. A processzuskezelő a
hardver-megszakításkezelő beállítása, és a megszakítások engedélyezése felhasz­ sys_setalarm kernelhívást használja, amikor egy időzítő beállítására van szüksége.
nálói szintű eszközmeghajtóhoz. A sys_devio lehetővé teszi a felhasználói szintű Ez csak akkor történik, amikor a processzuskezelő által karbantartott sor elején
eszközmeghajtóknak, hogy a rendszertaszkot I/O-kapuk írására és olvasására kér­ változás áll be, és nem feltétlenül akkor, amikor egy felhasználói processzus meg­
jék. Ez nyilván elengedhetetlen, és az is világos, hogy ez a módszer többletm un­ hívja az alarm-ot.
kával jár ahhoz képest, m intha a meghajtó a kernel része lenne. A következő két A 2.45. ábra utolsó két kernelhívása rendszervezérlésre szolgál. A sys_abort ki­
kernelhívás magasabb szintű I/O-eszköz tám ogatást nyújt. A sys_sdevio akkor hasz­ indulhat a processzuskezelőből normál rendszerleállítási kérelm et követően vagy
nálható, ha bájtok vagy szavak sorozatát kell kiírni egy I/O-címre, vagy beolvasni pánik után. A tty eszközmeghajtótól is eredhet, amennyiben a felhasználó le­
egy I/O-címről, például egy soros vonal esetében. A sys_vdevio arra használható, nyomta a c t r l - a l t - d e l billentyűkombinációt.
hogy egy vektorban tárolt I/O-kéréseket küldjünk a rendszertaszknak. Vektor Végül a sys_getinfo egy nagyon általános információlekérő hívás. H a végignéz­
alatt (kapu, érték) párok sorozatát kell érteni. A fejezet korábbi részében írtunk zük a M INIX 3 C forrásállományait, akkor valójában nagyon kevés hivatkozást ta­
az in trjn it függvényről, amely inicializálja az Intel i8259-es megszakításvezérlőket. lálunk rá, de ha kiterjesztjük a keresést a definíciós könyvtárakra is, akkor nem ke­
A 8140. és a 8152. sor között egy utasítássorozat bájtok sorozatát írja ki. M indkét vesebb mint 13 m akrót találunk az include/minbc/syslib.h-ban, amelyek mind más
i8259-es lapkának van egy m ódbeállító vezérlőkapuja, és egy másik, amely egy nevet adnak a sys_getinfo-nak. Például a
négybájtos sorozatot fogad az inicializáció során. Természetesen ez a program ­
rész a kernelben hajtódik végre, és nem igényel közreműködést a rendszertaszk sys_getkinfo(dst) sys_getinfo(GET_KINFO, dst, 0,0,0)
részéről. H a azonban ugyanezt egy felhasználói processzus akarná végrehajtani,
akkor egy 10 (kapu, érték) párból álló vektor címét tartalm azó üzenet sokkal ha­ a rendszerindításkor egy kinfo struktúrát (az include/minix/type.h-ban van definiál­
tékonyabb lenne, mint 10 üzenet, amelyek mindegyike egyetlen kapucímet és egy va a 2875. és 2893. sor között) ad vissza a processzuskezelőnek. Ugyanarra az in­
kiírandó értéket tartalmazna. formációra többször is szükség lehet. Például a ps parancsnak ismernie kell a pro­
214 2. PROCESSZUSOK 2.7. A MINIX 3-RENDSZERTASZK 215

cesszustábla kernelben lévő részének helyét, hogy az összes processzus állapotáról A rendszertaszk legfelső szintje a sysja sk eljárás. M iután a függvénypointerek
információt tudjon adni. Megkérdezi a processzuskezelőt, amely a sys_getinfo fenti töm bjének inicializációja m egtörtént, a sy sja sk belép egy ciklusba. V ár egy üze­
variánsát, a sys_getkinfo-t használja az információ megszerzéséhez. netre, néhány lépésben ellenőrzi az érvényességét, majd a kérést átadja az üzenet
M ielőtt befejezzük a kernelhívások típusainak áttekintését, meg kell em líte­ típusának megfelelő függvénynek. H a válaszolni kell, akkor a választ visszaküldi,
nünk, hogy a sys_getinfo nem az egyetlen kernelhívás, amelyet az include/minix/ és ezt a ciklust (9768-9796. sor) ismétli egészen addig, amíg a M INIX 3 fut. Az
syslib.h-bán található makródefiníciók miatt több néven is el lehet érni. Például a érvényesség ellenőrzése során a priv táblabejegyzés alapján megállapítja, hogy
sys_sdevio általában a sysjnsb, sysjnsw, sys_outsb vagy sys_outsw m akrók által hívó­ a hívónak engedélyezve van-e ez a típusú hívás, és hogy a hívás típusa egyálta­
dik meg. A neveket úgy találtuk ki, hogy könnyen meg lehessen állapítani az adat­ lán érvényes-e. A m unkát elvégző függvény hívása a 9783. sorban van. A call_vec
átvitel irányát, illetve hogy bájtokkal vagy szavakkal dolgozunk-e. Hasonlóképpen tömb indexelésére a hívás számát használjuk, azt a függvényt hívjuk meg, amelyre
a sysjrqctl-t is makrón keresztül hívjuk úgy, mint a sysjrqdisable-t és hasonlókat. a tömb megfelelő eleme mutat. A hívás argum entum a a kapott üzenetre m uta­
Az ilyen makrók olvashatóbbá teszik a kódot, és a program ozót is segítik azzal, tó pointer, visszatérési értéke pedig egy állapotkód. Elképzelhető, hogy a függ­
hogy a konstans argum entum okat autom atikusan generálják. vény az ED O N TRE PLY kóddal tér vissza; ez azt jelenti, hogy nem kell válaszolni.
Különben a 9792. sorban küldjük a választ.
Ahogy a 2.43. ábrán látható, a M INIX 3 indulásakor a rendszertaszk a legma­
2.7.2. A rendszertaszk megvalósítása gasabb prioritású sor elején van, ezért van értelme, hogy a megszakításkezelők
adatszerkezetét és az időzítők listáját a rendszertaszk initialize függvénye iniciali­
A rendszertaszk a fordítás során a kernel/ könyvtárban lévő system. h definíciós zálja (9808-9815. sor). M indenesetre ahogy korábban is megjegyeztük, a megsza­
fájlból és a system.c C forrásállományból alakul ki. Ezenkívül van még egy spe­ kításokra reagáló felhasználói szintű eszközmeghajtók számára a rendszertaszk
ciális függvénykönyvtár a kemel/system könyvtárban. Megvan az oka ennek a szer­ engedélyezi a megszakításokat, ezért jogos, hogy ebben van a táblázat előkészíté­
kezetnek. Bár a M INIX 3-at itt úgy írjuk le, mint egy általános célú operációs se. Hasonló okok miatt került ide a többi rendszerprocesszus által kért szinkron
rendszert, potenciálisan alkalmazható speciális célokra is, mint például valami­ riasztásokhoz használt időzítőlisták beállítása is.
lyen hordozható eszköz beágyazott rendszereként. Ilyen esetekben az operációs Folytatva az inicializációt, a 9822. és a 9824. sor között a call_vec tömb minden
rendszer lecsupaszított verziója lehet a megfelelő. Például egy lemez nélküli esz­ elemébe a d o jin u sed függvény címe kerül, ezt hívjuk, ha nem tám ogatott kernel­
köznek esetleg nincs szüksége a fájlrendszerre. A kemel/config.h-bm láttuk, hogy hívást kísérel meg valaki. A fájl m aradék részében a 9827. és a 9867. sor között
a kernelhívások fordítása egyenként engedélyezhető vagy letiltható. Könnyebbé a map m akró több kifejtése található, mindegyik egy függvény címét helyezi el a
teszi az egyedi rendszerek építését, ha az egyes kernelhívásokat megvalósító kódo­ call_vec megfelelő indexű elemébe.
kat a fordítás utolsó fázisában a könyvtárból szerkesztjük be. A system.c m aradék része PUBLIC-ként deklarált függvényekből áll; ezeket
Az egyes kernelhívások kódjának külön állományba helyezése megkönnyíti a a kernelhívásokat feldolgozó függvények is, de a kernel más részei is hívhatják.
szoftver karbantartását. A kemel/system/ könyvtár megtalálható a M INIX 3 webol- Például az első függvényt, a get_priv-et (9872. sor) a sys_privctl kernelhívást meg­
dalán és a mellékelt CD-n is. valósító do_privctl használja. Hívja még a kernel is, amikor a betöltési m em ória­
A kemel/system.h definíciós állománnyal (9600. sor) kezdjük. A 2.45. ábrán lát­ kép processzusai számára processzustábla-bejegyzéseket hoz létre. A név talán
ható kernelhívások legtöbbjéhez tartozó függvények prototípusa m egtalálható egy kicsit félrevezető. A get_priv nem a m ár meglévő jogosultságokról ad vissza
benne. Van még egy d o jin u sed prototípus; ez a függvény nem tám ogatott ker­ információt, hanem egy üres priv bejegyzést keres, és hozzárendeli a hívóhoz. Két
nelhívás esetén fut le. A 2.45. ábra néhány csoportja itt definiált m akróknak felel eset van - a rendszerprocesszusok mindegyike saját bejegyzést kap a priv táblában.
meg. Ezek a 9625. és a 9630. sor között találhatók. Ezek olyan esetek, amikor egy H a nincs üres, akkor a processzus nem válhat rendszerprocesszussá. A felhasz­
függvény egynél több hívást is kezelni tud. nálói processzusok mind a tábla ugyanazon bejegyzésén osztoznak.
M ielőtt a system.c kódjára rátérnénk, figyeljük meg a call_vec hívási vektor dek­ A get_randomness (9899. sor) kiindulási értékeket szolgáltat a véletlenszám-
larációját és a map makró definícióját a 9745. és a 9749. sor között. A call_yec generátorhoz, amely karakteres eszközként van implementálva a M INIX 3-ban.
függvényekre m utató pointerek tömbje, ami lehetővé teszi, hogy egy adott üzenet A legújabb Pentium osztályú processzorokban van egy belső ciklusszámláló, és
kiszolgálásához tartozó függvényt az üzenet típusa alapján találjunk meg. Ehhez annak egy utasítása, amellyel a számlálót ki lehet olvasni. Ezt használjuk, ha ren­
az üzenet típusát, mint számot, indexként használjuk a tömbhöz. Ezt a módszert delkezésre áll, különben egy olyan függvényt hívunk meg, amely az időzítőlapka
a M INIX 3 más részeiben is felfedezhetjük. A map makróval kényelmes lehet ini­ egyik regiszterét olvassa ki.
cializálni ilyen tömböket. Úgy van definiálva, hogy ha érvénytelen argum entum ­ A send_sig értesítést küld egy rendszerprocesszusnak, miután az s_sig_pending
mal próbáljuk meg kifejteni, akkor egy negatív m éretű töm böt deklarál. Ez term é­ bittérképben beállította a processzushoz tartozó bitet. A bitet a 9942. sorban állít­
szetesen lehetetlen, ezért fordítási hibát eredményez. ja be. Figyeljük meg, hogy az s_sig_pending bittérkép a priv struktúra része, ezért
216 2. PROCESSZUSOK 2.7. A MINIX 3-RENDSZERTASZK 217

ezzel a m ódszerrel csak rendszerprocesszusoknak küldhető értesítés. Az összes A system.c utolsó függvénye a virtu a ljo p y (10071. sor). E nnek a függvénynek
felhasználói processzushoz egyetlen priv táblabejegyzés tartozik, az s_sig_pending legnagyobb része egy C switch utasítás, amely a fent em lített három umap_* közül
mezőn viszont nem osztozhatnak, ezért egyáltalán nem használják. Még a se n d jig választva a virtuális címeket átkonvertálja fizikaira. Ez m egtörténik a forrásra és a
hívása előtt m egtörténik annak ellenőrzése, hogy a címzett egy rendszerprocesz- célterületre is, majd a tényleges másolást a klib386.s-bcn található assembly nyel­
szus-e. A hívás vagy egy sys_kill kernelhívás eredménye, vagy a kerneltől jön, ami­ vű p h y s jo p y végzi (10121. sor).
kor a kprintf karaktersorozatot küld. Az első esetben a hívó állapítja meg, hogy a
címzett rendszerprocesszus-e. A második esetben a kernel csak a beállított kime­
neti processzusnak küld, amely vagy a konzol-, vagy a naplózómeghajtó lehet, de 2.7.3. A rendszerkönyvtár megvalósítása
m indkettő rendszerprocesszus.
A következő függvény a cause_sig (9949. sor), azért hívjuk, hogy szignált küld­ M inden dojcyz alakú névvel ellátott függvény forráskódja egy alkönyvtárban, a
jünk egy felhasználói processzusnak. Akkor van rá szükség, amikor a sys_kil) kernel/system/dojyz.c-ben van. A kernel/ könyvtárban lévő Makefile tartalm az egy
kernelhívás célpontja egy felhasználói processzus. Azért van a system.c-ben, m ert
felhasználói processzusban keletkezett kivétel hatására a kernel közvetlenül is cd system && $(MAKE) -$(MAKEFLAGS) $@
hívhatja. A s e n d jig -hez hasonlóan a fogadó kezeletlen szignálokat nyilvántartó
bittérképében be kell állítani egy bitet, de a felhasználói processzusok esetében sort, amelynek hatására a kemel/system/ m inden állománya lefordul, és előáll a
ez nem a priv táblában van, hanem a processzustáblában. A szóban forgó procesz- system.a a kernel/ könyvtárban. Am ikor a vezérlés visszatér a fő kernelkönyvtárba,
szust a lockjiequeue-v&\ ki is kell venni a futtathatók közül, valamint a (szintén a akkor a Makefile egy másik sorának hatására a kernel a tárgykódú fájlok szerkesz­
processzustáblában lévő) jelzőbitjeit aktualizálva rögzíteni kell, hogy szignált fog tésekor először a lokális függvénykönyvtárból oldja fel a hivatkozásokat.
kapni. Ezután egy üzenet megy ki - de nem a célprocesszusnak. Az üzenetet a A kemel/system/ könyvtárból itt két fájllal foglalkozunk. Azért ezeket választot­
processzuskezelő kapja, amely aztán mindent elrendez a szignállal kapcsolatban, tuk, m ert jól reprezentálják a rendszertaszk által nyújtott támogatások két osztá­
amit egy felhasználói szinten futó rendszerprocesszus csak elrendezhet. lyát. Az egyik támogatási kategória a kernel adatszerkezeteihez való hozzáférés
Ezután három olyan függvény következik, amelyek mind a sys_umap kernelhívást olyan felhasználói szinten futó rendszerprocesszusok számára, amelyek igénylik
támogatják. A processzusok rendszerint virtuális, vagyis egy bizonyos szegmens ezeket az adatokat. Példaként a system !dojetalarm x leírása fog szolgálni. A m á­
elejéhez viszonyított relatív címeket használnak. Néha azonban meg kell tudniuk sik általános kategória az olyan rendszerhívások támogatása, amelyeknek na­
egy m em óriaterület abszolút (fizikai) címét, például ha két szegmens közötti adat­ gyobb részét felhasználói szintű processzusok végrehajtják, de bizonyos művelete­
másolást készülnek kérni. Három féleképpen lehet egy virtuális címet megadni. A ket kernelszinten kell elvégezniük. Példaként a system /dojxec.c-t választottuk.
processzusok alapesetben valamelyik hozzájuk rendelt és a processzustáblában A sys_setalarm kernelhívás valamennyire hasonlít a sysjrqenable-re, amelyet em ­
bejegyzett program-, adat- vagy veremszegmens elejéhez képest értelm ezett rela­ lítettünk, amikor a megszakításkezelést tárgyaltuk a kernelben. A sysjrqenable
tív címeket használnak. Az ilyen virtuális címek fizikaira történő konverzióját az beállítja egy megszakításkezelő címét arra az esetre, ha egy adott vonalon megsza­
u m a p jo ca l függvény (9983. sor) végzi. kítás érkezne. A kezelő egy függvény a rendszertaszkon belül, a genericjiandler.
A második fajta memóriahivatkozás olyan régióra történhet, amely kívül van ugyan Ez egy értesítést generál annak az eszközmeghajtó processzusnak, amelynek rea­
a processzushoz rendelt program-, adat- és veremszegmenseken, de amelyért vala­ gálnia kell a megszakításra. A system/do jeta la rm .c (10200. sor) olyan program ­
milyen okból a processzus mégis felelős. Példa lehet erre egy videó- vagy Ethernet- kódot tartalmaz, amely az időzítőket a megszakításokhoz hasonlóan kezeli. Egy
eszközmeghajtó, mert a hozzájuk tartozó videokártya vagy Ethernet-kártya memó­ sys_setalarm kernelhívás inicializál egy időzítőt az olyan felhasználói processzusok
riájának egy része az I/O-eszközök részére fenntartott OxaOOOO-Oxfffff sávba lehet számára, amelyeknek szinkron riasztásra van szükségük, és rendelkezésre bocsát
leképezve. Egy másik példa lehet a memória eszközmeghajtó, amely a RAM-lemezt egy függvényt, amelyet az időzítő lejártakor meg kell hívni, hogy a felhasználói
kezeli, de amely képes a memória bármely részéhez is hozzáférést biztosítani a Idevl processzus értesítést kapjon az eseményről. Egy korábban kért riasztás visszavo­
mem és a /dev/kmem eszközökön keresztül. Ilyen memóriahivatkozások esetén a vir­ nását is lehet kérni, ha lejárati időnek 0 értéket adunk meg az üzenetben. A műve­
tuálisról fizikaira történő konverzió az um apjem ote feladata (10025. sor). let egyszerű - a 10230. és 10232. sor között az üzenetből kinyerjük az információt.
Végül hivatkozhatunk olyan mem óriarészre is, amit a BIOS használ. Ehhez A két legfontosabb tétel az időpont, amikor az időzítő lejár, illetve a processzus,
számítjuk a legalsó 2 KB-os részt, az alatt, ahova a M INIX 3 betöltődik, valamint amelynek erről tudom ást kell szereznie. M inden rendszerprocesszusnak saját
a 0x90000-0xfffff részt, amelyhez a betöltött M INIX 3 felett tartozik valamennyi időzítő struktúrája van a priv táblában. A 10237. és a 10239. sor között m eghatá­
RAM, plusz az I/O-eszközöknek fenntartott terület. Az u m a p jem o te ezt is tud­ rozzuk az időzítőstruktúra címét, majd a processzus számát, illetve a causejilarm
ja kezelni, de a harmadik függvény, az umap_bios (10047. sor) ellenőrzi is, hogy a függvény címét elhelyezzük benne. Utóbbi függvényt kell végrehajtani, amikor az
m egadott címek valóban ebbe a tartom ányba esnek. időzítő lejár.
218 2. PROCESSZUSOK 2.7. A MINIX 3-RENDSZERTASZK 219

H a az időzítő m ár aktív volt, akkor a sys_setalarm válaszüzenetében tudatja,


hogy a riasztásig mennyi idő lett volna még hátra. A nulla visszatérési érték azt
jelzi, hogy az időzítő nem aktív. Több lehetőséget kell figyelembe venni. Lehet,
hogy az időzítő előzőleg le lett állítva - az időzítő inaktív voltát az ex p jim e mező­
jében tárolt speciális TMR_NEVER érték jelzi. Ami a C program ot illeti, ez csak
egy nagy egész szám, ezért ezt az értéket explicit módon használjuk, amikor azt
ellenőrizzük, hogy a lejárati idő elmúlt-e már. Az időzítő jelezhet olyan időpontot,
amely m ár elmúlt. Ez nem valószínű, hogy megtörténik, de könnyű ellenőrizni. Az
időzítő jelezhet jövőbeli időpontot is. Az első két esetben a visszatérési érték nul­
la, egyébként a hátralévő időt adja vissza (10242-10247. sor).
Végül az időzítő leállítása vagy beállítása következik. Ezen a szinten ez úgy
történik, hogy a kívánt lejárati időt az időzítőstruktúra megfelelő mezőjébe írjuk,
majd meghívunk egy függvényt, amely a konkrét m unkát elvégzi. Természetesen
az időzítő leállításához nem kell új értéket eltárolni. Ham arosan látni fogjuk a
reset és a set függvényt, program kódjuk az időzítőtaszk forrásállományában van.
Mivel a rendszertaszk és az időzítőtaszk is a kernelbe van fordítva, mindkét függ­
vény deklarációja PUBLIC, ezért hozzáférhetők.
Van még egy függvény a do_setalarm.c-be.n. Ez a causejilarm, a felügyelőfügg­
vény, amelynek címe minden időzítőbe bekerül, így meg lehet hívni, ha a beállított (a) (b)
idő letelik. A függvény maga az egyszerűség - értesítést (notify) küld annak a procesz-
szusnak, amelynek száma szintén az időzítőstruktúrában van tárolva. így a kernelbeli 2.46. ábra. (a) Egy blokk olvasása legrosszabb esetben 11 üzenetet igényel.
szinkron riasztás a kérelmező rendszerprocesszusnak küldött üzenetté alakul. (b) Egy blokk olvasása legjobb esetben is 4 üzenetet igényel
Mellékesen megjegyezzük, hogy amikor néhány oldallal ezelőtt (és ebben a sza­
kaszban is) az időzítők inicializálásáról beszéltünk, akkor előkerült a rendszerpro­ használni fog, akkor a klib386.s-ben definiáltphysjn em set függvény törli azokat az
cesszusok által kért szinkron riasztás. H a nem volt teljesen érthető, vagy a kedves adatokat, amelyek korábbról m aradhattak azon a m em óriaterületen (10330. sor).
olvasó azon tűnődik, hogy mi az a szinkron riasztás, esetleg mi a helyzet a nem-rend- Az exec hívás okoz egy kis anomáliát. A hívást kezdeményező processzus üzene­
szerprocesszusok időzítőivel, akkor azt válaszolhatjuk, hogy ezekkel a kérdésekkel tet küld a processzuskezelőnek, és blokkolódik. Más rendszerhívások esetén a vá­
a következő szakaszban, az időzítőtaszk tárgyalásakor foglalkozunk. Olyan sok egy­ laszüzenet feloldaná a blokkolást. Az exec esetében azonban nincs válasz, m ert az
mással összefüggő része van egy operációs rendszernek, hogy jószerivel lehetetlen éppen betöltött futtatható program nem várja a választ. Ezért a do_exec a 10333.
a tém ákat úgy sorrendbe állítani, hogy időnként ne kelljen hivatkozni olyan részre, sorban m agát a processzust szabadítja fel a blokkolás alól. A következő sor futásra
amely csak később következik. Ez különösen igaz akkor, ha a megvalósításról be­ kész állapotba helyezi a program ot a lock_enqueue függvénnyel, amely zárolással
szélünk. H a nem egy valóságos operációs rendszerrel foglalkoznánk, akkor valószí­ kivédi a lehetséges versenyhelyzeteket. Végül a parancs neve elm entésre kerül,
nűleg el tudnánk kerülni az ehhez hasonló zűrös részleteket. Ami azt illeti, az ope­ hogy a felhasználó azonosítani tudja a processzust, ha kiadja a ps parancsot, vagy
rációs rendszerek alapjainak teljesen elméleti tárgyalása során valószínűleg említést lenyom egy olyan funkcióbillentyűt, amelynek hatására a processzustábla adataiba
sem tennénk rendszertaszkról. Egy elméleti könyvben csak legyintünk, és figyelmen kaphat betekintést.
kívül hagyjuk azt a problémát, hogy miként lehet felhasználói szinten futó rendszer- A rendszertaszk tárgyalásának végén megnézzük, hogy milyen szerepet játszik
komponenseknek korlátozott és szabályozott hozzáférést biztosítani olyan közpon­ egy tipikus operációsrendszer-szolgáltatás kezelésében, konkrétan egy read rend­
tosított erőforrásokhoz, mint például a megszakítások vagy az I/O-kapuk. szerhívás kiszolgálásában. Am ikor a felhasználó hívja a read-et, akkor először a
A kemel/system/ könyvtárban a do_exec.c (10300. sor) az utolsó fájl, amelyet fájlrendszer ellenőrzi, hogy a gyorsítótárában megvan-e a kért blokk. H a nincs,
részletesen tárgyalunk. Az exec rendszerhívással kapcsolatos teendők nagy részét akkor üzenetet küld a megfelelő lemezhez tartozó eszközmeghajtónak, hogy tölt­
a processzuskezelő elvégzi. A processzuskezelő előkészít egy vermet az új prog­ se be a gyorsítótárba. Ezután a fájlrendszer üzenetet küld a rendszertaszknak,
ramnak, amely tartalmazza az argum entum okat és a környezetet. A verem cí­ kérve a blokk átmásolását a felhasználói processzushoz. A legrosszabb esetben
mét átadja a kernelnek egy sys_exec kernelhívás keretében. Ezt a hívást a do_exec 11 üzenetre van szükség egy blokk beolvasásához, a legjobb esetben pedig csak
(10318. sor) kezeli. A verem m utató a processzustábla kernelben tárolt részében 4-re. A 2.46. ábra mindkét esetet bem utatja. A 2.46.(a) ábrán a 3-as üzenet kéri
kerül beállításra, és ha az éppen létrehozott processzus más memóriaszegmenst is a rendszertaszkot az I/O-műveletek elvégzésére, a 4-es üzenet a nyugta. Amikor
220 2. PROCESSZUSOK 2.8. A MINIX 3-IDŐZUŐTASZK 221

hardvermegszakítás történik, akkor a rendszertaszk az 5-ös üzenetben tájékoztat­ Kristályoszcillátor


ja erről a várakozó eszközmeghajtót. A 6-os üzenet kéri az adatoknak a fájlrend­
szer gyorsítótárába másolását, a 7-es üzenet az erre küldött válasz. A 8-as üzenet
— I □ I—
tudatja a fájlrendszerrel, hogy az adatok készen állnak, a 9-es és a 10-es pedig az
adatok átm ásolásának kérelm e a felhasználóhoz, illetve a válasz. Végül a 11-es a
A számláló minden impulzusra eggyel csökken
felhasználónak küldött válasz. A 2.46.(b) ábrán a kért adat m ár a gyorsítótárban
van, a 2-es és a 3-as üzenet az adatok átmásolásának kérelme a felhasználóhoz, il­
letve a válasz. Ezek az üzenetek többletm unkát jelentenek a M INIX 3-ban, ez az
ára a moduláris felépítésnek. Tárolóregiszter a számláló feltöltéséhez
Valószínűleg az adatmásolást kérő kernelhívások a leggyakoribbak a M INIX 3-ban.
M ár láttuk a rendszertaszknak azt a részét, amelyik a konkrét másolást elvégzi; ez
volt a Virtual_copy függvény. Az üzenetküldési mechanizmus nem megfelelő haté­ 2.47. ábra. Programozható óra (időzítő)
konyságának egyik ellenszere az, ha több kérést helyezünk el egyetlen üzenetben. A
sys_virvcopy és a sys_physvcopy kernelhívások ezt teszik. A hívásokat kiváltó üzenet­ nak megfelelően minden ciklusban megszakítást okoznak. Ezek jószerivel nem is
ben van egy olyan vektorra mutató pointer, amely több átmásolandó memóriablokk fordulnak elő a m odern személyi számítógépekben.
leírását tartalmazza. M indkettő a do_vcopy-1 hívja, amely egy ciklusban először A másik fajta órának három kom ponense van: egy kristályoszcillátor, egy szám­
meghatározza a forrás- és a célterület címét, majd a phys_copy segítségével végre­ láló és egy tárolóregiszter, ahogy a 2.47. ábrán látható. H a egy kvarckristályt meg­
hajthatja az átmásolást, amíg az összes blokk sorra nem kerül. A következő fejezet­ felelően darabolunk és mechanikai feszültséget keltünk benne, akkor nagyon
ben látni fogjuk, hogy a lemezegységek hasonlóképpen tudnak egy kérésben több nagy pontosságú elektromos jelet állíttathatunk elő vele, kristálytól függően tipi­
átviteli kérelmet kezelni. kusan az 5-200 MHz tartományban. Rendszerint minden számítógépben van leg­
alább egy ilyen áramkör, amely a többi áram körnek szinkronizáló jelet állít elő.
Az előállított jel a számlálóhoz kerül, amely ennek hatására folyamatosan számlál
lefelé. Am ikor eléri a nullát, akkor megszakítást idéz elő. A 200 MHz-nél nagyobb
2.8. A MINIX 3-időzítőtaszk frekvenciájúnak m ondott számítógépekben rendszerint ennél lassabb óra és több­
szöröző áram kör van.
Az időzítők (vagy órák) sok okból alapvető fontosságúak az időosztásos operációs A program ozható óráknak általában több üzemmódja van. Az egyszeri mód­
rendszerek működésében. Például nyilvántartják a valós időt, és megakadályoz­ ban (one-shot mode), az óra indulásakor a tárolóregiszter tartalm a átmásolódik a
zák, hogy valamelyik processzus kisajátítsa magának a CPU-t. A M INIX 3-idő- számlálóregiszterbe, és a kristály m inden egyes impulzusának hatására a számláló
zítőtaszkja némileg hasonlít egy eszközmeghajtóra, m ert egy hardvereszköz által tartalm a eggyel csökken. Am ikor a számláló értéke eléri a nullát, akkor ez meg­
generált megszakítások irányítják a m űködését. Az időzítő azonban nem blokkos szakítást okoz, és az óra megáll addig, amíg a szoftver újra nem indítja. Ismétlődő
eszköz, mint egy lemezegység, és nem is karakteres eszköz, m int mondjuk egy módban (square-wave mode), m iután a számlálóregiszter elérte a nullát és kivál­
terminál. Valójában a M INIX 3-ban az időzítőhöz nem férhetünk hozzá a Idevl totta a megszakítást, a tárolóregiszter tartalm a autom atikusan újra bemásolódik a
könyvtár egyetlen állományán keresztül sem. Továbbá az időzítőtaszk a kernel számlálóba, és az egész folyamat ismétlődik a végtelenségig. Ezeket a periodikus
címtartományában működik, és a felhasználói processzusok nem érhetik el köz­ megszakításokat órajeleknek (clock ticks) nevezzük.
vetlenül. A kernel minden függvényéhez és adatához hozzáfér, de a felhasználói A program ozható órák előnye, hogy a megszakítások frekvenciáját szoftver
processzusok csak a rendszertaszkon keresztül érhetik el. Ebben az alfejczetben segítségével be tudjuk állítani. H a egy 1 MHz-es kristályt használunk, akkor a
először az időzítőhardvert és -szoftvert tekintjük át általánosságban, majd meg­ számláló minden milliomod m ásodpercben impulzust kap. 16 bites regisztereket
nézzük, hogy az elveket hogyan alkalmaztuk a M INIX 3 esetében. használva, a megszakítások közötti intervallum program ozható m ódon 1 millio­
mod másodperc és 65 536 milliomod másodperc közé eshet. A program ozható
óralapkák általában két vagy három egymástól függetlenül program ozható órát
2.8.1. Időzítőhardver tartalm aznak, és egy sor egyéb funkciójuk lehet (például a lefelé számlálás helyett
felfelé számlálhatnak, letilthatók a megszakítások, és így tovább).
A számítógépekben kétfajta órát használnak; m indkettő lényegesen különbözik Annak megakadályozására, hogy a számítógép kikapcsoláskor elfelejtse a pon­
azoktól az óráktól, amiket az em berek használnak. Az egyszerűbbek a 110 vagy tos időt, elemmel m űködtetett másodlagos órát használnak, amely olyan alacsony
220 voltos elektromos hálózatra csatlakoznak, és az 50 vagy 60 Hz-es frekvenciá- fogyasztású áramkörökből áll, mint a digitális karórák. Ennek az elemmel m ű­
222 2. PROCESSZUSOK 2.8. A MINIX 3-IDŐZlTŐTASZK 223

ködtetett órának a tartalm a rendszerindításkor kiolvasható. H a ilyen másodlagos Órajelek számlálója


óra nincs a számítógépben, akkor a szoftver megkérdezheti a dátum ot és a pon­
tos időt a felhasználótól. Hálózati rendszerekben rendelkezésre áll egy szabvá­
nyos protokoll arra, hogy a dátum ot és a pontos időt egy távoli gépről kérdezzük
le. Akárhogy is jutunk hozzá a pontos időhöz, azt át kell számítani valamely bá­
zisidőponttól eltelt másodpercekre. A bázisidőpont lehet a Unix és M INIX által
is használt Universal Coordinated Time (UTC) - régebben greenwichi középidő
- szerinti 1970. január 1., 0 óra, vagy valami más. Az órajeleket a futó rendszer
számolja, és m inden eltelt másodperc után a valós idő számlálóját eggyel növeli. ideje
másodpercekben
A M INIX 3 (és a legtöbb Unix-rendszer) nem veszi figyelembe a szökőmásodper-
ceket, amelyekből 23 volt 1970 óta. Ezt nem tekintik súlyos hibának. Általában (a) (b) (c)
rendelkezésre állnak olyan segédprogramok, amelyekkel be lehet állítani a rend­
szer óráját és a háttérórát, illetve szinkronizálni lehet ezeket. 2.48. ábra. A pontos idő nyilvántartásának három módja
Meg kell említenünk, hogy a legkorábbi IBM-kompatibilis rendszerek kivételé­
vel minden számítógépeknek külön óraáram köre van a CPU, a belső adatsínek és H árom megközelítés lehetséges az előbbi problém a megoldására. Az első meg­
más kom ponensek időzítőjeleinek előállítására. Ez az az óra, amire az emberek közelítés szerint 64 bites számlálót kell használni, bár így a számláló karbantartása
gondolnak, amikor CPU-óraj elekről és -sebességről beszélnek. Ennek kezdetben sokkal időigényesebb, hiszen m ásodpercenként igen sokszor kell ezt elvégezni. A
megahertz volt az egysége, újabban a gigahertz tartom ányba esnek. Ezeknek az második megközelítés szerint a számlálóban a másodpercek számát tartjuk nyil­
áram köre ugyanazokból az alapelemekből épül fel, de a velük szemben tám asztott ván az órajelek száma helyett, egy kiegészítő számlálóban számoljuk az órajeleket
követelmények annyira eltérők, hogy a m odern számítógépeknek külön áram kö­ addig, amíg egy teljes másodperc el nem telik. A 232 másodperc több mint 136 év,
rük van a CPU vezérlésére és az idő nyilvántartására. így ez a módszer egészen jól fog működni a XXII. század elejéig.
A harmadik megközelítés szerint az órajeleket számoljuk, de nem egy előre
m eghatározott időponthoz, hanem a rendszerindítás időpontjához viszonyítva.
2.8.2. Időzítőszoftver Amikor a háttérórát olvassuk, vagy a felhasználó beállítja a valós (pontos) időt,
akkor a rendszerindítás idejét ki kell számolni az így nyert pontos idő alapján,
Az időzítő hardvere mindössze annyit tesz, hogy ismert időközönként megszakí­ és ezt az értéket el kell tárolni a m em óriában valamilyen megfelelő formában.
tásokat generál. Az idővel kapcsolatos m inden egyebet a szoftvernek, az időzítő­ Később, amikor szükség van a pontos időre, akkor ezt az eltárolt idő és a szám­
meghajtónak kell elvégeznie. Az időzítőmeghajtó pontos teendői változhatnak a láló összeadásával meg lehet határozni. A 2.48. ábra mind a három megközelítést
különböző operációs rendszerekben, de általában a következőket tartalmazzák: bemutatja.
A második órafunkció annak megakadályozása, hogy egy processzus túl sokáig
1. A pontos idő karbantartása. fusson. Am ikor egy processzus elindul, akkor az ütem ezőnek be kell állítania egy
2. Annak megakadályozása, hogy egy processzus tovább fusson, mint ami szá­ számlálót arra az értékre, amennyi időt a processzus órajelekben megadva futhat.
mára engedélyezett. Az időzítő által generált minden egyes megszakításkor az időzítőmeghajtója a
3. A felhasznált CPU-idő könyvelése. számlálóban levő értéket eggyel csökkenti. Amikor a számláló eléri a nullát, akkor
4. A felhasználói processzusok által kezdeményezett alarm rendszerhívás leke­ az időzítőmeghajtó meghívja az ütemezőt, hogy másik processzust indítson el.
zelése. A harmadik órafunkció a CPU használatának könyvelése. Ennek legpontosabb
5. Felügyeleti időzítők (watchdog timer) nyújtása a rendszer többi része felé. m ódja az, hogy a rendszer időzítőjétől független második időzítőt indítunk min­
6. Futásidő-elemzés (profiling), m onitorozás és statisztikai adatok gyűjtése. den olyan alkalommal, amikor egy processzus elindul. Amikor a processzus meg­
áll, akkor az időzítőből kiolvasható, hogy mennyi ideig futott. A helyes eredm ény­
Az első funkció, a pontos idő (másképpen valós idő - reál time) karbantartá­ hez az időzítő értékét el kell m entenünk minden egyes megszakítás beérkezése­
sa nem nehéz. Ehhez csak egy számlálót kell növelni minden egyes órajelre, mint kor, és vissza kell állítanunk a megszakítás befejezésekor.
ahogy ezt m ár említettük. Az egyetlen dolog, amire érdemes odafigyelni, az a pon­ Egy kevésbé pontos, ám sokkal egyszerűbb módja a könyvelésnek, hogy egy glo­
tos időt nyilvántartó regiszter bitjeinek száma. 60 Hz-es óra esetén egy 32 bites bális változóban egy m utatót tárolunk az éppen futó processzus processzustábla-
számláló nem sokkal két év után túlcsordul. Vagyis a rendszer nyilván nem tárol­ beli bejegyzésére. Minden egyes órajelre a processzus bejegyzésének egyik mező­
hatja a valós időt 32 biten az 1970. január 1-je óta eltelt órajelek számával. jét eggyel növeljük. így m inden egyes órajelet „ráterhelünk” arra a processzusra,
224 2. PROCESSZUSOK 2.8. A MINIX 3-IDŐZfTŐTASZK 225

amely az órajel érkezésekor éppen futott. Ennek a stratégiának gyenge pontja, könyvelését, és csökkentenie kell a riasztás számlálóját. Ezek az utasítások azon­
hogy ha a processzus futása alatt sok megszakítás keletkezik, akkor az ezekben ban igen nagy körültekintéssel lettek összeállítva, hogy nagyon gyorsak legyenek,
töltött idő teljes egészében a processzust terheli, bár maga a processzus nem hiszen m inden egyes m ásodpercben igen sokszor végrehajtásra kerülnek.
túl sok m indent tudott elvégezni. A megszakítások alatti CPU-használat pontos Az operációs rendszer egyes részei is igényelnek időzítőket. Ezeket felügyeleti
könyvelése túl költséges, ezért ritkán teszik meg. időzítőknek (watchdog tim er) nevezzük. A merevlemezes egység m eghajtóprog­
A M INIX 3-ban és sok más operációs rendszerben a processzusok kérhetik az ram jának vizsgálatakor látni fogjuk, hogy a lemezvezérlőnek küldött paranccsal
operációs rendszert, hogy bizonyos időintervallum elteltével küldjön nekik figyel­ egy időben egy ébresztéses időzítő is elindul, hogy akkor is lehetőség legyen a
meztetést. Ez a figyelmeztetés általában egy szignál, megszakítás, üzenet, vagy va­ helyreállításra, ha a parancs végrehajtása teljesen sikertelen. A hajlékonylemezes
lami hasonló. Például egy hálózati alkalmazás kérhet ilyen figyelmeztetést, m ert meghajtók időzítő segítségével várakoznak arra, hogy a lemezegység m otorja elér­
ha egy elküldött csomagra m egadott időn belül nem érkezik nyugtázás, akkor a je a megfelelő sebességet, illetve hasonló m ódon állítják le a m otort, ha bizonyos
csomagot újra kell küldeni. Egy másik alkalmazás a számítógéppel segített okta­ ideig nem történik semmilyen tevékenység. Néhány mozgatható nyomtatófejes
tás, amikor a tanulónak meg kell mondani a választ, ha nem válaszol egy megadott nyomtató 120 karakter/m ásodperces sebességgel tud nyomtatni (ez 8,3 ezred m á­
időn belül. sodperc karakterenként), de a nyomtatófejet nem tudja a bal m argóra visszavinni
H a az időzítőmeghajtónak elég óra áll rendelkezésére, akkor m inden egyes ké­ 8,3 ezred másodperc alatt, ezért a m eghajtóprogram nak várnia kell a kocsi vissza
réshez más-más órát használhat. H a ez nincs így, akkor egy fizikailag létező órával karakter kiírása után.
több virtuális órát kell szimulálnia. Ennek egyik módja egy olyan táblázat karban­ Az időzítőmeghajtó a felügyeleti időzítőket pontosan úgy kezeli, mint a fel­
tartása, amely az összes függőben lévő riasztáshoz tartozó időpontokat tartalm az­ használói riasztásokat. Az egyetlen különbség, hogy az időzítő lejártakor nem egy
za, valamint egy változó, amely az időben legközelebbi idejét tárolja. Valahányszor szignál keletkezik, hanem a meghajtó meghív egy eljárást, amelyet a hívó bocsá­
a pontos idő frissítésre kerül, a meghajtó megvizsgálja, hogy a legközelebbi riasztási tott rendelkezésére. Ez az eljárás a hívó kódjának része. A M INIX 3 tervezésekor
időpont elérkezett-e. H a igen, akkor a táblázatból kikeresi a következő legköze­ ez problém át jelentett, m ert az egyik cél a m eghajtóprogram ok eltávolítása volt a
lebbi időpontot. kernel címterületéről. Röviden úgy lehet összefoglalni, hogy a kernelszinten lévő
H a sokan várakoznak riasztásra, akkor több órát hatékonyabban lehet úgy szi­ rendszertaszk beállíthat riasztást felhasználói processzusok számára, majd az idő
mulálni, hogy idő szerint rendezve egy láncolt listába fűzzük a várakozó riasztási lejártakor értesítést küld nekik. Később még jobban kifejtjük ezt a témát.
igényeket, ahogy a 2.49. ábra mutatja. A lista minden egyes elem e megadja, hogy Az utolsó tétel a listánkon a futásidő-elemzés (profiling). Néhány operációs
a megelőzőhöz képest hány órajelet kell várni a jelzésig. Ebben a példában a riasz­ rendszer lehetőséget ad arra, hogy a felhasználói program futásáról az utasítás­
tások a 4203., 4207., 4213., 4215. és 4216. órajelnél következnek be. m utató értékeit tartalm azó hisztogramot készítsünk, ezáltal láthatóvá téve azt,
A 2.49. ábra szerint egy időzítő éppen lejárt. A következő megszakítás 3 óra­ hogy a program egyes részein mennyi időt töltött futás közben. Amikor a futásidő­
jel múlva következik be, a 3 éppen be lett töltve a számlálóba. Minden órajelre a elemzés lehetősége adott, akkor minden egyes órajelnél az időzítőmeghajtó meg­
Következő jelzés eggyel csökken. Amikor eléri a nullát, akkor létrejön a lista első nézi, hogy az aktuális processzus kérte-e az adatgyűjtést. H a igen, akkor megálla­
elem ének megfelelő jelzés, az elem et pedig eltávolítjuk a lista elejéről. Ezután a pítja, hogy utasításm utató melyik címtartományban van, majd a címtartományhoz
Következő jelzés értékét a lista új első elem ének értéke szerint állítjuk be, a pél­ tartozó számlálóértéket eggyel növeli. Ezt az eljárást term észetesen fel lehet hasz­
da szerint 4-re. Sok esetben relatív időknél sokkal kényelmesebb abszolút időket nálni a rendszer futásidő-elemzésére is.
használni, ezért a M INIX 3-ban is ezt a megközelítést választottuk.
Figyeljük meg, hogy egy óramegszakítás alatt az időzítőmeghajtójának sok a
dolga. Többek között növelnie kell a valós időt, csökkentenie kell az időszelet­ 2.8.3. A M INIX 3-időzítőmeghajtó áttekintése
ből hátralévő időt, és ellenőriznie kell annak 0 voltát, el kell végeznie a CPU-idő
A M INIX 3-időzítőmeghajtó a kem ellclockx fájlban található. Három funkcio­
Aktuális idő Következő jelzés nális részre különíthető el. Először is a következő fejezet eszközmeghajtóihoz
hasonlóan van egy taszkfunkciója, vagyis egy ciklust futtat, amelyben kérésekre
várakozik, majd a beérkező üzeneteket továbbítja feldolgozó szubrutinokhoz. Ez
a szerkezet azonban majdhogynem csökevényes az időzítőtaszkban. Az üzenetek
költségesek, m ert mindig környezetátkapcsolással járnak. Ezért az időzítőtaszk
esetében ezt csak akkor használjuk, ha tekintélyes mennyiségű m unkát kell elvé­
gezni. Csak egyetlen fajta üzenetet fogad el, em iatt csak egy kiszolgáló szubrutinja
2.49. ábra. Több időzítő szimulálása egyetlen órával van, munkája végeztével pedig nem küld válaszüzenetet.
226 2. PROCESSZUSOK 2.8. A MINIX 3-IDŰZÍTÖTASZK 227

Az időzítőszoftver második nagyobb része a m ásodpercenként 60-szor aktivi­ tartjuk karban, a betöltéskori idő máshol van feljegyezve. Az időzítőszoftver csak
zálódó megszakításkezelő. A legszükségesebb nyilvántartási feladatokat végzi el, az órajelszámláló aktuális értékével járul hozzá a valós idővel kapcsolatos rend­
növeli egy változó értékét, ami a betöltés óta eltelt órajeleket számlálja. Ezt ösz- szerhívásokhoz, további feldolgozást az egyik szerver végez. Ez megfelel annak a
szehasonlítja a következő riasztási idővel. Frissíti azokat a számlálókat is, amelyek törekvésnek, hogy a M INIX 3-ban minél több funkcionahtást felhasználói szintű
az aktuális processzus időszeletéből elhasznált időt, illetve az általa felhasznált processzusokba helyezzünk át.
összes időt tárolják. H a a megszakításkezelő azt veszi észre, hogy egy processzus A megszakításkezelőben a lokális számlálót m inden megszakításkor aktuali­
elhasználta az időszeletét, vagy lejárt egy időzítő, akkor üzenetet generál, amely a záljuk. Az órajelek elvesznek, amikor a megszakítások le vannak tiltva. Bizonyos
taszkciklushoz kerül. Egyébként nem küld üzenetet. Az alapelv az, hogy az óraje­ esetekben ezt az effektust lehet korrigálni. Van egy globális változó, amely az elve­
lek hatására a kezelő minél kevesebbet, minél gyorsabban végezzen el. A költséges szett órajeleket számlálja, ennek az értékét m inden megszakításkor hozzáadjuk a
főtaszk csak akkor aktivizálódik, ha tekintélyes mennyiségű m unkát kell elvégezni. főszámlálóhoz, majd lenullázzuk. A megvalósítás leírásánál fogunk látni egy pél­
Az időzítőmeghajtó harmadik általános része egy szubrutingyűjtemény, amely­ dát erre.
nek tagjai általános tám ogatást nyújtanak, de a megszakítások során sem a A megszakításkezelő a processzustábla változóit is befolyásolja, elszámolási és
megszakításkezelő, sem a főtaszk nem hívja meg őket. Az egyik szubrutin PRIVÁTÉ, vezérlési szempontból is. A z időzítőtaszk csak akkor kap üzenetet, ha az aktuális
és a taszk hívja, mielőtt belép a főciklusba. Ez inicializálja az időzítőt, vagyis az idő m eghaladja a következőnek beütem ezett riasztás idejét, vagy ha az aktuális
időzítőlapkára olyan adatokat ír, hogy az a kívánt időközönként megszakításokat processzus időszelete letelt. A megszakításkezelőben m inden egyszerű egész m ű­
generáljon. Az inicializációs rutin a megszakításkezelő címét is megfelelően elhe­ veletekkel m egoldható - alapműveletek, összehasonlítás, logikai ÉS/VAGY, ér­
lyezi, hogy a megszakításvezérlő megtalálja, amikor az időzítőlapka jelet küld neki tékadások. Ezeket a C fordítóprogram könnyűszerrel hatékony gépi utasításokká
az IR Q 8-as vonalon, végül engedélyezi a vonalat. alakítja. A legrosszabb esetben 5 összeadás/kivonás, 6 összehasonlítás, valamint
A clockx többi szubrutinja PUBLIC, ezeket a kernelen belülről bárhonnan néhány logikai művelet és értékadás elvégzésére van szükség egy megszakítás ki­
meg lehet hívni. Ami azt illeti, a c.lockx-bő\ egyiket sem hívjuk. Többnyire a rend­ szolgálásához. Szubrutinhívásra egyáltalán nincs szükség.
szertaszk hívja őket az idővel kapcsolatos rendszerhívások kiszolgálása közben.
A szubrutinok között van például olyan, amelyik kiolvassa a betöltés óta eltelt
időt nyilvántartó számlálót, egy másik az órajel-felbontású időzítéshez használ­ Felügyeleti időzítők
ható, vagy egy olyan, amelyik egyenesen az időzítőlapka egyik regiszterét olvas­
sa ki, hogy ezred m ásodperces felbontású időzítés is lehetséges legyen. Időzítők Néhány oldallal ezelőtt függőben hagytuk azt a kérdést, hogy a felhasználói pro­
beállítására és leállítására is vannak szubrutinok. Végül van egy olyan, amelyet a cesszusoknak hogyan biztosíthatunk felügyeleti időzítőket, amelyeket rendszerint
M INIX 3 leállításakor kell meghívni. Ez visszaállítja a hardveridőzítési értékeket úgy képzelünk el, mint a felhasználó által m egadott olyan eljárásokat, amelyek a
a BIOS igényei szerint. felhasználó program jának részei, és egy időzítő lejártakor hajtódnak végre. Az
világos, hogy ilyet a M INIX 3-ban nem lehet. Ellenben szinkron riasztás lehetsé­
ges, ezzel áthidalhatjuk a kernelszint és a felhasználói szint közötti szakadékot.
Az időzítőtaszk Most van itt az ideje, hogy elmagyarázzuk, mit értünk szinkron riasztás alatt.
Egy szignál bármikor érkezhet, illetve egy hagyományos felügyeleti időzítő bár­
Az időzítőtaszk csak egy fajta üzenetet fogad el, ez a H A R D JN T, amelyik a meg­ mikor aktivizálódhat, függetlenül attól, hogy a program melyik részén van éppen
szakításkezelőtől érkezik. M inden más hibát jelent. Továbbá ezt az üzenetet nem a vezérlés. Ezért mondjuk, hogy ezek aszinkron módon működnek. Egy szinkron
kapja meg minden órajel után, annak ellenére, hogy az üzenet vétele után meghí­ riasztás üzenetben érkezik, ezért csak akkor jut el a címzetthez, amikor az egy
vott szubrutin neve do_clocktick. Csak akkor érkezik üzenet, és ezért a do_clocktick receive-et hajt végre. Azért nevezzük szinkronnak, m ert csak akkor kerül a cím­
is csak akkor fut le, ha processzusütemezésre van szükség, vagy lejárt egy időzítő. zetthez, amikor az számít rá. H a az értesítéses (notify) módszert alkalmazzuk a ri­
asztásra, akkor a küldőnek nem kell blokkolódnia, a fogadónak pedig nem aggód­
nia azért, hogy lemarad a riasztásról. A notify üzenetet a rendszer eltárolja, ha a
Az időzítő megszakításkezelője címzett éppen nem arra várakozik. Egy bittérképet használ erre a célra, amelyben
minden bit egy lehetséges forrást jelöl.
A megszakításkezelő akkor aktivizálódik, amikor az időzítőlapka elszámol nul­ A felügyeleti időzítők a priv tábla m inden egyes elem ében megtalálható tim e r j
láig és megszakítást generál. Itt történik a legszükségesebb nyilvántartási fel­ típusú s jila r m jim e r mezőt használják. M inden rendszerprocesszushoz tartozik
adatok elvégzése. A M INIX 3-ban az idő nyilvántartása a 2.48.(c) ábra szerint egy bejegyzés a priv táblában. Egy felhasználói szinten futó rendszerprocesszus a
történik. A clockx-ben azonban csak a betöltés óta eltelt órajelek számlálóját sys_setalarm hívással állítja be az időzítőt; a hívást a rendszertaszk kezeli. A rend-
228 2. PROCESSZUSOK 2.8. A MINIX 3-IDŐZÍTŐTASZK 229

szertaszk a kernelbe van fordítva, ezért végre tudja hajtani az időzítő inicializá- nelszintről. Jelenleg ezt a függvényt csak arra használjuk, hogy a véletlenszám-
lását a hívó számára. A z inicializáció abból áll, hogy az időzítő lejártakor meghí­ generátor kezdőértéke is véletlenszerű legyen. Nagyon gyors számítógépen több
vandó eljárás címét a megfelelő m ezőben eltároljuk, majd az időzítőt felfűzzük az m indenre is lehetne használni, de ez egy jövőbeli projekt.
időzítők sorába, ahogy a 2.49. ábrán látható.
A végrehajtandó eljárásnak term észetesen a kernel címtartom ányában kell len­
nie. Ez nem jelent problém át. A rendszertaszkban van egy függvény erre a célra; Az időzítőszolgáltatások összefoglalása
ez a cause alarm, amely lefutásakor egy értesítést generál, ezzel szinkron riasztást
ad a felhasználónak. Ez a riasztás kiválthatja a felhasználói eljárás meghívását. A 2.50. ábra összefoglalja a clockx által közvetlenül vagy közvetetten nyújtott
A kernelen belül ez egy valódi felügyeleti időzítő eljárás, de a riasztást kérő pro­ különféle szolgáltatásokat. Sok PUBLIC-ként deklarált függvény van, amelyet a
cesszus számára egy szinkron riasztás. Ez nem ugyanaz, m intha az időzítő hívna kernel vagy a rendszertaszk közvetlenül hívhat. A többi szolgáltatás csak közvetet­
meg egy eljárást a kérő címtartományában. Egy kis többletmunkával jár, de egy­ ten áll rendelkezésre, rendszerhívások révén, amelyeket végül a rendszertaszk hajt
szerűbb, mint egy megszakítás. végre. A többi rendszerprocesszus fordulhat a rendszertaszkhoz közvetlenül, de a
Az előbb leírt módszer nem működik m inden felhasználói szintű processzus­ felhasználói processzusoknak kérést kell küldeniük a processzuskezelőhöz, amely
ra, csak a rendszerprocesszusokra. M inden rendszerprocesszusnak van egy saját szintén a rendszertaszkra támaszkodik.
példánya a priv struktúrából, de a felhasználói processzusok egyetlen példányon A kernel és a rendszertaszk lekérdezheti az indulás óta eltelt időt, vagy beál­
osztoznak. A struktúra nem megosztható részét, így a függőben lévő értesítések líthat/leállíthat időzítőt az üzenetküldéssel járó többletmunka nélkül. A kernel
bittérképét és az időzítőt a felhasználói processzusok nem használhatják. A meg­ és a rendszertaszk hívhatja a read_clock-ot is, amely az időzítőlapka számlálóját
oldás a következő: a processzuskezelő kezeli a felhasználói processzusok időzítőit olvassa ki; ezzel megközelítőleg 0,8 milliomod m ásodperces egységekben lehet az
ahhoz hasonlóan, ahogy a rendszertaszk teszi ezt a rendszerprocesszus számára. időt mérni. A clock_stop függvényt a M INIX 3 leállásakor kell hívni, visszaállít­
Minden processzusnak van egy tim e r j típusú mezője a processzustábla azon ré ­ ja a BlOS-időzítőértékeket. Egy rendszerprocesszus, akár eszközmeghajtó, akár
szében, amelyet a processzuskezelő tart nyilván. szerver, kérhet szinkron riasztást, aminek hatására egy kernelterületen lévő eljá­
Amikor egy felhasználói processzus az alarm rendszerhívással kezdeményezi rás aktivizálódik, és értesítést küld a kérelmező processzusnak. POSIX-riasztást a
egy időzítő beállítását, akkor a processzuskezelő fog eljárni az érdekében, beállít felhasználói processzusok a processzuskezelőtől kérnek, amely továbbítja a kérést
egy időzítőt, és elhelyezi a saját listájába. A processzuskezelő megkéri a rendszer­ a rendszertaszknak. Az időzítő lejártakor a rendszertaszk értesíti a processzuske­
taszkot, hogy küldjön neki értesítést, amikor a listában lévő első időzítő lejárt. A zelőt, az pedig szignált küld a felhasználói processzusnak.
processzuskezelőnek csak akkor kell segítséget kérnie, amikor az időzítőlistájának
legelső eleme megváltozik. Ez előfordulhat amiatt, m ert a legelső időzítő lejárt Szolgáltatás Elérés módja Válasz Kliensek
vagy törölték, vagy azért, m ert egy új riasztási kérelem m iatt új elem et kell beszúr­ get_uptime Függvényhívás Órajelek száma Kernel vagy rendszertaszk
ni az addigi első elé. A szabványos POSIX-rendszerhívást ezzel a módszerrel tá­ set_timer Függvényhívás Nincs Kernel vagy rendszertaszk
mogatja a M INIX 3. A végrehajtandó eljárás a processzuskezelő címtartom ányá­ reset_timer Függvényhívás Nincs Kernel vagy rendszertaszk
ban van. Am ikor aktivizálódik, akkor a riasztást kérő felhasználói processzusnak read_clock Függvényhívás Számláló Kernel vagy rendszertaszk
egy szignált küld, nem pedig értesítést. clock_stop Függvényhívás Nincs Kernel vagy rendszertaszk
Szinkron riasztás Rendszerhívás Értesítés Szerver vagy eszközmeghajtó,
a rendszertaszkon keresztül
Ezred másodperces időzítés POSIX-riasztás Rendszerhívás Szignál Felhasználói processzus, a
processzuskezelőn keresztül
A clockx-ben van egy eljárás, amely milliomod másodperc felbontású időzítést tesz Idő Rendszerhívás Üzenet Bármelyik processzus, a
lehetővé. Különböző I/O-eszközöknél szükség lehet akár néhány milliomod m á­ processzuskezelőn keresztül
sodperc rövidségű késleltetésekre is. Ezt a gyakorlatban a riasztások vagy az üze­
netküldési felület használatával nem lehet megoldani. Az időzítőmegszakítások 2.50. ábra. Az időzítőmeghajtó által nyújtott, idővel kapcsolatos szolgáltatások
generálásához használt számlálót közvetlenül is ki lehet olvasni. Megközelítőleg
0,8 milliomod m ásodpercenként csökken eggyel, m ásodpercenként 60-szor fut
le nulláig, vagyis 16,67 ezred m ásodpercenként. Ahhoz, hogy I/O-időzítéshez
felhasználható legyen, egy kernelszinten futó eljárásnak folyamatosan figyelnie
kellene, de sokat dolgoztunk azon, hogy az eszközmeghajtókat eltávolítsuk a ker­
230 2. PROCESSZUSOK 2.9. ÖSSZEFOGLALÁS 231

2.8.4. A MINIX 3-időzítőmeghajtó megvalósítása A clock_stop visszaállítja az időzítőlapkát az inicializálás előtti állapotba. D ek­
larációja PUBLIC, és a clockx-bői sehonnan sem hívjuk meg. A clockJnit-tel való
Az időzítőtaszk nem használ nagyobb adatstruktúrákat, ehelyett néhány változó­ egyértelmű kapcsolata miatt került ide. Csak a M INIX 3 leállásakor hívja meg a
ban követi nyomon az idő változását. A realtime változó (10462. sor) alapvető - ez rendszertaszk, mielőtt a betöltési felügyelőprogramnak visszaadná a vezérlést.
számlálja az órajeleket. Egy globális változó, a lostjicks, ag/o./z-ban van definiálva Ahogy (pontosabban 16,67 ezred másodperccel azután, hogy) az init_clock le­
(5333. sor). Ezt a változót m inden olyan kernelszinten futó függvény használhat­ futott, beérkezik az első időzítőmegszakítás, majd ezek m ásodpercenként 60-szor
ja, amely elég sokáig letiltja a megszakításokat ahhoz, hogy egy vagy több órajel ismétlődnek egészen addig, amíg a M INIX 3 fut. A clockJiandler (10556. sor)
elvesszen. Ezt a változót jelenleg csak az int86 függvény használja a klib386.s-bői. program ja valószínűleg többször fut, mint a M INIX 3-rendszer bármelyik másik
Az int86 a betöltési felügyelőprogramot használja arra, hogy a vezérlést átad­ része. Következésképpen a clock Jiandler esetében a sebesség áll m indenek felett.
ja a BlOS-nak, a felügyelőprogram pedig az ecx regiszterben visszaadja, hogy a Egyedül a 10586. sorban vannak szubrutinhívások. Csak akkor van rájuk szükség,
BlOS-hívás lefutásához hány órajelre volt szükség. Ez azért lehetséges, m ert bár a ha egy elavult IBM PS/2-es rendszeren futunk. Az (órajelekben m ért) aktuális idő
M INIX 3-időzítő megszakításkezelője nem működik a BlOS-hívás alatt, a betölté­ frissítése a 10589. és a 10591. sor között található. Ezután a felhasználói és a szám­
si felügyelőprogram nyilván tudja tartani az órajeleket a BIOS segítségével. lázási idők kerülnek frissítésre.
Az időzítőmeghajtó több más globális változót is használ, többek között a proc_ A kezelő tervezésekor megkérdőjelezhető döntések születtek. A 10610. sorban
pír, prev_ptr és a bili_ptr m utatókat, hogy hozzáférjen az általuk azonosított pro­ két ellenőrzést végzünk, és ha bármelyik feltétel teljesül, akkor az időzítőtaszknak
cesszusok processzustábla-bejegyzéseihez. Ezekben a bejegyzésekben több mező­ értesítést küldünk. Az időzítőtaszk által hívott do_clockticks függvény megismétli
höz is hozzányúl; ezek között van a p_user_time és a p j y s j i m e az elszámoláshoz, mindkét ellenőrzést, hogy eldöntse, mit kell tennie. Erre azért van szükség, m ert a
valamint a p j l c k s j e f t az időszeletből megmaradt idő nyilvántartásához. kezelő által használt notify híváson keresztül nem adhatunk át semmilyen többlet-
A M INIX 3 indulásakor m inden eszközmeghajtó meghívásra kerül. Ezek információt, ami alapján a két esetet meg lehetne különböztetni. Az olvasót arra
legtöbbje végrehajt némi inicializációt, majd üzenetre várva blokkolódik. Az biztatjuk, hogy fontoljon meg egyéb alternatívákat és ezek kiértékelésének lehet­
időzítőmeghajtó, a clo ckja sk (10468. sor) is így tesz. Először meghívja az init_ séges módját.
clock-ot, hogy 60 Hz-re inicializálja a program ozható óra frekvenciáját. Amikor A clockx m aradék része a m ár em lített kisegítőfüggvényeket tartalmazza.
üzenetet kap, akkor meghívja a do_clocktick függvényt, ha az üzenet H ARD IN T A getjiptim e (10620. sor) egyszerűen a realtime értékét adja vissza, ami csak a
(10486. sor) volt. Másfajta üzenetre nincs felkészülve, azokat hibaként kezeli. clockx függvényei számára látható. A se tjim er és a resetjim er a könyvtár más
A do_clocktick (10497. sor) nem hívódik meg m inden egyes órajelre, tehát a ne­ függvényeit használja, amelyek elrejtik az időzítőlisták kezelésének részleteit. V é­
ve nem adja pontos leírását a funkciójának. Csak akkor kerül meghívásra, ha a gül a read_clock kiolvassa és visszaadja az időzítőlapka számlálóregiszterében lévő
megszakításkezelő szerint valamilyen fontos tevékenységet kell elvégezni. aktuális értéket.
A do_clocktick (10497. sor) futását eredményezheti az, ha az éppen futó pro­
cesszusnak letelt az időszelete. H a a processzus megszakítható (a rendszertaszk
és az időzítőtaszk nem az), akkor először meghívja a lock_dequeue-1, majd rögtön
utána a lock_enqueue-1 (10510-10512. sor), aminek az a hatása, hogy a procesz- 2.9. Összefoglalás
szust leveszi az ütemezési sor elejéről, majd futtathatóvá teszi és újraütemezi.
A do_clocktick aktiválását eredményezi még az is, ha letelik egy felügyeleti időzí­ A megszakítások elfedésére az operációs rendszerek a párhuzam osan futó szek­
tő. Időzítők és időzítők láncolt listái olyan sokszor fordulnak elő a M INIX 3-ban, venciális processzusok modelljét alkalmazzák. A processzusok különféle procesz-
hogy kisegítőfüggvényeikből egy könyvtárat hoztunk létre. Ezek közül a 10517. szusok közötti kommunikációs mechanizmusok segítségével kommunikálhatnak
sorban hívott tmrs_exptimers meghívja a lejárt időzítőkhöz tartozó eljárásokat és egymással, mint például szemaforok, monitorok vagy üzenetek. Ezeket arra hasz­
deaktiválja őket. náljuk, hogy két processzus soha ne legyen egyszerre a kritikus szakaszában. Egy
Az init_clock (10529. sor) csak egyszer hívódik meg, amikor az időzítőtaszk el­ processzus lehet futó, futásra kész vagy blokkolt állapotban, és akkor kerülhet át
indul. Sok olyan pont van, amire rám utathatunk, és azt mondhatjuk: „Itt kezd el egyik állapotból a másikba, ha önmaga vagy egy másik processzus végrehajt egy
futni a M INIX 3.” Ez a pont is esélyes jelölt; hiszen az időzítő alapvető fontosságú kommunikációs alapműveletet.
egy megszakítható ütemezéses többfeladatos rendszerben. Az init_clock három A processzusok közötti kommunikációs alapműveletek olyan problém ák meg­
bájtot ír ki az időzítőlapkára, amivel beállítja az üzemmódot és a megfelelő értéket oldására használhatók, mint például a gyártó-fogyasztó, az étkező filozófusok vagy
az elsődleges regiszterbe. Ezután bejegyezteti a processzusszámát, IRQ-szám át és az olvasók és írók. Még ezek használata esetén is óvatosnak kell lennünk, hogy el­
a kezelő címét, hogy a megszakítások a megfelelő helyre érkezzenek. Végül enge­ kerüljük a hibákat és holtponti helyzeteket. Számos ütemezési algoritmus ismert,
délyezi a megszakításvezérlő lapkát, és elkezdi fogadni a megszakításokat.
232 2. PROCESSZUSOK FELADATOK 233

például round robin, prioritásos, többszintű várakozósoros, illetve elv által vezé­ A kernel tárgykódú állománya tartalm az egy rendszertaszkot, amely lehető­
relt ütemezők. vé teszi, hogy a felhasználói szintű processzusok kommunikáljanak a kernellel.
A M INIX 3 támogatja a processzusmodellt, és üzeneteket használ a processzu­ Támogatja az eszközmeghajtókat és a szervereket azáltal, hogy számukra privi­
sok közötti kommunikációra. Az üzeneteket nem puffereljük, így a send csak akkor legizált műveleteket hajt végre. A M INIX 3-ban az időzítőtaszk is a kernelbe van
sikeres, ha a fogadó m ár várakozik az üzenetre. Hasonlóan, a récéivé csak akkor si­ fordítva. Nem a hagyományos értelem ben vett eszközmeghajtó. A felhasználói
keres, ha egy üzenet m ár rendelkezésre áll. H a bármelyik művelet nem sikeres, ak­ szintű processzusok nem érhetik el az időzítőt eszközként.
kor a hívó processzus blokkolódik. A M INIX 3 az üzenetek mellett a nem blokkoló
notify alapműveletet is támogatja. H a olyan címzettnek akarunk értesítést küldeni,
amely éppen nem várakozik üzenetre, akkor ez egy bit beállítását eredményezi,
aminek hatására a legközelebbi récéivé az értesítést kézbesíti a fogadónak. Feladatok
Az üzenetek kezelésének illusztrálására tekintsünk egy felhasználót, aki read
műveletet akar végezni. A felhasználói processzus üzenetet küld a fájlrendszer­ 1. A m ultiprogramozás m iért központi jelentőségű egy m odern operációs rend­
nek, kérve az adatokat. H a az adatok nincsenek a fájlrendszer gyorsítótárában, szer működéséhez?
akkor a fájlrendszer kérést küld a lemezt kezelő eszközmeghajtónak, hogy olvassa 2. Melyik három fő állapotban lehet egy processzus? írja körül röviden m ind­
be a lemezről. Ezután a fájlrendszer blokkolódik és vár az adatokra. A lemezmeg­ egyiket.
szakítás beérkezésekor a rendszertaszk értesítést kap, így válaszolni tud a lemez­ 3. Tételezzük fel, hogy egy olyan fejlett számítógép-architektúrát kell tervez­
egység eszközmeghajtójának, az pedig válaszol a fájlrendszernek. Ezen a ponton a nie, amelyben a processzusváltást megszakítások helyett a hardver végezné.
fájlrendszer kéri a rendszertaszkot, hogy a gyorsítótárából az újonnan beolvasott Milyen információra lenne szüksége a CPU-nak? Vázolja fel, hogyan m űköd­
adatblokkot másolja át a felhasználóhoz. Ezeket a lépéseket a 2.46. ábrán szem­ hetne a hardver-processzusváltás.
léltettük. 4. A megszakításkezelő rutinok m inden mai számítógépen legalább részben
Megszakítás után processzusváltás következhet be. H a egy processzus futása assembly nyelven vannak írva. M iért?
megszakad, akkor egy verem jön létre a hozzá tartozó processzustábla-bejegy- 5. Rajzolja újra a 2.2. ábrát úgy, hogy hozzáad két új állapotot: Új és Befejezett.
zésben, és a folytatásához szükséges m inden információ ebbe a verembe kerül. Egy processzus létrehozásakor az Új állapotba kerül. Amikor kilép, akkor a
Bármelyik processzust újra futtatható állapotba lehet hozni, ha a verem m utatót a Befejezett állapotba kerül.
processzustábla bejegyzésére állítjuk, újratöltjük a regisztereket, majd végrehaj­ 6 . A könyvben azt állítottuk, hogy a 2.6.(a) ábrán látható modell nem megfelelő
tunk egy iretd utasítást. Azt az ütem ező dönti el, hogy melyik processzustábla-be- gyorsítótárral ellátott fájlszerver számára. M iért nem? Lehetne minden pro­
jegyzés címe kerül a veremmutatóba. cesszusnak saját gyorsítótára?
A kernel futása közben nem történhetnek megszakítások. A kernel futása köz­ 7. Mi az alapvető különbség processzus és szál között?
ben bekövetkezett kivétel a processzustáblában lévő helyett a kernelverm et hasz­ 8. Egy szálakat használó rendszerben a szálaknak is külön vermük van, vagy csak
nálja. Megszakítás kiszolgálása után egy processzus futhat tovább. a processzusoknak? Indokolja meg a választ.
A M INIX 3 ütemezési algoritmusa prioritásos várakozási sorokat használ. A 9. Mi az a versenyhelyzet?
rendszerprocesszusok általában a legmagasabb prioritású sorokban futnak, a fel­ 10. Adjon példát versenyhelyzetre, ami akkor léphet fel, ha két együtt utazó em ­
használói processzusok pedig az alacsonyabb prioritású sorokban, de a prioritá­ ber számára akarunk repülőjegyet venni.
sok egyedileg kerülnek kiosztásra. Egy hosszú ciklusban bennragadt processzus 11. írjon egy olyan parancsértelm ező program ot, amely egy számsort tartalmazó
prioritása ideiglenesen csökkenhet, de visszakerülhet az eredeti helyére, ha más állomány utolsó elem ét kiolvassa, hozzáad egyet, majd az így kapott számot
processzusok is lehetőséget kaptak a futásra. A nice paranccsal bizonyos keretek az állomány végéhez hozzáfűzi. Futtassa a program egy példányát a háttér­
között megváltoztatható a processzusok prioritása. A processzusok round robin ben, egyet pedig az előtérben, miközben mind a kettő ugyanazt az állományt
módszerrel követik egymást, alkalmanként mindegyik egy időszeletet kap, amely­ próbálja módosítani. Mennyi idő kell ahhoz, hogy versenyhelyzet jelei m utat­
nek hossza függhet a processzustól. H a egy processzus blokkolódás után újra fut­ kozzanak? Hol van a kritikus szakasz? M ódosítsa a program ot úgy, hogy meg­
tatható állapotba kerül, akkor az időszeletének m aradék részével a sora elejére szűnjön a versenyhelyzet. (Tanács: használja az
kerül vissza. E nnek az a célja, hogy az I/O-műveleteket végző processzusok gyor­
sabban tudjanak reagálni. Az eszközmeghajtók és a szerverek hosszú időszeletet In file file.lock
kapnak, m ert várhatóan úgyis blokkolódásig futnak. Azonban még a rendszerpro­
cesszusok is megszakíthatok, ha túl hosszú ideig futnak. utasítást az adatállomány zárolásához.)
234 2. PROCESSZUSOK FELADATOK 235

12. Hatékony módja-e a zárolásnak az 21. M iért rendeljük az étkező filozófusok megoldásában (lásd 2.20. ábra) a take_
forks eljárásban az állapotváltozóhoz a H U N G R Y értéket?
In file file.lock 22. Tekintsük a 2.20. ábra p u tjo r k s eljárását. Tegyük fel, hogy a state[i] változó a
THINKING értéket a két test hívás után kapja meg, nem előtte. Hogy változtat­
módszer az előző példában szereplő program hoz hasonló helyzetekben? ná ez meg a megoldást 3 filozófus esetén? 100 filozófus esetén?
M iért, vagy miért nem? 23. Az olvasók és írók problém a sokféleképpen megfogalmazható attól függően,
13. M űködik-e a tűm változót használó tevékeny várakozásos megoldás (lásd 2.10. hogy melyik processzuscsoport mikor indítható. írja le körültekintően a prob­
ábra), ha a két processzus egy közös memóriás többprocesszoros rendszeren léma három változatát, mindegyikben kitüntetett (vagy alárendelt) szerepet
fut, azaz két CPU van, és közös memória. szánva az egyik csoportnak. Minden variáns esetén adja meg, hogy mi tö rté­
14. Tekintsünk egy olyan gépet, amelynek nincs TEST AND SET LOCK utasítá­ nik, amikor egy olvasó vagy egy író kész hozzáférni az adatbázishoz, illetve
sa, de van egy olyan utasítása, amely egy oszthatatlan művelettel megcseréli amikor nem akarja tovább használni az adatbázist.
egy regiszter és egy memóriaszó tartalm át. Használható-e ez a 2.12. ábrán lát­ 24. A CDC 6600 számítógép egyszerre maximum 10 I/O-processzust volt képes
ható enter_region rutin megvalósítására? kezelni egy érdekes, ún. processzormegosztásos round robin ütemezéssel.
15. Vázolja fel, hogyan tudná a szemaforokat megvalósítani egy, a megszakításo­ M inden utasítás után processzusváltás történt, így az első végrehajtott utasí­
kat letiltani képes operációs rendszer. tás az első processzusé volt, a második utasítás a második processzusé, és így
16. Mutassa meg, hogyan lehet megvalósítani bináris szemaforok és közönséges tovább. A processzusváltást speciális hardver végezte, ez nem jelentett több­
gépi utasítások felhasználásával az egész értékű szemaforokat (vagyis olyan letterhelést. H a egy processzusnak T m ásodpercre volna szüksége a lefutáshoz
szemaforokat, amelyek tetszőlegesen nagy értéket tárolnak). versenytársak hiányában, mennyi időre volna szüksége processzormegosztást
17. A 2.2.4. alfejezetben leírtunk egy szituációt, amelyben egy magas prioritású alkalmazva, n processzus jelenlétével?
H processzus és egy alacsony prioritású L processzus szerepelt, és az események 25. A round robin ütemezők általában egy listában tartják nyilván a futtatható pro­
oda vezettek, hogy H végtelen ciklusban tartotta a processzort. Ugyanebbe a cesszusokat; minden processzus pontosan egyszer fordul elő a listában. Mi
problém ába ütköznénk-e, ha a prioritásos helyett round robin ütemezést hasz­ történne, ha egy processzus kétszer is benne lenne a listában? El tud képzelni
nálnánk? Indokolja meg a választ. olyan okot, am iért ezt érdem es lenne megengedni?
18. A m onitorokban az állapotváltozók és két speciális művelet, a WAIT és a 26. Egy bizonyos rendszerben végzett m érések azt m utatták, hogy egy átlagos pro­
SIGNAL szolgál a szinkronizáció megvalósítására. Általánosabb megoldás cesszus T ideig fut, m ielőtt egy I/O-művelet miatt blokkolódna. Egy procesz-
lenne egyetlen W AITUNTIL művelet bevezetése, amelynek tetszőleges logi­ szusváltás S időegységet igényel; ez tulajdonképpen veszteség. Egy Q időegy­
kai kifejezés lehetne a param étere. így például írhatnánk, hogy séget használó round robin ütemezés esetén adja meg képlettel a CPU haté­
konyságát az alábbi esetekben:
W AITUNTIL x < 0 or y + z < n (a) Q = °°
(b ) Q > T
A SIGNAL műveletre sem lenne szükség. Ez a séma egyértelműen általáno­ (c ) S < Q < T
sabb, mint a H oare és Brinch Hansen-féle megoldás, de mégse használják. (d ) Q = S
M iért nem? (Tanács: gondoljon a megvalósításra.) (e) Q majdnem 0
19. Egy gyorsétkezdének négyféle alkalmazottja van: (1) rendelésfelvevő, aki a
vendégek rendelését felveszi; (2) szakács, aki elkészíti az ételeket; (3) csoma­ 27. Ö t program vár futásra. Becsült futásidejűk 9, 6, 3, 5 és X. Milyen sorrendben
goló szakember, aki az ételeket becsomagolja és (4) pénztáros, aki a csoma­ kell őket végrehajtani, hogy az átlagos válaszidő a legkisebb legyen? (A válasz
gokat a vendégeknek adja és beszedi a pénzt. Minden alkalmazott egy kom­ fü g g ő tő l.)
munikáló szekvenciális processzusnak tekinthető. Milyen kommunikációt al­ 28. Öt kötegelt program (^4-tól E- ig) érkezik a számítóközpontba szinte teljesen
kalmaznak ezek az alkalmazottak? Hasonlítsa össze ezt a modellt a M INIX 3 egy időben. Becsült futásidejűk 10, 6, 2, 4 és 8 perc. Az előre megállapított
processzusaival. prioritásaik sorrendben 3, 5, 2, 1 és 4. A legnagyobb prioritás az 5. Az alábbi
20. Tegyük fel, hogy van egy üzenetküldéses, postaládákat használó rendszerünk. ütemezési algoritmusok mindegyikére állapítsa meg az átlagos áthaladási időt.
A processzusok nem blokkolódnak, ha egy tele ládába küldenek, vagy egy (a) round robin
üresből akarnak üzenetet kivenni. Ehelyett egy hibakódot kapnak vissza. A (b) prioritásos
processzusok a hibakódra úgy reagálnak, hogy újra és újra próbálkoznak, amíg (c) érkezési sorrendben (most 10, 6, 2, 4, 8)
a művelet sikeres nem lesz. Vezethet-e ez a séma versenyhelyzetekhez? (d) legrövidebb feladat először
236 2. PROCESSZUSOK FELADATOK 237

Az (a) esetben tételezzük fel, hogy a rendszer multiprogramozott, és minden egy pávián át akar kelni, körül kell néznie, hogy nem jön-e szembe egy társa,
program egyenlően részesedik a CPU idejéből. A (b), (c) és (d) esetben téte­ írjon egy olyan, szemaforokat használó program ot, amely elkerüli a holtponti
lezzük fel, hogy egyszerre csak egy program fut, de az addig, amíg befejeződik. helyzeteket. Ne törődjön azzal, hogy kelet felé haladó páviánok akármeddig
M inden program csak a CPU -t használja. feltarthatják a nyugat felé menőket.
29. Egy CTSS-en futó processzusnak 30 időszeletre van szüksége a lefutáshoz. 42. Az előző feladat megoldását egészítse ki az éhezés elkerülésével. H a egy kelet
Hányszor kell behozni lemezről, beleszámítva a legelsőt (m ielőtt még elindult felé haladó pávián lát egy nyugat felé haladót a kötélen, akkor megvárja, míg
volna)? az átér, de újabb nyugat felé haladó pávián nem kezdhet el mászni, amíg leg­
30. Az a = 1/2 param éteres öregedési algoritmust használjuk a futási idők meg­ alább egy át nem jött az ellenkező irányba.
becsülésére. Az előző négy futás, a legrégebbivel kezdve 40, 20, 40 és 15 ms. 43. Oldja meg az étkező filozófusok problém át szemaforok helyett monitorokkal.
Mennyi a becslés a következő futásra? 44. Egészítse ki a M INIX 3-kernelt egy olyan programrésszel, amely számolja,
31. A 2.25. ábrán láthattuk, hogy a háromszintű ütemezés hogyan működik köte­ hogy hány üzenetet küld az i processzus (vagy taszk) a j processzusnak (vagy
gelt rendszerben. Lehetne ezt az ötletet alkalmazni olyan interaktív rendszer­ taszknak). Az f4 billentyű lenyomására nyomtassa ki ezt a mátrixot.
ben, ahol nem érkeznek új feladatok? Hogyan? 45. M ódosítsa a M INIX 3-ütemezőt úgy, hogy az tartsa nyilván, melyik felhasz­
32. Tegyük fel, hogy a 2.28.(a) ábrán látható szálak ebben a sorrendben futnak: nálói processzus mennyi CPU-időt kapott legutóbb. Am ikor nincs futtatható
egy az^l-ból, egy a fí-ből, egy az^l-ból, egy a 5-ből stb. Hány lehetséges szálso­ taszk vagy szerver, válassza azt a felhasználói processzust, amely legutóbb a
rozat van az első négy ütemezési eseményig? legkevesebb időt kapta.
33. Egy toleráns valós idejű rendszernek négy periodikus eseményt kell kezelnie, 46. Módosítsa a M INIX 3-at úgy, hogy minden processzus be tudja állítani a gyer­
a periódusuk 35, 20, 10 és x ms CPU-idő. M ekkora az x legnagyobb értéke, mekei prioritását egy új rendszerhívással. A rendszerhívás neve legyen setpriority,
amelyre a rendszer még beütem ezhető? két param étere pedig a gyermekprocesszus azonosítója és kívánt prioritása.
34. Futás közben a M INIX 3 egy változót (proc_ptr) használ arra, hogy a futó pro­ 47. Módosítsa a hw intjnaster és h w in tjla ve m akrókat az mpx386.s állomány­
cesszushoz tartozó processzustábla-bejegyzésre mutasson. M iért? ban úgy, hogy a savé függvény utasításait a hívás helyére soronként beilleszti.
35. A M INIX 3 nem puffereli az üzeneteket. Magyarázza meg, milyen problém á­ Mennyivel növekedett meg a program kód m érete? Ki tud-e m utatni teljesít­
kat okoz ez a tervezési elv az időzítő- és a billentyűzetmegszakítások esetén. ménynövekedést?
36. Amikor a M INIX 3-ban egy üzenetet küldünk egy alvó processzusnak, a ready 48. Futtassa le a sysenv parancsot a saj át M INIX 3-rendszerén, és magyarázza el, hogy
eljárás a processzust a megfelelő ütemezési sorba teszi. Ez az eljárás a megsza­ mit jelentenek az egyes tételek. H a nincs hozzáférése M INIX 3-rendszerhez,
kítások letiltásával kezdődik. Miért? akkor a 2.37. ábra tételeit magyarázza el.
37. A m in ije c M INIX 3-eljárás egy ciklust tartalm az. M ire szolgál ez? 49. A processzustábla inicializálásának tárgyalása közben említettük, hogy egyes
38. A M INIX 3 alapjában véve a 2.43. ábrán látható ütemezési módszert alkal­ C fordítóprogram ok valamivel jobb kódot generálnak akkor, ha egy konstanst
mazza úgy, hogy az egyes osztályoknak különböző a prioritása. A legalsó osz­ a tömbhöz adunk hozzá, nem az indexhez. írjon néhány rövid C program ot en­
tály (felhasználói processzusok) round robin ütem ezést használ, de a taszkok nek a hipotézisnek az ellenőrzésére.
és a szerverek blokkolásig futhatnak. Lehetséges-e, hogy a legalsó osztály pro­ 50. Módosítsa a M INIX 3-at úgy, hogy statisztikákat gyűjtsön arról, hogy ki kinek
cesszusai éhezzenek? Miért, vagy m iért nem? küld üzenetet. írjon egy program ot, amely összegyűjti és használható form á­
39. Alkalmas-e a M INIX 3 valós idejű alkalmazásokhoz, mint például az adatgyűj­ ban kinyomtatja a statisztikákat.
tés. H a nem, hogyan lehetne erre alkalmassá tenni?
40. Tegyük fel, hogy van egy szemaforokat tám ogató operációs rendszerünk.
Valósítson meg egy üzenetküldéses rendszert. írjon az üzenetek küldésére és
fogadására szolgáló eljárásokat.
41. Egy hallgató, akinek főszaka az antropológia, mellékszaka pedig a számító-
gép-tudomány, olyan kutatásba kezdett, amely azt hivatott vizsgálni, vajon az
afrikai páviánoknak meg lehet-e tanítani a holtpont fogalmát. Keres egy mély
kanyont, és kifeszít fölé egy kötelet, így a páviánok függeszkedve át tudnak ju t­
ni. Egyszerre több pávián is át tud menni, feltéve, hogy ugyanabba az irányba
mennek. H a kelet felé haladó és nyugat felé haladó páviánok kerülnek egy­
szerre a kötélre, akkor holtpont alakul ki (a páviánok beragadnak középen),
m ert nem tud egyik a másikon átjutni, miközben lógnak a kanyon fölött. H a
3.1. AZ l/O-HARDVER ALAPJAI 239

A programozók nézik a szoftver kapcsolódási felületeit - a parancsokat, am e­


3. Bevitel/kivitel lyeket a hardver elfogad, a függvényeket, amelyeket végrehajt, és a hibákat, am e­
lyeket visszajelezhet. Ebben a könyvben az I/O-eszközök programozásával foglal­
kozunk, nem a tervezésükkel, felépítésükkel vagy karbantartásukkal, vagyis érdek­
lődésünk a hardver program ozására terjed ki, és nem érdekel bennünket a belső
működésük. Mindazonáltal, sok I/O-eszköz programozása gyakran burkoltan kap­
csolódik a belső működéséhez. A következő három szakaszban röviden kitérünk
az I/O-hardver általános hátterére, mivel ez kapcsolódik a programozásukhoz.

3.1.1. I/O-eszközök

Az I/O-eszközöket nagyjából két csoportba sorolhatjuk: blokkos eszközök és


Az operációs rendszer fő feladatai közül az egyik az I/O- (Input/O utput - bevitel/ karakteres eszközök. Blokkos eszközön olyan eszközt értünk, amely az informá­
kivitel) eszközök vezérlése. Az eszközök felé parancsokat kell kiadnia, kezelnie ciót adott m éretű blokkokban tárolja, mindegyiket saját címmel. A szokásos
kell a megszakítási kéréseket és a hibákat. Továbbá gondoskodnia kell az eszkö­ blokkm éret tartom ánya 512 bájt és 32768 bájt között van. A blokkos eszközök lé­
zök és a rendszer többi része közötti kapcsolódási felületről, amelynek egysze­ nyeges tulajdonsága, hogy az egyes blokkok írhatók és olvashatók az összes többi
rűnek és könnyen használhatónak kell lennie. A lehetőségek bővítése miatt, az blokktól függetlenül. A leggyakrabban használt blokkos eszköz a lemez.
eszközök közötti kapcsolatok megvalósítására egységes módszert kell biztosítania H a alaposabban megnézzük a határt a blokkonként címezhető, és az így nem cí­
(eszközfüggetlen kapcsolat). A teljes operációs rendszernek egy jelentős hányadát mezhető eszközök között, akkor láthatjuk, hogy ez nem egy jól definiált fogalom.
az I/O-kód teszi ki. Az operációs rendszer m egértéséhez szükséges az I/O m űkö­ Mindenki egyetért abban, hogy a lemez egy blokkonként címezhető eszköz, mivel
désének megismerése. Ennek a fejezetnek a tárgya, hogy miként tám ogatja az nem jelent problém át az olvasófej pillanatnyi helyzete, mindig lehetséges egy m á­
operációs rendszer az I/O-feladatok megoldását. sik cilinder keresése, majd annak kivárása, hogy a kért blokk a fej alá forduljon.
A fejezet felépítése a következő. Először néhány olyan elvet tekintünk át, ame­ M ost tekintsünk egy szalagmeghajtó egységet, amellyel biztonsági másolatot ké­
lyek szerint az I/O-hardver szervezve van. Ezt követően az I/O-szoftvert tárgyaljuk szíthetünk a lemezről. A szalagok blokkok sorozatából állnak. H a a szalagmeghaj­
általánosan. Az I/O-szoftver rétegekre bontható, amelyek mindegyike egy-egy jól tó egység kap egy olvasási parancsot az iV-edik blokkra vonatkozóan, akkor elő­
definiált feladatot lát el. Ezeket a rétegeket abból a szempontból vizsgáljuk, hogy ször mindig visszacsévéli a szalagot az elejére, és utána mozgatja előre az A'-edik
mit tesznek, és hogyan illeszkednek egymáshoz. blokkig. Ez a művelet a lemezen való kereséssel analóg, de annál sokkal hosszabb
A következő rész a holtpont problémával foglalkozik. Ebben definiáljuk a holt­ időt igényel. Szintén kérdéses, hogy egy szalag belső blokkjának újraírására van-e
pont pontos fogalmát, megmutatjuk, hogyan állhat elő ez a probléma, adunk két lehetőség, vagy sem. Még ha lehetséges lenne is a szalagot véletlen elérésű blok­
módszert elemzésére, és megvizsgálunk néhány algoritmust, amelyek alkalmazá­ kos eszközként használni, az iménti problém a megoldása ennél többet kíván: ha­
sával megelőzhetők ennek a problém ának az előfordulásai. gyományosan nem használható ily módon.
Ezután rátérünk a M INIX 3 vizsgálatára. Majd madártávlatból vetünk egy pil­ Az I/O-eszközök másik típusát a karakteres eszközök alkotják. Egy karakteres
lantást a M INIX 3 I/O részére, beleértve a megszakításokat, az eszközvezérlőket, eszköz vagy kibocsátja, vagy fogadja a karakterek sorozatát anélkül, hogy figyelem­
az eszközfüggő és az eszközfüggetlen I/O-t. A bevezetésnek megfelelően számos be venne bármilyen blokkszerkezetet. Az ilyen eszköz nem címezhető, és a kere­
I/O-eszközzel részletesen foglalkozunk: lemezek, billentyűzetek, megjelenítők. sési műveletet sem tudja végrehajtani. Nyomtatók, hálózati csatlakozási felületek,
Mindegyik eszköznél megnézzük a hardvert és a szoftvert. egerek (rám utatásra), digitalizáló táblák (pszichológiai laborkísérleteknél) és a
legtöbb egyéb eszköz, amely nem lemez jellegű, karakteres eszköznek tekinthető.
Ez az osztályozási séma nem igazán jó. Bizonyos eszközök nem illeszkednek
egyik osztályba sem. Például az órák nem címezhetők blokkonként. Nem generál­
3.1. Az l/O-hardver alapjai nak, nem fogadnak karaktersorozatot. Mindössze annyit tesznek, hogy jól meg­
határozott időintervallumonként megszakításokat hoznak létre. Mégis, a blokkos
Az egyes em berek más-más m ódon nézik az I/O-hardvert. A villamosmérnökök és karakteres eszközök modellje elég általános ahhoz, hogy az operációs rendszer
a hardvert a fizikailag m egtestesítő lapkák, vezetékek, erőforrások, m otorok és I/O-eszközfüggetlen szoftverjei közül néhánynak alapul szolgáljon. Például a fájl-
egyéb fizikai kom ponensek szempontjából látják.
240 3. BEVITEL/KIVITEL 3.1. AZ l/O-HARDVER ALAPJAI 241

Eszköz Adatátviteli sebesség Monitor Merevlemez­


10 bájt/s USB meghajtó
Billentyűzet Billentyűzet CD-ROM egység
Egér 100 bájt/s
s
56 K modem 7 KB/s s\
á □□□□□
Szkenner 400 KB/s
Digitális videokamera 4 MB/s
52x CD-ROM 8MB/S
FireWire (IEEE 1394) 50 MB/s Video- Billentyűzet­ USB- Merev­
CPU Memória lemez-
USB 2.0 60 MB/s vezérlő vezérlő vezérlő
vezérlő
XGA monitor 60 MB/s
SONET OC-12 hálózat 78 MB/s
Gigabit Ethernet 125 MB/s
Soros ATA merevlemez 200 MB/s Sín
SCSI Ultrawide 4 merevlemez 320 MB/s
528 MB/s 3.2. ábra. A CPU, a memória, a vezérlők és az l/O-eszközök összekapcsolásának egy modellje
PCI-sín

3.1. ábra. Néhány gyakori eszköz, hálózat és sín adatátviteli sebessége sín modellt alkalmazza a CPU és a vezérlők közötti kapcsolat megvalósításánál.
A nagygépek gyakran más modellt használnak, speciális I/O-számítógépekkel;
rendszer absztrakt blokkos eszközökkel foglalkozik, és az eszközfüggő részt ala­ ezeket I/O-csatornáknak nevezik, amelyek átveszik a központi CPU-tól az átvitel­
csonyabb szintű szoftverekre hagyja, az ún. eszközmeghajtókra (device driver). lel kapcsolatos feladatok egy részét.
Az I/O-eszközök sebességi tartom ánya meglehetősen nagy, ami a szoftverek A vezérlő és az eszköz közötti kapcsolódási felület gyakran alacsony szintű.
számára tekintélyes nehézséget okoz, mivel jelentősen különböző adatátviteli se­ Egy lemezt például lehet olyan form átum úra hozni, amelyben az 512 bájtos pálya
bességnél kell jól működniük. A 3.1. ábra néhány közismert eszköz adatátviteli se­ 16 szektorra bontott. Az, amit valójában a meghajtó egység létrehoz, egy bitsoro­
bességét mutatja. Az idő múlásával az eszközök legtöbbje egyre gyorsabb. zat, amely egy fejléccel kezdődik, utána egy 4096 bites szektor van, és végül egy el­
lenőrző összeg, amit hibajavító kódnak (Error-Correcting Code, ECC) neveznek.
A fejléc a lemez formázása során kap értéket: tartalmazza a pályák és szektorok
3.1.2. Eszközvezérlők számát, a szektor m éretét és hasonló adatokat.
A vezérlő feladata, hogy a bitsorozatot bájtokból álló blokkokba konvertálja
Az I/O-egységek tipikusan mechanikus és elektromos összetevőkből épülnek fel. és a szükséges hibajavításokat is elvégezze. Egy bájtokból álló blokk rendszerint
Gyakran lehetőség van arra, hogy a két részt különválasszuk, és ezzel egy modulári- először bitenként össze van gyűjtve a vezérlő egy belső pufferében. A m emóriába
sabb és általánosabb jellegű leírást adjunk. Az elektromos komponenst, eszközvezér­ másolás csak akkor hajtódik végre, ha a vezérlő m ár megvizsgálta a hibajavító kód
lőnek vagy adapternek nevezik. A személyi számítógépeknél ez gyakran egy nyom­ helyességét, és a kijelölt blokk is hibátlan.
tatott áramköri lap alakjában jelenik meg, amely behelyezhető a bővítő nyílásba. A Egy monitorvezérlő úgy dolgozik, mint egy m eglehetősen alacsony szintű bit­
mechanikus komponens maga az eszköz. A 3.2. ábra mutatja ezt az elrendezést. szervezésű eszköz. A memóriából olvassa a megjelenítendő karaktereket tartal­
A vezérlőkártyán rendszerint van egy csatlakozó, amely kábellel felcsatolha­ mazó bájtokat, és jeleket generál, amelyek módosítják a CRT sugárnyalábját. A
tó az eszközhöz. Sok vezérlő kettő, négy vagy akár nyolc azonos eszközt is képes vezérlő olyan jelzést is létrehoz, amely a CRT sugárnyalábját úgy irányítja, hogy
irányítani. H a a vezérlő és az eszköz között szabványos kapcsolódási felület van, egy teljes sor beolvasása után horizontálisan visszatér, és hasonlóan egy teljes kép­
akár egy hivatalos ANSI, IE E E vagy ISO szabvány, akár valamilyen más, akkor a ernyő beolvasása után a sugár vertikális visszatérését idézi elő. Az LCD képernyő­
gyártó cégek a kapcsolódási felülethez illeszkedő vezérlőket és eszközöket tud­ nél ezek a jelek képpontokat választanak ki, és szabályozzák a fényerőt, így szimu­
nak készíteni. Például sok társaság gyárt lemezmeghajtó egységeket, amelyek az lálva a CRT elektron-sugárnyaláb hatását. H a ez nem így lenne a videovezérlőnél,
IDE (Integrated Drive Electronics - integrált meghajtóelektronika) vagy az SCSI akkor az operációs rendszer program ozójának kellene programoznia a tényleges
(Small Computer System Interface) kapcsolódási felülethez illeszthetők. képletapogatást. Az operációs rendszer néhány param éterrel beállításokat hajt
Megjegyezzük, hogy a vezérlő és az eszköz közötti megkülönböztetést azért végre a vezérlővel kapcsolatosan, olyanokat, mint a képernyő soraiban a karakte­
tesszük, mivel az operációs rendszer majdnem mindig a vezérlővel foglalkozik, és rek vagy a képpontok számának és a képernyő sorai számának beállítása, de a ve­
nem az eszközzel. A legtöbb személyi számítógép és szerver a 3.2. ábrán látható zérlő látja el a megjelenítő irányítását.
242 3. BEVITEL/KIVITEL 3.1. AZ l/O-HARDVER ALAPJAI 243

3.1.3. Memórialeképezésű 1/0 Más számítógépeknél az I/O-regiszterek a szokásos m em óriacím tár egy részén
találhatók, ez látható a 3.3.(b) ábrán. Ezt az elrendezést nevezik m emórialeké­
Minden vezérlő rendelkezik néhány regiszterrel, amelyet a CPU-val történő kap­ pezésű I/O-nak, amit a PDP-11 miniszámítógépnél vezettek be. Mindegyik ve­
csolat lebonyolítására használ. Ezekbe a regiszterekbe történő írással az operá­ zérlőregiszter a m em ória egy olyan adott helyén van, ami csak erre használható.
ciós rendszer képes utasítani az eszközt, hogy adatot szállítson, adatot fogadjon, Szokásosan a kijelölt címek a címtartomány tetején helyezkednek el. A 3.3.(c)
kapcsolja be vagy ki magát, vagy bizonyos más feladatot hajtson végre. Ezeknek a ábra egy hibrid rendszert m utat m emórialeképezésű I/O-adatpufferrel és külön a
regisztereknek az olvasása révén az operációs rendszer megtudja, hogy milyen az vezérlőregiszterek számára I/O-kapukkal. A Pentium alkalmazza ezt az architek­
eszköz állapota, vajon felkészült-e egy új parancs fogadására stb. túrát: 640 K-tól 1 M-ig a címek az IBM PC-vel kompatibilis eszközök adatpufferei
Ráadásul a vezérlőregiszterek mellett számos eszköz rendelkezik adatpufferrel, számára vannak fenntartva, továbbá vannak 0-tól 64 K-os I/O-kapuk is.
amelyet az operációs rendszer írni és olvasni tud. Például a számítógépek szoká­ Hogyan működik ez a rendszer? Minden esetben, amikor a CPU egy szót ol­
sosan videó RAM -ot használnak a képpontok képernyőn való megjelenítéséhez, vasni akar vagy a memóriából, vagy egy I/O-kapuból, a sín címvonalára elhelyezi
ami ténylegesen egy adatpuffer, amelybe írhatnak a programok vagy az operációs a címet, és utána kiad egy READ jelet a sínvezérlő vonalán. Egy második jelvonalat
rendszer. is használ, amely megmondja, vajon I/O-hely vagy memóriahely van megadva. H a
Különbség tehető aközött, ahogyan a CPU kommunikál a vezérlőregiszterek­ memóriahely, akkor a memória a felelős a kérésért, ha egy I/O-hely, akkor az I/O-
kel és az eszköz adatpuffereivel. Két változat ismert. Az első megközelítés szerint eszköz a felelős. H a csak memóriahely van - mint a 3.3.(b) ábra esetén - , akkor
mindegyik vezérlőregiszterhez hozzá van rendelve egy l/O -kapu szám, ami egy 8 minden memóriamodul és minden I/O-eszköz összehasonlítja a címvonalat azzal
vagy 16 bites egész szám. Egy speciális I/O-utasítás hatására, mint az a címtartománnyal, ami hozzátartozik. H a a cím beleesik a tartom ányába, akkor
ő a felelős a kérésért. Mivel egyetlen cím sincs memóriához és I/O-eszközhöz egy­
IN REG,PORT aránt hozzárendelve, így félreértés és konfliktus nem léphet fel.

a CPU kiolvassa a PORT vezérlőregiszter tartalm át, és tárolja az eredményt a CPU


REG regiszterében. Hasonlóan, az 3.1.4. Megszakítások

OUT PORT,REG Rendszerint a vezérlőregisztereknek egy vagy több állapotbitjük van, aminek tesz­
telésével eldönthető, vajon egy kiviteli művelet hajtódik végre, vagy egy új adat
utasítás esetén a CPU a REG tartalm át beírja egy vezérlőregiszterbe. A korai szá­ érhető el egy beviteli eszközről. A CPU képes egy olyan ciklust futtatni, amely
mítógépek legtöbbje, beleértve majdnem az összes nagygépet, mint az IBM 360 és egy állapotbitet addig tesztel, amíg az eszköz készen áll a fogadásra vagy az új
az összes utódja, ilyen m ódon működtek. adat szolgáltatására. Ezt nevezik tevékeny várakozásnak. M ár találkoztunk ezzel
Ebben a rendszerben a m em ória és az I/O-cím helyek különbözők: ezt m utatja a fogalommal a 2.2.3. alfejezetben, mint a kritikus szekciók kezelésének lehetsé­
a 3.3.(a) ábra. ges módszerével, de abban az összefüggésben el lett vetve m int a legtöbb esetben
kerülendő technika. Nagy mennyiségű I/O esetén lehetséges, hogy nagyon hosszú
ideig kell várakoznia valakinek az adat elfogadására vagy feldolgozására, ami nem
Két címzés Egy címzés helye Két címzés helyei
elfogadható, kivéve azt a kevés számú rendszert, amelyek párhuzamos processzu­
sokat nem futtatnak.
Memória Az állapotbit mellett sok vezérlő alkalmaz megszakításokat, amely megmondja
s a CPU-nak, hogy mikor írhatja vagy olvashatja a regisztereket. A 2.1.6. alfejezet­
ben m ár láttuk, hogyan kezeli a CPU a megszakításokat. Az I/O-val összefüggés­
l/O-kapuk
ben tudni kell, hogy a legtöbb interfészeszköz egy outputot ad ki, amely logikailag
azonos a „művelet elvégezve” vagy „az adat készen áll” regiszter állapotbittel, de
/ amely vezérli a rendszersín IR Q (Interrupt ReQuest) megszakításkérés-vonalak
1 egyikét. így amikor egy megszakítás művelet végbemegy, ez megszakítja a CPU-t,
(a) (b) (c) és elindítja a megszakításkezelő programot. Ez a kód tájékoztatja az operációs
rendszert, hogy az I/O készen van. Majd az operációs rendszer ellenőrizheti az ál­
3.3. ábra. (a) Külön 1/0- és memóriahelyek, (b) Memórialeképezésű 1/0. (c) Hibrid lapotbiteken keresztül, hogy m inden jól működött, és vagy begyűjti az eredm énye­
zett adatot, vagy elindít egy újabb próbálkozást.
244 3. BEVITEL/KIVITEL 3.1. AZ l/O-HARDVER ALAPJAI 245

A megszakításvezérlő inputjainak a száma korlátozott lehet; a pentium os PC-k- Meghajtóegység


nél csak 15 áll az I/O-eszközök rendelkezésére. Néhány vezérlő a rendszer alap­
lapján mereven behuzalozott, mint például a billentyűzetvezérlő az IBM PC-nél.
Régebbi rendszereknél az eszköz által használt IR Q megszakításkérés egy kap­
csolóval vagy billenőkapcsolóval volt a vezérlőhöz kötve. H a egy felhasználó egy
új behelyezhető lapot vett, akkor kézzel kellett beállítania az IR Q -t úgy, hogy a
létező IRQ-val ne ütközzön. Kevés felhasználó tudta ezt helyesen elvégezni; ez
vezetett ahhoz, hogy az ipar kifejlesztette a Plug ’n Play (beilleszt és működik)
rendszert, amelyben a BIOS autom atikusan hozzárendeli az IR Q megszakításké­
réseket az eszközökhöz az indítási időben, elkerülve így a konfliktusokat.

3.1.5. Közvetlen memóriaelérés (DMA)


Egy rendszer akár memórialeképezésű I/O-val rendelkezik, akár nem, a CPU szá­ 3.4. ábra. Egy D M A átvitelművelet végrehajtása
m ára szükséges az eszközvezérlők címzése, hogy adatot cseréljen velük. A CPU
bájtonként is kérheti az adatokat az I/O-vezérlőtől, akkor viszont olyan eszköznél, van szükség (3.4. ábrán az 1. lépés). Kiad egy parancsot a lemezvezérlőnek, hogy
mint egy nagy blokkokat tartalm azó lemez, a CPU sok időt pazarolna. Ez indo­ olvasson be adatot a lemezről a belső pufferbe, és ellenőrizze a hibajavító kódot.
kolja, hogy gyakran egy másik módszert alkalmaznak, az ún. közvetlen memória­ Amikor az adat helyes a lemezvezérlő pufferében, akkor indulhat a DMA.
elérést vagy DMA-t (Direct Memory Access). Az operációs rendszertaszk akkor A DMA-vezérlő elindítja az átvitelt, kiadva egy olvasási kérést a lemezvezér­
alkalmazhatja a DMA-t, ha a hardver rendelkezik egy DMA-vezérlővel, ami a leg­ lőnek a sínen keresztül (2. lépés). Ez az olvasási kérés olyan, mint bármely másik
több esetben megvan. Néha ez a vezérlő be van ágyazva a lemezvezérlőkbe vagy olvasási kérés, és a lemezvezérlő nem is tudja, illetve nem figyel arra, hogy a kérés
más vezérlőkbe, de az ilyen esetekben külön DMA-vezérlő szükséges minden esz­ vajon a CPU-tól vagy a DMA-vezérlőtől érkezik. Szokásosan, a sín címsorában
köz számára. Általánosabb, hogy egyetlen DMA-vezérlő van (például az alapla­ van az a memóriacím, ahová a lemezvezérlőnek a belső pufferéből a következő
pon) több eszköz számára az átvitelek szabályozásához, gyakran egyidejű módon. szót kell vinni. A m em óriába írás egy szabványos sínciklus (3. lépés). Mikor a m e­
A DMA-vezérlő, akárhol is van fizikailag, hozzáfér a CPU-tól független rend­ móriába írás készen van, a lemezvezérlő küld egy visszaigazoló jelet a DMA-nak a
szersínhez; ezt szemlélteti a 3.4. ábra. Számos regisztert tartalmaz, amelyeket a sínen keresztül (4. lépés). A DMA-vezérlő ezután növeli a memóriacímet és csök­
CPU olvasni és írni tud. Tartalmaz egy memóriacím-regisztert, egy bájtszámláló kenti a bájtszámlálót. A 2—4. lépéseket mindaddig ismétli, amíg a bájtszámláló ér­
regisztert és egy vagy több vezérlőregisztert. A vezérlőregiszter határozza meg a téke el nem éri a 0 értéket. Ez az a pont, amikor a vezérlő egy megszakítást hoz
használandó I/O-kaput, az átvitel irányát (olvasás az I/O-eszközről vagy írás az létre. Am ikor az operációs rendszer feldolgozza a megszakítást, nem kell a blok­
I/O-eszközre), az átvitel egységét (bájtonként vagy szavanként) és az átvitel egy kot a m em óriába másolnia, m ert az m ár ott van.
ütem ében továbbítandó bájtok számát. Érdekes lehet, hogy miért nem tárolja a vezérlő a bájtokat azonnal a főtárban,
Ahhoz, hogy elmagyarázzuk a DM A működését, először nézzük meg, hogyan amint a lemezről megkapja. Más szavakkal, m iért van szükség egy belső pufferre?
zajlana le a lemezes olvasás, ha nincs DMA. A vezérlő először beolvassa a meg­ Ennek két oka van. Az egyik ok a belső puffer alkalmazására, hogy mielőtt az átvi­
hajtóegységből a blokkot (egy vagy több szektort), amit úgy végez, hogy bitenként tel m egtörténne, a lemezvezérlő ellenőrizheti a hibajavító kódot. H a ez hibás, ak­
folytatólagosan olvas a meghajtóegységből a saját belső pufferébe, amíg egy teljes kor hibajelzést generál, és nem történik meg az átvitel a memóriába. A másik ok,
blokk kialakul. Ezután kiszámolja a hibajavító kódot, amellyel ellenőrzi, hogy nem hogy ha egyszer egy lemezes adatátvitel elkezdődött, akkor a bitek állandó átviteli
fordult elő olvasási hiba. Ezután egy megszakítást idéz elő. Amikor az operációs sebességgel folyamatosan jönnek a lemezről, függetlenül attól, hogy a vezérlő ké­
rendszer beindítja a futtatást, akkor a lemez egy blokkját a vezérlő pufferéből ol­ szen áll-e fogadásukra, vagy sem. H a a vezérlő az adatot közvetlenül a m em óriába
vassa be egy ciklus végrehajtásával, amelyben m inden egyes iterációs lépésben egy próbálná írni, akkor minden egyes szó átviteléhez a rendszersínt kellene használ­
bájtot vagy szót olvas a vezérlő regiszteréből, és azt a m em óriában tárolja, növelve nia. H a viszont a sín foglalt, m ert más eszköz használja éppen, akkor a vezérlőnek
a memóriacímet és csökkentve az egységszámlálót, addig olvas, amíg ennek értéke várakoznia kellene. H a azelőtt érkezik a lemezről a következő szó, hogy a vezérlő
nulla lesz. az előzőt továbbadta, akkor a vezérlőnek azt valahol tárolnia kell. H a a sín nagyon
DM A alkalmazásánál a folyamat m ásként zajlik. Először is a CPU beprogra­ elfoglalt, akkor a vezérlő valószínűleg csak kevés szót képes tárolni, és sok admi­
mozza a DMA-vezérlőt, beállítva a regisztereit, így ez tudja, hogy milyen átvitelre nisztrációt kell készítenie. Am ikor a blokk belsőleg van pufferelve, akkor az adat-
246 3. BEVITEL/KIVITEL 3.2. AZ l/O-SZOFTVER ALAPELVEI 247

csatornára egészen addig nincs szükség, amíg a DM A el nem indul, így a vezérlő így egy állománynak a könyvtárba másolása esetén az állomány a hajlékonylemez­
szerkezete sokkal egyszerűbb, hiszen a DMA-s m em óriába való átvitel nem jelent re másolódik. így az összes állomány és eszköz azonos m ódon címezhető: egy el­
kritikus időt. érési út nevével.
Nem minden számítógép alkalmaz DMA-t. Az ellenérv az, hogy a központi Egy másik fontos kérdés az I/O-szoftverrel kapcsolatban a hibakezelés. A hibá­
CPU gyakran jóval gyorsabb, mint a DMA-vezérlő, és sokkal gyorsabban tudja kat amennyire csak lehet, a hardverhez közeli szinten kellene kezelni. Ha a vezér­
a m unkát elvégezni (amikor az I/O-eszköz gyorsasága nem jelent korlátozó fel­ lő olvasási hibát észlel, akkor megpróbálja a hibát kijavítani. H a erre nem képes,
tételt). Ha nincs más feladata, amivel foglalkozzon, akkor értelm etlen lenne, ha akkor az eszközmeghajtónak kell kezelnie a hibát, esetleg a blokk olvasásának
a (gyors) CPU várakozna arra, hogy a (lassú) DMA-vezérlő befejezze a munkát. megismétlésével. Sok hiba átm eneti jellegű, mint például egy porszemcse előfor­
Továbbá, pénz takarítható meg, és jelentőséggel bír a beágyazott számítógépeknél, dulása az olvasófejen, ami megszűnhet a művelet megismétlésével. A magasabb
ha a DMA-vezérlőtől megszabadulunk, és minden m unkát szoftverúton a CPU- szoftverrétegeknek csak akkor kellene tudom ást szerezniük a hibákról, ha azok
val végeztetünk el. az alacsonyabb rétegekben nem kezelhetők. Sok esetben a hiba orvoslása töké­
letesen elvégezhető alacsony szinten anélkül, hogy a magasabb szintek bárm it is
észlelnének belőle.
További fontos kérdésként jelentkeznek a szinkron (blokkolásos) és aszink­
3.2. Az l/O-szoftver alapelvei ron (megszakításvezérelt) átviteli módszerek. A fizikai I/O-k legtöbbje aszink­
ron jellegű - a CPU beindítja az átvitelt, és más feladatot lát el a megszakítás
Hagyjuk most az I/O-hardvert, és nézzük az I/O-szoftvert. Először áttekintjük az érkezéséig. A felhasználói program okat sokkal egyszerűbb úgy írni, ha az I/O-
I/O-szoftver céljait, majd megnézzük, hogy az operációs rendszer szempontjából a műveletek blokkoltak - a program egy récéivé rendszerhívás után autom atiku­
különböző módszereket az I/O hogyan képes elvégezni. san felfüggesztődik egészen addig, amíg az adat a pufferben elérhetővé válik. Az
operációs rendszernek rendelkeznie kell olyan funkciókkal, amelyeken keresztül
megszakításvezérelten kezelheti a blokkolt felhasználói programokat.
3.2.1. Az l/O-szoftver céljai Az I/O-szoftverekkel kapcsolatban jelentkezik a pufferezés fogalom. Gyakran egy
eszközről jövő adat nem tárolható közvetlenül a végső célhelyen. Például amikor
A kulcsfogalom az I/O-szoftver tervezésénél az úgynevezett eszközfüggetlen­ csomag érkezik a hálózatról, az operációs rendszer addig nem tudja, hogy hová he­
ség. Ez azt jelenti, hogy lehetőség legyen olyan program írására, amely hozzáfér lyezze, amíg nem tárolja és vizsgálja meg valahol a csomagot. Továbbá a szigorúan
bármelyik I/O-eszközhöz anélkül, hogy előzetesen az eszközt meg kellene adni. valós válaszidejű eszközöknél (például a digitális audioeszközök) az adatot előre el
Például egy program nak képesnek kell lennie arra, hogy egy állományt inputként kell helyezni egy kiviteli pufferbe, hogy ne jelentkezzen egy üres puffer feltöltésének
be tudjon olvasni egy hajlékonylemezről, egy merevlemezről, egy CD-ROM -ból ideje, ebből a célból kerülni kell a puffer túlcsordulását. A pufferezés tekintélyes
anélkül, hogy a program ot m ódosítani kellene a különböző típusú eszközök sze­ mennyiségű másolással jár, és gyakran jelentősen befolyásolja az I/O teljesítményét.
rint. Lehetőség legyen olyan parancs írására, mint Az utolsó fogalom, amellyel itt foglalkozunk, az eszközök megosztott és az ezzel
ellentétes monopol módú használata. Néhány I/O-eszközt, például a lemezeket,
sort<input>output sok felhasználó használhatja ugyanabban az időben. Nem okoz problémát, ha azo­
nos időben több felhasználó is megnyit állományokat ugyanazon a lemezen. Más
és ez m űködjön akár egy hajlékonylemezről, egy IDE-lemezről, egy SCSI-lemez- eszközök, például a szalagmeghajtó egységek, egyszerre csak egy felhasználó szá-
ről vagy a billentyűzetről jövő bem enettel és tetszőleges típusú lemezre vagy a
képernyőre kerülő kimenettel. Az operációs rendszer feladata azon problém ák­
Felhasználói szintű l/O-szoftver
nak a megoldása, amelyek abból a tényből erednek, hogy ezek az eszközök való­
ban különbözők, és nagyon eltérő parancssorozatokat igényelnek az olvasáshoz és Eszközfüggetlen operációsrendszer-szoftver
az íráshoz.
Eszközmeghajtők
Az eszközfüggetlenséghez szorosan kapcsolódik az egységes névhasználat. Egy
állomány vagy egy eszköz nevének egyszerűen egy jelsorozatnak vagy egy egész Megszakításkezelők
számnak kellene lennie, függetlenül az eszköztől. A Unixnál és a MINIX 3-nál az
Hardver
összes lemez egy fájlrendszerben hierarchikusan rendezett valamilyen módon, így
a felhasználónak nem kell tudni arról, hogy melyik név melyik eszközhöz tartozik.
Például egy hajlékonylemez logikailag csatolható a /usr/astlbackup könyvtárhoz, 3.5. ábra. Az 1/0-szoftverrendszer rétegei
248 3. BEVITEL/KIVITEL 3.2. AZ l/O-SZOFTVER ALAPELVEI 249

m ára elérhetők. U tána egy másik felhasználó birtokolhatja a szalagmeghajtó egy­ amelyet általában az eszköz gyártója ír, és az eszközzel együtt szállít egy CD-
séget. H a két vagy több felhasználó véletlenszerű összevisszaságban írogatna blok­ ROM- on. Mivel m inden operációs rendszernek a saját m eghajtóira van szüksége,
kokat ugyanarra a szalagra, akkor használhatatlan dolog keletkezne. A monopol ezért az eszközök gyártói több népszerű operációs rendszer meghajtójával is ellát­
módú eszközök bevezetése ugyanakkor számos problém át okoz (például holtpon­ ják az eszközeiket.
tok). Ismét az operációs rendszerre marad, hogy kezelje mind a megosztva, mind a Minden egyes eszközmeghajtó adott típusú eszközöket vagy legalábbis közeli
monopol m ódon használt eszközöket úgy, hogy a problém ákat is elkerülje. rokonságban levő eszközök egy osztályát kezeli. Valószínű, hogy kellemes lenne,
Az I/O-szoftver gyakran négy rétegbe van szervezve, miként a 3.5. ábra mutatja. ha csak egyetlen egérmeghajtó kellene, még akkor is, ha a rendszer számos kü­
A következő alfejezetekben valamennyit megnézzük, kezdve az alapoknál. Ebben lönböző fajtájú egeret támogat. Egy másik példaként vegyünk egy lemezmeghaj­
a fejezetben a hangsúly az eszközvezérlőkön (2. réteg) lesz, de összefoglalást tót, amely rendszerint számos eltérő m éretű és eltérő sebességű lemez, talán még
adunk az I/O-szoftver többi részéről is, megmutatva, hogyan illeszkednek egymás­ a C D -R O M kezelésére is képes. Másrészt, az egér és egy lemez annyira eltérők,
hoz az I/O-rendszer darabjai. hogy különböző m eghajtóra van szükségük.
Annak érdekében, hogy az eszköz hardvere, a vezérlő regiszterei elérhetők le­
gyenek, az eszközmeghajtó hagyományosan a kernel része. Ez a megközelítés a
3.2.2. Megszakításkezelők legjobb teljesítményt adja, és a legrosszabb megbízhatóságot, mivel a rendszer tel­
jes összeomlását idézheti elő bármelyik eszközmeghajtóban egy hiba. A M INIX 3
A megszakítások az élet öröm telen dolgai; jóllehet nem kerülhetők el. El kell rej­ ebből a modellből indul ki, hogy erősítse a megbízhatóságot. M int látni fogjuk, a
teni őket az operációs rendszer belső részébe olyan mélyen, amennyire lehetséges, M INIX 3-nál m inden eszközmeghajtó külön felhasználói szintű processzusként
hogy az operációs rendszernek csak kicsi része tudjon róla. A legjobb módja az jelenik meg.
elrejtésnek, ha egy I/O-műveletet elkezdő meghajtó blokkolódik, amíg az I/O vég­ M int m ár korábban megjegyeztük, az operációs rendszer annak alapján sorolja
bemegy, és egy megszakításkérés megjelenik. A meghajtó blokkolni tudja magát, be a m eghajtókat, hogy blokkos eszközök (mint például a lemez) vagy karakteres
például egy szemafor down, egy feltételváltozó wait vagy egy üzenet récéivé műve­ eszközök (mint például a billentyűzet és a nyomtató). A legtöbb operációs rend­
letével, vagy más hasonló eszközzel. szer definiál egy olyan szabványos interfészt, amelyet az összes blokkos meghajtó­
Megszakítás esetén a megszakításeljárás kezeli a megszakítást. Ezután képes a nak tám ogatnia kell, és egy olyan másik interfészt, amelyet az összes karakteres
meghajtó blokkoltságát m egszüntetni és elindítani. Bizonyos esetekben ez a sze­ m eghajtónak kell támogatnia. Ezek az interfészek olyan eljárásokból állnak, am e­
mafor up helyzetbe állítását jelenti. Másoknál a m onitor feltételváltozója signal-ra lyet az operációs rendszer meghív, m ikor a m eghajtót dolgoztatni akarja.
változik. Vannak rendszerek, amelyeknél egy üzenet indul a blokkolt meghajtó­ Általános értelem ben egy eszközmeghajtó feladata az eszközfüggetlen szoftver­
hoz. M inden esetben a megszakítás egyértelmű hatása, hogy az előzőleg blokkolt től érkező absztrakt kérések fogadása és annak biztosítása, hogy a kérés ki legyen
m eghajtó most folytatódhat. Ez a modell akkor működik a legjobban, ha a meg­ elégítve. Egy tipikus kérés a lemezmeghajtótól, hogy az «-edik blokkot olvassa be.
hajtók független processzusokba strukturálhatok, saját állapotokkal, vermekkel és H a a meghajtó éppen üresjáratban van a kérés beérkezésének időpontjában, ak­
programszámlálókkal rendelkeznek. kor azonnal elkezdi a kérés végrehajtását. H a viszont m ár egy kérés miatt foglalt,
akkor az új kérést elhelyezi a még megválaszolatlan kérések sorába, és amint le­
hetséges, foglalkozik vele.
3.2.3. Eszközmeghajtók Egy I/O-kérés végrehajtásakor az első lépés ellenőrizni, hogy az inputparam é­
terek helyesek-e, és hiba esetén jelezni. H a a kérés érvényes, akkor a következő
Ebben a fejezetben korábban m ár láttuk, hogy mindegyik eszközvezérlőnek van­ lépés az absztrakt alaknak konkrét form ára transzformálása. Egy lemezmeghajtó
nak regiszterei, amelyen keresztül parancs adható, vagy kiolvasható az állapota, esetében ez azt jelenti, hogy m eghatározza a kért blokk tényleges lemezen való
vagy m indkettő. A regiszterek száma és a parancsok jellege eszközönként nagyon helyét, ellenőrzi, vajon a meghajtóegység m otorja működik-e, megvizsgálja, hogy
különböző. Például az egérmeghajtó információt fogad az egértől, amely m egad­ az olvasófej a megfelelő pályára van-e állítva, és így tovább. Röviden, a meghajtó­
ja az elmozdulását és azt, hogy melyik gombja lett lenyomva. Ezzel ellentétben a nak el kell döntenie, hogy milyen vezérlő m űveletekre van szükség, és azok milyen
lemezvezérlőnek ismernie kell a szektorokat, sávokat, cilindereket, olvasófejeket, sorrendben hajtódnak végre.
a kar mozgását, a m otorikus meghajtóegységet, az olvasófej-beállítási időket és Valahányszor a meghajtó eldöntötte, hogy mely parancsokat kell kiadni a vezér­
egyéb m echanikákat, amelyek révén a lemez valójában használható. Természete­ lő számára, elkezdi azok beírását a vezérlő eszközregisztereibe. Egyszerű vezérlők
sen ezek a m eghajtók nagyon különbözők lesznek. egy időben csak egy parancsot tudnak kezelni. Intelligensebb vezérlők készek p a­
így a számítógéphez csatolható valamennyi I/O-eszköz vezérlésénél bizonyos rancsok egy láncolt listájának az elfogadására is, amelyeket aztán végrehajtanak
eszközspecifikus kódra van szükség. Ezt a kódot nevezik eszközmeghajtónak, m inden további, az operációs rendszertől jövő segítség nélkül.
250 3. BEVITEL/KIVITEL 3.2. AZ l/O-SZOFTVER ALAPELVEI 251

A parancs vagy parancsok kiadása után kétféle helyzet közül az egyik lesz alkal­ Egységes kapcsolódási felület az eszközmeghajtóknál
mazható. Sok esetben az eszközmeghajtónak várakoznia kell, amíg a vezérlő
bizonyos m unkát elvégez számára, vagyis blokkolja magát a megszakítási kérés Fontos kérdés egy operációs rendszernél, hogy m iként tekintheti az összes I/O-
beérkezéséig, aminek hatására a blokkoltsága megszűnik. Más esetekben a m ű­ eszközt és -meghajtót többé-kevésbé azonosnak. Amennyiben a lemezek, nyom­
velet késedelem nélkül végrehajtódik, így a m eghajtónak nem szükséges blokkol­ tatók, billentyűzetek stb. eltérő m ódon kapcsolódnak, akkor valahányszor egy új
ni. Az utóbbi esetre példa a képernyő görgetése, ami bizonyos grafikus kártyák­ perifériás eszköz jelenik meg, az operációs rendszert az új eszköz szerint m ódo­
nál csak néhány bájtnak a vezérlőregiszterekbe való beírását igényli. Semmiféle sítani kellene. A 3.7.(a) ábra egy ilyen helyzetet szemléltet, vagyis ekkor minden
mechanikus mozgás nem szükséges, így a teljes művelet elvégezhető néhány eszközmeghajtónak különböző kapcsolódási felülete van az operációs rendszer­
mikroszekundum alatt. hez. Ezzel ellentétben a 3.7.(b) egy olyan tervezést mutat, amelyben minden meg­
Az előbbi esetben a blokkolt meghajtót a megszakítási kérés ébreszti fel. Az hajtó azonos kapcsolódási felületű.
utóbbi esetben a m eghajtó soha nem alszik. A művelet elvégzése után mindkét Egy szabványos kapcsolódási felületnél sokkal egyszerűbb egy új meghajtó be­
esetben hibaellenőrzés szükséges. H a m inden rendben van, akkor a meghajtó kötése, feltéve, hogy illeszkedik a meghajtó kapcsolódási felülethez. Ez azt is je­
átadhatja az adatot az eszközfüggetlen szoftvernek (azaz egy blokkot beolvas). lenti, hogy a meghajtóíróknak ismerniük kell az elvárásokat (milyen funkciókról
Végül a hibákkal kapcsolatos néhány állapotinformációt ad vissza a hívójának. H a kell gondoskodni és milyen kernelfüggvények hívhatók). A gyakorlatban az összes
bármi kérés van a sorban, akkor azok egyikét kiválasztja, és elkezdi a teljesítését. eszköz nem azonos, de rendszerint csak kisszámú eszköztípus van, és még ezek is
H a a sor üres, akkor a m eghajtó blokkolódik, várakozván a következő kérésre. általában majdnem azonosak. Például még a blokkos és karakteres eszközöknek
Egy m eghajtónak a fő feladata az olvasási és írási kérésekkel való foglalkozás, is sok funkciója közös.
de lehetnek más kérések is. Például lehet, hogy a meghajtónak inicializálni kell az Az egységes kapcsolódási felület esetén egy másik szempont, hogy m iként tö r­
eszközt a rendszer indításakor vagy az eszköz első használatakor. Szintén lehet­ ténjen az I/O-eszközök elnevezése. Az eszközfüggetlen szoftver gondoskodik
nek feladatok a tápegységgel, a Plug ’n Playjel vagy bejelentkezési eseményekkel a szimbolikus eszközneveknek a valós meghajtókhoz való hozzárendeléséről.
kapcsolatban. Például a Unixban és a M INIX 3-ban egy olyan eszköznév, m int /dev/ttyOO, egyér­
telm űen kijelöl egy adott fájlhoz tartozó i-csomópontot, és ebben az i-csomópont-
ban van egy főeszközszám, amely a megfelelő m eghajtóra utal. Az i-csomópont
3.2.4. Eszközfüggetlen l/O-szoftver tartalm az egy mellékeszközszámot is, amely param éterként adódik át a meghaj­
tónak, jelezve az egységet az íráshoz vagy olvasáshoz. Minden eszköznek van fő-
Jóllehet bizonyos I/O-szoftverek eszközfüggők, nagy hányaduk eszközfüggetlen. és mellékeszközszáma, és az összes meghajtó elérhető a kiválasztott meghajtó
A m eghajtók és az eszközfüggetlen szoftverek közötti pontos határ függ a rend­ főeszközszámával.
szertől, mivel bizonyos tevékenységek, amelyeket eszközfüggetlen szoftverrel Az elnevezéshez szorosan kapcsolódik a védelem. Hogyan előzi meg a rendszer
kellene megoldani, adott esetben a meghajtóval hatékonyabban elvégeztethe- azt, hogy a felhasználók ne tudjanak elérni olyan eszközöket, amelyekhez nincs
tők. A 3.6. ábrán felsorolt tevékenységek tipikusan az eszközfüggetlen szoftver
részei. M INIX 3-ban az eszközfüggetlen szoftver a fájlrendszer része. Bár az 5.
fejezetben tanulmányozni fogjuk a fájlrendszert, itt gyors áttekintést adunk az
eszközfüggetlen szoftverről.
Operációs rendszer
Az eszközfüggetlen szoftver alapvető feladata azoknak az I/O-tevékenységeknek
a végrehajtása, amelyek m inden eszköznél közösek, és egy szabványos kapcsoló­
dási felület biztosítása a felhasználói szintű szoftver részére. A továbbiakban rész­
letesebben megnézzük a fenti tevékenységeket. JlrüL Jlíu
Egységes kapcsolódási felület az eszközmeghajtóknál
l n _ Lru
Pufferezés______________________________________ L
Hibakezelés____________________________________ Lemez- Nyomtató- Billentyűzet­ Lemez- Nyomtató- Billentyűzet­
meghajtó meghajtó meghajtó meghajtó meghajtó meghajtó
Monopol módú eszközök lefoglalása és elengedése
Eszközfüggetlen blokkméret biztosítása____________ (a) (b)

3.6. ábra. A z eszközfüggetlen l/O-szoftver tevékenységei 3.7. ábra. (a) Szabványos meghajtó interfész nélkül, (b) Szabványos meghajtó interfésszel
252 3. BEVITEL/KIVITEL 3.2. AZ l/O-SZOFTVER ALAPELVEI 253

hozzáférési joguk? A Unixnál, M INIX 3-nál és a Windows későbbi verzióinál, egy open-t a specifikus fájlokon. H a az eszköz nem hozzáférhető, akkor az open
mint amilyen a Windows 2000 és az XP, az eszközök a fájlrendszerben jelennek sikertelen lesz. Az ilyen monopol módú eszközöket azután a bezárásuk teszi újra
meg, mint objektumnevek, ami azt jelenti, hogy a szokásos fájlvédelmi szabályo­ elérhetővé.
kat alkalmazzák az I/O-eszközökre is. Minden eszköz esetében a rendszergazda
állítja be a valós engedélyeket (például a Unixnál az rwx biteket).
Eszközfüggetlen blokkméret

Pufferezés Nem m inden lemez szektorm érete azonos. Az eszközfüggetlen szoftverre hárul
az a feladat, hogy ezt a tulajdonságot elrejtse, és egységes blokkm éretet kínáljon
A pufferezés szintén egy m egoldandó problém a mind a blokkos, mind a karakte­ a magasabb rétegek felé, például úgy, hogy több szektort tekint egyetlen logikai
res eszközök esetében. A blokkos eszközöknél a hardver általában az írást és ol­ blokknak. így a magasabb rétegek csak olyan absztrakt eszközökkel foglalkoznak,
vasást teljesen blokkonként hajtja végre, míg a felhasználói processzusok szabad­ amelyek azonos logikai blokkm éretet használnak a fizikai szektor m éretétől füg­
ságot kívánnak abban, hogy az írás és olvasás milyen egységekben történjen. Ha getlenül. Hasonló a helyzet néhány karakteres eszköznél, amelyek az adatokat
egy felhasználói processzus egy fél blokkot ír, akkor az operációs rendszer általá­ bájtonként szállítják (ilyenek a m odemek), míg mások nagyobb egységekben vég­
ban mindaddig belsőleg tárolja ezt az adatot, amíg az adat további része is beol­ zik ezt (ilyenek a hálózati kártyák). Ezt a különbözőséget is el kell rejteni.
vasásra kerül, és ekkor teszi ki a blokkot a lemezre. Karakteres eszközöknél a fel­
használó írhatja gyorsabban az adatokat, mint ahogy azok kivitelre kerülnek, ami
szükségessé teszi a pufferezést. Szintén pufferezést igényel a felhasználás előtt 3.2.5. A felhasználói szintű l/O-szoftver
billentyűzetről érkező input.
Bár a legtöbb I/O-szoftver az operációs rendszerben van, kis része könyvtárak­
ból áll, összekapcsolódva felhasználói programokkal, sőt olyan teljes program ok­
Hibakezelés kal, amelyek a kernelen kívül futnak. A rendszerhívásokat, beleértve az I/O-
rendszerhívásokat is, rendszerint könyvtári eljárások végzik. Amikor egy C prog­
A hibák jóval gyakoribbak az I/O-val összefüggésben, mint más esetekben. Az ram ban a
operációs rendszernek az előforduló hibákat a legjobb tudása szerint kell kezelni.
Sok hiba nagymértékben eszközfüggő, így csak a m eghajtó tudja, hogy mit tegyen count = write(fd, buffer, nbytes);
(újra próbálkozik, figyelmen kívül hagyja, pánikba esik). Egy tipikus hiba áll elő
a lemez olyan blokkjánál, amely megsérült és többé m ár nem olvasható. Miután utasítás szerepel, akkor a write könyvtári eljárás a program hoz kapcsolódik, és fu­
a m eghajtó egy bizonyos számú alkalommal megpróbálja a blokk ismételt olvasá­ táskor a m em óriában levő bináris program tartalmazza. Az összes ilyen könyvtári
sát, feladja a további próbálkozást, és informálja az eszközfüggetlen szoftvert. A eljárás gyűjteménye nyilvánvalóan része az I/O-rendszernek.
hiba kezelése innentől eszközfüggetlen. H a a hiba egy felhasználói állomány ol­ Míg ezek az eljárások szinte csak azt teszik, hogy a rendszerhívás számára a pa­
vasásakor jelentkezik, akkor valószínű, hogy elegendő a hibát közölni a hívóval. ram étereket elhelyezik a megfelelő helyre, addig vannak olyan I/O-eljárások, am e­
H a azonban egy lényeges rendszeradat olvasásakor lép fel a hiba, például a bittér­ lyek ténylegesen m unkát végeznek. Például a formázott bevitelt és kivitelt könyv­
képet tartalm azó blokknál, ami a szabad blokkokat mutatja, akkor az operációs tári eljárások végzik. C-ből erre példa a printf, amely egy formázott sztringet és le­
rendszernek valószínűleg nincs más választása, mint hogy kinyomtat egy hibaüze­ hetőleg néhány változót vesz, mint inputot, felépíti az ASCII formátum ú sztringet,
netet, és befejeződik. és meghívja a write eljárást a sztring kiíratásához. A printf-re példaként nézzük a

printf("The square of %3d is %6d\n", i, i*i);


M onopol módú eszközök lefoglalása és elengedése
Ez kialakít egy sztringet, amely a 14 karakteres „The square o f ’ kódból, az ezt kö­
Néhány eszközt, m int például a CD-ROM -írókat, egyszerre csak egyetlen pro­ vető í-nek az értékéből, ami 3 karakteres sztring, a 4 karakteres „is”, a 6 karakteres
cesszus használhat. Az operációs rendszer dolga, hogy a lemez használhatóságá­ i2, és végül a sorvégjelből tevődik össze.
ra vonatkozó kérést megvizsgálja, és azt elfogadja vagy elutasítsa, attól függően, A bevitellel kapcsolatban egy hasonló eljárásra példa a scanf amely olvassa a
hogy a lemez elérhető vagy foglalt. A kérések kezelésének egyszerű módja, ha m a­ bem enő adatokat, és a form átum ot leíró jelsorozatnak megfelelően - amely azo­
guktól a processzusoktól kérik, hogy az eszközökért közvetlenül hajtsanak végre nos szintaxisú, mint a printf-nél - értelmezi és tárolja azt a változókban. A szabvá­
254 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 255

nyos I/O-könyvtárban számos olyan eljárás van, amelyek az I/O-t végzik, és mind­ A 3.8. ábrán a nyilak a vezérlés irányát mutatják. Például amikor egy felhasz­
egyik úgy fut, mint a felhasználói program része. nálói program állományból blokkot akar olvasni, akkor az operációs rendszer se­
Nem m inden felhasználói szintű I/O-szoftver tartalm az könyvtári eljárásokat. gítségére van szükség a hívás végrehajtásához. Az eszközfüggetlen szoftver például
Egy másik fontos fogalom a háttértárolás módszer. A háttértárolás (spooling) a szétnéz a blokkok raktárában. H a a kívánt blokk nincs ott, akkor hívja az eszköz-
multiprogramozású rendszerekben a monopol m ódon használható I/O-eszközök meghajtót, hogy az adjon ki egy kérést a hardver felé, hogy a lemezről olvassa be.
egyik kezelési módja. Tekintsünk egy tipikusan háttértárolással működő eszközt, A processzus egész addig blokkolva marad, amíg a lemezművelet végrehajtódik.
a nyomtatót. Bár technikailag könnyen megengedhető, hogy bármely felhasználói Mikor a lemezművelet befejeződött, a hardver egy megszakítási kérést generál.
processzus megnyithassa a nyomtató speciális, karakteres állományát, de tételez­ A megszakításkezelő kideríti, hogy mi történt, melyik eszközzel kell most éppen fog­
zük fel, hogy egy processzus a megnyitás után órákig nem tesz semmit. Ez idő alatt lalkozni. Ezután kiveszi az eszközből az állapotot, és felébreszti az alvó processzust,
más processzus sem tudna semmit sem nyomtatni. hogy fejezze be az I/O-kérést, és engedje a felhasználói processzust folytatódni.
Az előbb em lített problém a elkerülésére készült egy démonnak nevezett spe­
ciális processzus, és létrehoztak egy ún. háttérkönyvtárat (spooling directory).
Egy állomány nyomtatásakor a processzus először a teljes nyom tatandó állományt
létrehozza, és a háttérkönyvtárba teszi. A démon az egyetlen processzus, amely 3.3. Holtpontok
rendelkezik a nyomtató speciális fájljához való hozzáféréssel, hogy a könyvtárban
levő állományokat kinyomtassa. A speciális fájlnak a közvetlen felhasználói hasz­ A számítógéprendszerek erőforrásai között sok olyan van, amelyet egy időben
nálattól való megvédésével elkerülhető az a probléma, hogy valaki az állományt a csak egy processzus használhat. Ilyenek a nyomtatók, a szalagmeghajtó egységek
megnyitva szükségtelenül hosszú ideig lefoglalja. és a rendszer belső táblázatának bejegyzései. H a két processzus egyszerre írna a
A háttértárolás módszerét nemcsak a nyomtatók esetében alkalmazzák, hanem nyomtatóra, zagyvaság lenne az eredmény. H a két processzus azonos fájlrendszer-
más helyzetekben is. Például az elektronikus levelezés rendszerint egy dém ont hasz­ táblahelyet használna, akkor hibás fájlrendszer állna elő, és valószínűleg összeom-
nál. Mikor egy üzenetet küldünk, az üzenet egy levelező háttértárba kerül. Később lana a rendszer. Következésképpen, minden operációs rendszer olyan engedélye­
a levelező démon próbálja azt elküldeni. Lehetséges, hogy egy adott időpontban zési hatáskörrel rendelkezik, amely alapján egy processzus kizárólagos hozzáfé­
a megadott célállomás nem érhető el, ekkor a démon az üzenetet a háttértárban rést kap bizonyos erőforrásokhoz, mind a hardverhez, mind a szoftverhez.
hagyja, megjelölve azzal a státuszinformációval, hogy ismételten próbálkozni kell az Sok esetben egy processzus egynél több erőforrás esetében is kizárólagos hoz­
elküldéssel. A démon küldhet üzenetet a feladónak is, tájékoztatva a küldés késésé­ záférést igényel. Tegyük fel például, hogy két processzus mindegyike egy szkennelt
ről, vagy arról, hogy adott idő elteltével sem sikerült a levelet a próbálkozások elle­ dokumentumot akar CD-re rögzíteni. A z A engedélyt kér a szkenner használatára,
nére elszállítania. Ezek a tevékenységek nem az operációs rendszerre tartoznak. és lefoglalja azt. A B processzus másként van programozva, és először a CD-írót ké­
A 3.8. ábra összefoglalja az I/O-rendszert, felsorolja a rétegeket fő feladataikkal ri és foglalja le. Most az A processzus kéri a CD-írót, de a kérés mindaddig el van
együtt. Alulról kezdve a rétegek: hardver, megszakításkezelők, eszközmeghajtók, utasítva, amíg a B el nem engedi azt. Sajnos ahelyett, hogy a B elengedné a CD-írót,
eszközfüggetlen szoftverek és végül felhasználói processzusok. kéri a szkenner elérését. Ebben a pillanatban mindkét processzus blokkolt, és az is
m arad örökre. Ezt a helyzetet holtpontnak nevezik.
l/O-válasz H oltpont sok olyan helyzetben is kialakulhat, amely nem a monopol módon
Reteg l/O-tevékenységek használható I/O-eszközökre vonatkozó kérések miatt áll elő. Például egy adat­
Felhasználói bázisrendszerben egy program valószínűleg több rekordot is zárol, amelyekkel
l/O-hívás, formázott l/O, háttértárolás
l/O- processzusok dolgozik, azért, hogy elkerülje a versenyt. H a az A processzus zárolja az R Í re­
kérés
Eszközfüggetlen Megnevezés, védelem, blokkolás, kordot, a B processzus az R2 rekordot, majd mindegyik processzus megpróbálja
szoftver pufferezés, lefoglalás zárolni a másik rekordját, holtponthelyzet áll elő. Vagyis holtpont előfordulhat a
Eszközregiszterek beállítása, hardver- és a szoftvererőforrásokkal kapcsolatosan egyaránt.
Eszközmeghajtók állapot ellenőrzése Ebben a fejezetben a holtpont problémával foglalkozunk, közelebbről megnéz­
Megszakítás­ zük kialakulásának mikéntjét, és tanulunk néhány módszert a problém a megelő­
l/O befejeztével a meghajtó felébresztése
kezelők zésére vagy elkerülésére. Bár ehelyütt az operációs rendszerhez kapcsolódó holt­
ponttal foglalkozunk, de a problém a előfordulhat adatbázisrendszereknél és sok
Hardver l/O-művelet végrehajtása más számítástudományi területen, így ez az anyag a párhuzam os rendszerek széles
körében alkalmazható.
3.8. ábra. Az l/O-rendszer rétegei és az egyes rétegek fő feladatai
256 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 257

3.3.1. Erőforrások Ha az erőforrás a kéréskor nem hozzáférhető, akkor a kérő processzus kénytelen
várakozni. Bizonyos operációs rendszerekben az erőforrás sikertelen kérésekor
H oltpont jöhet létre, amikor m egengedett, hogy a processzusok kizárólagosan a processzus autom atikusan blokkolódik, és felébred, mikor a kérés kielégíthető.
érhessenek el eszközöket, állományokat stb. A holtpontot, amennyire lehetsé­ Más rendszerekben a sikertelen kéréskor egy hibakód generálódik, és a hívó eljá­
ges, általánosan tárgyaljuk, és az engedélyezett objektum okra mint erőforrásokra rás dolga az, hogy várakozzon egy kis ideig, majd ismét próbálkozzon.
hivatkozunk. Egy erőforrás lehet egy hardvereszköz (például egy szalagmeghajtó
egység) vagy egy információ (például egy adatbázisban egy zárolt rekord). Egy szá­
mítógép általában sok különböző erőforrással rendelkezik, amelyek m egszerezhe­ 3.3.2. A holtpont alapelvei
tők. Bizonyos erőforrásokból több azonos példány is lehet, például három szalag­
meghajtó egység. Felcserélhető erőforrásokról* beszélünk, ha egy erőforrásnak A holtpont formálisan a következőképpen definiálható:
több egymással felcserélhető példánya is van, és az erőforrással kapcsolatos kéré­
sek kielégítésére a példányok bármelyike használható. Röviden: erőforráson azt a Egy processzusokból álló halmaz holtpontban van, ha mindegyik halmazbeli pro­
valamit értjük, amit ugyanabban az időben csak egy processzus használhat. cesszus olyan eseményre várakozik, amelyet csak egy másik halmazbeli processzus
Az erőforrások két fajtája: a megszakíthatatlanok (monopol módú) és a meg­ okozhat.
szakíthatok. Egy erőforrás megszakítható, ha elvehető az azt birtokló processzus­
tól bármiféle hiba bekövetkezte nélkül. A memória ilyen megszakítható erőforrás. Mivel mindegyik processzus várakozik, így egyikük sem okozhat bármi olyan ese­
Tekintsük például azt a rendszert, amely egy 64 MB-os felhasználói memóriából, ményt, ami felébreszthetné a halmaz bármely más tagját, vagyis az összes p ro ­
két 64 MB-os processzusból, valamint egy nyomtatóból áll, és mindegyik procesz- cesszus folyamatosan várakozik mindvégig. Ennél a modellnél feltesszük, hogy a
szus nyomtatni kíván valamit. A z A processzus kéri és kapja a nyomtatót, majd hoz­ processzusok egyszálúak, és nem jelentkezik megszakítás, ami felébresztene egy
zálát a nyomtatandó értékek kiszámolásához. M ielőtt azonban a számolással vé­ blokkolt processzust. A megszakítás jelentkezését tiltó feltétel egy másféle holt­
gezne, felhasználja a rendelkezésére álló időegységet, és így a memóriából kikerül. pontprocesszust előz meg, ami a felébresztésből adódna, mondjuk egy váratlan
A B processzus most fut, és sikertelen kísérletet tesz a nyomtató megszerzésé­ esemény alkalmával a halmaz többi processzusa el lenne engedve.
re. Potenciálisan a rendszer holtponthelyzetbe került, mivel A -hoz a nyomtató és A legtöbb esetben a processzusok arra az eseményre várnak, hogy más halmaz­
ő -hez a m em ória van kapcsolva, és egyik sem tud folytatódni a másik által lefog­ beli elem az általa pillanatnyilag lefoglalt néhány erőforrást elengedje. Más sza­
lalt erőforrás nélkül. Szerencsére B -tői elvehető a memória, és A betehető oda. vakkal: a holtpontos processzusok halmazának mindegyik tagja egy olyan erőfor­
M o st/l futhat, elvégezheti a nyomtatást, és utána a nyom tatót elengedi. Holtpont rásra vár, amelyet egy holtpontos processzus lefoglalva tart. Egyik processzus sem
nem állt elő. tud futni, egyik sem tud semmiféle erőforrást elengedni, és egyik sem tud felébred­
Ezzel szemben egy m egszakíthatatlan erőforrásnak az elvétele a pillanatnyi tu­ ni. A processzusok száma, a lefoglalt és kért erőforrások száma és fajtája lényegte­
lajdonostól, számolási hibát eredményez. H a egy processzus elkezdett egy írási fo­ len dolgok. Ez az eredmény érvényes mind hardver-, mind szoftvererőforrásokra.
lyamatot egy CD-ROM -ra, és hirtelen elveszik tőle a CD-írót, majd azt egy másik
processzusnak adják, akkor egy kusza eredm ény alakul ki a CD-n. A CD-írókat
nem lehet megszakítani tetszőleges pillanatban. A holtpont feltételei
Általában a holtpont problém a a m egszakíthatatlan erőforrásokhoz kapcsolha­
tó. A megszakítható erőforrásokból álló lehetséges holtpontok rendszerint felold­ Coffman és társai (Coffman et al., 1971) megm utatták, hogy négy feltétel megléte
hatók az erőforrásoknak az eljárások közötti újrakiosztásával. Épp ezért vizsgála­ szükséges a holtpont kialakulásához:
tunk középpontjába a m egszakíthatatlan erőforrások kerülnek.
Egy erőforrás használatával kapcsolatos tevékenységek absztrakt formái a kö­ 1. Kölcsönös kizárás feltétel. Minden egyes erőforrás vagy aktuálisan hozzá van
vetkezők: rendelve pontosan egy processzushoz, vagy szabad.
2. Birtoklás és várakozás feltétel. A m ár korábban kapott erőforrásokat birtokló
1. Az erőforrás kérése. processzusok kérhetnek újabb erőforrásokat.
2. Az erőforrás használata. 3. Megszakíthatatlanság feltétel. Egy processzustól az előzőleg engedélyezett
3. Az erőforrás elengedése. erőforrások nem vehetők el semmi módon. Az erőforrásokat csak az őket
birtokló processzusok engedhetik.
* Ez egy jogi és pénzügyi fogalom. Az arany cserélhető: az egyik gramm arany ugyanolyan 4. Ciklikus várakozás feltétel. Két vagy több processzusból összetevődő ciklikus
jó, mint a másik. láncnak kell kialakulnia, amelynek mindegyik processzusa olyan erőforrásra
várakozik, amelyet a láncban következő processzus tart fogva.
258 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 259

A feltételek mindegyikének teljesülnie kell egy holtpontban. H a egy vagy több fel­ A B C
tétel nem teljesül, akkor holtpont sem alakulhat ki. R kérése S kérése T kérése
Levine cikksorozatában (Levine, 2003a; 2003b; 2005) rám utat arra, hogy az iro­ S kérése T kérése R kérése
dalomban változatos helyzeteket neveznek holtpontnak, és a Coffman és mások R elengedése S elengedése T elengedése
által megfogalmazott feltételeket kielégítő helyzeteket valójában erőforrásholt­ S elengedése T elengedése R elengedése
pontnak kellene hívni. Az irodalom ban vannak olyan „holtpont” példák, amelyek­ (a) (b) (c)

ben az összes fenti feltétel nem teljesül. Például ha egy kereszteződésben négy
járm ű találkozik, és megpróbálnak a szabályoknak engedelmeskedni, elsőbbséget
1. A kéri R-t
adni a jobbra levő járm űnek, akkor egyik sem haladhat tovább, de ez olyan eset, 2. B kéri S-t
© © ©
amelynél erőforrás-birtoklás nincs. Ez a problém a inkább „ütemezési holtpont”, 3. C kéri T-t
amely megoldható egy rendőrtől kívülről érkező elsőbbséget definiáló paranccsal. 4. A kéri S-t
Érdem es megjegyezni, hogy mindegyik feltétel egy adott szabállyal kapcsola­ 5. B kéri T-t i] 0 0
tos, amellyel a rendszer vagy rendelkezik, vagy nem. Lehet-e egy adott erőforrást 6. C kéri R-t (e)
egynél több processzushoz hozzárendelni egyszerre? Egy processzus foglalhat-e holtpont
egy erőforrást, és kérhet-e egy másikat? Megszakítható-e az erőforrás? Léteznek (d)
ciklikus várakozások? A későbbiekben megnézzük, hogyan tám adható meg a holt­
pont bizonyos feltételek negálásával.

A holtpont modellje

H olt megm utatta, hogy m iként modellezhető irányított gráfokkal ez a négy felté­
tel (Holt, 1972). A gráfoknak kétféle csúcsa van: processzus, körrel jelölve, és erő­ 1. A kéri R-t
forrás, négyzettel jelölve. Egy erőforráscsúcsból (négyzet) egy processzuscsúcsba
(kör) m utató él azt jelenti, hogy az erőforrást a processzus előzőleg m ár kérte, en­
2. C kéri T-t
3. A kéri S-t ©©© ©©©
4. C kéri R-t
gedélyezték számára, és jelenleg birtokolja. A 3.9.(a) ábra szerint az R erőforrás az 5. A elengedi R-t
A processzushoz van rendelve.
Egy processzusból egy erőforrásba m utató él azt jelenti, hogy a processzus pilla­
6. A elengedi S-t
nincs holtpont
000 "00
(I) (m)
natnyilag blokkolt és várakozik az erőforrásra. A 3.9.(b) ábra alapján a B procesz-
(k)
szus várakozik az S erőforrásra. A 3.9.(c) ábra egy holtpontot mutat: a C procesz-
szus a T erőforrásra várakozik, amelyet aktuálisan a D processzus birtokol. A D
processzus nincs abban a helyzetben, hogy elengedje a T erőforrást, mivel éppen az
{/erőforrásra várakozik, amelyet a C birtokol. M indkét processzus a végtelenségig

( °) (p) (q)
3.10. ábra. Példa holtpont előfordulására és ennek elkerülésére

fog várakozni. Egy gráfbeli kör azt jelzi, hogy holtpont van; ezt a kört alkotó pro­
cesszusok és erőforrások hozzák létre. Ebben a példában a C -T -D -U -C egy kör.
(a) (b) (c) Most nézzük hogyan használhatók az erőforrásgráfok. Képzeljük el, hogy van
három processzusunk,^, B és C, és három erőforrásunk, R, S és T. A három pro­
3.9. ábra. A z erőforrás-lefoglalások gráfjai, (a) Az erőforrás birtoklása, cesszus erőforrásigényeit és -elengedéseit a 3.10.(a)-(c) ábra m utatja. Az operá­
(b) Egy erőforrás kérése, (c) Holtpont ciós rendszer bármelyik blokkolatlan processzust bármikor futtathatja, dönthet
260 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 261

úgy, hogy az A processzust futtatja egész addig, amíg minden munkáját elvégzi, Általában négy stratégiát használnak a holtpontokkal kapcsolatban.
ezután a B processzust futtatja végig, és végül a C-1.
Ez a sorrend nem vezet semmiféle holtponthoz (mivel nincs az erőforrásokért 1. A problém a teljesen figyelmen kívül hagyása. Lehet, hogy ennek az lesz a ha­
verseny), de párhuzam osítást sem tartalmaz. Az erőforrásigényeken és -elenge­ tása, hogy az is figyelmen kívül hagy minket.
déseken túl a processzusok számolnak és I/O-t végeznek. Amikor a processzusok 2. Felismerés és helyreállítás. Engedjük a holtpontot megjelenni, vegyük észre
egymás után futnak, akkor nincs lehetőség arra, hogy mialatt egy processzus I/O-ra és cselekedjünk.
várakozik, egy másik használhassa a CPU-t. A processzusok ilyen szigorúan szek­ 3. Dinamikus elkerülés az erőforrások körültekintő lefoglalásával.
venciálisán való futtatása valószínűleg nem optimális. Másrészt, ha a processzusok 4. Megelőzés, strukturálisan meghiúsítva a négy szükséges feltétel egyikét, am e­
egyike sem végez I/O-t, akkor a legrövidebb feladatot először ütem ező módszert lyek szükségesek a holtpont kialakulásához.
jobb választani, mint a ciklikus ütem ezés (round robin) módszerét, vagyis bizonyos
körülmények között a processzusok szekvenciális futtatása a legjobb mód. A következő négy alfejezetben valamennyi stratégia vizsgálatára sor kerül.
Most tegyük fel, hogy a processzusok mind I/O-t, mind számolást végeznek, és így
a ciklikus ütemezés egy ésszerű ütemezési algoritmus. Az erőforráskérések a 3.10.
(d) ábrán szereplő sorrend szerint érkeznek. H a ez a hat kérés az adott sorrendben 3.3.3. A strucc algoritmus
teljesül, akkor az ennek megfelelő hat erőforrásgráf a 3.10.(e) (j) ábrákon látható.
A 4. kérés teljesítése után az A blokkolódik, az S-re várakozva, amit a 3.10.(h) ábra A strucc algoritmus a legegyszerűbb megközelítés: dugjuk a fejünket a homokba,
mutat. A következő két lépés során a B és C is blokkolódik, ami végül is körhöz és és tegyünk úgy, m intha egyáltalán semmi problém a nem létezne.* Erre a straté­
holtponthoz vezet; ezt a 3.10.(j) ábra szemlélteti. Ennél a pontnál a rendszer lefagy. giára a különböző em berek különböző módon reagálnak. A m atematikusok sze­
M int ahogy m ár megjegyeztük, az operációs rendszernek nem kötelező a rint ez teljesen elfogadhatatlan, és véleményük szerint a holtpontot mindenáron
processzusokat valami speciális sorrendben futtatnia. Különösen akkor, ha egyes meg kell előzni. A m érnökök megkérdezik, hogy milyen gyakran várható a prob­
erőforrások használata holtponthoz vezetne, akkor az operációs rendszer egysze­ léma megjelenése, milyen gyakorisággal omlik össze a rendszer más okok miatt,
rűen felfüggesztheti a processzust a kérés teljesítése nélkül (azaz, nem ütemezi a mennyire veszélyes egy holtpont. H a a holtpontok átlagban ötévente egyszer for­
processzust) addig, amíg biztonságossá nem válik. A 3.10. ábrán előforduló eset­ dulnak elő, míg a hardverhibákból, a fordító hibáiból és a rendszernek az operá­
ben, ha az operációs rendszer tudott volna a küszöbönálló holtpontról, akkor ahe­ ciós rendszer tévedéseiből származó összeomlása hetente egyszer előfordul, akkor
lyett, hogy az 5-t engedélyezte, felfüggeszthette volna a B-t. H a csak az A és C fut, a legtöbb m érnök nem óhajt nagy árat fizetni a holtpontok megelőzéséért a rend­
akkor a 3.10.(d) ábra helyett a 3.10.(k) ábrán látható kéréseket és elengedéseket szer teljesítményének csökkenésével vagy kényelmi szempontok feladásával.
kapnánk. Ehhez a sorozathoz a 3.10.(1)—(q) ábrákon szereplő erőforrásgráfok tar­ Tegyük ezt az ellentétet konkrétabbá, és nézzük a Unix és a M INIX 3 operációs
toznak, és ez nem vezet holtponthoz. rendszert, ahol felléphetnek holtpontok, amelyeket észre sem vesz a rendszer,
A (q) lépés után a B -nek megengedhető az S, mivel az A befejeződik, és C is bir­ nemhogy autom atikusan feloldaná azokat. A rendszerbeli processzusok teljes szá­
tokol már mindent, amire szüksége van. H a esetleg fi-nek ténylegesen blokkolódnia m át a processzustáblázat bejegyzéseinek a száma határozza meg. így a procesz-
kell, amikor a T-t kéri, akkor sem lesz holtpont, ugyanis B csak addig várakozik, amíg szustáblázat szabad helyei véges számú erőforrások. H a egy fork sikertelen, mivel
C befejeződik. a táblázat tele van, akkor a problém a ésszerű megközelítése, hogy a fork-ot végre­
Később ebben a fejezetben egy algoritmus vizsgálatára is sor kerül, amellyel hajtó processzus valameddig várakozik, és utána ismét próbálkozik.
olyan lefoglalási döntések hozhatók, amelyek nem vezetnek holtponthoz. Most Tegyük most fel, hogy a M INIX 3-rendszerben 100 processzus számára van
m ár érthető, hogy az erőforrásgráfok eszközként szolgálnak ahhoz, hogy meg­ hely. Tíz program fut, amelyek mindegyikének 12 (rész) processzust kell létre­
nézhessük, vajon egy adott igény/elengedés sorozat holtponthoz vezet-e. Csak hoznia. M iután mindegyik processzus m ár 9 processzust létrehozott, a 10 eredeti
ki kell elégíteni lépésenként az igényeket és elengedéseket, m inden egyes lépés processzus és a 90 új processzus kitölti a táblázatot. Az eredeti 10 processzus most
után ellenőrizni kell a gráfot, hogy tartalm az-e kört. H a igen, akkor holtpont van; egy-egy végtelenségig ismétlődő sikertelen klónozással küszködik - holtponthely­
ha nem, akkor nincs holtpont. Bár az erőforrásgráfokat olyan esetben használ­ zet. Ezen helyzet bekövetkeztének valószínűsége nagyon kicsi, de m egtörténhet.
tuk, amelyekben m inden egyes erőforrástípusból csak egyetlen erőforrás volt, az Mondjunk le a processzusokról és a fork hívásról, hogy a problém a megszűnjön?
erőforrásgráfok általánosíthatók az olyan esetekre is, amikor több azonos típusú
erőforrás van (Holt, 1972). Viszont Levine rám utatott arra, hogy felcserélhető
erőforrásokkal ez valójában bonyolultabbá válik (Levine, 2003a; 2003b). H a van * Valójában ez egy ostoba szólás. A struccok 60 km/h sebességgel képesek futni, rúgásuk
a gráfnak egy ciklusba nem tartozó ága, egy holtpontba nem tartozó processzus, pedig elég erős ahhoz, hogy akár egy vacsoráról ábrándozó oroszlánt is meg tudjanak
amely az erőforrások egyikének egy példányát birtokolja, akkor nincs holtpont. ölni vele.
262 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 263

A nyitott állományok maximális száma is korlátozva van, mégpedig az i-csomó- Elsőként vegyük a kölcsönös kizárás feltételt. H a egyetlen erőforrás sincs soha
pont táblázat méretével, így a táblázat betekével - az előzőhöz hasonló - problé­ kizárólagosan egy processzushoz rendelve, akkor holtpont sem lehet. De nyilván­
ma áll elő. Egy másik korlátozott erőforrás a csere lemezterülete. Valójában az való, hogy ha két processzusnak egy időben m egengedett, hogy az eredményeit a
operációs rendszer majdnem minden táblázata egy véges erőforrás. Ezeket mind nyom tatóra kiírja, akkor ebből káosz lesz. A nyom tatóra küldött állományok hát­
el kellene dobnunk, m ert m egtörténhet, hogy egy n processzusból álló halmazban tértárban történő tárolásával több processzus is tud egy időben kim enetet előállí­
a processzusok mindegyike - m iután a véges erőforrások 1/n-ed részét m ár kérte - tani. Ebben a m odellben csak egyetlen processzus kéri ténylegesen a fizikai nyom­
csak próbálkozna a fennm aradó igénye kielégítésével? tatót, és ez a nyomtató démonja. Mivel a dém onnak nincs semmi más erőforrás-
A legtöbb operációs rendszer, így a Unix, a M INIX 3 és a Windows megközelí­ igénye, így a nyomtatóval kapcsolatos holtpont megszűnik.
tése, hogy ne foglalkozzunk a problémával, és ez azon alapul, hogy a felhasználók Sajnos nem minden eszköznél alkalmazható a háttértárolásos módszer (a pro­
többsége inkább elfogadja azt, hogy alkalmanként holtpont keletkezzen, mint hogy cesszustáblázat esetében ez a módszer nem vezetne jóra). De holtpont állhat be a
egy olyan szabályhoz alkalmazkodjon, amely minden felhasználónak csak egy pro­ háttértárként szolgáló lemezhelyekért folyó versenyben is. Mi történik akkor, ha
cesszust, egy nyitott állományt és mindenből csak egyet engedélyezne. H a a holtpont van két processzus, amelyek mindegyike az elérhető belső tárolóhelyek felét már
felszámolása semmibe se kerülne, akkor erről a problémáról nem is kellene beszélni. felhasználta az output számára, és ekkor még az output folyamat nem fejeződik be?
A probléma az, hogy az ár magas, ami főleg a processzusokat sújtaná a kényelmetlen H a a démon úgy van programozva, hogy a nyomtatást elkezdi, mielőtt a teljes kime­
szigorításokkal. így szembe kell nézni azzal a nem túl örömteli helyzettel, amelyben net kialakulna a háttértárban, akkor a nyomtatónak esetleg tétlenül kell várakoznia
választani kell a kényelem és a megbízhatóság között, és elemezni kell, hogy melyik a kimenet első részének kiírása után, m ert a kiviteli processzusra kell várnia. Ezért
a fontosabb és kinek. Ilyen feltételek mellett általános megoldást nehéz találni. a démonok általában úgy vannak programozva, hogy csak azt követően nyomtat­
nak, miután a teljes kimeneti állomány elérhető. Esetünkben van két processzus,
amelyek outputjának egy része befejeződött, de nem teljesen és nem tudnak folyta­
3.3.4. Felismerés és helyreállítás tódni. Egyik processzus sem fejeződik be, és a lemezen holtpont jön létre.
A Coffman és társai által adott második feltétel ígéretesebbnek néz ki. H a sike­
A második stratégia a felismerés és helyreállítás. Ennek a technikának az alkal­ rül megelőzni olyan helyzeteket, amelyekben erőforrásokat birtokló processzusok
mazásakor a rendszer semmi egyebet nem tesz, mint figyeli az erőforrásigénye­ várakoznak további erőforrásokra, akkor nem lesz holtpont. Ezen cél elérésének
ket és -elengedéseket. M inden egyes erőforráskéréskor vagy -elengedéskor az egyik módja az, ha minden processzus még a futása előtt az összes erőforrásigé­
erőforrásgráfot módosítja, és ellenőrzi, hogy van-e benne kör. H a kör keletkezik, nyét közölné. H a mind elérhető lenne, akkor a processzus lefoglalhatna bármit,
akkor az abban levő processzusok egyikét megszünteti. H a így sem sikerült meg­ ami kell, és végig futhatna. H a egy vagy több erőforrás foglalt lenne, akkor semmit
szüntetnie a holtpontot, akkor vesz egy másik processzust és megszünteti azt is, és sem foglalna le, hanem várakoznia kellene.
így tesz mindaddig, amíg a kör meg nem szűnik. Az első gond ezzel a megközelítéssel kapcsolatban az, hogy sok processzus a
Egy valamivel durvább módszer az, amely még az erőforrásgráffal sem foglal­ kezdetekor nem tudja, hogy mennyi erőforrásra lesz szüksége. Egy másik prob­
kozik, hanem periodikusan ellenőrzi, hogy vannak-e olyan processzusok, amelyek léma, hogy ezzel a módszerrel az erőforrások nincsenek optimálisan kihasználva.
mondjuk m ár 1 óránál hosszabb ideje folyamatosan blokkoltak. Az ilyen procesz- Vegyük például azt az esetet, amikor egy processzus adatokat olvas egy bem eneti
szusokat megszünteti. szalagról, egy óráig elemzi azokat, majd ír egy kim eneti szalagot, valamint kiraj­
A felismerés és helyreállítás stratégia a nagygépeknél gyakran használt m ód­ zolja az eredményt. H a az összes erőforrást előre kell kérni, akkor ez a processzus
szer, különösen kötegelt rendszerekben, amelyekben egy processzus m egszünteté­ egy órán keresztül foglalja a kimeneti szalagmeghajtó egységet és a rajzolót.
se és újraindítása elfogadott dolog. A gondot ekkor az jelenti, hogy gondoskodni A „birtokol és várakozik” feltétel m egtörésének egy kissé másik módja, amikor
kell az eredeti állapothoz képest m ódosult állományok helyreállításáról, továbbá egy erőforrás igénylésekor a processzusnak először el kell engednie az összes, pil­
m inden más mellékhatást ki kell küszöbölni, ami előfordulhatott. lanatnyilag birtokolt erőforrását. Ezután m egpróbálhatja mindegyiket megszerez­
ni, ha egyáltalán kell neki.
A harmadik feltétel (megszakíthatatlanság) elkerülése még kevésbé biztató,
3.3.5. A holtpont megelőzése m int a másodiké. H a egy processzus m ár birtokolja a nyomtatót, és eredményei
nyom tatása közben elveszik a nyomtatót, m ert egy kért rajzgép nem elérhető, az
A harmadik holtpont stratégia alkalmas megszorításokat ír elő a processzusoknak hihetetlenül nagy zagyvasághoz vezetne.
úgy, hogy a holtpont eleve lehetetlen legyen. A Coffman és társai által megfogal­ M ár csak egy feltétel m aradt. A ciklikus várakozás többféle m ódon is megszün­
mazott négy feltétel (Coffman et al., 1971) kulcsként szolgál néhány lehetséges tethető. Egy egyszerű mód, ha alkalmazzuk azt a szabályt, hogy egy processzus
megoldáshoz. bármely pillanatban csak egyetlen erőforrást foglalhat. H a igénye van másodikra is,
264 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 265

Feltétel Megközelítés
1. Fotókidolgozó Háttértárolás
Kölcsönös kizárás
2. Szkenner
3. Rajzgép Birtokol és várakozik Az összes erőforrásigény előzetes kérése
4. Szalagmeghajtó egység Megszakíthatatlanság Az erőforrás elvétele
5. CD-ROM-meghajtó egység
Ciklikus várakozás Erőforrások numerikus rendezése

(a) (b)
3.12. ábra. A holtpontmegelőzés lehetőségeinek összefoglalása
3.11. ábra. (a) Num erikusán rendezett erőforrások, (b) Egy erőforrásgráf
nem alkalmas a felcserélhető rendszernél - egy teljesen jó és elérhető erőforrás­
akkor el kell engednie az első erőforrást. Egy olyan processzusnál, amely egy ha­ példány nem lenne elérhető egy ilyen szabálynál.
talmas állományt kíván egy szalagról átmásolni egy nyomtatóra, ez a megszorítás A 3.12. ábrán a holtpontmegelőzés különböző megközelítéseinek összefoglalása
elfogadhatatlan. látható.
A ciklikus várakozás elkerülésének másik módja az összes erőforrás megszámo-
zásával történik; ez látható a 3.11.(a) ábrán. M ost a szabály a következő: a pro­
cesszusok bárm ikor igényelhetik az erőforrásokat, de csak a m egadott számsor­ 3.3.6. A holtpont elkerülése
rendben. Egy processzus kérheti először a szkennert és utána egy szalagmeghajtó
egységet, de nem kérhet először egy rajzgépet és utána egy szkennert. A 3.10. ábrán szereplő példánál láttuk, hogy a holtpont elkerülése nem valamilyen
Ennek a szabálynak az érvényesítése mellett az erőforrások foglaltsági gráfjá­ szabálynak a processzusokra való rákényszerítésével történt, hanem m inden egyes
ban sohasem lesz kör. Nézzük, m iért igaz ez a 3.1 l.(b) ábrában szereplő két pro­ erőforráskérés biztonságos voltának gondos elemzésével. A kérdés most az: van-e
cesszus esetében. H oltpont csak akkor lenne, ha A kérné a j erőforrást és B kér­ olyan algoritmus, amellyel mindig elkerülhető a holtpont? A válasz egy feltételes
né az i erőforrást. Tételezzük fel, hogy az i és a j különböző erőforrások, ekkor a igen - elkerülhető a holtpont, ha bizonyos információ előre elérhető. Ebben a
sorszámaik különbözők. H a i > j, akkor ^4-nak nincs megengedve a j kérése, mivel részben a holtpontelkerülés olyan m ódjait vizsgáljuk, amelyek alapja a körültekin­
az alacsonyabb, mint amivel m ár rendelkezik. H a i < j, akkor ő-n ek nincs m egen­ tő erőforrás-lefoglalás.
gedve az i kérése, mivel az alacsonyabb, mint amivel m ár rendelkezik. A holtpont
mindegyik esetben lehetetlen.
Több processzus esetében teljesen hasonló meggondolások érvényesek. Mindig A bankár algoritmus egyetlen erőforrásra
van a kiosztott erőforrások között egy legnagyobb számú. Ezt az erőforrást bir­
tokló processzus soha nem kérhet m ár kiosztott erőforrást. Vagy befejeződik, vagy Dijkstrától származik az egyik holtpontelkerülő ütemezési algoritmus, amely úgy
rosszabb esetben még magasabb számú erőforrásokat kér, amelyek mindegyike ismert, mint a ban k ár algoritm us (Dijkstra, 1965). Ez egy kisvárosi bankár m un­
hozzáférhető. Végül befejeződik, és felszabadítja az erőforrásait. Ekkor valamely kájának modellje, aki ügyfelek egy csoportjával foglalkozik, akiknek engedélyez
másik processzus foglalja a legnagyobb számú erőforrást, és így ez is befejeződhet.
Röviden szólva, létezik egy forgatókönyv, amely szerint az összes processzus lefut,
így holtpont nem alakulhat ki.
Ezt az algoritmust csak kissé változtatja meg, ha az erőforrások megszerzésének
szigorúan növekvő sorrendben való követelményét kidobjuk, és csak ahhoz ra­
gaszkodunk, hogy a processzusok ne kérhessenek az éppen birtokolt erőforrásaik­ A 0 6 A 1 6 A 1 6
nál kisebb számút. H a egy processzus kezdetben a 9-et és a 10-et kérte, és utána B 0 5 B 1 5 B 2 5
m indkettőt elengedte, akkor valójában m indent kezdhet elölről, így nincs semmi C 0 4 C 2 4 C 2 4
ok arra, hogy tilos legyen számára akár az 1-es erőforrást kérni.
D 0 7 D 4 7 D 4 7
Bár az erőforrások számozott sorrendjével a holtpont kiküszöbölhető, de szin­
te lehetetlen egy m indenkit kielégítő sorrendet találni. Mikor az erőforrások kö­ Szabad: 10 Szabad: 2 Szabad: 1
zött vannak processzustáblázati szabad helyek, zárolt adatbázisrekordok és más (a) (b) (c)
absztrakt erőforrások, akkor a lehetséges erőforrások és a különböző használatok
száma olyan nagy lehet, hogy nem rendezhetők olyan sorrendbe, amely alapján 3.13. ábra. Három erőforrás-lefoglalási állapot, (a) Biztonságos, (b) Biztonságos,
dolgozhatnánk. M iként Levine rám utat (Levine, 2005), az erőforrások rendezése (c) Bizonytalan
266 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 267

bizonyos nagyságú hitelt. A bankárnak nincs szükségszerűen annyi készpénze, ami u (mindkét processzus
elegendő lenne az összes ügyfél teljes hiteligényének egy időben való kielégítésé­ befejeződött)
re. A 3.13.(a) ábra négy ügyfelet tüntet fel; ezeket jelölje A , B, C és D, a számuk­ Nyomtató
ra engedélyezett hitelegységek (például 1 egység 1 K dollár) számával. A bankár
tudja, hogy nem lesz szüksége mindegyik ügyfélnek azonnal a maximális hitelre, h
így a kiszolgálásukra csak 10 egységet foglal le a 22 helyett. Továbbá bízik abban is, k
hogy m inden ügyfél a teljes hitel felvételét követően amint lehet, azonnal visszafi­
zeti a kölcsönt. (Itt az ügyfelek játsszák a processzusok szerepét, a szalagmeghajtó Rajzgép Is
egységek az egységek szerepét, a bankár pedig az operációs rendszer szerepét.)
Az ábra mindegyik része az erőforrás-lefoglalások szerinti rendszerállapotot
mutatja, vagyis ügyfelenként m utatja a m ár kölcsönvett pénzt (a m ár birtokolt sza­
lagmeghajtó egységek) és a maximálisan elérhető hitelt (a szalagmeghajtó egysé­
gek maximális száma, amennyire egyszer később szükség lesz). Egy állapot bizton­ Q h
ságos, ha létezik ezzel kezdődő olyan állapotsorozat, amelynek eredményeként Nyomtató -
mindegyik ügyfél felvehet összesen annyi kölcsönt, amennyit a hitel lehetősége Rajzgép
enged (minden processzus megkapja az összes erőforrását, és befejeződik).
Az ügyfelek intézik a saját ügyeiket, időről időre kölcsönt (vagyis erőforrást) 3.14. ábra. Kétprocesszusú erőforrás-pályagörbék
kérnek. Egy adott pillanatbeli helyzetet a 3.13.(b) ábra szemléltet. Ez az állapot
biztonságos, mivel két egység megm aradt, és a bankár késleltetheti a kéréseket, A processzus által végrehajtott parancsok számát ábrázoljuk. A függőleges tenge­
kivéve a C-t, így engedi a C befejeződését, és elengedi a négy erőforrását. A ban­ lyen jelöljük a B processzus által végrehajtott parancsok számát, /,-nél az A kér
kár négy egységgel a kezében megengedheti D-nek vagy 5-nek, hogy megkapja a egy nyomtatót; I2-nél kér egy rajzgépet. A nyom tatót / 3-nál, a rajzgépet IA-nél en­
kívánt egységeket, és így tovább. gedi el. A B processzusnak / 5-től / 7-ig egy rajzgépre és / 6-tól / -ig egy nyomtatóra
Nézzük, mi lenne, ha történetesen B egy egységgel többet kérne, mint azt tet­ van szüksége.
te a 3.13.(b) ábra szerint. Akkor a 3.13.(c) ábrán lévő helyzet állna elő, amelyik A diagram m inden pontja a két processzus közös állapotát jelöli. A kezdeti ál­
bizonytalan állapotú. H a mindegyik ügyfél a számára maximálisan engedélyezett lapot a p, amelynél egyik processzus sem hajtott végre még parancsot. H a az üte­
kölcsönt akarná, akkor a bankár egyikőjüket sem tudná kielégíteni, és holtpont mező először az A -t futtatja, akkor a görbe a q pont felé mozdul, e k k o rra ^ már
keletkezne. Egy bizonytalan állapot nem feltétlenül vezet holtponthoz, mivel az néhány parancsot elvégez, de B még nem tett semmit. A q pontnál a görbe füg­
ügyfelek valószínűleg nem igénylik a teljes lehetséges hitelt, azonban a bankár gőlegessé válik, jelezve, hogy az ütem ező áttért a B futtatására. Egyetlen procesz-
nem számolhat ezzel a viselkedéssel. szor esetén m inden pályaszakasz vagy vízszintes, vagy függőleges, de sosem ferde.
A bankár algoritmus minden kérés m egjelenésekor megnézi, hogy vajon en­ Továbbá a haladási irány mindig felfelé vagy jobbra, de soha nem lefelé vagy balra
gedélyezése biztonságos állapothoz vezet-e. H a igen, akkor a kérést jóváhagyja, (a processzusok nem futtathatók visszafelé).
egyébként későbbre halasztja. Egy állapot biztonságos voltának eldöntésekor a Amikor A keresztezi az I x vonalat az r-ből 5 felé tartó szakaszon, akkor kéri és
bankár azt ellenőrzi, hogy van-e elegendő erőforrása ahhoz, hogy kielégítsen né­ megkapja a nyomtatót. Am ikor B eléri a t pontot, akkor kéri a rajzgépet.
hány ügyfelet. H a ezt m egteheti, akkor feltevés szerint ezek a kölcsönök visszafi- A bevonalkázott területek különösen érdekesek. A délnyugat-északkelet irá­
zetődnek, és következhet annak az ügyfélnek a vizsgálata, aki legközelebb van a nyú vonalakkal satírozott terület jelöli azt, hogy mindkét processzusnak szüksége
hitellimitjéhez, és így tovább. H a minden kölcsönt végül visszafizetnek, akkor az van a nyomtatóra. A kölcsönös kizárási szabály lehetetlenné teszi az ilyen terület­
állapot biztonságos, és a kezdeti kérést ki lehet elégíteni. re történő belépést. A másik m ódon satírozott terület azt jelenti, hogy mindkét
processzus foglalja a rajzgépet, ami szintén lehetetlen. Egyik feltétel esetén sem
léphet a rendszer a bevonalkázott területekre.
Erőforrás-pályagörbék H a a rendszer belépne az /,-gyel és / 2-vel, mint oldalakkal, az / 5-tel felülről és
az / 6-tal alulról határolt területre, akkor végül is holtpontba jutna, mikor az I2 és Ib
Az előző algoritmus egyetlen erőforrásosztályra volt kitalálva (például csak sza­ metszését elérné. Ennél a pontnál A kéri a rajzgépet és B kéri a nyomtatót, am e­
lagmeghajtó egységekre vagy csak nyomtatókra, de nem mindegyikből néhányra). lyek mindegyike m ár foglalt. Az egész terület állapota bizonytalan, vagyis nem
A 3.14. ábrán egy olyan modell látható, amely két processzussal és két erőforrással szabad belelépni. A t pontnál csak egyetlen biztonságos dolog tehető: az A pro­
foglalkozik, például egy nyomtatóval és egy rajzgéppel. A vízszintes tengelyen az cesszust kell futtatni az / 4-ig. Ezután m ár bármely görbe u -ba vezet.
268 3. BEVITEL/KIVITEL 3.3. HOLTPONTOK 269

Fontos látni, hogy a t pontnál a B kér egy erőforrást. A rendszernek el kell dön­ 1. M egkeres egy olyan R sort a jobb oldali mátrixban, amely ^4-nál kisebb vagy
tenie, hogy ezt elfogadja, vagy sem. H a elfogadja, akkor a rendszer egy bizonyta­ egyenlő. H a ilyet nem talál, akkor a rendszer végül holtpontba kerül, mivel
lan tartom ányba lép, és végül holtpontba kerül. A holtpont elkerüléséhez a B -1 egyik processzus sem tud végigfutni.
addig fel kell függeszteni, amíg az A kéri és elengedi a rajzgépet. 2. Tegyük fel, hogy a kiválasztott sorhoz tartozó processzus kéri az összes erő-
forrás-szükségletét (ez garantáltan teljesíthető) és befejeződik. Jelöljük ezt a
processzust, mint lefutottat, és az összes erőforrását adjuk az A vektorhoz.
A bankár algoritmus többpéldányos erőforrástípusok esetén 3. Ismételjük az 1 és 2 lépéseket, amíg vagy mindegyik processzus befejeződik,
és ekkor a kezdő állapot biztonságos volt, vagy egy holtpont keletkezéséig, és
A grafikus modell nehezen alkalmazható az olyan általános esetekben, ahol tet­ ekkor az állapot bizonytalan.
szőleges a processzusok száma és tetszőleges az erőforrások osztályainak száma is,
sőt több példány lehet mindegyikből (például két rajzgép, három szalagmeghajtó H a több processzus is megfelel az 1. lépés választásának, akkor azok bármelyike
egység). A bankár algoritmus általánosítható ilyen helyzetekre. A 3.15. ábra m u­ választható: az erőforráskészlet vagy bővül, vagy legrosszabb esetben változatlan
tatja, hogyan dolgozik ilyenkor. marad.
A 3.15. ábrán két mátrix van. A bal oldali mutatja, hogy az öt processzus jelen­ Térjünk most vissza a 3.15. ábra példájához. A jelenlegi állapot biztonságos. Te­
leg külön-külön hány erőforrást foglal le az egyes erőforrástípusokból. A jobb ol­ gyük fel, hogy a B processzus most egy nyom tatót kér. Ez az igény kielégíthető,
dali mátrix azt mutatja, hogy mennyi erőforrásra van még igényük a befejeződés­ m ert az eredm ényezett állapot továbbra is biztonságos (a D processzus befejeződ­
hez. Ahogy egyetlen erőforrás esetében, úgy itt is a processzusoknak a végrehajtá­ het, utána az A vagy E processzus, majd a többiek).
suk előtt közölniük kell a teljes erőforrásigényüket, hogy a rendszer képes legyen Most képzeljük el, hogy miután B m egkapta a m aradék két nyomtató egyikét,
a jobb oldali mátrix lépésenkénti meghatározására. az E is kér egy nyomtatót, az utolsót. Ennek az igénynek a kielégítésekor a szabad
Az ábra jobb oldalán három vektor van, E m utatja a meglévő erőforrásokat, erőforrások vektora (1000) lenne, ami holtponthoz vezet. Világos, hogy E igényét
P a foglalt, A pedig a szabad erőforrásokat. £-ből látható, hogy a rendszerhez hat nem szabad azonnal kielégíteni, hanem kis időre el kell halasztani.
szalagmeghajtó egység, három rajzgép, négy nyomtató és két CD-ROM -m eghajtó A bankár algoritmust először Dijkstra publikálta 1965-ben. Azóta szinte va­
egység tartozik. Közülük jelenleg öt szalagmeghajtó egység, három rajzgép, ket­ lamennyi operációs rendszerekkel foglalkozó könyvben részletesen le van írva.
tő nyomtató és kettő CD-ROM -m eghajtó egység foglalt. Ugyanezt kapjuk a bal Számtalan cikket írtak különböző aspektusairól. Néhány szerző vakmerően rám u­
oldali mátrix négy erőforrásoszlopának összegzésével. A szabad erőforrásvektor tatott arra, hogy jóllehet elméletileg az algoritmus csodálatos, a gyakorlatban lénye­
egyszerűen a rendszerben lévő és a jelenleg használt erőforrások különbsége. gében használhatatlan, mivel a processzusok csak ritkán tudják előre a maximális
Egy állapot biztonságos voltának ellenőrzésére most a következő algoritmus al­ erőforrásigényüket. Továbbá a processzusok száma van amikor nem állandó, ha­
kalmazható. nem dinamikusan változik, mivel új felhasználók léphetnek be és ki. Sőt erőforrá­
sok, amelyekre mint elérhetőkre számít a rendszer, hirtelen eltűnhetnek (a szalag­
meghajtó egység meghibásodik). így a gyakorlatban csak kevés olyan rendszer van,
ha van egyáltalán, amely a bankár algoritmust alkalmazza a holtpont elkerülésére.
& Összefoglalva, a „megelőzésként” korábban leírt séma túlságosan megszorító,
<^° 3 4
<*<p <? $ 0& O az „elkerülés” nevű, itt leírt algoritmus pedig olyan információt kér, amely álta­
A 3 0 1 1 A 1 1 0 0 E = (6342)
lában nem adható meg. H a az olvasónak eszébe jutna egy - a gyakorlatban és az
P = (5322) elm életben egyaránt jó - általános célú algoritmus, akkor írja le és küldje el a helyi
B 0 1 0 0 B 0 1 1 2
A = (1020) számítástudományi folyóirathoz.
C 1 1 1 0 C 3 1 0 0 Jóllehet általános esetben sem az elkerülés, sem a megelőzés nem túl ígéretes,
D 1 1 0 1 D 0 0 1 0 viszont különleges alkalmazásokra sok speciális célú algoritmus ismert. E rre pél­
E 0 0 0 0 E 2 1 1 0 da az alábbi. Sok adatbázisrendszerben van olyan művelet, amely gyakran előfor­
dul; ilyen azoknak a rekordoknak a zárolási kérése, amelyeket azután megváltoz­
Lefoglalt erőforrások További erőforrásigények
tat. Amikor egy időben több processzor fut, akkor a holtpontnak valódi veszélye
van. A problém a m egszüntetésére speciális technikákat alkalmaznak.
3.15. á b r a . bankár algoritmus többpéldányos erőforrástípusok esetén Az egyik gyakran használt megközelítés kétfázisú zárolásként ismert. Az első
fázisban a processzus megpróbálja az összes szükséges rekordot egyesével zárolni.
270 3. BEVITEL/KIVITEL 3.4. A MINIX 3 l/O ÁTTEKINTÉSE 271

H a sikerül, akkor beindul a második fázis, elvégzi a módosításait, és elengedi a zá­ táskezelőre. Egyszerű lenne az élet, ha m inden megszakítás ilyen könnyen kezel­
roltakat. Az első fázisban ténylegesen nincs munkavégzés. hető lenne.
H a az első fázisban olyan rekordra van szükség, amely már zárolt, akkor a pro­ Néha az alacsony szintű kezelőnek van több munkája. Az üzenetküldéses m ód­
cesszus elengedi az összes általa lefoglaltat, és mindent kezd elölről. Bizonyos szernek ára van. Amikor egy megszakítás gyakran előfordulhat, de megszakítá­
értelem ben ez a megközelítés hasonló az összes szükséges erőforrásigény előre - sonként az I/O mennyisége kevés, akkor lehet, hogy kifizetődőbb a kezelőt többet
vagy legalábbis azt megelőzőleg - való kéréséhez, mielőtt valami visszavonhatat­ dolgoztatni, elhalasztani a meghajtónak m enő üzenetküldést több megszakításké­
lan történne. A kétfázisú zárolás néhány változatánál nincs elengedés és újrakez­ rés beérkezéséig, amikor m ár több munkája lenne a meghajtónak. A M INIX 3-ban
dés, ha az első fázisban egy zárolás jelenik meg. a legtöbb I/O esetében ez nem lehetséges, mivel a kernelbeli alacsony szintű keze­
Akárhogyan is, de ez a stratégia általában nem alkalmazható. A valós idejű lőként alkalmazva majdnem m inden eszköz esetén egy általános célú eljárás van.
rendszerekben és a processzusirányító rendszerekben például nem fogadható el Az utolsó fejezetben láttuk, hogy az óra kivételt jelent. Mivel a kernelbe van
az, hogy egy processzus befejeződjön, m ert egy erőforrás nem elérhető, és min­ fordítva, az órának van saját kezelője az extra munkákhoz. Sok óraütéskor nagyon
dent kezdjen újra. Egy olyan processzusnak az újraindítása sem fogadható el, kevés a tennivaló az idő kezelésén kívül. Ez viszont elvégezhető az időzítőtaszkhoz
amely már olvasott vagy írt üzenetet a hálózatra, állományokat m ódosított vagy üzenetküldés nélkül is. Az óra-megszakításkezelő növeli a találóan realtime nevű
bármi olyat tett, ami biztonságosan nem ismételhető meg. Az algoritmus csak változó értékét, lehetőleg egy BlOS-hívás alatti ütések számával. A kezelő néhány
azokban a helyzetekben dolgozik jól, ahol a programozó nagy alapossággal megol­ járulékos, nagyon egyszerű számolást végez - növeli a felhasználói idő és a szám­
dott olyan kérdéseket, hogy a program az első fázis alatt tetszőleges pontban meg­ lázási idő számlálóját, csökkenti az aktuális processzus ticksjeft számlálóját, tesz­
állítható és újraindítható legyen. Sok alkalmazás azonban nem strukturálható így. teli, vajon van-e lejárt időzítő. Ü zenetet csak akkor küld az időzítőtaszknak, ha azt
észleli, hogy az aktuális processzus felhasználta az időegységét, vagy egy időzítés
lejárt.
Az óra-megszakításkezelő a M INIX 3-nál egyedi, mivel az óra az egyedüli meg­
3.4. A MINIX 3 l/O áttekintése szakítással vezérelt eszköz, amely a kernelben fut. Az órahardver be van építve
a PC-be - valójában az óramegszakítás-vonal nincs összekapcsolva egyik bővítő
A M INIX 3 I/O szerkezeti felépítését a 3.8. ábra szemlélteti. Az ott szereplő felső I/O-vezérlő beillesztési pontjával sem így nem lehetséges egy órát módosító
négy réteg megfelel a 2.29. ábrán levő M INIX 3 négyrétegű szerkezetének. A kö­ csomag telepítése, helyettesítve az órahardvert és a gyártó által készített meghaj­
vetkező részekben röviden megnézzük mindegyik réteget, hangsúlyt helyezve az tót. Ennek az az oka, hogy az órameghajtó fordításának a kernelben kell lennie,
eszközmeghajtókra. A megszakítási kérések kezelésével a 2. fejezet foglalkozott, és a kernelben levő bármely változóból elérhetőnek kell lennie. A M INIX 3 egyik
az eszközfüggetlen I/O-t pedig az 5. fejezetben a fájlrendszerekkel kapcsolatban tervezési szempontja volt, hogy a többi eszközmeghajtó számára az elérésnek ez a
tárgyaljuk. típusa ne legyen szükségszerű.
A felhasználói szinten futó eszközmeghajtók nem tudják közvetlenül elérni a
kernel helyét vagy az I/O-kapukat. Jóllehet lehetséges, de megsértené a M INIX 3
3.4.1. Megszakításkezelők és l/O-elérés a MINIX 3-ban tervezési elveit, ha egy megszakítást kiszolgáló eljárás olyan távoli hívást tudna
tenni, amelynek hatására végrehajtódna egy felhasználói processzus kódrészében
Sok eszközmeghajtó elindít néhány I/O-eszközt, és utána blokkolódik, várakozva levő szolgáltatóeljárás. Ez még annál is veszélyesebb lenne, mintha megenged­
egy bejövő üzenetre. Ezt az üzenetet általában a megszakításkezelő generálja az nénk, hogy felhasználói szintű processzus hívjon egy kernelben levő függvényt.
eszköznek. Más eszközmeghajtók nem indítanak el semmi fizikai I/O-t (példá­ Ebben az esetben legalább biztosak lehetnénk abban, hogy a függvény írója egy
ul egy RAM-lemezről olvasás és írás egy tárcímleképezéses megjelenítőre), nem hozzáértő, az operációs rendszer biztonságára figyelő tervező, vagy lehetőleg
használnak megszakításokat, és nem várakoznak I/O-eszköztől jövő üzenetre. olyan valaki, aki ezt a könyvet olvasta. A kernel kódjai nem lennének megbízha­
Az előző fejezetben részletesen ism ertettük azt a kernelbeli módszert, amellyel tók, ha a felhasználói program ok hozzáférnének.
a megszakítások üzenetet generálnak és taszkváltást idéznek elő, így itt nem fog­ Az I/O-elérésnek számos olyan különböző szintje van, amely egy felhasználói
lalkozunk ezzel. Általánosan megnézzük a megszakításokat és az I/O-t az eszköz- szintű eszközmeghajtó számára szükséges lehet.
meghajtóknál. A részletekre pedig akkor térünk vissza, amikor a különböző esz­
közök kódjait vizsgáljuk. 1. Egy meghajtónak a szokásos adathelyen kívül eső m em óriaelérésre lehet
Lemezeszközöknél a bevitel és kivitel általában egyrészt parancsadás egy esz­ szüksége. A csak ilyen típusú elérést igénylő m eghajtóra példa a RAM-
köznek, hogy hajtsa végre a műveletét, másrészt a művelet befejezéséig való vára­ lemezt kezelő memóriameghajtó.
kozás. A lemezvezérlő végzi a munka nagy részét, és csak kevés hárul a megszakí­
272 3. BEVITEL/KIVITEL 3.4. A MINIX 3 l/O ÁTTEKINTÉSE 273

2. Egy meghajtó olvashatja és írhat az I/O-kapura. Az ilyen műveletekhez a gépi A merevlemez szintén változatos kernelhívásokat alkalmaz az I/O-hoz, ami le­
szintű parancsok csak kernel módban alkalmazhatók. Ahogy ham arosan látni hetővé teszi, hogy kapuk, kiírandó adatok és m ódosítandó változók listáját küldje
fogjuk, a merevlemez-meghajtónak szüksége van ilyen elérésre. a rendszertaszknak. Hasznos tudni, hogy a merevlemez-meghajtó egy bájtsorozat
3. Egy meghajtónak lehet, hogy előre látható megszakításokat kell megválaszol­ írását kéri a hét kimeneti kapura, hogy elindítson egy műveletet. Az utolsó bájtja
nia. Például a merevlemez-meghajtó a lemezvezérlőnek ír parancsokat, am e­ a sorozatnak egy parancs, és a lemezvezérlő, amikor egy parancsot befejez, egy
lyek megszakítást okoznak a tervezett művelet befejeződésekor. megszakítást generál. M indezt egy egyszerű kernelhívás kíséri, nagyban csökkent­
4. Egy meghajtónak lehet, hogy előre nem látható megszakításokat kell meg­ ve a szükséges üzenetek számát.
válaszolnia. A billentyűzetmeghajtó ebbe a kategóriába sorolható. Az előző Ezzel rátérünk a lista harmadik pontjára: egy váratlan megszakítás megválaszo­
eset egy részosztályának tekinthető azzal, hogy kiszámíthatatlanul bonyolítja lása. M iként a rendszertaszk vizsgálatánál megjegyeztük, amikor egy felhasználói
a dolgokat. szintű program (egy sys-irqctl kernelhívást alkalmazva) érdekében egy megsza­
kítás elkezdődik, akkor a megszakításkezelő rutinja mindig a genericjiandler, a
Az összes esetet a kernelhívások támogatják, és a rendszertaszk kezeli. rendszertaszk részeként definiált függvény. Ez a rutin a megszakítást egy értesítő
Az első eset az extra memóriaszegmens-elérés, kihasználja az Intel processzo­ üzenetté alakítja át a megszakítást kiváltó processzus számára. Az eszközmeghaj­
rok által biztosított hardverszegmentációt. Bár egy szokásos processzus csak a sa­ tónak egy récéivé m űveletet kell elindítania a kernelhívás után, amely kiadja a pa­
ját kód-, adat- és veremszegmenseihez fér hozzá, a rendszertaszk megengedi, hogy rancsot a vezérlőnek. Amikor az értesítés megérkezik, az eszközmeghajtó végre
más szegmensek definiálhatók és elérhetők legyenek a felhasználói szintű procesz- tudja hajtani a megszakítás kiszolgálását.
szusokból. így a memóriam eghajtó a RAM-lemezen levő m em óriaterületet eléri, Ebben az esetben egy megszakítás körültekintően védve van, ha valami balul
valamint más területeket más speciális célból. A konzolmeghajtó hasonlóan eléri ütne ki. Arra, hogy egy várt megszakítás nem következik be, egy processzus úgy
a videomegjelenítő adapternek a memóriáját. készül fel, hogy a rendszertaszkot egy időzítő beállítására kéri meg. Az időzítők
A második esetre a M INIX 3 kernelhívásokat biztosít az I/O-parancsok haszná­ szintén értesítő üzeneteket generálnak, és így a récéivé művelet értesítést kaphat,
latához. A rendszertaszk végzi az aktuális I/O-t egy kevésbé privilegizált procesz- ha megszakítás fordult elő vagy egy időzítő lejárt. Bár az értesítés nem szállít sok
szus helyett. A fejezetben később megnézzük, hogyan használja ezt a szolgáltatást információt, mégsem okoz problém át, m ert az értesítő üzenet jelzi az eredetét.
a merevlemez-meghajtó. Itt most csak a tém a bevezetésére kerül sor. A lemez- Bár mindkét értesítést a rendszertaszk generálja, egy megszakítás értesítőjében
m eghajtónak lehet, hogy írnia kell egy egyszerű kiviteli kapura, hogy kiválasszon benne lesz, hogy a H ARD W ARE-bői jön, az idő lejártáról pedig az értesítőben
egy lemezt, ezután olvasnia kell egy másik kapuról azért, hogy az eszköz készen­ megjelenik, hogy a CLOCK-ból jön.
létéről megbizonyosodjon. Amennyiben normálisan nagyon gyors válaszadás vár­ Egy másik problém a is van. H a egy megszakítás időzített m ódon történik, és az
ható, akkor ez lekérdezéssel végezhető. Vannak kernelhívások, amelyek specifi­ időzítő beállított, akkor egyszer a jövőben az időtartam elhasználását egy másik
kálnak egy kaput és a kiírandó adatot vagy a beolvasott adat számára egy helyet. récéivé művelet észleli, valószínűleg a meghajtó főciklusában. Egyik megoldás egy
Ezek megkövetelik, hogy egy kaput olvasó hívás ne blokkolódjon, vagyis ténylege­ kernelhívással m egbénítani az órát, amikor a HARD W ARE-ből az értesítés meg­
sen a kemelhívások ne blokkoljanak. jön. Vagy ha valószínűleg a következő a récéivé művelet lesz, ahol a CLOCK-ból
Némi biztosítás hasznos lehet az eszközhibákkal szemben. Egy lekérdező cik­ nem vár üzenetet, akkor ki kellene hagyni, és ismét a receive-et hívni. Bár kevésbé
lusban lehet olyan számláló, amely befejezi a ciklust, ha az eszköz nem áll készen valószínű, de elképzelhető, hogy a lemezművelet egy váratlanul hosszú késés után
bizonyos számú iteráció után. Ez általában nem jó elképzelés, mivel a ciklus fu­ következik be, egy megszakítást generálva az időzítő lejárta után. Az előálló hely­
tási ideje függeni fog a CPU gyorsaságától. Egy lehetőség ezzel kapcsolatban a zet többféleképpen kezelhető. Am ikor időtúllépés lép fel, egy kernelhívás m egbé­
számlálónak CPU-időhöz kötődő értékkel való indítása, lehetőleg egy globális nítja a megszakítást, vagy egy olyan récéivé művelet indul, amely nem vár megsza­
változó alkalmazásával, amelynek inicializálása a rendszer indításakor történik. A kítást, és figyelmen kívül hagyja a HARD W ARE-bői jövő üzenetet.
M INIX 3-rendszerkönyvtár jobb módszert nyújt a getuptime függvény révén. Ez Alkalmas itt megjegyezni, hogy amikor egy megszakítás először engedélyezett,
egy kernelhívással hozzáfér a rendszerindítás óta eltelt órajelek számát tartalmazó egy kernelhívás beállítja a megszakítással kapcsolatos „szabályokat”. A szabály
számlálóhoz, amelyet az időzítőtaszk kezel. Ennek az információnak azonban ára egyszerűen egy állapotjelzővel valósul meg, amely m eghatározza, hogy a meg­
van, a ciklusban eltelt időt nyomon kell követni, ami m inden egyes iterációs lépés­ szakítás autom atikusan újra engedélyezhető-e vagy addig nem lehetséges, amíg
ben egy további kernelhívást jelent. Egy másik lehetőség megkérni a rendszertasz­ az eszközmeghajtó, amelyet kiszolgál, egy kernelhívással újra nem engedélyezi.
kot egy figyelőóra beállítására. Azonban egy récéivé blokkoló művelet szükséges Lehetséges, hogy egy megszakítást követően az eszközmeghajtónak tekintélyes
ahhoz, hogy egy órától információt lehessen elérni. Amennyiben gyors válaszidőre mennyiségű munkát kell elvégeznie, és így lehet, hogy legjobb a megszakítást ad­
van szükség, akkor ez nem jó megoldás. dig nem engedni, amíg az összes adat másolása el nem készül.
274 3. BEVITEL/KIVITEL 3.4. A MINIX 3 l/O ÁTTEKINTÉSE 275

A listánk negyedik esete a legproblémásabb. A billentyűzettámogatás a tty Processzusstrukturált rendszer Monolitikus rendszer
meghajtó része, amely egyaránt ellátja a kivitelt és a bevitelt is, továbbá párhuza­
mos eszközöket is képes támogatni. így az input jöhet egy lokális billentyűzetről, f F á j i - y r TfelhasználóiN
de jöhet egy soros vonalon csatolt vagy hálózati csatolású távoli felhasználótól is. V rendszer T g \processzus)

Számos olyan processzus futása is lehetséges, amelyek mindegyike különböző helyi


vagy távoli term inálra produkál kimenetet. Mikor nem ismert, hogy egy megsza­
\ \
Processzusok
f Eszköz-
kítás mikor fordul elő, ha egyáltalán előfordul, képtelenség egy récéivé hívás blok­ ymeghajtó/'*""
kolása, hogy egy egyszerű erőforrásból az input elérhető legyen, ha ugyanannak a
processzusnak kell esetleg válaszolnia más beviteli vagy kiviteli erőforrásoknak is.
A M INIX 3 ennek a problém ának a kezelésére számos technikát alkalmaz. --- N
\3

\l1
* , N\ 7 Rendszer-)
A terminálmeghajtók által használt alapvető technika a billentyűzetbemenetnél i Hardver i
\ \ ta s z k J
megszakításkezeléssel történik, amilyen gyorsan csak lehetséges, így a karakterek
nem vesznek el. Egy karakternek a billentyűzethardverből egy pufferbe való írása
a lehető legkevesebb munkával történik. Továbbá amikor a billentyűzetről az adat 1-6 kérés A felhasználói szintű rész
a megszakításnak eleget téve átkerül, amint az adat pufferezve van, a billentyűzet­ és válaszüzenetek a kernelszintű részt hívja
ről ismét olvas, még mielőtt azt megelőzően, hogy a megszakításból visszatérne. A négy független programmegszakítással.
processzus között A fájlrendszer az eszköz-
megszakítások olyan értesítő üzeneteket generálnak, amelyek a küldőt nem blok­ meghajtót mint egy eljárást
kolják; ez segít megelőzni az input elvesztését. A nem blokkoló récéivé művelet hívja. A teljes operációs
szintén alkalmazható, bár ezt csak rendszerösszeomlás során használják az üzene­ rendszer része minden
egyes processzusnak
tek kezelésére. A jelzőórákat olyan eljárások aktiválására is használják, amelyek a
(a) (b)
billentyűzetet ellenőrzik.
3.16. ábra. A felhasználó-rendszer közötti kom m unikáció strukturálásának két módja

3.4.2. A MINIX 3 eszközmeghajtói blokkos eszközmeghajtót támogatja. A tty.h az összes termináleszköznek a közös
definícióját nyújtja.
Egy M INIX 3-rendszerben meglévő I/O-eszközök mindegyik osztályához egy kü­ A M INIX 3-ban a teljesen elkülönülő processzusok tervezési elve az operá­
lönálló I/O-eszközmeghajtó tartozik. Ezek a m eghajtók teljesen önálló procesz- ciós rendszer kom ponenseinek futtatásával kapcsolatban erősen modulált és
szusok saját hellyel, regiszterekkel, veremmel, és így tovább. Az eszközmeghaj­ m érsékelten hatékony. Ebben a M INIX 3 és a Unix lényegesen különbözik. A
tók, a M INIX 3-processzusok által használt standard üzenetküldéses módszerrel M INIX 3-ban egy processzus úgy olvas egy állományt, hogy üzenetet küld a fájl­
érintkeznek a fájlrendszerrel. Az egyszerű eszközmeghajtót valószínűleg önálló rendszerprocesszusnak. A fájlrendszer ekkor üzenetet küld a lemezmeghajtónak,
forrásfájlokként írták. A RAM-lemez, a merevlemez és a hajlékonylemez meghaj­ amelyben kéri, hogy az igényelt blokkot olvassa be. A lemezmeghajtó kernelhívás­
tóinál m inden eszköztípushoz van egy forrásfájl, és a driver.c-ben és a drvlib.c-ben sal kéri a rendszertaszkot, hogy végezze el az aktuális I/O-t, és másolja az adatot a
vannak a közös rutinok az összes blokkos eszköztípus támogatására. A szoftver, processzusok között. A 3.16.(a) ábra ezt a folyamatot szemlélteti (a valóság némi
hardverfüggő és hardverfüggetlen részekre történő felosztása révén, könnyen al­ egyszerűsítésével). Mivel üzeneteken keresztül m ennek végbe ezek a belső tevé­
kalmazható a különböző hardverkonfigurációknál. Bár néhány közös forráskódot kenységek, a rendszer különböző részei rákényszerülnek arra, hogy szabványos
is használnak, mégis mindegyik lemeztípus m eghajtója önálló processzusként fut, m ódon kapcsolódjanak a többi részhez.
hogy gyors adatmozgatást tudjon megvalósítani, és elkülönítse a m eghajtókat egy­ A Unixban minden processzusnak két része van: egyik a felhasználói m em ória­
mástól. részben, a másik a kernel m em óriaterületén, ahogy ez a 3.14.(b) ábrán látható.
A term inálm eghajtó forráskódja hasonló m ódon szervezett, a tty.c állományban Egy rendszerhíváskor az operációs rendszer valami bűvös m ódon átkapcsol a fel­
van a hardverfüggetlen kódja és külön állományban a különböző eszközöket tá­ használói szintű részből a kernelszintűre. Ez a szerkezet a MULTICS-tervezés
mogató forráskód - úgymint a tárra leképező konzolok, a billentyűzet, a soros vo­ maradványa, amelyben a kapcsolás csupán szokásos eljáráshívás volt, nem pedig
nal és az egyéb végberendezések. Ebben az esetben azonban egyetlen processzus megszakítás, amelyet a felhasználói rész állapotának mentése követ, ahogy az a
tám ogatja az összes különböző eszköztípust. Unixban van.
Az olyan eszközcsoportoknál, mint a lemezes eszközök és a terminálok, am e­ Az eszközmeghajtók a Unixban egyszerű kerneleljárások, amelyek a procesz-
lyekhez különféle forrásfájl tartozik, vannak definíciós fájlok. A driver.h az összes szus kernelszintű részéből hívódnak. Amikor a processzusnak egy m eghajtóra van
276 3. BEVITEL/KIVITEL 3.4. A MINIX 3 l/O ÁTTEKINTÉSE 277

szüksége, akkor egy kerneleljárást hív, ami többek között alvó helyzetbe teszi, és vagy WRITE) és ezek param étereit. A meghajtó megkísérli a kérés teljesítését, és
addig alszik, amíg egy megszakításkezelő felébreszti. Megjegyezzük, hogy csak a utána visszaküld egy választ.
felhasználói processzus kerül alvó állapotba; a kernelszintű és a felhasználói szin­ Blokkos eszközöknél a kérés- és válaszüzenetek mezőit a 3.17. ábra mutatja. A
tű részek a processzusnak ténylegesen különböző részei. kérésüzenet tartalm azza annak a pufferterületnek a címét, ahonnan az adat kike­
Az operációs rendszer tervezői szűnni nem akaró vitát folytatnak a monolitikus rül, vagy ahová a beérkező adat elhelyezésre kerül a kérésnek megfelelően. A vá­
rendszerek, mint a Unix, és a processzusstrukturált rendszerek, mint a M INIX 3, laszban van állapotinformáció, ezt használva a kérő processzus ellenőrizni tudja,
érdemeiről. A M INIX 3-megközelítés jobban strukturált (modulárisabb), világo­ hogy a kérése valóban teljesült-e, vagy nem. A karakteres eszközök mezői alapve­
sabb a részek közötti kapcsolat, és könnyen átvihető osztott rendszerekre, am e­ tően hasonlók, de m eghajtónként kissé különbözhetnek egymástól. A term inál­
lyekben a processzusok különböző számítógépen futnak. A Unix megközelítése meghajtóhoz jövő üzenetek tartalm azhatják egy adatszerkezet címét, ami specifi­
hatékonyabb, mivel az eljáráshívások sokkal gyorsabbak az üzenetküldéseknél. Sok kálja a term inál összes kialakítható működési módját, például azokat a karaktere­
esetben a M INIX 3-at elvetették, de úgy gondoljuk, hogy mivel növekszik a haté­ ket, amelyeket soron belüli karaktertörlésre, sortörlésre használ.
kony személyi számítógépek elérhetősége, így az áttekinthetőbb szoftverszerkezet Mindegyik m eghajtónak feladata a többi processzustól, normálisan a fájlrend­
is egyre fontosabb, még akkor is, ha a rendszer lassúbbá válik általa. A teljesít­ szertől jövő kérések fogadása és azok végrehajtása. A blokkos eszközök meghaj­
ményveszteség 5-10% -a tulajdonítható a felhasználói szintű operációs rendszer tóit úgy írták meg, hogy azok üzenetet kapnak, végrehajtják azt, és választ kül­
futtatásának. Természetesen sok operációsrendszer-tervező nem osztja azt a né­ denek. Ez a strukturális döntés többek között azt jelenti, hogy ezek a meghajtók
zetet, hogy érdem es áldozni egy kis sebességet nagyobb m odularitásért és jobb szigorúan szekvenciálisak, nem végeznek semmiféle belső multiprogramozást,
rendszer-megbízhatóságért. hogy megőrizzék egyszerűségüket. Egy hardverkérés kiadásakor a meghajtó vé­
Ebben a fejezetben a RAM-lemez-, a merevlemez-, az óra- és a terminálm eg­ gez egy récéivé műveletet, amivel jelzi, hogy csak megszakítási kérések fogadásával
hajtókat tárgyaljuk. Egy szabványos M INIX 3-konfigurációhoz hozzátartoznak a foglalkozik, nem érdekli semmiféle új m unkára vonatkozó kérés. Valamennyi új
hajlékonylemez- és nyomtatómeghajtók, de ezekkel nem foglalkozunk részlete­ kérőüzenetnek várnia kell, amíg a jelenlegi m unkáját be nem fejezi (randevú elv).
sen. Vannak M INIX 3-szoftverek egyéb eszközmeghajtók számára is, ilyenek az A term inálm eghajtó némileg más, mivel itt egyetlen, számos más eszközt kiszol­
RS-232 soros vonal, a CD-ROM , az Ethernet-adapter és a hangkártyák. Ezek a gáló meghajtóról van szó. így lehetséges, hogy elfogad egy új kérést, amely billen­
M INIX újrafordításával ágyazhatok be, külön fordíthatók és bármikor indíthatók. tyűzetről kér bevitelt, mialatt még nem fejezte be a soros vonalról való olvasási
Ezeknek a m eghajtóknak a M INIX 3-rendszer más részeivel való kapcsolata kérés teljesítését. D e az eszközöknek be kell fejezniük egy kérést, mielőtt egy új
azonos m ódon valósul meg: a kérésüzenetek a m eghajtókhoz vannak küldve. Az kérést elkezdenének teljesíteni.
üzenetek több mezőt is tartalm aznak, rendszerint a művelet kódját (például READ
message mess; /* üzenetpuffer */
Kérések
Mező Típus Jelentés
void io_driver() {
initializeO /* csak a kezdeti beállításkor végzi el */
m.m_type int A kért művelet
while (TRUE) {
m.DEVICE int A használandó másodlagos eszköz
receive(ANY, &mess); /* várakozik egy feldolgozandó kérésre */
m.PROC_NR int Az l/O-t kérő processzus caller = mess.source; /* a processzus, ahonnan az üzenet jött */
m.COUNT int A bájtok száma vagy az IOCTL kód switch(mess.type) {
m.POSITION long Hely az eszközön case READ: rcode = dev_read(&mess); break;
m.ADDRESS char* Cím a kérő processzusban case WRITE: rcode = dev_write(&mess); break;
/* egyébként; az OPEN, a CLOSE és az IOCTL esetében is */
default: rcode = ERROR;
Válaszok }
Mezők Típus Jelentés mess.type = DRIVER_REPLY;
m.m_type int Mindig DRIVER_REPLY mess.status = rcode; /* eredmény kódja */
m.REP_PROC_NR int Ugyanaz, mint a kérésben a PROC_NR send(caller, &mess); /* válaszüzenetet küld a hívónak */
m.REP_STATUS int A mozgatott bájtok száma vagy hibaszám }
}
3.17. ábra. A fájlrendszer által a blokkos eszközmeghajtókhoz küldött üzenetek 3.18. ábra. Egy 1/0-eszközmeghajtó főeljárásának vázlata
és a visszaküldött válaszok mezői
278 3. BEVITEL/KIVITEL 3.4. A MINIX 3 l/O ÁTTEKINTÉSE 279

A blokkos eszközök főprogramja szerkezetileg azonos; ez a 3.18. ábrán van vá­ lókról és hálózatról soros vonalakon (beleértve a m odem eket) történő bejelentke­
zolva. A rendszer első elindításakor valamennyi meghajtó elindítására sor kerül, zéseket. A hálózati műveletek igényelnek némi operációs rendszertől jövő segít­
hogy a belső táblázatok és hasonló dolgok kezdeti beállításai megtörténjenek. séget, ami az ebben a könyvben leírt konfigurációjú M INIX 3-nak nem része, de
Ezután mindegyik eszközmeghajtó blokkolódik, míg egy üzenetet nem kap. Egy a M INIX 3-ba a hálózati szerver könnyen befordítható. A hálózati szerver azonos
üzenet beérkezésekor a hívó azonosítóját elmenti, és meghív egy eljárást a munka prioritással fut a tárkezelővel és a fájlrendszerrel, és azokhoz hasonlóan úgy fut,
elvégzésére; más-más eljárást hív az egyes műveletek elvégzésére. A munka elvég­ mint egy felhasználói processzus.
zése után egy választ küld a hívónak, majd a meghajtó visszatér a ciklus elejéhez,
vagyis várakozik a következő kérésre.
A dev_XXX eljárások mindegyike a meghajtó által nyújtott műveletek vala­ 3.4.5. Holtpontkezelés a MINIX 3-ban
melyikét kezeli. A történteket tükröző állapotkódot adnak vissza. Ez a kód a vá­
laszüzenet REP_STATUS mezőjébe kerül, és értéke az átmozgatott bájtok száma Hagyományainak megfelelően a M INIX 3 ugyanazt az utat követi, mint a Unix a
(nulla vagy pozitív), ha m inden jól ment; hiba esetén pedig a hibakód (negatív). Az holtponttal kapcsolatban, vagyis figyelmen kívül hagyja ezt a problémát.
érték különbözhet a kért bájtok számától. Egy állomány végénél a kért mennyiség­ Rendszerint a M INIX 3-ban nincsenek monopol módú I/O-eszközök, de ha va­
nél kevesebb is lehet az elérhető bájtok száma. A termináloknál legfeljebb egy sor laki egy ipari szabványú DAT szalagmeghajtó egységet akarna a PC-hez csatolni,
adódik vissza (kivéve a nyers módot), még ha a kért mennyiség nagyobb is. az ehhez szükséges szoftver elkészítése nem okozna különösebb problémát. R ö­
viden, a holtpont egyedül csak az impliciten megosztott erőforrásokkal kapcsolat­
ban fordul elő, ilyen erőforrások a processzustáblázat szabad helyei, az i-csomó-
3.4.3. Eszközfüggetlen l/O-szoftver a MINIX 3-ban pont táblázat szabad helyei stb. Az ismert holtpont algoritmusok nem tudják az
ilyen erőforrásokat kezelni, vagyis azokat, amelyek kérése nem explicit.
A M INIX 3-ban az összes eszközfüggetlen I/O-kódot a fájlrendszerprocesszus tar­ Valójában, a fentiek nem feltétlenül igazak. Az egy dolog, hogy a felhasználói
talmazza. Az I/O-rendszer annyira szorosan kapcsolódik a fájlrendszerhez, hogy processzusoknál elfogadjuk a holtpont-kialakulás kockázatát, sajnos azonban m a­
egyetlen összefésült processzusban vannak. A fájlrendszer tevékenységeit a 3.6. gában az operációs rendszerben is van néhány hely, ahol tekintélyes gondot okoz
ábrán soroltuk fel, kivéve a m onopol m ódú eszközök kérését és elengedését, am e­ az elkerülése. Fő előfordulási helye a processzusok közötti belső üzenetátadásnál
lyek a M INIX 3-ban nem lehetségesek a jelenlegi szerkezetben. Ezek azonban van. Például a felhasználói processzusoknak csak a sendrec üzeneti módszer al­
könnyen hozzáadhatok az aktuális eszközmeghajtókhoz, ha erre a jövőben igény kalmazása engedett, így egy felhasználói processzusnak soha nem kellene zárolva
merülne fel. lennie, mivel ez egy récéivé művelet, amikor nincs hozzá üzenetet küldő procesz-
A meghajtókkal, pufferezéssel és blokklefoglalásokkal kapcsolatos kapcsolódá­ szus. A szerverek csak a send vagy a sendrec m űveletet használják az eszközmeg­
si felületek kezelésén túl a fájlrendszer foglalkozik az i-csomópontok, könyvtárak hajtóval való kommunikálásra, és az eszközmeghajtók csak a send vagy a sendrec
és logikailag felcsatolt fájlrendszerek védelmével és kezelésével. Részletesen erre m űveletet használják a rendszertaszkkal a kernelrétegben való kommunikáláshoz.
az 5. fejezet tér ki. Ritka eset az, ahol a szervereknek egymás között kell kommunikálniuk, olyan,
mint váltások a processzuskezelő és a fájlrendszer között, amikor beállítják a saját
processzustáblarészeiket, ilyenkor a kommunikáció rendje nagyon körültekintően
3.4.4. Felhasználói szintű l/O-szoftver a M INIX 3-ban m egtervezett a holtpont elkerülése miatt. Az üzenetátadásnak szintén a legalacso­
nyabb szintjénél megy végbe annak a biztosítása, hogy ha egy processzus valamit
Ebben a fejezetben a korábban m ár felvázolt általános modellt alkalmazzuk. küld, akkor a célprocesszus ne tehesse ugyanazt.
Könyvtári eljárások vannak rendszerhívásokhoz és az összes olyan C függvényhez, A fenti megszorításokon túl a M INIX 3-ban egy új notify üzenetprimitív látja el
amelyeket a POSIX szabvány megkövetel, ilyenek a formázott beviteli és kivi­ azoknak a helyzeteknek a kezelését, amelyekben egy üzenetet kell küldeni „felfe­
teli függvények, a printf és scanf A standard M INIX 3-konfigurációban van egy lé” (upstream ) irányban. A notify blokkolódik, és az értesítés tárolódik, amikor a
háttértáras démon, az Ipd, amely az Ip paranccsal átadott állományokat tárolja címzett közvetlenül nem elérhető. Ebben a fejezetben a M INIX 3-eszközmeghaj-
és nyomtatja. A szabványos M INIX 3-szoftvertermékek tartalm aznak olyan dé­ tók vizsgálatánál látni fogjuk, hogy a notify használata jelentős.
monokat is, amelyek számos hálózati funkciót támogatnak. Ebben a könyvben A másik módszer, amivel a holtpont megelőzhető, a zárolás. Az eszközök és
leírt M INIX 3-konfiguráció tám ogatja a legtöbb hálózati műveletet, az összes állományok zárolása az operációs rendszer tám ogatása nélkül is lehetséges. Egy
olyat, ami ahhoz kell, hogy indításkor elérhetők legyenek a hálózati szerverek és állománynév úgy viselkedik, mint egy helyes globális változó, amelynek a jelenlé­
meghajtók az E thernet-adapterek számára. A terminálm eghajtó újrafordítása tét vagy hiányát az összes többi processzus érzékelheti. A M INIX 3-rendszerben
pszeudo-terminálokkal és soros vonalak alkalmazásával bővíti a távoli term iná­ és a legtöbb Unix-rendszerben is általában van egy /usr/spoolllocks/ nevű speciá­
280 3. BEVITEL/KIVITEL 3.5. BLOKKOS ESZKÖZÖK A MINIX 3-BAN 281

lis könyvtár, amelybe a processzusok elteszik a zárolási állományokat, megjelöl­ A régebbi MINIX-verzióknál a CD-ROM -m eghajtó még elkülönülve volt je ­
ve így minden használatban levő erőforrást. A M INIX 3-fájlrendszer a POSIX- len, amivel szükség esetén bővíteni lehetett. M a m ár elképzelhetetlen különálló
féle állományzárolást is támogatja. D e ezeknek a mechanizmusoknak egyike sem CD-ROM -m eghajtó. Különböző meghajtócégek szabadalmazott interfészeinek
kényszeríthető ki. Csak a processzusok helyes viselkedésében lehet bízni, ugyanis tám ogatása szükséges, de a modern CD-ROM -m eghajtók rendszerint felcsatolha-
nincs semmi megelőző védelem arra, hogy egy program m egpróbáljon használni tók az IDE-vezérlőhöz, bár a notebook számítógépeken néhány C D -R O M USB
egy másik processzus által zárolt erőforrást. Ez a módszer nem azonos az erőfor­ csatlakozású. A M INIX 3 teljes verziója tám ogatja a merevlemez-eszközmeghaj­
rások megszakított használatával, mivel nem gátolja meg az első processzust, hogy tót, beleértve a CD-ROM -ot, viszont ebben a könyvben mi kivettük a CD-ROM -
folytassa az erőforrás használatát. Más szavakkal, nem érvényesül a kölcsönös ki­ tám ogatást a meghajtóból.
zárás feltétel. Egy helytelenül viselkedő processzus ilyen ténykedésének eredm é­ Természetesen minden blokkos eszközmeghajtónak végre kell hajtania néhány
nye valószínűleg valami zagyvaság, de m indenesetre nem lesz holtpont. beállítást. A RAM-lemezmeghajtónak bizonyos mennyiségű mem óriát le kell
foglalnia, a merevlemez-meghajtónak meg kell határoznia a merevlemezhardver
param étereit, és így tovább. A hardverspecifikus beállítások miatt valamennyi le­
mezmeghajtó egyedenként van mcghíva. M iután végrehajtották a szükséges be­
3.5. Blokkos eszközök a MINIX 3-ban állításokat, mindegyik meghajtó meghívja a főciklusát tartalm azó függvényt. Ez
a ciklus vég nélkül fut; a hívóhoz nincs visszatérés. Amikor a főcikluson belül egy
A M INIX 3 különféle blokkos eszközöket támogat, így először ezek közös jellem ­ üzenet érkezik, akkor egy olyan függvényhívás történik, amely függvény elvégzi az
zőit vesszük szemügyre. Ezt követi a RAM-lemez, a merevlemez és a hajlékony- üzenetben kívánt műveletet, és egy válaszüzenetet generál.
lemez vizsgálata. Mindegyik más okból érdekes. Vizsgálódásainkhoz példaként A mindegyik lemezmeghajtó processzus által hívott közös főciklus akkor kerül
nagyon jó a RAM-lemez, mivel rendelkezik a blokkos eszközök minden tulaj­ lefordításra, amikor a drivers/libdriver/driver.c és a többi állomány a könyvtárában
donságával általában, a tényleges I/O-t kivéve - ugyanis ez a „lemez” valójában a le van fordítva, és a driver.o tárgykód egy m ásolata utána van kapcsolva mindegyik
m em ória egy része. Egyszerűsége alkalmassá teszi, hogy vele kezdjünk. A merev­ lemezmeghajtó végrehajtható állományában. Valamennyi meghajtó azt a techni­
lemeznél látható, hogy milyen egy valódi lemezmeghajtó. Azt várhatnánk, hogy kát követi, hogy átad a főciklusnak egy param étert, amely egy m utatót tartalm az
a hajlékonylemez tám ogatása könnyebb, mint a merevlemezé, ez azonban nem azon függvények címeinek egy táblázatára, amelyeket a meghajtó az egyes műve­
így van. A hajlékonylemez m inden részletének vizsgálatára nem térünk ki, de rá­ letekhez használ, és ezután közvetve hívja ezeket a függvényeket.
m utatunk számos, a hajlékonylemez-meghajtóban lévő bonyodalomra. H a a m eghajtók egyetlen futtatható állományba fordítódnának le, akkor a
Előretekintve, a blokkos m eghajtók vizsgálata után foglalkozunk a terminál- főciklusnak csak egyetlen m ásolatára lenne szükség. A M INIX korai változa­
billentyűzet + megjelenítő) meghajtóval, ami fontos tartozéka minden rendszer­ tában olyan kód volt írva, amelyben az összes m eghajtó együtt volt fordítva. A
nek és jó példa a karakteres eszközmeghajtókra. M INIX 3-ban hangsúlyt helyeznek az egyedi, amennyire lehetséges, független
Az egyes alfejezetekben a megfelelő hardvert és a meghajtó mögötti szoftverel­ operációsrendszer-kom ponensekre, bár az elkülönülő program ok számára a kö­
veket írjuk le, áttekintést adva a megvalósításról és magukról a kódokról. Ez a tár­ zös forráskód használata a megbízhatóság növelésének jó módja. Feltéve, hogy
gyalásmód az alfejezeteket hasznos olvasmánnyá teszi még azon olvasók számára ha egyszer valamit rendbe hozunk, az jó lesz m inden meghajtó számára. Vagy ha
is, akiket a kódok részletei nem érdekelnek. az egyik alkalmazásban találnak egy hibát, akkor más alkalmazásokban is létezhet
észrevétlenül. Épp ezért az osztott forráskódot nagyon alaposan tesztelni kell.
A többszörös eszközmeghajtóknál ténylegesen hasznos egyéb függvényeknek
3.5.1. Blokkos eszközmeghajtók áttekintése a M INIX 3-ban egy halmaza a drivers/libdriver/dtvlib.c-ben van definiálva, és a drvlib.o teszi ezeket
elérhetővé. Az összes szolgáltatott tevékenységről feltehető, hogy egyetlen állo­
M ár korábban említettük, hogy az összes I/O-meghajtó főeljárásai hasonló szer­ mányban van, de ezek nem mindegyike szükséges m inden eszközmeghajtónak.
kezetűek. A M INIX 3-ban mindig legalább két darab blokkos eszközmeghajtó Például a memory meghajtó, amely egyszerűbb, mint a többi meghajtó, csak a
a rendszerbe van fordítva: a RAM-lemezmeghajtó és/vagy a különféle m erevle­ drive.o-hoz kapcsolódik. Az a tjv in i meghajtó mind a driver.o-, mind a drvlib.o-hoz
mez-meghajtók közül egy, vagy pedig egy hajlékonylemez-meghajtó. Rendszerint kapcsolódik.
három darab blokkos eszköz van - mind a hajlékonylemez-meghajtó, mind pedig A 3.19. ábrán a főciklusnak egy vázlata látható; formailag a 3.18. ábrán lévőhöz
egy IDE (Integrated Drive Electronics - integrált meghajtóelektronika) merevle­ hasonló. Az olyan utasítások, mint a
mez-meghajtó is jelen van. Mindegyik blokkos eszköz meghajtója függetlenül van
fordítva, de a forráskód egy közös könyvtára megosztott számukra. code = (*entry_points->dev_read)(&mess);
282 3. BEVITEL/KIVITEL 3.5. BLOKKOS ESZKÖZÖK A MINIX 3-BAN 283

közvetett függvényhívások. Mindegyik meghajtó esetén más-más dev_read függ­ rendszer az adatokat kim ásolta a kiíráshoz. A z O PEN és a C LO SE jele n tése az
vényhívás történik, jóllehet mindegyik meghajtó egy főciklust hajt végre, amely eszk özök nél h asonló az állom ánym űveletként alkalm azott open és close rendszer-
ugyanabból a forrásfájlból van fordítva. Azonban néhány művelet, mint például a hívásokéhoz: az OPEN m űveletnek ellen őrizn ie kell az eszköz hozzáférh etőségét,
close annyira egyszerű, hogy egynél több eszköz is ugyanazt a függvényt hívja. vagy ellen k ező esetb en egy h ib aü zen etet kell visszaadnia; egy CLOSE-nak garantál­
Van hat olyan lehetséges művelet, amelyet mindegyik eszközmeghajtótól meg­ nia kell, hogy bárm ely olyan pufferezett adat, am elyet a hívó ki akart írni, teljesen
követelhetünk. Ezek megfelelnek azoknak a lehetséges értékeknek, amelyek a átm ozgatásra kerüljön az eszk özön lévő v ég ső helyre.
3.17. ábrán látható üzenet m .m jy p e mezőjében előfordulhatnak. A műveletek a Lehet, hogy az IO C TL művelet nem olyan ismerős. Sok I/O-eszköz rendelke­
következők: zik műveletparam éterekkel, amelyeket alkalm anként vizsgálni és term észetesen
változtatni kell. Az IO C TL ilyen. Egy szokványos feladat az átviteli sebesség vagy
1. OPEN egy kommunikációs vonal paritásának megváltoztatása. Blokkos eszközöknél az
2. CLOSE IO C TL műveletek kevésbé megszokottak. A M INIX 3-ban az IO C TL művelettel
3. REA D történik a particionált lemezes eszközök vizsgálata és megváltoztatása (bár ez csu­
4. W RITE pán egy blokknyi adat írását és olvasását jelenti).
5. IOCTL Nem kétséges, hogy a SC ATTERED IO művelet a legkevésbé ismert ezek kö­
6. S C A T T E R E D IO zött. A kim ondottan gyors lemezes eszközökkel (például RAM-lemez) nehéz elér­
ni megfelelő lemez I/O-teljesítményt, ha m inden lemezes kérés egyszerre csak egy
Ezek legtöbbjét valószínűleg az olvasók programozási tapasztalatukból m ár jól is­ blokkra vonatkozik. Egy SC ATTERED IO megengedi a fájlrendszernek, hogy egy
merik. Az eszközmeghajtók szintjén a legtöbb művelet az azonos nevű rendszerhí­ kérésre több blokk írását vagy olvasását elvégezze. Egy R EAD művelet esetében
vásokhoz kapcsolódik. Például vegyük a R EAD és a W RITE műveleteket, amelyek lehet, hogy a járulékos blokkokat nem kéri az a processzus, amelynek a nevében
jelentése: olvasás és írás. Ezeknél a műveleteknél egy blokknyi adat átmozgatása a hívás történt; az operációs rendszer megkísérel elébe menni a jövőbeni adatké­
történik az eszközről a hívást beindító processzushoz tartozó memóriahelyre, vagy réseknek. Ilyen kéréseknél az eszközmeghajtó nem fogadja el szükségszerűen az
fordítva. Egy R EAD művelet normálisan addig nem ad vissza semmi eredményt a összes átviteli kérést. Az egyes blokkokra vonatkozó kérést egy jelzőbittel lehet
hívónak, amíg az adatok átmozgatása tart, azonban az operációs rendszer mozgat­ módosítani, ami jelzi az eszközmeghajtónak, hogy a kérés elhagyható. Valójában
hatja az adatokat pufferelve egy W RITE esetében, azért, hogy későbbre halassza a fájlrendszer mondhatja: „Szép dolog lenne m indezeket az adatokat birtokolni,
a tényleges átmozgatást, és azonnal visszatér a hívóhoz. Ez nagyszerű, amíg a hívó de ebben a pillanatban nincs szükségem rájuk.” Az eszköz azt tehet, ami a legjobb
is be van ebbe avatva; később újra használható az a puffer, amelyből az operációs neki. A hajlékonylemez-meghajtó például visszaadja az egyetlen pályáról kiolvas­
ható összes blokkot, és hatásosan azt mondja: „Ezeket neked adom, de túl sokáig
message mess; /* üzenetpuffer */ tart egy másik pályára való átmozdulás; később ismét kérj meg a fennm aradottak
átadására.”
void shared_io_driver(struct driver_table *entry_points) { Amikor adatot kell írni, akkor nem kérdéses, hogy minden körülmények között
/* a hívás előtt mindegyik meghajtó kezdeti beállítása megtörténik */ írni kell. Azonban az operációs rendszer több írási kérést pufferelhet abban a re­
while (TRUE) { ményben, hogy több blokk írása hatékonyabban végezhető el, m intha az egyes ké­
receivefANY, &mess);
réseket a beérkezésükkor kezelné. Egy SC A T T E R E D JO kérésben, akár írás vagy
caller = mess.source;
olvasás esetében, a kért blokkok listájának rendezésével a művelet hatékonyab­
switch(mess.type) (
ban elvégezhető, m intha a kérésekkel azonnal foglalkozna. Továbbá azáltal, hogy
case READ: rcode = (*entry_points->dev_read)(&mess); break;
case WRITE: rcode = (*entry_points->dev_write)(&mess); break;
a meghajtó egyetlen hívásra több blokkot mozgat át, a M INIX 3-ban csökken az
/* egyébként, beleértve az OPEN, a CLOSE és IOCTL esetét is */ elküldött üzenetek száma.
default: rcode = ERROR;
}
mess.type = DRIVER_REPLY; 3.5.2. Közös blokkos eszközmeghajtó szoftver
mess.status = rcode; /* eredmény kódja */
send(caller, &mess); Az összes blokkos eszközmeghajtó számára szükséges definíciókat a drivers/
} libdriver/driver.h-bán helyezték el. Az állomány legfontosabb része a 10829-10845.
} sorokban elhelyezkedő dríver adatszerkezet, amelyet bizonyos m eghajtók arra
3.19. ábra. Egy l/O-meghajtó főeljárása közvetett hívásokkal használnak, hogy a munkájukat alkotó egyes részek elvégzésére használt függ­
284 3. BEVITEL/KIVITEL 3.5. BLOKKOS ESZKÖZÖK A MINIX 3-BAN 285

vények címeinek listáját átadják. Szintén itt van definiálva a device adatszerkezet két. Régebbi gépeken, amelyek a m em óriát csak 1 MB-ig tudják címezni, a DMA-
(10856-10859. sor), amiben a partíciókra, a kezdőcímekre és a m éretre vonatko­ cím alacsonyabb helyi értékű 16 bitje a 8237A-ba kerül, míg a magasabb helyi ér­
zó legfontosabb információ kerül bájtegységekben megadásra. Ezt az elhelyezési tékű 4 bit egy speciális 4 bites tárolóelem be (latch) kerül. Az újabb gépek 8 bites
m ódot azért választották, hogy ne legyen szükség semmi átalakításra, amikor a speciális tárolóelem et használnak, és 16 M B-ot tudnak címezni. Amikor a 8237A
munkavégzés m emóriabeli eszközzel történik, maximális válaszadási sebességnél. a OxFFFF-ről a OxOOOO-re vált, akkor nem jön létre semmi átvitel a speciális tá­
A valóságos lemezek esetében oly sok más ok késlelteti az elérhetőséget, hogy a rolóegységben, és így a DMA-cím hirtelen a mem óriának 64 KB-tál kisebb című
szektorokba való átalakítás nem jelent lényeges hátrányt. részére ugrik.
A főciklus és az összes blokkos eszközmeghajtó közös függvényeinek forráskód­ Egy hordozható C program nem képes egy adatstruktúrához abszolút címeket
ja a driver.c-ben van. Az esetleg szükséges hardverspecifikus beállítások elvégzése m eghatározni, így nincs mód annak megelőzésére, hogy a fordító a puffért hasz­
után mindegyik meghajtó a driverjask-ot hívja, és hívásparam éterként átad egy nálhatatlan helyre tegye. Ennek kiküszöböléséhez ki kell jelölni bájtoknak kétszer
driver adatszerkezetet. A DM A-műveletekhez használt puffer címének kijelölése olyan nagy vektorát, mint am ekkora a bujfer-nél van (11044. sor), és e vektor ak­
után a főciklusba (11071-11120. sor) való belépés következik. Ez a ciklus vég nél­ tuális elérésére egy tm p_buf (11045. sor) m utatót kell lefoglalni. Az init_buffer a
kül fut; a hívóhoz nincs visszatérés. tmp_buf-nak a buffer elejére történő próba jellegű beállítását végzi, és megnézi,
A főciklus switch m űveletében az első öt üzenettípus, a D E V O P E N , DEV_ hogy van-e elegendő hely a 64 KB-os határig. H a a próbabeállítás nem biztosít
CLOSE, D E V JO C T L , D E V CANCEL, D E V SE L E C T esetében közvetett hívá­ elegendő helyet, akkor a tmp_buf-1 növeli az aktuálisan kért bájtok számával. így
sokra kerül sor, amelyek a driver adatszerkezetben átadott címeket használják. A bizonyos mennyiségű hely mindig kárba vész a buffer-hez lefoglalt hely egyik vagy
D E V R EAD és D E V WRITE üzenetek mindegyikénél a do_rdwt közvetlen hívása másik végénél, de nem következik be hiba amiatt, hogy a puffer nem veszi figye­
történik; D E V G ATHER és D EVJSCATTER üzenetek mindegyikénél a do_vrdwt lembe a 64 KB-os határt.
közvetlen hívása történik. Azonban a switch részből való akár közvetett, akár köz­ Az IBM PC család újabb számítógépei m ár jobb DMA-vezérlőkkel rendel­
vetlen hívásokkal param éterként átadódik a driver adatszerkezet, és így azt min­ keznek, így a kód egyszerűsíthető, és a memória egy kis része is visszavehető, ha
den hívott rutin használni tudja, ha szüksége van rá. A d o jd w t és a do vrdwt némi valaki egészen biztos abban, hogy a gépében az iménti problém a nem állhat elő.
előzetes feldolgozást végez, viszont ezután ezek is indirekt hívásokat végeznek az Viszont ha mégis tévedne, akkor szembe kell néznie a jelentkező hibákkal. Ha
eszközspecifikus eljárásokhoz. egy 1 KB-os DM A-pufferre van igény, akkor 1 a 64-hez a valószínűsége annak,
A többi eset, a H A R D J N T , SYS_SIG és a SY N A L A R M mind felelősek a nyug­ hogy egy régi DMA-lapkás gépen a problém a megjelenik. M inden alkalommal,
tázásokért. Ezek szintén közvetett hívásokban jelentkeznek, de mindegyik befeje­ amikor a kernelszintű forráskódjában módosítás történik úgy, hogy a lefordított
ződése után egy continue utasítás van. Ennek hatására a vezérlés visszatér a ciklus kernelbeli m éret változik, akkor van esély arra, hogy a problém a előforduljon. A
elejére, kikerülve a tisztogatást és a válaszüzenet-lépéseket. legvalószínűbb, hogy amikor a hiba a következő hónapban vagy a következő évben
Bármi is volt az üzenetben levő kérés, annak végrehajtása után az eszköz jelentkezik, akkor ezt annak a kódnak tulajdonítják majd, amit utoljára módosí­
term észetétől függően szükségessé válhat bizonyos tisztogatás. Egy hajlékonyle­ tottak. Az ehhez hasonló, váratlan hardversajátosságok okozhatnak olyan rend­
mez esetében például valószínű, hogy egy időm érő elindítására kerül sor, és ha kívül homályos hibákat, amelyek megtalálása heteket vehet igénybe (ráadásul a
egy adott rövid időn belül további kérés nem érkezik, akkor a lemezmeghajtó mo­ felhasználói kézikönyvek egy szóval sem tesznek említést ezekről).
torja kikapcsolódik. Egy közvetett hívással történik ez is. A tisztogatást követően A következő függvény a driver.c-ben a d o jd w t (11148. sor). Ez sorjában hív­
egy válaszüzenet kialakítására és a hívóhoz való küldésére kerül sor (11113-11119. hat kettő eszközfüggetlen függvényt, amelyekre a driver adatszerkezet dr jjrepare,
sor). Lehetséges, hogy egy eljárás az üzenettípusok egyikét kiszolgálja, és értékül drjransfer mezői m utatnak. Itt és a következőkben a C nyelvi (*function_pointer)
egy EDONTREPLY-t eredményez, hogy elfojtsa a válaszüzenetet, de az aktuális jelölést használjuk arra a függvényre, amelyre a function_pointer mutat.
m eghajtók egyike sem használja ezt az opciót. A kérésben levő bájtmennyiség pozitív voltának vizsgálata után a d o jd w t meg­
Mindegyik taszk első dolga a főciklusba lépés után, hogy hívja az init_buffer-1 hívja a (*drj>repare)-t. Ez a művelet betölti a device struktúrában elérhető le­
(11126. sor), ami kijelöl egy puffért a DMA-műveletekhez. Az, hogy ez a kezdeti mezek, partíciók vagy részpartíciók báziscímét és m éretét. A m emóriameghajtó
beállítás mégis szükséges, az eredeti IBM PC-hardverének azon tulajdonságából esetében, mivel ez nem tám ogatja a partíciókat, csak a mellékeszközszám érvé­
származik, amely megköveteli, hogy a DM A puffer ne lépje át a 64 KB-os határt. nyességét ellenőrzi. A merevlemeznél a mellékeszközszám használható a mellék-
Azaz egy 1 KB-os DMA-puffer kezdődhet 64510-nél, de nem 64514-nél, mivel az a eszközszámmal megjelölt partíció vagy részpartíció m éretének kiszámításához.
puffer, amely az utóbbi címnél kezdődne, a 65536-nál m eghaladná a 64 KB határt. Ennek sikerülnie kell, m ert a *drjirepare csak akkor sikertelen, ha egy open m ű­
Ez a zavaró szabály azért kell, m ert az IBM PC egy régi DM A lapkát, az Intel veletben érvénytelen eszközt adtak meg. Következő egy io v e c j struktúra (amely a
8237A-t használja, amelynek 16 bites a számlálója. Egy nagyobb számláló kellene, 2856-2859. sorban van definiálva az include/minix/type.h-bán), az iovecl feltöltése.
m ert a DM A abszolút címeket használ, nem szegmensregiszterhez relatív címe­ Ez a struktúra megadja a lokális puffer virtuális címét és m éretét, amelybe vagy
286 3. BEVITEL/KIVITEL 3.5. BLOKKOS ESZKÖZÖK A MINIX 3-BAN 287

amelyből az adatot a rendszertaszk másolja. Azonos struktúra van használva, mint tok számát, és bár a driverJ a s k által kialakított válaszüzenetben közvetlenül nincs
a kérésvektor egy eleme a több-blokkos hívásnál. Egy változó címe és az azonos tí­ visszaadva az egyes kérések teljes bájtigénye, ehhez a hívó hozzáfér a vektorból.
pusú változó egy tömbje első elem ének a címe pontosan azonos m ódon kezelhető. A driver.c következő néhány rutinja segíti a fenti műveleteket. A (*drjiam e) hí­
Ezután egy másik közvetett hívás, a (*dr-transfer) jön, amely végrehajtja az adat­ vás visszaadja az eszköz nevét. H a az eszköz neve nincs meghatározva, a n o jia m e
másolást és a kért I/O-műveleteket. Az átvitelkezelő eljárások mindegyike elvárja, függvény visszaadja a „nonam e” sztringet. Vannak olyan eszközök, amelyek egy
hogy megkapja a kérések egy tömbjét. A do-rdwt-ben az utolsó argumentum a hí­ adott szolgáltatást nem kérnek, például a RAM-lemez nem igényel semmiféle spe­
vásnál az 1, ami egyelemű töm böt ad meg. ciális szolgáltatást a DEV_CLOSE kérésnél. A d o jio p a kérés típusától függően
A következő részben a lemezhardver tárgyalásánál látni fogjuk, hogy a kérések különféle kódokat ad vissza. További függvények a nopjignal, a nopjilarm , a
beérkezési sorrendben való megválaszolása nem hatékony módszer, így ez a rutin nopj>repare, a n o p jlea n u p és a n o p ja n c e l függvények látszólagos rutinok olyan
megengedi az egyes eszközöknek, hogy az eszköz tulajdonságából adódó legked­ eszközök számára, amelyek nem igénylik ezeket a szolgáltatásokat.
vezőbb módon kezeljék a kéréseket. Az egyes eszközökre jellemző módok a közve­ Végül a do_diocntl (11216. sor) elvégzi a D E V IO C TL kéréseket egy blokkos
tett hívásokon keresztül maszkolódnak. A RAM-lemeznél a drjransfer egy olyan eszköznél. Egy D E V IO C TL művelet partíciós információra vonatkozó olvasási
eljárásra mutat, amely egy kernelhívással a rendszertaszkot arra kéri, hogy másol­ (DIOCGETP) vagy írási (DIOCSETP) kérés lehet, egyébként hiba keletkezik. A
ja az adatot a fizikai m emória egyik részéből a másikra, ha a mellékeszközszám dojliocntl hívja az eszköz (*dr_prepare) függvényét, amely ellenőrzi az eszköz ér­
elérhető a Idevlram, a /dev/mem, a /dev/kmem, a Idev/boot vagy a /dev/zero valame­ vényességét, és egy m utatót ráállít a device adatszerkezetre, amely tartalmazza a
lyikében. (Természetesen semmi másolás nincs a /dev/null elérésénél.) Egy valódi partíció kezdetét és bájtokban a méretet. Olvasási kéréskor meghívja az eszköz
lemeznél a drjransfer-re m utató kódnak szintén a rendszertaszkot kell kérnie egy (*dr_geometry) függvényét, hogy megkapja a partíció cilinder-, fej- és szektorinfor­
adatátvitelre. De a másolási művelet előtt (egy olvasásnál) vagy utána (egy írás­ mációját. Minden esetben egy sys_datacopy kernelhívással kérhető a rendszertaszk­
nál) egy kernelhívással kell kérni a rendszertaszkot, hogy az aktuális I/O-t végezze tól, hogy az adatot másolja a meghajtó és a kérő processzus memóriahelyei között.
el; a lemezvezérlő részben levő regiszterekbe megfelelő bájtok írásával válassza ki
a lemezen a helyet; és határozza meg az átvitel m éretét és irányát.
Az átviteli eljárás az iovecl struktúrában levő io v jiz e számlálót módosítja; 3.5.3. A meghajtó könyvtára
hibakódot (egy negatív számot) ad vissza, ha volt hiba, vagy egy pozitív számot,
amely az átm ozgatott bájtok számát jelzi. Nem feltétlenül hiba, ha egyetlen bájt A drvlib.h és a drvlib.c állományokban az IBM PC-kompatibilis számítógépek le­
átmozgatása sem történik meg; ez azt jelzi, hogy elérte az eszköz végét. A főciklus­ m ezeinek particionálását támogató, rendszerfüggő kódok vannak.
hoz visszatérve a válaszüzenet R E P S T A T U S m ezejében hibakód vagy bájtszám A particionálással egyetlen tárolóeszköz szétbontható részeszközökké. A legis­
van visszaadva a driverJ a s k -ból. m ertebb a merevlemezek esete, de a M INIX 3 támogatja a hajlékonylemezeknél is
A következő függvény a d o jr d w t (11182. sor) kezeli az összes széttagolt I/O- a particionálást. Néhány szempont, am iért a lemezes eszközöket particionálják:
kérést. Egy üzenet széttagolt I/O-kéréssel az A D D R E SS mezőt használja az
io v e c j adatszerkezetek egyik töm bjének az elérésére, amelyek mindegyike egy 1. Nagy lemezekben olcsóbb az egységnyi lemezkapacitás. Két vagy több ope­
puffercímet és az átmozgatandó bájtok számát tartalmazza. A M INIX 3-ban ilyen rációs rendszernek különböző fájlrendszerekkel való használata során sokkal
kérés csak a lemezen levő összefüggő blokkokra vonatkozhat; az üzenetben benne gazdaságosabb egyetlen nagy lemezt particionálni, mint az egyes operációs
van a kiindulási pozíció az eszközön, és hogy írás vagy olvasás a művelet. így egy rendszerek számára több kisebb lemezt üzembe helyezni.
kérésben levő összes művelet vagy olvasás, vagy írás lesz, az eszközön levő blok­ 2. Az operációs rendszereknek az általuk kezelhető eszközök m éretében kor­
kok sorrendjébe rendezve. A 11198. sorban található ellenőrzés megnézi, hogy ez látozottak a lehetőségeik. A jelenlegi vizsgálatainkban szereplő M INIX
a hívás egy kernelszintű I/O-taszk érdekében van-e; ez egy maradvány a M INIX 3 3-változat például 4 GB-os fájlrendszert kezelhet, de a régebbi változatoknál
egy korai fejlesztéséből, mielőtt az összes lemezmeghajtó felhasználói szintűre lett ez a határ 256 MB. így az e feletti lem ezterület kárba vész.
átírva. 3. Egy operációs rendszer használhat két vagy több különböző fájlrendszert.
Alapvetően ennek a műveletnek a kódja nagyon hasonlít ahhoz, amit egysze­ Például egy szabványos fájlrendszer használható a szokásos állományokhoz
rű olvasáskor vagy íráskor végrehajt. Ugyanazok a közvetett hívások vannak az és egy másként felépített fájlrendszer a m emóriacsere (swap) helyeként.
eszközfüggetlen (*drj>repare)-re és a (*drjransfer)-re. A többszörös kéréseket a 4. Kényelmes megoldás lehet, ha a rendszer állományainak egy része külön lo­
ciklus a (*drjransfer) által m utatott függvénnyel belsőleg kezeli. Az utolsó argu­ gikai eszközre kerül. A M INIX 3 gyökérfájlrendszerének egy kis eszközre
mentum ez esetben az 1; ez az io v e c j elemek tömbmérete. A ciklus befejeződése való helyezésével könnyebbé válik a mentés, és elősegíti indításkor a RAM-
után visszamásolódik a kérések vektora oda, ahonnan jött. A vektor mindegyik lemezre való másolást.
kom ponensének io jiz e mezője m utatja a kérésnek megfelelően átm ozgatott báj­
288 3. BEVITEL/KIVITEL 3.6. R A M - L EM EZ E K 289

A lemezparticionálás tám ogatása megegyezés kérdése. Ez a tulajdonság nem táblázatot, vagy valami más okból adódóan a lemezen a táblázatban szemét is le­
kötődik a hardverhez. A particionálás tám ogatása eszközfüggetlen. Azonban, ha het. Mi a bizalmunkat a M INIX 3 szerint kiszámított számokba helyezzük. Jobb a
egynél több operációs rendszer fut egy adott hardverkiépítettség mellett, akkor biztonság, mint az utólagos sajnálkozás.
meg kell egyezni a partíciós táblázat formátum ában. IBM PC-ken a szabványt Még a cikluson belül, az eszközön az összes partíció esetében, ha a partíció
az MS-DOS fdisk parancsa állítja be, és a többi OS-rendszer, mint a M INIX 3, M INIX 3-partícióként azonosított, akkor a partidon függvény hívódik rekurzívan,
a Windows és a Linux, ezt a form átum ot használva együtt tudnak létezni az MS- hogy a részpartíciók információit összegyűjtse. H a a partíció egy kiterjesztett par­
DOS-szal. Amikor egy másik géptípushoz kapcsolódik a M INIX 3, akkor értelem ­ tíció, akkor a következő függvény, az extpartition hívása történik.
szerűen egy olyan partíciós táblázatform átum ot használ, amely kompatibilis az új Az extpartition (11501. sor) függvény valójában a M INIX 3 operációs rendszer
hardveren futó másik operációs rendszer által használttal. így az IBM számítógé­ esetében nem tesz semmit, így ennek részleteivel itt nem foglalkozunk. Vannak
peken a particionálást tám ogató M INIX 3-forráskód driver_c helyett a drvlib.c-be operációs rendszerek (például Windows), amelyek kiterjesztett partíciókat hasz­
került, két okból. Először is, nem az összes lemeztípus támogatja a particionálást. nálnak. Kapcsolt listákat alkalmaznak a rögzített m éretű tömbök helyett a rész­
M int korábban m ár em lítettük, a memóriam eghajtó a driver.o-hoz kapcsolódik, partíciók támogatásához. A M INIX 3 az egyszerűség m iatt a részpartícióknál
nem használja a drvlib.o-ba fordított függvényeket. Másrészt ez könnyebbé teszi ugyanazt a módszert használja, mint az elsődleges partícióknál. Azonban felte­
a M INIX 3 kapcsolását a különböző hardverekhez. Könnyebb egy kis állományt hető olyan, a kiterjesztett partíciókra vonatkozó minimális támogatás, amely le­
elhelyezni, mint sok szekcióval egy nagyot szerkeszteni és a különböző környeze­ hetővé teszi, hogy a M INIX 3 parancsai más operációs rendszerek állományait és
tekben fordítani. könyvtárait olvashassák és írhassák. A műveletek könnyűek; sokkal bonyolultabbá
Az include/ibm/partition.h-bán definiált alap-adatstruktúra a ROM -beli szoft­ válna, ha feltételeznénk a teljes tám ogatását annak, hogy a kiterjesztett partíciók
verek (firmware) tervezőitől örökölt, és az #include utasítással ágyazható be a felcsatolása és egyéb használata ugyanolyan m ódon történne, mint az elsődleges
drvlib.h-ba (10900. sor). Ez információt tárol a partíciók cilinder-fej-szektor geo­ partícióknál.
metriájáról, valamint kódokat a partíciók fájlrendszertípusainak azonosítására és A get_part_table (11549. sor) meghívja a d o jd w t függvényt, hogy megkapja az
egy jelzőt a betölthetőség jelzésére. Ezen információk legtöbbjére nincs szüksége eszközön (vagy részeszközön) azt a szektort, ahol egy partíciós tábla van. A relatív
a M INIX 3-nak, miután egyszer a fájlrendszer m ár ellenőrzött. elhelyezkedés argum entum a nulla, ha a hívás egy elsődleges partíció megszerzésé­
A partidon függvény (drvlib.c-ben a 11426. sor) meghívására akkor kerül sor re van kiadva, és nem nulla egy részpartíció esetében. Ez ellenőrzi a bűvös számot
első alkalommal, mikor egy blokkos eszközt először nyitnak meg. Az argum en­ (0xaa55), és igaz vagy hamis állapotot ad vissza, jelezve az érvényes partíciós táb­
tum ok között ott van a driver adatszerkezet, így eszközfüggő függvényeket is la megtalálását. H a a tábla létezik, akkor az argum entum ként átadott táblacímre
hívhat, továbbá egy kezdeti mellékeszközszám és egy param éter, jelezve, hogy bemásolja azt.
a particionálás fajtája hajlékonylemez, elsődleges partíció vagy részpartíció. Ez Végül a sort (11582. sor) rendezi a belépési pontokat egy partíciós táblában a
hívja a (*dr_prepare) eszközfüggő függvényt, hogy ellenőrizze az eszköz érvényes­ legalacsonyabb szektor szerint. Azok a belépési pontok, amelyekhez nem tarto­
ségét, és beletegye a kezdőcímet és a m éretet a device adatszerkezetbe, amelyről zik partíció, a rendezésben nem vesznek részt, és a rendezettek végére kerülnek,
az előző szakaszban m ár szóltunk. Ezután hívja a get_part_table függvényt, hogy még ha nulla érték van is az alacsony szektorú mezőjükben. A rendezés egyszerű
megállapítsa, vajon egy partíciós tábla jelen van-e, és ha igen, akkor beolvassa. buborékrendezéssel történik; semmi szükség hatékonyabb algoritmus alkalmazá­
H a nincs semmi partíciós tábla, akkor a m unkát elvégezte. Egyébként kiszámítja sára egy csupán négy tételből álló rendezésnél.
az első partíció mellékeszközszámát, felhasználva az eredeti hívásban specifikált
particionálási fajtára alkalmazott alárendelt eszközök számozási szabályait. Az
elsődleges partíciók esetében a partíciós tábla úgy van rendezve, hogy a partíciók
rendezése megfelel a más operációs rendszereknél használtakkal. 3.6. RAM-lemezek
Ennél a pontnál a (*dr_prepare) függvény egy másik hívása is megtörténik; ez
alkalommal az első partíció újra kiszámított eszközszámának felhasználásával. H a M ost visszatérünk az egyes blokkos eszközmeghajtókhoz, és közülük többet rész­
a részeszköz érvényes, akkor egy ciklus hajtódik végre a tábla minden belépési letesen tanulmányozunk. Az első, amit megnézünk, a memóriameghajtó. Ezzel a
pontjára, ebben megvizsgálja az eszközön levő táblából beolvasott értékeket, hogy memória bármely része elérhető. Fő haszna, hogy megengedi a m em ória egy ré­
kívül esnek-e azon a tartományon, ami korábbról fennáll a kezdőcímre és a teljes szének lefoglalását és annak egy hagyományos lemezhez hasonló használatát; erre
eszköz m éretére. H a eltérés mutatkozik, akkor a tárban a táblázat kiigazítására itt m int RAM -lemezmeghajtóra fogunk hivatkozni. Nem nyújt állandó jellegű tá­
kerül sor úgy, hogy illeszkedjen. Ez meglepőnek tűnhet, de mivel a táblázatokat rolást, de az erre a területre bem ásolt állományok rendkívül gyorsan elérhetők.
különböző operációs rendszerek írhatják, és egy másik operációs rendszert hasz­ Egy RAM-lemez szintén hasznos az olyan számítógép operációs rendszerének
náló programozó esetleg megpróbálja valami szokatlanra használni a partíciós első telepítésekor, amelynek csak egy cserélhető tárolóeszköze van, például egy
290 3. BEVITEL/KIVITEL 3.6. RAM-LEMEZEK 291

hajlékonylemez, C D -R O M vagy valamilyen hasonló eszköz. A gyökéreszköznek a Főtár (RAM)


RAM -lemezen való elhelyezésével a cserélhető tárolóeszközök fel- és lecsatolha­
tok aszerint, hogy szükségesek-e a merevlemezre való adatátvitelhez. A gyökéresz­
közt a hajlékonylemezre helyezve lehetetlenné válik állományok hajlékonyleme­ Felhasználói
programok
zekre való mentése, mivel a gyökéreszköz (az egyetlen hajlékonylemez) nem lehet
lecsatolva. A RAM -lemezeket „élő” CD-RO M -ként is szokták használni, ami le­
hetővé teszi tesztelési vagy demonstrációs céllal az operációs rendszer futtatását
bármely állománynak a merevlemezre másolása nélkül. Ezen túlm enően a RAM- RAM-
ban elhelyezkedő gyökéreszköz a rendszert nagyon rugalmassá teszi: hajlékonyle­ lemez . A RAM-lemez 1. blokkja
mezek és merevlemezek tetszőleges kombinációja felcsatolhatók. Ilyen élő CD- ■A RAM 0. blokkját olvasók
ROM -on forgalmazzák a M INIX 3-at és sok más operációs rendszert. és írók használják ezt a memóriát
M ajd látni fogjuk, hogy a memóriam eghajtó számos egyéb tevékenységet is tá­ Operációs
rendszer
mogat a RAM-lemezzel kapcsolatban. A közvetlen m em ória elérése tám ogatott,
akár bájtonként, akár más egységenként. Ez a módszer inkább egy karakteres esz­
közé, mint egy blokkos eszközé. Egyéb memóriam eghajtó által tám ogatott karak­
teres eszköz a Idevlzero és a /dev/null, amelyek széles körben ismertek. 3.20. ábra. Egy RAM-lemez

foglalva. Minden egyes blokknak ugyanakkora a m érete, mint a valódi lemezeken


3.6.1. Hardver és szoftver a RAM-lemeznél levő blokkméret. Amikor a meghajtó kap egy blokk írásával vagy olvasásával kap­
csolatos üzenetet, akkor éppen csak ki kell számítani a kért blokk helyét a RAM-
A RAM-lemez hátterében megbúvó ötlet nagyon egyszerű. A blokkos eszköz egy lemez m emóriájában, és onnan máris lehet olvasni vagy írni a blokkot, hajlékony-
tároló két paranccsal: egy blokk olvasása és egy blokk írása. Szokásosan ezek a lemez vagy merevlemez alkalmazása helyett. Végül is a hívott rendszertaszk végzi
blokkok ciklikus elérésű tárolókon jelennek meg, például hajlékonylemezen vagy az átvitelt. A kernelben levőphys_copy assembly nyelvű eljárás dolgozik, másol a
merevlemezen. A RAM-lemez ezeknél egyszerűbb: a főtár előre lefoglalt részét felhasználói program ba vagy onnan, a hardver képessége szerinti maximális se­
használja a blokkok elhelyezésére. Egy RAM-lemez az azonnali elérés (semmi bességgel.
keresés vagy forgási késleltetés) előnyével rendelkezik, így alkalmas olyan progra­ Egy RAM -lemezmeghajtó tám ogathatja a memória több területének RAM-le-
mok és adatok tárolására, amelyek elérésére gyakran van szükség. mezként való használatát, közöttük a hozzájuk rendelt különböző mellékeszköz-
Itt érdem es röviden rám utatni azon rendszerek közötti különbségre, amelyek számmal téve különbséget. Általában ezek a területek eltérők, de néhány esetben
támogatják a fájlrendszerek csatolását, és amelyek nem (például az MS-DOS és a kényelmi okok miatt átlapoltak is lehetnek, m int ahogy a következő részben lát­
Windows). A felcsatolt fájlrendszereknél a gyökéreszköz mindig jelen van egy ál­ ható lesz.
landó helyen, és a cserélhető fájlrendszerek (például lemezek) felcsatolhatóak az
állományfájlba, és így kialakul egy egyesített fájlrendszer. H a egyszer m ár m inden­
nek m egtörtént a felcsatolása, akkor a felhasználó nem lesz gondban amiatt, hogy 3.6.2. A RAM-lemezmeghajtó áttekintése a MINIX 3-ban
melyik eszközön van egy állomány.
Ezzel ellentétben, az MS-DOS-os rendszereknél a felhasználónak valamennyi állo­ A M INIX 3 RAM-lemez valójában hat, egymáshoz szorosan kapcsolódó meghajtó.
mány helyét meg kell határoznia, vagy expliciten - például B:\DIR\FILE alakban Mindegyik beérkező üzenet meghatároz egy alárendelt eszközt; ezek a következők:
vagy bizonyos alapbeállítások felhasználásával (aktuális eszköz, aktuális könyvtár és
így tovább). Egy vagy két hajlékonylemez esetében ez a teher még kezelhető, de le­ 0:/dev/ram 2:/dev/kmem 4:/dev/boot
mezek tucatjaival rendelkező nagy számítógéprendszer esetén az eszközök nyomon l:/dev/m em 3:/dev/null 5:/dev/zero
követése egész idő alatt elviselhetetlen lenne. Jusson eszünkbe, hogy Unix operációs
rendszerek futnak a kis otthoni és hivatali számítógépektől a szuperszámítógépekig, A fenti felsorolásban az első speciális fájl, a Idev/ram egy igazi RAM-lemez. Sem
köztük az IBM Blue Gene/L szuperszámítógépen is, amely a könyv írásakor a leg­ a m érete, sem a kezdőpontja nincs a m eghajtóba beépítve. Ezeket a M INIX 3 indí­
gyorsabb gép a világon; az MS-DOS pedig csak kis rendszereken fut. tásakor a fájlrendszer határozza meg. H a az indítóparam éter specifikálja, hogy a
A 3.20. ábra felvázolja a RAM-lemez alapgondolatát. A RAM-lemez n darab gyökérfájlrendszer a RAM-lemezen van, de nem definiálják a RAM-lemez m ére­
blokkra van osztva, és n attól függ, hogy mennyi m emória van a lemez számára le- tét, akkor a gyökérfájlrendszerkép eszközének m éretével azonos m éretű RAM-
292 3. BEVITEL/KIVITEL 3.6. RAM-LEMEZEK 293

lemez van létrehozva. A gyökérfájlrendszer m éretétől eltérő RAM -lemezméret lementálva; ez a /dev/ram. Bárhogyan is, ez azt jelenti, hogy a kezdeti beállítás a
egy indítóparam éterrel adható meg; ez lehet nagyobb, de lehet tetszőleges olyan betöltési m em óriaképhez csatolt fájl m em óriába másolásával történik az init után,
érték, amely elfér a m em óriában, és elegendő helyet hagy a rendszer tevékenysé­ ahelyett hogy a m em ória egy üres blokkjával kezdődne, mint a /dev/ram esetében.
géhez, ha a RAM -ba a gyökérfájlrendszert nem kell bemásolni. A m éret ism ere­ Feltételezhető, hogy ilyen eszköztámogatásra csak a későbbiekben lesz szükség,
tében egy megfelelő nagyságú memóriablokk-kérés történik, amelyet a procesz- így a M INIX 3 nem alkalmazza.
szusvezérlő kivesz az inicializálás alatt a memóriából. Ezzel a módszerrel lehetővé Végül a memóriam eghajtó által tám ogatott utolsó eszköz, egy másik karakteres
válik a RAM -lemezként jelentkező mennyiség növelése vagy csökkentése anélkül, fájl, a /dev/zero. N éha kényelmes, ha egy zero forrással rendelkezünk. A /dev/zero-
hogy az operációs rendszert újra kellene fordítani. ra írás olyan, mint a /dev/null-ra írás: eldobja az adatot. De a /dev/zero olvasása
A következő két alárendelt eszköz olvassa és írja a fizikai mem óriát, illetve a nullát ad bármilyen kívánt mennyiségben, akár egyetlen karaktert, vagy egy teljes
kernel m em óriaterületét. A megnyitott és olvasó /dev/mem kiveszi a fizikai memó­ lemezt feltöltve.
riahelyek tartalm át, kezdve a nulla abszolút címtől (a valós m ódú megszakításvek­ A meghajtószinten a /dev/ram, /dev/mem, /dev/kmem, a /dev/boot kezelők kódja
torok). A szokásos felhasználói program ok soha nem teszik ezt, de egy hibakereső azonos. Az egyedüli különbség közöttük, hogy mindegyik a m emória más-más te­
rendszerrel rendelkező rendszerprogram nak szüksége lehet erre a lehetőségre. rületének felel meg, ez a ram-origin és ram-limit tömbökkel van jelezve, és m ind­
Megnyitva a /dev/mem-et és írva arra, a megszakításvektorok fognak megváltozni. egyik a mellékeszközszámmal indexelve. A fájlrendszer az eszközöket egy maga­
Szükségtelen is mondanunk, hogy mindezt csak azoknak a gyakorlattal rendelke­ sabb szinten kezeli, és azokat vagy karakteresnek, vagy blokkosnak ismeri fel, és
ző felhasználóknak szabad tenniük, akik tudják, hogy pontosan mit tesznek, és ne­ ennek megfelelően felcsatolja a /dev/ram-ot és a /dev/boot-ot, és kezeli az eszközö­
kik is a legnagyobb körültekintéssel kell dolgozniuk. kön levő könyvtárakat és állományokat. Karakteresként definiált eszköznél a fájl-
A /dev/kmem speciális fájl, hasonló a /dev/mem állományhoz, kivéve, hogy en­ rendszer csak folytonos adatot tud olvasni vagy írni (bár egy folytonos olvasás a /
nek az állománynak a nulla sorszámú bájtja most a kernel-adatm em ória nulla sor­ dev/null-ból csak EO F-ot ad).
számú bájtja, amely helynek az abszolút címe a M INIX 3-kernelbeli kódszegmens
m éretétől függően változik. Ezt is elsősorban a hibakereső és más, nagyon speciá­
lis program ok használják. Vegyük észre, hogy ez a két alárendelt eszköz átlapol- 3.6.3. A RAM-lemezmeghajtó megvalósítása a M INIX 3-ban
tan fedi le a RAM-lemez területét. H a például tudjuk pontosan a m em óriában a
kernel elhelyezkedését, akkor a /dev/mem állományt megnyitva megkereshetjük Más lemezmeghajtókhoz hasonlóan a RAM-lemezmeghajtó főciklusa is a driver.c
a kernel-adatterület kezdetét, és ugyanazokat a dolgokat láthatjuk, mint a /dev/ állományban van. A memory.c-ben a memóriaeszközök eszközfüggő támogatása
km em kezdetének olvasásakor. Azonban ha a kernelt újrafordítjuk, megváltoztat­ valósul meg. A memóriam eghajtó fordításakor adrivers/libdriver/driver.o nevű tárgy­
va a m éretét, vagy ha a M INIX 3 egy leszűkített változatában a kernel a memória fájlnak egy m ásolata elkészül a drivers/libdriver/driver.c fordítással, és ez van össze­
valamely más helyére került, akkor a /dev/mem-ben különböző mennyiségű helyet szerkesztve a drivers/memory/memory.o tárgyfájllal, ami a drivers/memory/memory.c
kell átkutatni, hogy láthassuk ugyanazt a dolgot, mint amit a /dev/kmem elején lát­ fordítás eredménye.
hatunk. M indkét speciális fájlt védeni kell: meg kell előzni, hogy a rendszergaz­ Érdem es megnézni, hogyan történik a főciklus fordítása. A driver.h-bán (10829-
dán kívül más is használja. 10845. sor) levő driver struktúra deklarációja definiálja az adatstruktúrát, de nem
A csoport utolsó állománya, a /dev/null, egy olyan speciális fájl, amely átvesz hozza azt létre. Az m_dtab deklaráció (11645-11660. sor) létrehoz egy példányt,
adatot és eldobja azt. A parancsértelm ező ezt használja, amikor a program olyan feltölti a struktúra m inden egyes részét egy függvénymutatóval. Néhány függvény
kim enetet állít elő, amelyre nincs szüksége. Például: általános kódjának fordítása a driver.c fordításakor történik, ilyen például a nop
összes függvénye. Vegyük észre, hogy a memóriam eghajtó belépési pontjai közül
a.out>/dev/null héthez vagy keveset csináló, vagy semmit sem csináló eljárás tartozik, az utolsó
kettő pedig N U L L-ként van definiálva (ez azt jelenti, hogy ezek a függvények so­
futtatja az a.out program ot, de eldobja a kimenetét. A RAM -lemezmeghajtó ha­ ha nem lesznek meghíva, még egy d o jio p sem szükséges). Mindez azt bizonyítja,
tásosan kezeli ezt az alárendelt eszközt, mivel a m érete nulla, és így semmi adat hogy a RAM-lemez műveletei nem különösebben bonyolultak.
nincs oda bemásolva vagy onnan kivéve. Ilyet olvasva egy azonnali EO F-t (End of A memóriaeszköz nem követeli meg nagyszámú adatstruktúrának vagy másnak
File, fájlvége) kapunk. a definícióját. Az m_geom[NR_DEVS] (11627. sor) tárolja a báziscímét és 64 bi­
H a valaki látta ezeknek az állományoknak a könyvtári bejegyzéseit a /dev/-ben, tes egészekként a hat memóriaeszköz m éretét, így a M INIX 3-nál nem fordul elő,
akkor észrevehette, hogy csak a /dev/ram a blokkos fájl. Az összes többi karakteres hogy ne rendelkezne elég nagy RAM-lemezzel. A következő sor más m eghajtók­
eszköz. A m emóriameghajtó még egy blokkos eszközt támogat, ez a /dev/boot. A z ban nem látható, érdekes struktúrát definiál. Az m_seg[NR_DEVS] látszólag egy
eszközmeghajtó nézőpontjából egy másik blokkos eszköz a RAM-ban van imp­ egészekből álló tömb, de ezek az egészek azt jelzik, hogy egy szegmensleírás meg­
294 3. BEVITEL/KIVITEL 3.6. RAM-LEMEZEK 295

található-e. A m em ória eszközmeghajtó a felhasználói szintű processzusok között A m egmaradó művelet egy olvasás vagy írás a /dev/zero-ra. Az adat olvasása a
szokatlan, mivel lehetővé tesz m em óriaterület-elérést a szokásos kód-, adat- és dev zero tömbből történik, mint m ár korábban em lítettük. M egkérdezheti vala­
veremszegmenseken kívül, amelyeket mindegyik processzus birtokol. Ez a tömb ki, hogy m iért nem generálódnak a nulla értékek, ahelyett hogy mindegyik egy
tárolja azt az információt, amely a kijelölt memóriabővítési terület elérését meg­ pufferből másolódik be. Mivel egy adat másolása egy adott helyre kernelhívással
engedi. Az m jievice változó tárolja az éppen aktív alárendelt eszköz ebben a vek­ történik, egy ilyen módszer vagy bájtok hatástalan másolását igényelné a m em ó­
torban levő indexét. riam eghajtótól a rendszertaszkokhoz, vagy a rendszertaszkban nullákat generáló
A /dev/ram-nak mint gyökéreszköznek a használatához a mem óriam eghajtót kódnak kellene lennie. Az utóbbi megközelítés növelné a kernelszintű kód bonyo­
nagyon korán, a M INIX 3 indításakor inicializálni kell. A következőként definiált lultságát, amit a M INIX 3 szeretne elkerülni.
kinfo és machine struktúrák az indítás alatt a kernelből kinyert adatot tárolják, A memóriacszköznél egy írás vagy olvasás művelet befejezéséhez nincs szük­
ami a memóriam eghajtó inicializálásához szükséges. ség a harmadik lépésre, így a megfelelő mJLtab-bán levő belépési pontoknál egy
M ielőtt a végrehajtható kód elkezdődik, egy másik adatstruktúra definiálása is n o p jin ish hívás van.
megtörténik. Ez a devzero, egy 1024 bájtos tömb, amely a /dev/zero-ra vonatkozó Egy memóriaeszköz megnyitását az m_doj>pen (11801. sor) végzi. A munka
read hívásnál gondoskodik az adatról. főrésze az m_prepare hívásával hajtódik végre, amely megvizsgálja a hivatkozott
A main főeljárás (11672. sor) egy függvényt hív a lokális inicializálás elvégzésére. eszköz érvényességet. Az itt levő kódnál azonban érdekesebb a M INIX régebbi
Ezután hívja a főciklust, amely üzeneteket kap, továbbküldi azokat a megfelelő el­ verzióiban itt található kódra vonatkozó megjegyzés. Előzőleg egy sajátosság volt
járásokhoz, és visszaküldi a válaszokat. A befejezéskor a main-hez nem tér vissza. itt elrejtve. Egy felhasználói processzus általi hívás, amely megnyitja a /dev/mem-
A következő függvény, az m-name triviális. Ez a „memory” karaktersorozatot et vagy /dev/kmem-et, varázslatos képességet adna a hívónak olyan parancsok
adja vissza, amikor hívják. végrehajtására, amelyek elérik az I/O-kapukat. A Pentium osztályú CPU-k négy
Olvasáskor vagy íráskor a főciklus három hívást kezdeményez: egyet, ami az jogosultsági szintet valósítanak meg, és a felhasználói processzusok szokásosan
eszközt előkészíti, egyet az aktuális adatátvitel elvégzésére és egyet a helyreállítás­ a legalacsonyabb jogosultsági szintnél futnak. A CPU egy általános védekezési
ra. Ezek közül egy memóriaeszköz esetében az első hívás m_prepare. Ez ellenőr­ m ódot generál, amikor egy processzus megpróbál egy parancsot nem a neki meg­
zi, hogy a kérés érvényes mellékeszközre vonatkozik-e, és utána visszaadja a kért engedett jogosultsági szinten végrehajtani. Ezt a módszert biztonságosnak tekin­
RAM -terület kezdőcímét és m éretét tároló adatszerkezet címét. A második hívás tették, mivel a memóriaeszközöket csak gyökér jogosultságú felhasználó érhette
m jra n sfer (11706. sor). Ez végzi az összes munkát. Ahogyan láttuk a driver.c-ben, el. Ez a potenciálisan kockázatos megoldás a M INIX 3-ból hiányzik, mivel azok a
az adatolvasásra vagy -írásra vonatkozó összes hívás átalakítódik többszörös, foly­ kernelhívások, amelyek engedik az I/O-elérést a rendszertaszkon keresztül, most
tonos adatblokkokat olvasó vagy író hívásokká - ha csak egy blokkra van szükség, rendelkezésre állnak. H a a M INIX 3 van kötve a hardverhez, amely m em órialeké­
a kérés akkor is többszörös blokkra vonatkozik egyértékű számlálóval. így az át­ pezésű I/O-t alkalmaz, akkor szükséges lehet egy ilyen konstrukció újrabevezetése.
vitelnek csak két fajtája jut a meghajtóhoz, a D E V G A T H E R -hez egy vagy több Az ezt végző függvény, az enablejop bennm arad a kernelkódban - hogy mutassa,
blokk olvasásakor, és a D E V S C A T T E R -hez egy vagy több blokk írásásakor. így hogyan volt ez kezelve -, bár most árvának érzi magát.
a mellékeszközszám ism eretében m jra n sfer egy ciklust indít el, amelyet a kért A következő függvény az m j n i t (11817. sor) hívására csak a m e m ja s k első
átvitelek számának megfelelően ismétel. A ciklusban van egy kapcsoló az eszköz meghívásakor kerül sor. Ez a rutin számos kernelhívást használ, és érdem es tanul­
típusára. mányozni, hogy lássuk, ahogyan a m eghajtók egymásra hatnak a kernelszinten ke­
A /dev/null esetében egy D E V G ATHER kérés vagy egy D E V SC ATTER kérés resztül a M INIX 3-ban, felhasználva a rendszertaszk-szolgáltatásokat. Először egy
eredménytelen, és a tevékenység közvetlenül a kapcsoló végére kerül. Ez az át­ sys_getkinfo kernelhívás történik, hogy a kernelhívás kinfo adatának egy másolata
mozgatott bájtok számát (bár ez a szám a /dev/null-nál nulla) úgy adja vissza, m int­ elérhető legyen. Ebből az adatból a /dev/kmem báziscímét és -m éretét az m_geom
ha egy write m űveletet végrehajtott volna. adatstruktúra megfelelő mezőibe másolja. Egy másik kernelhívás, a sys_segctl át­
Az összes valós memóriahelyre hivatkozó eszköztípusnál hasonló a tevékeny­ alakítja a /dev/kmem fizikai címét és m éretét a szegmensleíró információba, ami
ség. A kért hely ellenőrzése az eszköz m érete alapján történik, megvizsgálva, ahhoz szükséges, hogy a kernelm em ória virtuális m emóriahelyként legyen kezel­
hogy vajon a kérés az eszközhöz lefoglalt m em óriakorlátok közé esik-e. Ezután hető. H a egy betöltési eszköz m em óriaképének a fordítása a rendszer betöltési
egy kernelhívás a hívó m emóriájába vagy abból másolja az adatot. Két kódm arad­ m em óriaképében van, akkor a /dev/boot báziscímének a mezője nem lesz nulla.
vány is van, ami ezt eredményezi. A /dev/ram, a /dev/kmem és a /dev/boot esetén H a ez így van, akkor az eszköz számára a m em óriaterület eléréséhez az informá­
virtuális címek használhatók; ezekhez szükséges a m em óriaterület szegmenscíme, ció pontosan ugyanazon a m ódon készül, mint ahogyan a /dev/kmem esetében.
amely elérhető az m j e g tömbből egy sys_vircopy kernelhívással (11640-11652. Nullákkal töltődik fel az a tömb, amely az adatot biztosítja a /dev/zero elérésekor.
sor). A /dev/mem egy fizikai címet használ és a sys_physcopy hívását. Ez valószínűleg szükségtelen; a C fordítóról feltehető, hogy az újként létrehozott
statikus változókat nullákkal inicializálja.
296 3. BEVITEL/KIVITEL 3.7. LEMEZEK 297

Végül az m j n i t a sys_getmachine kernelhívással kapja meg a kernelből az ada­ 3.7.1. Lemezhardver


tok egy másik halmazát, a machine struktúrát, amely a különféle lehetséges hard­
veralternatívákat jelzi. Ez esetben szükséges az az információ, hogy a CPU védett M inden valódi lemez cilinderekbe szervezett, m inden egyes cilinder annyi pá­
m ódú m űveletekre alkalmas, vagy nem. Ez alapján a Idevlmem m érete vagy 1 MB- lyavonalból áll, ahány függőlegesen elhelyezkedő olvasófej tartozik a lemezhez.
ra, vagy 4 GB - 1-re állítódik be, attól függően, hogy a M INIX 3 a 8088-as vagy a A pályavonalak szektorokba vannak osztva, a szektorok száma körvonalanként
80386-os m ódban fut. Ez a MINIX 3 által tám ogatott maximális méret, nem te­ a hajlékonylemezeken 8 és 32 közötti érték, míg néhány merevlemezen ez több
hető semmi annak érdekében, hogy több RAM legyen a gépen telepítve. Csak az száz is lehet. A legegyszerűbb konstrukciókban mindegyik pályavonalon azonos
eszköz m érete kerül beállításra, a fordítóra van bízva a báziscím nullára állítása. számú szektor van. Valamennyi szektor azonos számú bájtból áll, ami egy kicsit
Mivel a Idevlmem m int fizikai (nem virtuális) m emória érhető el, ezért nincs szük­ elgondolkodtató tulajdonság, hiszen a lemez perem éhez közel levő pályavonalak
ség egy sys_segctl kernelhívásra a szegmensleíró beállításához. fizikailag hosszabbak, mint amelyek a középponthoz vannak közel. Akárhogyan
M ielőtt elhagynánk az m_init-ct, meg kell említeni egy másik kernelhívás al­ van is, a szektorok írása és olvasása azonos időt igényel. Nyilvánvalóan a bentebb
kalmazást, bár ez a kódban nem szembetűnő. A memóriameghajtó inicializálá- levő pályavonalakon a jelek sűrűsége nagyobb, és néhány lemezkonstrukciónál a
sa során alkalmazott tevékenységek közül sok a M INIX 3-ra jellemző funkciók­ bentebbi pályavonalaknál szükséges a meghajtóban az olvasófejek korrekciója.
hoz alapvető, így számos teszt is végbemegy, és egy teszt sikertelensége esetén a Ezt azonban a lemezt vezérlő hardver útján kezeli, és a felhasználó nem lát belőle
panic hívására kerül sor. A panic esetében egy könyvtári eljárás végül is a sys_exit semmit (de még az operációs rendszer készítője sem).
kernelhívást eredményezi. A kernel, a processzuskezelő és a fájlrendszer saját A bentebb és kintebb levő pályavonalakra jellemző jelsűrűségek közötti külön­
panic eljárással rendelkeznek. Az eszközmeghajtók és más kisebb rendszerkom ­ bözőség a kapacitásban jelent áldozatot, és kifinomultabb rendszerek meglétét
ponensek számára könyvtári eljárások állnak rendelkezésre. kívánja. Azok a hajlékonylemez-szerkezetek, amelyek nagyobb sebességgel fo­
Meglepő, hogy a most vizsgált m init függvény nem inicializálja a /dev/ram fon­ rognak, amikor a fejek kintebbi pályavonalak fölött vannak, m ár kipróbáltak. Va­
tos memóriaeszközt. Erről a következő függvény, az m jo c tl (11863. sor) gondos­ lójában több szektor is elférne az egyes pályavonalakon, növelve ezzel a lemez
kodik. Valójában csak egy ioctl művelet van definiálva a RAM-lemez számára; ez kapacitását. Azonban a MINIX 3-at jelenleg használó rendszerek egyike sem tá­
a M IOCRAM SIZE, amelyet a fájlrendszer használ a RAM-lemez m éretének be­ mogatja az ilyen lemezeket. A m odern nagy merevlemezmeghajtó egységeknél a
állításához. A legtöbb munka során nincs szükség a kernel semmiféle szolgáltatá­ kintebbi pályákon a szektorok száma nagyobb, m int a bentebbi pályavonalakon.
sára. A 11887. sorban az allocmem hívás rendszerhívás, de nem kernelhívás. Ezt Ezek az IDE- (Integrated Drive Electronics - integrált meghajtóelektronika)
a processzuskezelő kezeli, amely karbantartja az összes olyan információt, ami a meghajtószerkezetek a bonyolultabb feldolgozást a m eghajtószerkezetbe beépí­
memória egy használható területének megkereséséhez szükséges. Bárhogyan is, tett elektronikával hajtják végre. Az operációs rendszer számára azonban mindez
egy kernelhívás kell a végén. A 11894. sorban a sys_segctl hívás állítja elő a fizikai úgy látszik, m intha minden pályavonalon azonos számú szektor lenne.
címet és a m éretet az allocmem által, visszaadva a szegmensinformációban azt, ami A meghajtószerkezet és a vezérlőelektronika ugyanolyan fontosak, mint a mecha­
a további eléréshez szükséges. nikai hardver. A lemezvezérlő fő eleme egy speciális integrált áramkör, valójában
A memory.c-ben definiált utolsó függvény az m_geometry. Ez egy utánzat. Nyil­ egy kis mikroszámítógép. Valamikor ez a számítógép hátlapjába bedugott kártyán
vánvalóan a cilinderek, fejek és szektorok egy félvezető m em ória címzésében lé­ volt, de a m odern rendszereknél a lemezvezérlő az alaplapra van integrálva.
nyegtelenek, de ha egy kérés egy memóriaeszköz ilyen információjára vonatkozik, A lemezvezérlő áram köre a merevlemeznél egyszerűbb lehet, mint a hajlékony-
ez a függvény szimulálja a 64 fejes és sávonként 32 szektoros helyzetet, és kiszá­ lemeznél, aminek az oka, hogy a merevlemez-meghajtó egységbe be van építve
molja a m éretből a cilinderek számát. egy hatékony elektronikus vezérlő. Az eszköz sajátossága, ami a lemezmeghajtó­
ra jelentősen hat, hogy a vezérlő rendelkezik azzal a lehetőséggel, hogy egyszer­
re kettő vagy több meghajtóegységen is keressen. Ezt hívják átlapolt keresésnek.
M ialatt a vezérlő és a szoftver vár az egyik meghajtóegységen való keresés befe­
3.7. Lemezek jezésére, a vezérlő elindíthat egy keresést egy másik meghajtóegységen. Sok ve­
zérlő képes olvasni vagy írni az egyik egységen, mialatt keres egy vagy több más
Minden m oderm számítógépnek, kivéve a beágyazott gépeket, vannak lemezmeg­ meghajtóegységen, azonban egy hajlékonylemez-vezérlő nem tud egyszerre két
hajtó egységei. Ezért most tanulmányozni fogjuk ezeket. A hardverrel kezdjük, meghajtóegységen olvasni és írni. (Az olvasás vagy írás alkalmával a vezérlőnek
majd a lemezszoftvereknek néhány általános jellemzőjéről beszélünk. Ezután a a biteket mikroszekundum nagyságrendű idő alatt kell mozgatnia, így egy átvitel
M INIX 3 lemezvezérlésének fogunk a mélyére ásni. során felhasználja számolási erejének nagy részét.) Más a helyzet az integrált ve­
zérlőkkel rendelkező merevlemezeknél és egy olyan rendszerben, amely egynél
több merevlemez-meghajtó egységgel rendelkezik, ugyanis ekkor ezek egyidejűleg
298 3. BEVITEL/KIVITEL 3.7. LEMEZEK 299

működhetnek, legalábbis a lemez és a vezérlő pufferm em óriája közötti átvitel so­ 3.7.2. RAID
rán. A vezérlő és a rendszerm emória között egyszerre csak egy átvitel lehetséges.
Két vagy több művelet egy időben való végrehajtásának lehetősége tekintélyesen Jóllehet a m odern lemezek sokkal gyorsabbak, mint a régiek, a CPU teljesítményé­
csökkentheti az átlagos hozzáférési időt. nek javulása nagyban túlhaladta a lemezekét. Evek során sokaknak eszébe jutott,
A m odern merevlemezek adatait megnézve láthatjuk, hogy a meghajtószoftver hogy a párhuzamos lemez I/O segíthet a helyzeten. így alakult ki az I/O-eszközök
által használt geometriai szerkezet és a fizikai szerkezet m ajdnem mindig külön­ új osztálya, a RAID, a Redundant Array of Independent Disks (független lemezek
bözők. Valójában, ha valaki kikeresné egy nagy merevlemez számára „ajánlott be­ redundáns tömbje) angol elnevezésből. Eredetileg a RAID tervezői (Berkeley) a
töltési param éterek”-et, valószínű specifikációként 16 383 cilindert, 16 fejet és sá­ RAID szót mint a „R edundant Array of Inexpensive Disks” rövidítését használ­
vonként 63 szektort találna, függetlenül a lemez valódi m éretétől. Ezek a számok ták, szemben a SLED-del (Single Large Expensive Disk). Amikor azonban ke­
egy 8 GB m éretű lemeznek felelnek meg, de szokásosak az ilyen vagy nagyobb le­ reskedelmileg népszerűvé vált a RAID, a lemezgyártó cégek megváltoztatták a
mezeknél is. Az eredeti IBM PC tervezői egy 6 bites m ezőt szántak a BIOS ROM RAID mozaikszó jelentését, mivel nem lett volna jó olcsó (inexpensive) névvel egy
szektorszámlálójának, 4 bitet a fej megadására és 14 bitet a cilinder kiválasztására. drága (expensive) term éket árulni. A RAID alapötlete egy lemezekkel teli egység
512 bájtos szektoroknál ez 8 GB lesz. így ha valaki egy nagyon régi számítógépbe telepítése a számítógéphez, általában egy nagy szerverhez úgy, hogy egy RAID-
próbál egy nagy lemezmeghajtót telepíteni, akkor azt találja, hogy csak 8 GB-ot vezérlővel van kicserélve a lemezvezérlő kártya, az adatok elérése a R A ID -en ke­
képes elérni akkor is, ha nagyobb lemezzel rendelkezik. Ilyen korlátozás esetén resztül történik, a többi művelet pedig a szokásos m ódon megy végbe.
rendszerint logikai blokkcímzést alkalmaznak, ami a lemez szektorait egymás A független lemezek számos m ódon használhatók együtt. Ezek mindegyiké­
után, a nullával kezdve számozza, anélkül hogy a lemez geom etriáját figyelné. nek kimerítő leírására nincs módunk, és a M INIX 3 nem is támogatja (még) a
Egy m odern lemez geom etriája csupán kitaláció. Egy m odern lemezen a felü­ RAID-et, de egy operációs rendszerekkel foglalkozó könyvben legalább néhány
let 20 vagy több zónára osztott. A lemez középpontjához közelebb levő zónák ke­ lehetőséget meg kell említenünk. A RAID használatával gyorsabb a lemezelérés
vesebb szektort tartalm aznak sávonként, mint a széléhez közelebbi zónák. így a és az adattárolás is biztonságosabb.
szektorok hossza közelítőleg azonos, függetlenül a lemezen való elhelyezkedéstől, Példaként nézzünk egy kétmeghajtóegységes egyszerű RAID-et. Mikor több
ami a lemezfelület hatékonyabb felhasználását eredményezi. Belsőleg, az integrált szektornyi adatot kell írni a „lemez”-re, a RAID-vezérlő a 0, 2, 4 stb. szektorokat
vezérlő a zónákat, cilindereket, fejeket és szektorokat kiszámolva címezi a lemezt. az első meghajtóegységhez küldi, az 1, 3, 5 stb. szektorokat pedig a második meg­
De ezt a felhasználó nem látja, és a részletek ritkán találhatók meg a publikált hajtóegységhez. A vezérlő szétosztja az adatot, és a két lemeznek az írása egyide­
specifikációkban. Végül is semmi nem m utat cilinder, fej, szektor használatára a jűleg történik, ezzel megduplázva az írási sebességet. Olvasáskor mindkét meg­
lemez címzésénél, ha csak valaki nem egy régi számítógéppel dolgozik, ami nem hajtóegység párhuzam osan olvas, míg a vezérlő a valódi sorrendben összerakja az
tám ogatja a logikai blokkcímzést. Nem érdem es egy új 400 GB-os meghajtót vásá­ adatot; ezzel az olvasás sebessége kétszer olyan gyorssá válik. Ez sávos módszer­
rolni egy 1983-ban vásárolt PC-XT-hez; 8 GB-nál többet úgysem lehetne elérni. ként ismert, amely a 0-s szintű RA ID -nek egy egyszerű példája. A gyakorlatban
Itt az alkalom, hogy megemlítsünk egy zavaró dolgot a lemezkapacitás-speci- négy vagy több meghajtóegységet szoktak alkalmazni. Ezek akkor dolgoznak a
fikációkkal kapcsolatban. A számítógépes szakmában a 2 hatványok használata legjobban, amikor nagy blokkokban történik az olvasás vagy az írás. Természete­
a megszokott - egy kilobájt (KB) 210 = 1024 bájt, egy megabájt (MB) 220 = 10242 sen semmi haszna, ha a tipikus eszközkérés egyszerre csak egyetlen szektorra vo­
bájt stb. - a memóriaeszközök m éretének kifejezésére. Egy gigabájtnak (GB) natkozik.
eszerint 10243 vagy 230 bájtnak kellene lennie. De a lemezgyártó cégek úgy vették Az előző példa rám utat, hogy a többszörös meghajtóegységek növelik a sebes­
át a „gigabájt” terminológiát, hogy annak jelentése 109, ami (papíron) azonnal nö­ séget. És a biztonság? Az 1-es szintű RAID a 0-s szintű RAID-hez hasonlóan dol­
veli a term ékük m éretét. így a fent em lített 8 GB-os korlát egy 8,4 GB-os lemez gozik, kivéve, hogy az adatokat duplikálja. Két meghajtóegység nagyon egyszerű
a lemezforgalmazók nyelvén. M ostanában elmozdulás van a gibibájt (GiB) alkal­ tömbjét alkalmazva m inden adat mindegyikre ráíródik. Ez nem okoz gyorsulást,
mazása felé; ennek jelentése 230. A szerzők ebben a könyvben a maguk módján viszont 100%-os redundanciát eredményez. Olvasási hiba észlelésekor nincs szük­
tiltakoznak a hagyomány felrúgása ellen, és olyan fogalmakat, mint megabájt és ség újrapróbálkozásra, ha a másik meghajtóegység az adatot helyesen olvassa. A
gigabájt továbbra is úgy használnak, ahogy eddig. vezérlőnek csak azt kell biztosítania, hogy a helyes adat át legyen adva a rendszer­
nek. írás közbeni hiba észlelésekor valószínűleg nem lenne jó ötlet kihagyni az új-
rapróbálkozást. H a a hibák elég gyakoriak, az ismételt végrehajtás átugrása észre­
vehetően gyorsabbá tenné az olvasást, ekkor viszont talán itt az idő bejelenteni: a
teljes kudarc elkerülhetetlen. A RAID-ben alkalmazott meghajtóegységek jellem ­
zően „melegen”cserélhetők, vagyis kicserélhetők a rendszer leállítása nélkül.
300 3. BEVITEL/KIVITEL 3.7. LEMEZEK 301

Többszörös lemezek bonyolultabb tömbjeiel mind a sebesség, mind a megbízha­ Kezdeti Várakozó
tóság növelhető. Példaként tekintsünk egy 7 lemezes tömböt. A bájtok 4 bites sza­
vakba lennének osztva úgy, hogy az egyes bitek a négy meghajtóegység egyikén len­
nének rögzítve, a másik három meghajtóegység pedig arra lenne használva, hogy
egy hárombites hibajavító kódot rögzítsenek. H a elromlik egy meghajtóegység,
és egy újjal kell „m elegen”cserélni, akkor a hiányzó meghajtóegység egyenértékű
a rossz bitessel, így a rendszer a karbantartás alatt is futhat. H ét meghajtóegység
áráért megbízható teljesítmény érhető el, ami négyszer gyorsabb az egyetlen meg­
hajtóegységnél, és nincs állásidő.

3.7.3. Lemezszoftver 3.21. ábra. A legközelebbit keres elsőként (SSF) lemezütemező algoritmus

Ebben a részben áttekintünk néhány kérdést, amelyek általában kapcsolódnak a létrehozza a még várakozó, az adott cilinderre vonatkozó kérések egy láncolt listá­
lemezmeghajtókhoz. Először nézzük, mennyi időbe telik egy lemezes blokk olva­ ját, amelynek kezdete a táblázat cilinder indexű komponense.
sása vagy írása. A kért idő az alábbi három tényezőből határozható meg. H a van egy ilyen adatszerkezet, akkor javíthatjuk az első-bejövő, első-kiszolgált
ütem ező algoritmust. Nézzünk például egy 40 cilinderes lemezt. Bejön egy kérés
1. A keresési idő (az olvasófejnek a megfelelő cilinderhez történő m ozgatásá­ a l l . cilinderen levő egyik blokk olvasására. M ialatt a l l . cilinder keresése folya­
hoz szükséges idő). m atban van, újabb kérések érkeznek a cilinderekre, érkezési sorrendben az 1., 36.,
2. A fordulási késés (a megfelelő szektornak az olvasófej alá fordulásához szük­ 16., 34., 9. és 12. cilinderre. Ezek most bekerülnek a várakozó kérések táblázatá­
séges idő). ba, mégpedig mindegyik a cilinderszámnak megfelelő láncolt listába. A 3.21. ábra
3. Az adatm ozgatás tényleges ideje. m utatja a kéréseket.
Amikor az aktuális kérés (11. cilinderre) befejeződik, akkor a lemezmeghajtó
A legtöbb lemeznél a keresési idő lényegesen nagyobb a másik kettőnél, így a ke­ választás elé kerül, hogy melyik kérést kezelje következőként. H a az FCFS stra­
resési idő csökkentésével a rendszer teljesítménye lényegesen javítható. tégiát választja, akkor a következő az 1. cilinderre vonatkozó kérés lenne, utána a
A lemezes eszközök hajlamosak a meghibásodásra. Vannak olyan hibaellenőr­ 36. cilinderre, és így tovább. Ez az algoritmus megkövetelné, hogy az olvasófej egy­
zések, amelyek egy ellenőrző összeget jegyeznek be a lemez minden szektorába. mást követően 10, 35, 20,18, 25 és 3 cilinderrel mozduljon el, ami összesen 111 ci­
A szektorok címei, amelyek a lemez formázásakor íródnak fel, szintén rendelkez­ linderrel való elmozdulást jelent.
nek ellenőrző adattal. A hajlékonylemeznél a vezérlőhardver tudathatja a hiba A másik lehetőség, hogy a következő kérésnek a cilinderszámban legközelebbit
észlelését, de a szoftver dönti el, hogy mit tegyen vele. A merevlemez-vezérlők választja, így minimalizálva a keresési időt. A 3.21. ábrán adott példa esetében a
gyakran átvállalják ennek a tehernek nagy részét. kérések most em lített módon való ütemezésénél a sorrend 12, 9 ,1 6 ,1 ,3 4 , 36, amit
A merevlemezeknél sajátságos, hogy az átviteli idő az egymást követő szektorok­ az ábra alsó részében levő törtvonal szemléltet. E sorozatnál az olvasófej elmoz­
nál egy pályavonalon belül nagyon rövid. így a kértnél több adat beolvasásával és dulása 1, 3, 7 , 15, 33 és 2, ami összesen 61 cilindernyi. Ez az algoritmus a legköze­
memóriába helyezésükkel a lemez hozzáférési sebessége nagymértékben növelhető. lebbit keres elsőként (Shortest Seek First, SSF) módszer, amely az FCFS-hcz ké­
pest az összes olvasófej mozgatások mennyiségét m ajdnem a felére csökkenti.
Sajnos az SSF esetén is van probléma. Tegyük fel, hogy több kérés érkezik folya­
Lemezfej-ütemező algoritmusok m atosan, mialatt a 3.21. ábrán levő kérések lezajlanak. Például ha a 16. cilinderre
elmozdul az olvasófej, egy új kérés jelenik meg a 8. cilinderre, akkor ez a kérés
H a a lemezmeghajtó a kéréseket egyesével fogadja, és végrehajtja azokat a be­ előnyt élvez az 1. cilinderrel szemben. H a ezután egy kérés a 13. cilinderre jön be,
érkezés sorrendje szerint, vagyis első-bejövő, első-kiszolgált (First-Come, First- akkor az olvasófej következő elmozdulási célja a 13. lesz az 1. helyett. Egy nagyon
Served, FCFS) módszerrel, akkor keveset tehet a keresési idő optimalizálásáért. sűrűn betöltött lemez esetén az olvasófej várhatóan az idő legnagyobb részében a
De egy másik stratégiára is lehetőség van, amikor a lemez erősen betöltött. Való­ lemez közepén m arad, így az ettől a helytől távolabb levő kéréseknek addig kell
színű, hogy mialatt az olvasófej egy kérésnek megfelelően keres, közben más pro­ várniuk, míg az a helyzet áll elő, hogy nincs több középre vonatkozó kérés. A kö­
cesszusok más lemezkérésekkel állnak elő. Sok lemezmeghajtó egy táblázatot ke­ zéptől távoli kérések kiszolgálása így nagyon lassúvá válhat. Összeütközésbe kerül
zel, amely a cilinderszámokkal van indexelve, és minden egyes cilinderszámhoz két cél: a minimális válaszidő és a méltányosság.
302 3. BEVITEL/KIVITEL 3.7. LEMEZEK 303

Magas épületekben szintén foglalkozni kell ezzel az összefüggéssel. Egy magas lé mozog. Itt a legkisebb számú cilindert úgy kezeljük, m intha közvetlenül a legna­
épületben a lift ütem ezésének problém ája hasonló egy lemez olvasófejének az gyobb számú cilinder fölött lenne.
ütemezéséhez. A liftet hívó kérések véletlenszerűen folytonosan jönnek az em ele­ Néhány lemezvezérlő m ódot ad arra, hogy szoftvereszközökkel vizsgálható le­
tekről (cilinderek). A liftet m űködtető mikroprocesszornak folyamatosan nyomon gyen az olvasófej alatti szektorszám. Az ilyen vezérlők esetében egy másik optim a­
kellene követnie azt a sorrendet, amelyben az ügyfelek a hívógombot megnyom­ lizálás is lehetséges. H a egy cilinderre vonatkozóan két vagy több megválaszolat­
ták, ha az FCFS stratégiát használja. De használhatná az SSF módszert is. lan kérés is van, akkor a meghajtó arra a szektorra vonatkozó kérést adhatja ki,
Azonban a legtöbb lift ezektől különböző algoritmust alkalmaz, hogy áthidal­ amely a következőkben az olvasófej alatt elhalad. Vegyük észre, ha a cilinder több
ja a hatékonysági és a méltányossági célok között feszülő konfliktust. Folyama­ pályavonalból áll, akkor az egymást követő kérések büntetlenül vonatkozhatnak a
tosan ugyanabba az irányba mozog, ameddig van abban az irányban el nem inté­ különböző pályavonalakra (egy cilinderen belül). A vezérlő az olvasófejek közül
zett kérés, ekkor irányt változtat. Ez az algoritmus mind a lemezek, mind a liftek bármelyiket azonnal kiválaszthatja, mivel az olvasófej kiválasztása nem igényel
világában úgy ismert, mint a liftes algoritmus, és megkívánja a szoftvertől, hogy semmilyen fejmozgatást vagy fordulási késleltetést.
kezeljen egy bitet: az aktuális irányt jelző bitet, amelynek értéke UP vagy DOWN. Az adatátvitel lebonyolítási sebességében a m odern merevlemez és hajlékony-
Mikor egy kérés befejeződik, akkor a lemez vagy a lift m eghajtója ezt a bitet vizs­ lemez között olyan nagymértékű az eltérés az első javára, hogy a gyorsítótárazás
gálja meg. H a az értéke UP, akkor az olvasófej vagy a liftszekrény a legközelebbi (caching) valamilyen fajtája szükséges. Egy szektor olvasására vonatkozó kérés
magasabb várakozó kérés felé mozdul. H a nincs várakozó kérés a magasabb pozí­ tipikusan a szektornak és a pályavonalán levő, ezt követő, bizonyos számú szek­
cióknál, akkor az irányt jelző bitet ellenkezőre változtatja. Amikor a bit DOW N-ra toroknak a vezérlő gyorsítótárába való elhelyezését eredményezi, az átmozgatott
van beállítva, akkor a mozgás a legközelebbi alacsonyabb kérés helyére történik, szektorok száma a vezérlő gyorsítótárában levő hozzáférhető helyek mennyiségé­
ha van ilyen. től függ. A mai gyorsítótárak gyakran 8 MB-osak, vagy ennél is nagyobbak.
A 3.22. ábra a liftes algoritmust mutatja, ugyanarra a hét kérésre alkalmazva, Több meghajtóegység esetén a rájuk vonatkozó megválaszolatlan kérések szá­
mint a 3.21. ábrán, feltéve, hogy az irányt jelző bit kiinduláskor UP értékű. A sor­ m ára külön-külön táblázatot kell kezelni. M inden egységnek egy keresési kérést
rend, amely szerint a cilinderek kiszolgálása megtörténik, 12,16, 34, 36, 9 és 1, és kell kiadni, hogy mozdítsa az olvasófejet arra a cilinderre, ahonnan a következő
az ezekhez szükséges olvasófej-mozgatások 1, 4, 18, 2, 27 és 18, vagyis az összes kérést majd teljesítheti (feltéve, hogy a vezérlő megengedi az átlapolt keresése­
mozgatás 60 cilindernyi. Ennél a példánál a liftes algoritmus egy kicsivel jobb az ket). Amikor az aktuális átvitel befejeződik, akkor egy vizsgálatot kell végeznie,
SSF-nél, bár általában rosszabb. A liftes algoritmusnak van egy kellemes tulajdon­ amelynek során megnézi, hogy mely egységek pozícionáltak már a helyes cilin­
sága, miszerint a kérések tetszőleges halm azára rögzített összes mozgatások szá­ derre. H a egy vagy több ilyen van, akkor a következő átvitel elkezdhető az egyik,
m ára van felső korlátja: ez a cilinderek számának a kétszerese. m ár jó cilinderre pozícionált egységen. H a egyik olvasófej sincs a megfelelő he­
A válaszidőkben kisebb szórás (méltányossági cél) érhető el az előző algoritmus lyen, akkor a meghajtónak ki kell adnia egy új keresést arra a meghajtóegységre,
kisebb módosításával (Teory, 1972): eszerint mindig azonos irányban történik a amely éppen befejezte az átvitelt, és várakozik a következő megszakításig, amikor
mozgatás. Amikor a megválaszolatlan kérésekkel rendelkező, legnagyobb számú is megnézi, hogy melyik olvasófej érte el elsőként a célhelyet.
cilinder kiszolgálása megtörténik, az olvasófej ahhoz a legkisebb számú cilinder­
hez mozdul el, amelyhez van megválaszolatlan kérés, és utána folyamatosan felfe-
Hibakezelés
Kezdeti
pozíció A RAM -lemezeknek nem kell törődniük a keresés és fordulási késleltetés optim a­
lizálásával: mindegyik blokk azonnal olvasható vagy írható bármiféle fizikai moz­
\ gatás nélkül. Egy másik terület a hibakezelés, amiben a RAM -lemezek egyszerűb­
X X X X X X X
0 5 10 15 20 25 30 35 Cilinder
bek, mint a valódi lemezek. A RAM-lemezek mindig dolgoznak, míg a valódi le­
m ezek nem mindig. A valódi lemezeknél sokféle hiba lehetséges. A közismertebb
hibák közül néhány:

1. Programozási hiba (például nem létező szektor kérése).


2. A hibajavító kód átmeneti hibája (például az olvasófejen levő porszem is okoz­
hatja).
3. A hibajavító kód tartós hibája (például a lemez blokkja fizikailag károso­
3.22. ábra. A lemezkérések liftes algoritmus szerinti ütemezése dott).
304 3. BEVITEL/KIVITEL 3.7. LEMEZEK 305

4. Keresési hiba (például a 6. cilinderhez küldött olvasófej a 7. cilinderhez moz­ jában és a lemezen tárolásra kerül az a táblázat, amely a hibás pályavonalaknak
dul). a tartalékokba való leképezését tartalmazza. Ez a helyettesítés közvetlenül nem
5. A vezérlő hibája (például a vezérlő elutasítja a parancsok elfogadását). érinti (láthatatlan a táblázat) a meghajtót, kivéve, hogy a gondosan kimunkált lif­
tes algoritmus nagyon szegényessé válik, ha például a vezérlő titkon a 800. cilin­
A lemezmeghajtó dolga, hogy a lehető legjobb m ódon kezelje ezeket a hibákat. dert használja a 3. cilinder helyett. A gyári lemezek felületénél alkalmazott tech­
Programozási hibák fordulnak elő, amikor a m eghajtó azt mondja a vezérlő­ nológiák sokat javultak, de még nem hibátlanok. Azonban a tökéletlenség felhasz­
nek, hogy keressen egy nem létező cilindert, olvasson egy nem létező szektorból, nálók előli elrejtésének technológiája szintén javult. Sok vezérlő a használat során
használjon egy nem létező olvasófejet, vagy hajtson végre átvitelt egy nem létező kialakuló új hibákat is kezeli, a helyrehozhatatlan hibák észlelésekor állandóan
memóriából. A legtöbb vezérlő ellenőrzi a számára átadott param étereket, és ha kiutalva helyettesítési blokkokat. Az ilyen lemezeknél a meghajtószoftver ritkán
azok érvénytelenek, akkor panaszkodik. Elvileg ezeknek a hibáknak soha nem látja bármi jelét a hibás blokkok létezésének.
kellene előfordulniuk, de mit tegyen a meghajtó, ha a vezérlő jelzi valamelyik hiba A keresési hibákat az olvasófej mechanikus problém ái okozzák. A vezérlő nyo­
bekövetkeztét? Egy házilagosan kifejlesztett rendszernél a legjobb, ami tehető, a mon követi az olvasófej helyzetét. Egy keresés végrehajtásánál impulzusok soro­
megállás és egy üzenet kinyomtatása, mondjuk, „Hívd a program ozót!”, így a hi­ zatát adja az olvasófej motorjának, cilinderenként egy impulzust, hogy az olvasó­
ba nyomon követhető és kijavítható. Egy kereskedelmi szoftvertermék esetében, fejet az új cilinderhez mozdítsa. Am ikor az olvasófej eléri a célhelyét, a vezérlő
amelyet az egész világon tömegesen használnak, az előbbi megközelítés m ár ke­ kiolvassa az aktuális cilinderszámot (az eszköz formázásakor íródik fel). H a az
vésbé vonzó. Valószínűleg az egyetlen dolog, amit tehetünk, a pillanatnyi lemezké­ olvasófej rossz helyen van, akkor keresési hiba jelentkezik, és javítási tevékeny­
rés hibával való befejezése, remélve, hogy a hiba túl gyakran nem ismétlődik meg. ségre kerül sor.
A hibajavító kód ideiglenes hibáját okozhatják a levegőben levő porszemcsék A legtöbb merevlemez vezérlője autom atikusan kijavítja a keresési hibákat, de
azzal, hogy az olvasófej és a lemez felülete közé jutnak. A művelet néhányszori sok hajlékonylemez-vezérlő (idetartozik az IBM PC is) csupán a hibát jelző bitet
megismétlésével a hiba a legtöbb esetben eltűnik. H a a hiba továbbra sem szűnik állítja be, és a többit a meghajtóra hagyja. A m eghajtó ezt a hibát egy recalibrate
meg, akkor a blokkot hibás blokként kell megjelölni, és a továbbiakban kerülni parancs kiadásával kezeli; ez elmozdítja az olvasófejet, amennyivel csak lehet, és
kell a használatát. beállítja az aktuális cilinder vezérlő által kezelt belső jelzését a 0 értékre. Ez a mód­
A hibás blokkok elkerülésének egyik módja egy nagyon speciális program írása, szer rendszerint megoldja a problém át. H a mégsem, akkor a meghajtóegységet
amely bem enetként veszi a hibás blokkokat, és létrehoz egy állományt, amely az meg kell javítani.
összes hibás blokkot tartalmazza. H a egyszer ez az állomány megvan, akkor a to­ Az eddigiekből látható, hogy a vezérlő valójában egy speciális, kis számítógép
vábbi helyek lefoglalásakor ezek a blokkok m ár lefoglaltakként jelennek meg, így szoftverrel, változókkal, pufferekkel és esetenként hibákkal. Váratlan események
újabb lefoglalásuk nem lehetséges. Egész addig nem fordul elő probléma, amíg sorozata néha előidézheti, hogy a vezérlő ciklusba kerül, vagy elveszít egy pálya­
valaki meg nem próbálja olvasni a hibás blokkok állományát. vonalat, amelyen éppen dolgozik. Ilyen hibát válthat ki egy megszakítási kérés az
Ne olvassuk a hibás blokkok állományát - ezt könnyebb mondani, mint megvaló­ egyik eszközön, ami egy másik eszközre alkalmazott recalibrate paranccsal egyide­
sítani. Sok lemezről készül úgy biztonsági mentés, hogy a tartalm át pályavonalan­ jűleg fordul elő. A vezérlők tervezői általában gondolnak a legrosszabbra is, így a
ként egy háttérszalagra vagy lemezegységre írják. Ezt az eljárást követve a hibás lapkán egy olyan áram köri elem et alakítottak ki, ami működése esetén eléri, hogy
blokkok problém át okoznak. A lemez tartalm ának állományonként való mentése a vezérlő felejtse el azt, amit eddig tett, és állítsa be újra magát. H a minden siker­
lassabb folyamat, de a problém a elkerülhető vele, ha a m entőprogram ismeri a hi­ telen, akkor a lemezmeghajtó beállíthat egy bitet, amelynek hatására segítségül
bás blokkok állományának nevét, és tartózkodik azok másolásától. hívódik az előbb em lített áramköri elem, és újraindítja a vezérlőt. H a ez sem segít,
Egy másik probléma, ami nem oldható meg a hibás blokkokat tartalm azó állo­ akkor a m eghajtó csak annyit tehet, hogy kinyomtat egy üzenetet és feladja.
mányokkal, ha egy hibás blokk a fájlrendszer egy olyan adatszerkezetében van,
amelynek helye rögzített. M ajdnem m inden fájlrendszernek van legalább egy rög­
zített helyű adatszerkezete, m ert ez könnyen m egtalálható. Egy particionált fájl- Pályavonaiankénti raktározás
rendszernél ilyenkor lehetőség van az ismételt particionálásra, kihagyva a hibás
pályavonalakat, de ha az állandó hiba egy hajlékonylemez vagy egy merevlemez Egy új cilinder megkereséséhez szükséges idő rendszerint sokkal nagyobb, mint
első néhány szektorában van, az általában a lemez használhatatlanságát jelenti. az olvasófej alá való fordulási késés, és mindig sokkal nagyobb, mint egy szektor
Intelligens vezérlők néhány pályavonalat, amelyek a felhasználói programokból átviteli ideje. Más szavakkal, ha a meghajtó az olvasófej valamely helyre való el-
normális esetben nem érhetők el, tartalékként foglalnak le. Mikor egy lemezegy­ m ozgatásának nehézségén túljutott, akkor már szinte egyre megy, hogy csak egy
ség formázása történik, akkor a vezérlő feltárja a hibás blokkokat, és a hibásat szektort vagy egy teljes pályavonalat olvas be. Ez a megállapítás még inkább igaz,
autom atikusan helyettesíti egy tartalék pályavonallal. A vezérlő belső m em óriá­ ha a vezérlő érzékeli a fordulást, és így a meghajtó láthatja az olvasófej alatt levő
306 3. BEVITEL/KIVITEL 3.7. LEMEZEK 307

szektort, és kiadhat egy kérést a következő szektorra. Ezzel a m ódszerrel egyetlen eszközök használata is, mint például az SCSI-vezérlő. Ennek a rugalmasságnak
körülfordulási idő alatt lehetséges egy teljes pályavonal olvasása. (Normálisan egy az az előnye, hogy az operációs rendszert nem kell korlátozni csupán egyetlen
fél fordulatot tesz, és csak egyetlen szektort olvas átlagban.) adaptertípus használatára.
Néhány lemezmeghajtó kihasználja ezt a tulajdonságot egy rejtett, pályavona­ Az IBM PC családban, mint ahogy a legtöbb számítógéprendszernél, mindegyik
lankénti gyorsítótárba raktározás kezelésével. Nincs szükség semmi lemezes át­ adatcsatornát az alap I/O-rendszer csak olvasható memóriájában (Basic Input/
vitelre, amikor egy gyorsítótárban levő szektorra van igény. A pályavonalankénti O utput System Read-Only Memory, BIOS ROM ) levő szoftver (firmware) keze­
gyorsítótárba raktározás egyik hátránya (túl azon, hogy növeli a szoftver bonyo­ li, amely tulajdonképpen a híd szerepét tölti be az operációs rendszer és a hard­
lultságát és pufferhelyet igényel), hogy a raktár és a hívóprogram közötti átvitelt ver sajátosságai között. Néhány perifériás eszközhöz a ROM -beli BlOS-on túl
CPU használatával kell végrehajtani, egy beprogram ozott ciklust alkalmazva, ahe­ még perifériás kártyák is tartozhatnak. Az operációs rendszer tervezőjének azzal
lyett hogy a m unkát a DM A-hardverrel végezné el. a nehézséggel kell szembenéznie, hogy az IBM típusú számítógépeknél a BlOS-t
Bizonyos vezérlők ezt a folyamatot egy lépéssel továbbviszik, és a pályavonalan­ konkrét operációs rendszerhez tervezték, mégpedig az MS-DOS-hoz, amely nem
kénti raktárnak a saját belső tárukat használják, amely láthatatlan a meghajtó tám ogatja a multiprogramozást, és 16 bites valós m ódban fut, amely a legalacso­
számára, így az átvitelt a vezérlő és a memória között a DM A bonyolítja le. Az nyabb szintű közös módja a 80x86-os CPU családból rendelkezésre álló különféle
ilyen m ódon dolgozó vezérlőknél a lemezmeghajtóra a munka nagyon kicsi ré­ műveleti módoknak.
sze marad. Megjegyezzük, hogy a vezérlő és a m eghajtó is abban a jó helyzet­ H a valaki az IBM PC-hez egy új operációs rendszert készít, akkor több lehető­
ben van, hogy egyetlen parancsra egy teljes pályavonalat olvas vagy ír, míg az sége van. Egyik ezek közül, hogy a perifériákhoz meghajtóként a BlOS-beli szoft­
eszközfüggetlen szoftver nem képes erre, mivel a lemezt blokkok lineáris soro­ vereket használja, vagy ír új m eghajtókat, a gyors előm em óriába elhelyezve. Ez
zataként tekinti, a lemez pályavonalakba és cilinderekbe való osztottsága nélkül. nem volt nehéz választás a M INIX korai verziói esetén, mivel a BIOS sok esetben
Csak a vezérlő ismeri a valódi geometriát. nem alkalmas az igényeikhez. Természetesen a M INIX 3 indításánál a betöltési
felügyelőprogram a BlOS-t használja a rendszer kezdeti betöltéséhez akár m e­
revlemezről, akár CD-ROM -ról, akár hajlékonylemezről - ennek nincs praktikus
3.7.4. A MINIX 3 merevlemez-meghajtója alternatívája. H a viszont a rendszer m ár be van töltve a saját I/O-meghajtóival
együtt, akkor a BlOS-nál sokkal jobban is megoldhatjuk.
A merevlemez-meghajtó a M INIX 3 első olyan része, amellyel kapcsolatban már Ekkor a második választási lehetőség jelenik meg: hogyan illeszthető a meg­
láttuk, hogy a hardverelemek különböző típusú széles körét kell kezelnie. Mielőtt hajtónk BIOS nélkül a hardver változatos fajtáihoz a különböző rendszereknél?
a meghajtót tárgyalnánk, röviden megnézünk néhány kérdést, amelyek a hardve­ Mivel a m odern 32 bites Pentium-rendszeren, amelyre a M INIX 3-at tervezték,
rek különbözőségéből erednek. a merevlemez-meghajtóknak két alapvető típusa van, ezért a problém a konkré­
A „PC” valójában különböző számítógépeknek egy családja. Nemcsak különbö­ tabb vizsgálatához tekintsük az integrált IDE-vezérlőt és a PCI-síneknél alkal­
ző processzorokat használnak a család különböző tagjaiban, hanem néhány alapve­ mazható SCSI-vezérlőket. H a valaki szeretné a régebbi hardverét használni és a
tő különbség is van az alaphardverben. A M INIX 3-at a Pentium osztályú CPU-val M INIX 3-at alkalmazni, hogy a korábbi M INIX-verzióknak megfelelő hardveren
rendelkező legújabb rendszerekre fejlesztették ki, jóllehet ezek között is vannak dolgozzon, akkor négy merevlemez-vezérlő típust kell megfontolnia: az eredeti 8
különbségek. Például a legrégebbi Pentium-rendszerek 16 bites AT-síneket hasz­ bites XT típusú vezérlő, a 16 bites AT típusú vezérlő és két különböző típusú ve­
nálnak, amelyek eredetileg a 80286-os processzorra voltak tervezve. Az AT-sínt zérlő az IBM PS/2 soros számítógépekhez. Az összes ilyen helyzet kezelésére szá­
okosan tervezték, m ert a régebbi 8 bites perifériák is használhatók maradtak. A mos lehetőség van:
későbbi rendszereket 32 bites PCI-sínnel bővítették a perifériák számára, mialatt
az AT-sínt is megőrizték. A legújabb tervekből már kidobták az AT-sínt és csak egy 1. Mindegyik merevlemez-vezérlő esetében, amit illeszteni akarunk, újrafordít­
PCI-sínt biztosítanak. Viszont indokolt elvárása a régebbi számítógéppel rendelke­ juk az operációs rendszer megfelelő változatát.
zőknek, hogy akár 8,16 vagy 32 bites perifériákkal is használhassák a M INIX 3-at. 2. A betöltési m em óriaképbe fordítjuk a különböző merevlemez-meghajtókat,
M inden sínhez az I/O-adaptereknek más-más családja tartozik. Régebbi rend­ és a rendszer autom atikusan eldönti az induláskor, hogy melyiket használja.
szereken külön áram köri lapok vannak, amelyek az alaplapba vannak csatlakoz­ 3. A betöltési mem óriaképbe fordítjuk a különböző merevlemez-meghajtókat,
tatva. Az újabb rendszereknél sok szabványos adapter, különösen a lemezvezérlők és a felhasználóra bízzuk, hogy eldöntse, melyiket használja közülük.
az alaplap integrált komponensei. Ez nem jelent korlátozást a programozók szá­
mára, mivel az integrált adapterek szokásosan szoftverinterfésszel rendelkeznek M int látjuk majd, ezek az esetek nem zárják ki egymást.
a cserélhető eszközök számára. Sőt az integrált vezérlők rendszerint m egbénít­ Hosszú távon valójában a legjobb mód az első. Egy konkrét üzembe helyezés­
hatok. így a beépített eszköz helyett lehetővé válik olyan továbbfejlesztett bővítő nél felesleges lenne sosem használt m eghajtók kódjainak lemezen vagy memóriá-
308 3. BEVITEL/KIVITEL 3.7. LEMEZEK 309

bán való tárolása. E z azonban a szoftverforgalm azók szám ára rém álom lenne. tót m ár a rendszer indításakor, a rendszer teljesen m egbénulhatna olyan eszközök
Ekkor ugyanis a felhasználóknak négy k ülön böző in d ítólem ezt k ellen e adniuk, és helytelen konfigurációja miatt, amelyekre esetleg nincs is szükség. H a az egyes
egy használati útm utatót, am i drága és n eh ézk es m ódszer. íg y legalábbis a k ezdeti m eghajtók indítása késleltethető a használatukig, akkor a rendszer a m űködőké­
ü zem be helyezésnél m ásik alternatívát tanácsos választani. pesekkel dolgozhat, és közben a felhasználó kiderítheti és m egszüntetheti a hibát.
A második módszernél az operációs rendszernek a kártyák azonosításához Egy kis kitérőként elm ondhatjuk, hogy a lecke nagyon kemény volt: a M INIX
le kell tapogatni a perifériákat a kártyákon levő R OM -ot olvasva, vagy az I/O- korábbi változatai megpróbálták a merevlemez beállítását, amint a rendszer indí­
kapukat írva és olvasva. Ez lehetséges (és az új IBM típusú rendszereknél jobb is, tása m egtörtént. H a nem volt jelen merevlemez, akkor a rendszer felfüggesztődött.
mint a régebbieken), viszont a nem szabványos I/O-eszközöknél nem alkalmazha­ Ez a viselkedésmód különösen szerencsétlen volt, mivel a M INIX tökéletesen fut­
tó. Egy eszköz azonosításánál az I/O-kapuk letapogatása néha működésbe hozhat hat egy merevlemez nélküli rendszeren is, persze korlátozott tárolókapacitás mel­
egy másik eszközt, amely megszerezheti a vezérlést és megbéníthatja a rendszert. lett és kisebb teljesítménnyel.
Ezzel a módszerrel bonyolult az eszközök kódjának kialakítása, és ráadásul nem Ebben és a következő szakaszban a vizsgálataink során modellként az AT típusú
is működik jól. Az ilyen módszert alkalmazó operációs rendszereknek általában merevlemez-meghajtót vesszük, ami a szabványos M INIX 3 felépítésében az alapér­
rendelkezniük kell bizonyos, megsemmisítő mechanizmussal, tipikusan ilyen, amit telm ezett meghajtó. Ez egy sokoldalú meghajtó, amely a merevlemez-vezérlőket
a M INIX 3 használ. kezeli a legkorábbi 80286-os rendszerben használtaktól a m odern EIDE (Extended
A M INIX 3-ben használatos a harm adik módszer is, ami engedi, hogy számos Integrated Drive Electronics - kiterjesztett integrált meghajtóelektronika) gi­
meghajtó a betöltési m em óriaképben legyen. A M INIX 3 betöltési felügyelőprog­ gabájt kapacitású vezérlőkig. A m odern IDE-vezérlők támogatják a szabványos
ram az elindításkor több indítóparaméter beolvasását engedi. Ezek beadhatók CD-ROM -meghajtót. A merevlemez-művelet általános szempontjai, amelyeket
kézi úton vagy egy lemezen vannak állandó jelleggel tárolva. Beindításkor, ha egy ebben a részben tárgyalunk, alkalmazhatók a többi tám ogatott meghajtóra is.
betöltési param éter alakja A merevlemez taszkjának főciklusa ugyanaz a közös kód, amelyet m ár ta­
nulmányoztunk, és a kérések szabványos kilenc típusát támogatja. A DEV_O PEN
label = AT kérés tekintélyes mennyiségű munkával járhat, mivel a merevlemezen mindig van­
nak partíciók és lehetnek részpartíciók is. Egy eszköz megnyitásakor (vagyis az
akkor az IDE-lemezvezérlőt (atjvini) jelöli ki, mint ami a M INIX 3 indításakor első elérésekor) ezeket be kell olvasni. A CD-ROM -tám ogatásnál aD E V jO P E N -
használható. Ez függ attól, hogy a címkéhez az a tjv in i vezérlő mit jelöl ki. A cím­ nek ellenőriznie kell az eszköz jelenlétét, mivel az cserélhető. A C D -R O M ese­
kék hozzárendelése a betöltési mem óriakép fordításakor történik. tében a D E V C L O S E műveletnek szintén van értelme: az ajtót ki kell nyitni, és
A többszörös merevlemez-meghajtókkal kapcsolatos problém ák minimalizálá­ a C D -R O M -ot ki kell adni. A hajlékonylemez-meghajtó egységeknél még inkább
sára a M INIX 3 két másik dolgot is tesz. Az egyik az, hogy van még egy meghajtó­ jelentkeznek a cserélhető eszközökkel kapcsolatos bonyodalmak; ezeket egy ké­
ja, ami összeilleszti a M INIX 3-at és a R O M BIOS merevlemezes támogatást. Ez sőbbi szakaszban tanulmányozzuk. A CD-ROM -nál a D E V IO C TL művelet be­
a m eghajtó m ajdnem garantáltan működik m inden rendszerben és az alábbi indí­ állít egy jelzőt annak jelzésére, hogy a D E V C LO SE műveletnek ki kell-e dobnia
tóparam éterrel alkalmazható: a lemezt a meghajtóból. A D E V IO C TL művelet a partíciós táblázat írására és
olvasására használható.
label = BIOS A DEV_READ, D E V WRITE, D E V G A T H E R és a D E V SC ATTER kérések
mindegyikének kezelése, ahogy azt az előzőkben m utattuk, két fázisban történik:
Ezt azonban csak végszükség esetén szabad használni. A M INIX 3, amint már előkészítés és átvitel. A merevlemeznél a D E V jC A N C E L és a D EV_SELEC T hí­
em lítettük, csak védett m ódban fut 80386-os vagy ennél jobb processzorú rendsze­ vások nem jelennek meg.
reken, de a BlOS-kód mindig valós (8086) m ódban fut. A védett mód kikapcso­ A merevlemez-meghajtó egyáltalán nem ütemez, ezt a fájlrendszer teszi, amely
lása, majd visszakapcsolása minden BlOS-beli rutin meghívásakor, nagyon lassú összerak egy vektort az összegyűjt/leoszt I/O-kérésekből. A kérések a fájlrendszer
módszer. háttértárából jönnek mint többszörös blokkokra vonatkozó D E V G ATHER vagy
A másik stratégia, amelyet a M INIX 3 a meghajtóknál alkalmaz, hogy a leg­ D EVJSCATTER kérések (a M INIX 3 alapértelm ezésű konfigurációjában 4 KB),
utolsó pillanatig elhalasztja a beállítást. így ha bizonyos hardverkiépítettség m el­ viszont a merevlemez-meghajtó képes egy szektor (512 bájt) tetszőleges egész-
lett a merevlemez-meghajtó egyáltalán nem működik, még akkor is elindítható szám-szorosának megfelelő kéréseket kezelni. Mint ahogy láttuk, m inden esetben
a M INIX 3 egy hajlékonylemezről, és megfelelően dolgozhat. Nem lesz semmi az összes meghajtó főciklusa transzformálja az egyszerű blokkokra vonatkozó ké­
problém ája a M INIX 3-nak, míg kísérletet nem tesz egy merevlemez elérésére. réseket a kérések vektorának egy elemébe.
Lehet, hogy ez a felhasználó szempontjából nem tűnik valami óriási áttörésnek, Egy kérésvektorban az olvasási és írási kérések nem fordulhatnak elő sem vegye­
de nézzük a következő szituációt: ha megpróbálnánk beindítani az összes meghaj­ sen, sem opcionálisként jelölve. Egy kérésvektor elemei egymás utáni lemezszek­
310 3. BEVITEL/KIVITEL 3.7. LEMEZEK 311

torokra vonatkoznak, és a fájlrendszer rendezi a vektort, mielőtt átadja az eszköz- wini vektor tartja nyilván; ennek definiálása a 12254-12276. sorban van, amelyek­
meghajtónak, így elegendő megadni a kiindulási lemez helyét a kérések számára. ben a MAX_DRJVES (8) meghajtóegységek mindegyikének van egy eleme, vagyis
A meghajtótól folytonos olvasást vagy írást várunk el, legalábbis a kérésvektor négy hagyományos IDE-meghajtónak és négy PCI-sínen levő meghajtóegységnek,
első kérésénél, és hibás kérés esetén azonnali visszatérést. A fájlrendszerre van amelyek lehetnek akár IDE-csatolású vezérlők, akár SATA- (Serial AT Attachment
bízva, hogy mit tesz; a fájlrendszer megpróbál végrehajtani egy írás műveletet, de - soros AT-csatolás) vezérlők.
csak akkor tér vissza a hívó processzushoz, amikor egy olvasás adatait elérte. A kezdeti beállítás lépéseinek késleltetési szabálya szerint akkor kerül sor ezek­
A tagolt I/O-t használó fájlrendszer képes megvalósítani a liftes algoritmus re a lépésekre, amikor igazán szükségessé válnak az első alkalommal, ezt meg­
Teory-változatához hasonló valamit - emlékeztetünk, hogy egy tagolt I/O-kérés- előzően hibához vezethetnének; az initj?arams semmi olyat nem tesz, amihez a
ben a kérések listája a blokkszám szerint rendezett. Az ütemezés második lépése lemezvezérlőt el kellene érni. A fő feladat, hogy bizonyos, a merevlemez logi­
a m odern merevlemeznél a vezérlőben történik. Az ilyen vezérlők okosak és nagy kai konfigurációjával kapcsolatos információt bemásoljon a wini vektorba. Egy
mennyiségű adat pufferezésére képesek, belsőleg beprogram ozott algoritmusokat pentium os számítógépen a ROM BIOS az alapkonfigurációs információt a CMOS
használnak az adatok leghatékonyabb sorrendbe való rendezésére, figyelmen kí­ m emóriából nyeri ki, amely az adatok megőrzésére használatos. A BIOS ezt ak­
vül hagyva a kérések beérkezési rendjét. kor hajtja végre, amikor a számítógépet először bekapcsolják, mielőtt a M INIX 3
betöltőprocesszusa elkezdődik. A 12366-12392. sorban levő információ a BIOS-
ból van másolva. Sok olyan konstanst használ, mint például az NR_HD_DRTVES_
3.7.5. A merevlemez-meghajtó megvalósítása M INIX 3-ban AN D R, amelynek a definíciója az include/ibm/bios.h-ban van; ez a M INIX 3
C D -R O M -on megtalálható. így ezek az információk nem kereshetők vissza. Egy
A mikroszámítógépekben használt kis merevlemezeket néha „winchester” lem e­ korszerű lemeznél az információ közvetlenül a lemezről is m egismerhető az első
zeknek hívják. Ez egy IBM-kódnév volt arra a feladatra, hogy kifejlesszenek egy eléréskor. A BIOS adatbejegyzését folytatva, mindegyik meghajtóegység számára
olyan lemeztechnológiát, amelyben az író/olvasó fej egy vékony légpárnán röpül, az initjlrive függvény hívásával további lemezinformációt tölt be.
és leszáll a rögzítőeszközre, amikor a forgás abbamarad. A név magyarázata, hogy Az IDE-vezérlésű régebbi rendszereken, még az AT típusú periféria kártyás ese­
a korai modell két adatmodullal rendelkezett, egy 30 megabájtos rögzített és egy tében is, a lemezfüggvények az alaplapra integráltak. A m odern meghajtóegység­
30 megabájtos cserélhető modullal, és ez feltehetően a fejlesztőket a Winchester vezérlők rendszerint a PCI-eszközökhöz hasonlóan működnek, leginkább 32 bites
30-30 lőfegyverre emlékeztette, amely az Egyesült Államok nyugati határterületei­ adatúttal a CPU-hoz, nem pedig 16 bites AT-sínnel. Szerencsére az inicializálást
nek legendás fegyvere volt. Bármi is legyen a név eredete, az alapvető technológia követően az interfész a lemezvezérlők mindkét generációjánál azonos módon jele­
azonos, bár napjaink tipikus PC-lemezei sokkal kisebbek, és a kapacitásuk sokkal nik meg a programozó számára. A munka elvégzéséhez az initj>aramsjy c i (12437.
nagyobb, mint a 14 hüvelykes lemezeké, amelyek az 1970-es évek elején voltak ti­ sor) hívására kerül sor, ha szükségesek a PCI-eszközök param éterei. Ennek az eljá­
pikusak, amikor a winchester-technológiát kifejlesztették. rásnak a részleteire nem térünk ki, de néhány dolgot meg kell említenünk. Először
A M INIX 3 AT típusú merevlemez-meghajtója az at_wini.c- ben van (12100. is a 12361. sorban a w jnstance változó értékének beállítása az atajnstance indító­
sor). Ez egy intelligens eszköz bonyolult meghajtója; a vezérlő regisztereit, álla­ param éter alapján történik. H a az indítóparam éter nincs beállítva, akkor az érték
potbitjeit és parancsait, az adatszerkezeteket és típusokat leíró makródefiníciók nulla lesz. H a nullánál nagyobbra van állítva, akkor a 12365. sorban levő vizsgálat
több oldalt tesznek ki. Mint más blokkoseszköz-meghajtóknál, a driver adatszerke­ eredménye a BIOS lekérdezése és a szabványos IDE-meghajtó inicializálás átugrá-
zet w_dtab (12316-12331. sor) kezdeti beállítása az aktuálisan dolgozó függvények­ sa. Ebben az esetben csak a PCI-sínen talált meghajtóegységek lesznek bejegyezve.
re vonatkozó mutatókkal történik. Ezek legtöbbjének definíciója az a tjv in i.c - ben Továbbá egy PCI-sínen található vezérlő azonosítása c0d4-c0d7 közötti vezérlő­
van, de mint a merevlemez esetében, itt sem szükséges a tisztogató művelet, így a eszközként történik. H a a w jnstance nem nulla, akkor nem játszanak szerepet
dr_cleanup belépési pontja a driver.c-ben levő, más meghajtókkal megosztva hasz­ a c0d0-c0d3 közötti meghajtóegység-azonosítók, kivéve, ha egy PCI-sínvezérlő
nált, közös nopjleanu p-ra. mutat. További olyan függvények is vannak, amelyek „kompatibilisként”, azonosítja magát. Egy kompatibilis PCI-sínvezérlővel irányí­
lényegtelenek a m eghajtó számára; ezek szintén nop_ függvényekkel indulnak. Az tott meghajtóegységek azonosítója c0d0-c0d3 között van. A legtöbb M INIX 3-fel-
at_winchester_task indító függvénye (12336. sor) egy eljárást hív, amely elvégzi a használó számára ezek a dolgok valószínűleg nem érdekesek. Kevesebb mint négy
hardverfüggő kezdeti beállításokat, és utána meghívja a driver.c-ben levő főciklust, meghajtóegységgel (beleértve a CD-ROM -m eghajtót) rendelkező számítógép
átadva a w_dtab címét. A libdriver/driver.c-ben levő driver J a s k főciklus vég nélkül valószínűleg úgy jelenik meg a felhasználó számára, mint aminek egy klasszikus
fut, függvényeket hívogatva a driver táblázat segítségével. konfigurációja van, cOdO-tói c0d3-mai jelölt meghajtóegységekkel, akár IDE-,
Mivel most a tényleges elektromechanikus tárolóeszközökkel foglalkozunk, a akár PCI-vezérlőkhöz csatolva, és akár a klasszikus 40 tűs párhuzamos csatlako­
munka jelentős részét a merevlemez-meghajtó kezdeti beállításának az initj>arams- zót, akár az újabb soros csatlakozót használják. Ennek az illúziónak a fenntartása
szal való (12347. sor) elvégzése teszi ki. A merevlemez különféle param étereit a azonban bonyolult programozási háttérrel valósul meg.
312 3. BEVITEL/KIVITEL 3.7. LEMEZEK 313

A közös főciklus meghívása után egy rövid ideig semmi sem történik, amíg a kalmazható-e rá a lineáris blokkcímzés (Linear Block Addressing, LBA). H a igen,
merevlemez elérésére kísérlet nem történik. A merevlemezre vonatkozó első el­ akkor a meghajtó figyelmen kívül hagyja a cilinder-, fej- és szektorparamétereket,
érési kísérletkor egy üzenet kéri a D E V O P E N műveletet, amit a főciklus kap, és abszolút szektorszámokat használ a címzésre, ami sokkal egyszerűbb.
és közvetve meghívja a w_do_open-1 (12521. sor). Ezután a w_do_open meghívja M int ahogy korábban megjegyeztük, lehetséges, hogy az init_params nem tud­
a w_prepare-t, hogy eldöntse az eszköz vonatkozó kérés jogosságát, utána meghívja ja a BlOS-táblázatokból kideríteni a logikai lemezkonfigurációt. H a ez történik,
a w jdentify-1, hogy azonosítsa az eszköz típusát, és hogy végrehajtsa a wini vek­ akkor a 12666-12674. sorban található kód megpróbál készíteni egy megfelelő
torban néhány további param éter kezdeti beállítását. Végül a wini vektorban egy param éterhalm azt az alapján, amit magáról a lemezről olvas. Az ötlet az, hogy a
számláló vizsgálatával eldönti, hogy a M INIX 3 elindítása óta ez-e az első alkalom maximális cilinder-, fej- és szektorszámok 1023,255 és 63 lehetnek, ami az eredeti
az eszköz megnyitására. A vizsgálat után a számláló értékét megnöveli. H a ez az BlOS-adatszerkezetben ezeknél a mezőknél megengedett bitek számából szár­
első D E V O P E N művelet, akkor meghívja a partidon függvényt (drvlib.c-ben). maztatható.
A következő függvény, a w_prepare (12577. sor) átvesz egy device egész típusú H a az ATA ID E N TIF Y parancs sikertelen, ez egyszerűen jelentheti azt, hogy
argumentumot, ami a használandó meghajtóegység vagy partíció mellékeszköz- a lemez egy olyan régi modell, amely nem tám ogatja a parancsot. Ez esetben az
száma, és visszaad a device adatszerkezetre egy m utatót; ebben van az eszköz kez­ init_params által kiolvasott logikai konfiguráció értékeihez juthatunk csak hozzá.
dőcíme és m érete. A C nyelvben nincs akadálya annak, hogy ugyanazzal a névvel H a érvényesek, akkor a wini fizikai param éter mezőibe bemásolódnak, egyébként
azonosítsunk egy adatszerkezetet és egy változót. A mellékeszközszámból eldönt­ egy hiba adódik vissza, és a lemez nem elérhető.
hető, hogy az eszköz egy meghajtóegység, egy partíció vagy egy részpartíció. H a Végül a M INIX 3 a címek bájtokban való számlálásához egy u 3 2 j változót
egyszer a w_prepare elvégezte a munkáját, akkor a többi lemezt író vagy olvasó használ. A partíciók m érete 4 G B -ra van korlátozva. Viszont a device struktú­
függvény közül egyiknek sem kell foglalkoznia a particionálással. M int láttuk, egy ra, ami a partíciók báziscímét és m éretét rögzíti (a drivers/libdriver/driver.h-bán
D E V O PEN kérés teljesítésekor a w_prepare meghívására kerül sor; ez azonban van definiálva a 10856-10858. sorban), az u 6 4 j használja, és egy 64 bites szor­
egy előkészítés/átvitel ciklusnak is az egyik (első) része, amely ciklusra minden zást alkalmaz a meghajtóegység m éretének kiszámításához (12688. sor). A teljes
adatátviteli kéréskor szükség van. meghajtóegység kezdőcíme és m érete ezután a wini vektorba kerül, meghívódik a
A szoftverkompatibilis AT típusú lemezek m ár meglehetősen hosszú ideje hasz­ w_specify, ha szükséges kétszer, hogy param étereket adjon vissza a lemezvezérlő­
nálatosak, így szükséges, hogy a w jdentify (12603. sor) különbséget tudjon tenni nek (12691. sor). Végül több kernelhívás következik: egy sysjrqsetpolicy hívás biz­
az évek során bevezetett különböző konstrukciók között. Az első lépésben ellen­ tosítja, hogy amikor egy lemezvezérlő-megszakítás előfordul, és a megszakítás ke­
őrzi, hogy van-e egy olvasható és írható I/O-kapu, ha a családba tartozó összes le­ zelése megtörténik, autom atikusan újra engedélyezve a megszakításokat. Ezután
mezvezérlőnél ez kell. Eddig ez az első olyan példa, ahol felhasználói szintről I/O- egy sys-irgenable hívás teszi lehetővé a megszakítást.
kapu elérés van, és ez a tény megérdemli a figyelmet. A lemezeszköz I/O-ok szá­ A w jia m e (12711. sor) visszaad egy mutatót, az eszköz nevét tartalmazó karak­
m ára a 12201-től 12208-ig lévő sorokban definiált com mand struktúra bájtértékek tersorozatra; ez lehet: AT-D0, AT-D1, AT-D2 vagy AT-D3. Mikor egy hibaüzenetet
sorozatával van feltöltve. Később egy kicsit részletesebben is megvizsgáljuk ezt; itt kell megjeleníteni, ez a függvény mondja meg, hogy az melyik eszköz generálta azt.
azt jegyezzük meg, hogy a struktúra két bájtja feltöltött, egyik az A T A JD E N T IF Y Lehetséges, hogy egy meghajtóegység kikapcsolásra kerül, m ert valamilyen
értékkel, ami úgy értelm ezhető, mint egy parancs, amely ATA- (AT Attachm ent - szempontból a M INIX 3-mal nem kompatibilis. A w j o j e s t (12723. sor) gon­
AT-csatolás) meghajtóegységként kéri az azonosítását, és egy másik, amely kivá­ doskodik m inden egyes meghajtóegység teszteléséről az első megnyitási kísérlet­
lasztja a meghajtóegységet. Majd a co m jim p le meghívása történik. kor. A rutin a meghajtóegység első blokkját próbálja olvasni rövidebb várakozási
Ez a függvény elrejti a hét I/O-kapu azon vektorának a megkonstruálását, amely­ értékkel, mint egy rendes műveletnél szokás. H a a tesztelés sikertelen, akkor a
be a címek és a bájtok írása történik, ennek az információnak a rendszertaszkhoz meghajtóegységet állandóan elérhetetlennek jelöli.
küldését, egy megszakításra várakozást és a visszaadott állapot ellenőrzését. Ez el­ A w jp ecify (12775. sor) átadja a param étereket a vezérlőnek, szintén újra be­
lenőrzi a meghajtóegység működőképességét, és a 12629. sorban levő sysjnsw ker­ állítja a meghajtóegységet (ha az egy régebbi modell), végrehajtva egy keresést a
nelhívással egy 16 bites karaktersorozat írását engedi meg. Ennek az információ­ nulla sorszámú cilinderre.
nak a visszafejtése egy szövevényes processzus, a részleteire nem térünk ki. Ennek A dojransfer (12814. sor), mint a nevéből következik, összeállítja a command
sikeres m egtörténte után tekintélyes mennyiségű információ válik elérhetővé, struktúrát az összes olyan bájt értékéből, amik egy nagy mennyiségű adat (255 le­
beleértve azt a karaktersorozatot is, ami azonosítja a lemez modelljét és az esz­ mezszektor mennyiség lehet) átvitelének kéréséhez szükségesek, és utána meghív­
közhöz tartozó fizikai cilinder-, fej- és szektorparam étereket. (Vegyük észre, hogy ja a com_out-ot, amely a lemezvezérlőhöz küldi a parancsot. Az adatnak a lemez
előfordulhat az, hogy a „fizikai” konfigurációként közöltek nem azonosak az igazi címzésétől függően form ázottnak kell lennie, vagy cilinder-, fej-, szektorcímzés,
fizikai konfigurációval, de nincs más alternatíva számunkra, mint a lemezmeghajtó vagy LBA címzés szerint. Belsőleg a M INIX 3 a lemez blokkjait lineárisan címzi,
egység követeléseinek elfogadása.) A lemezinformáció azt is jelzi, hogy vajon al­ így LBA címzésnél az első hárombájtnyi mezőt feltölti a szektorszámláló megfele-
314 3. BEVITEL/KIVITEL 3.7. LEMEZEK 315

lő számú bittel való jobbra léptetésével, majd maszkolással 8 bites értékeket kap. nek alapján a kérés csökkentésére kerül sor. M iután ellenőrzi, hogy a lemez inicia­
A szektorszámláló egy 28 bites szám, így az utolsó maszkolás művelet egy 4 bites lizálva van-e, és ha szükséges volt a kérés csonkítása, akkor egy csonka adatra ad
maszkot használ (12830. sor). H a a lemez nem támogatja az LBA módszert, akkor egy kérést a dojransfer (12887. sor) meghívásával.
a cilinder-, fej- és szektorértékeket kiszámolja az alkalmazott lemez param éterei Egy átviteli kérés elkészülte után a belső ciklus indul, amely mindegyik szektor­
alapján (12833-12835. sor). ra ismétlődik. Egy olvasás vagy írás műveletnél valamennyi szektor számára egy
A kód egy utalást tartalmaz egy jövőbeni fejlesztési irányra vonatkozóan. A 28 bi­ megszakítás generálódik. Az olvasáskor a megszakítás jelzi, hogy az adat készen
tes szektorszámlálóval dolgozó LBA címzés a MINIX 3-at 128 GB-os vagy kisebb van, és átm ozgatható. A 12913. sorban levő sysjn sw kernelhívás kéri a rendszer­
m éretű lemezek teljes kihasználására korlátozza. (Nagyobb lemez is használható, taszkot, hogy olvassa ismételve a jelzett I/O-kaput, mozgassa át az adatot a jelzett
de a M INIX 3 csak az első 128 GB-ot éri el.) A programozók gondolkoztak egy processzus adathelyében egy virtuális címre. Az írás műveletnél a sorrend fordí­
újabb LBA48 módszeren, de még nem implementálták, amely 48 bitet használ a tott. A sysj)utsw meghívás néhány sorral lentebb, a vezérlőre ír egy adatsorozatot,
lemez blokkjainak címzésére. A 12824. sorban levő teszt megvizsgálja, hogy van-e és a lemezvezérlőtől jön a megszakítás, amikor a lemezre az átvitel befejeződik.
lehetőség erre. A teszt a M INIX 3-nál mindig sikertelen lesz a leírtak miatt. Ez Akár olvasás, akár írás történik, az a tjn tr jv a it meghívással kapható meg a meg­
jó, mivel nem kell kódot biztosítani a sikeres teszt esetére. Nem szabad elfelejte­ szakítás, például a 12920. sorban az írási műveletet követően. Bár a megszakítás
ni, hogy amennyiben a M INIX 3-at módosítanánk, hogy alkalmazza az LBA48-at, elvárt, ez a függvény a várakozás m egszüntetésére is módot ad, ha egy hibás m ű­
akkor annál többet kell tennünk, mint hogy bizonyos kóddal bővítünk. Sok helyen ködés lép fel és megszakítás nem jönne. Az atjntr_w ait a lemezvezérlő állapotre­
változtatásokat kellene tenni, hogy a 48 bites címek kezelhetők legyenek. Valószínű giszterét olvassa és visszaad különféle kódokat. A 12933. sorban van ennek a tesz­
könnyebbnek tűnik megvárni, hogy a M INIX 3 egy 64 bites processzorra is átvihető telése. írásnál vagy olvasásnál bekövetkező hiba esetén van egy break, ami átugorja
legyen. H a a 128 GB-os lemez nem elég nagy valakinek, az LBA48 módszer 128 PB azt a szekciót, ahova az eredmény rögzítve van, és a m utatókat és számlálókat a
(petabájt) elérést nyújt. következő szektor számára állítja be, így a belső ciklusban a következő alkalom­
Most röviden megnézzük, hogyan történik egy magasabb szinten az adatátvi­ mal ismét lesz próbálkozás ugyanarra a szektorra, ha m egengedett további próba.
tel. A korábban m ár vizsgált wjjrepare van meghíva elsőként. H a az átviteli kérés H a a lemezvezérlő egy hibás szektorról ad jelzést, akkor a w jransfer azonnal befe­
többszörös blokkra vonatkozik (vagyis egy D EV_G ATH ER vagy D EVJSCATTER jeződik. Más hibák esetén egy számláló értéke nő, és addig lehet a függvényt foly­
kérés), akkor közvetlenül ezután a 12848. sorban levő w jransfer hívása törté­ tatni, amíg a m a xjrro rs értékét nem éri el.
nik. H a az átvitel egyszerű blokkra vonatkozik (egy DEV_READ vagy egy DEV_ A következő függvény, amelyet megvizsgálunk a co m jiu t; ez a lemezvezérlő­
WRITE kérés), akkor egy leoszt/összegyűjt vektor kialakítására kerül sor, majd ez­ nek küldi a parancsot, de mielőtt a kódját megnéznénk, először nézzük a vezérlőt
után meghívódik a wjransfer. A w jransfer-t úgy írták, hogy egy io v e c j vektorba szoftverszempontból. A lemezvezérlő irányítása egy regiszterhalmazon keresz­
várja a kéréseket. A kérésvektor mindegyik eleme tartalm az egy puffercímet és a tül történik, amely regiszterek néhány rendszernél memórialeképezésűek, de az
puffer m éretét, ami a lemez szektorm éretének többszöröse lehet csak. Az összes IBM-kompatibilis rendszereken I/O-kapukként jelennek meg. Meg fogjuk nézni
többi szükséges információ a hívás argum entum aként van átadva, és ez a teljes ké­ ezeket a regisztereket (és általánosan az I/O-vezérlőregisztereket), és megvizs­
résvektorra is vonatkozik. gáljuk a használatuk néhány vonatkozását. A M INIX 3-ban további bonyodalom,
Először egy egyszerű tesztelés következik; ez megnézi, hogy az átvitel kezdetét hogy a vezérlők felhasználói szinten futnak, és nem tudnak regisztert olvasó és író
megadó lemezeim a szektorkorlátnak megfelel-e (12863. sor). Ezután a függvény parancsot végrehajtani. Alkalom nyílik a kemelhívások ilyen megszorítások m el­
külső ciklusa indul. A kérésvektor minden elem ére ismétlődik ez a ciklus. Mint letti használatának megnézésére is.
ahogyan korábban m ár többször láttuk, a ciklusban, m ielőtt a függvény a való­ Egy szabványos IBM-AT típusú merevlemez-vezérlő regisztereit m utatja a 3.23.
di m unkát elvégezné, bizonyos számú teszt van. Először a kért bájtok számának ábra.
kiszámolása történik a kérésvektor elemeinek io v jiz e mezőinek összeadásával. M ár számos alkalommal foglalkoztunk az I/O-kapukhoz kapcsolódó olvasással
Ellenőrzésre kerül, hogy ez a szám egy szektorm éretnek pontosan a többszörö­ és írással, hallgatólagosan úgy kezelve ezeket, mint memóriacímeket. Valójában az
se-e. Egy másik teszt azt ellenőrzi, hogy a kezdési cím az eszköz végénél vagy azon I/O-kapuk eltérően viselkedhetnek a memóriacímektől. Általában azok a beviteli
túl van-e, és ha a kérés túlnyúlna az eszköz végén, akkor a kérés m éretét megcson­ és kiviteli regiszterek, amelyek történetesen ugyanazzal az I/O-kapu címmel ren­
kítja. Az eddigi számítások bájtokban voltak, míg a 12876. sorban levő számolás delkeznek, nem azonos regiszterek. így beírva egy adatot egy konkrét címre, a rá
64 bites aritm etikát használ a lemezen a blokk helyének kiszámítására. Vegyük következő olvasási művelet nem feltétlenül tudja azt visszakeresni. Például a 3.23.
észre, hogy bár az alkalmazott változó neve block, ez a lemez blokkjainak egy szá­ ábrán az utolsó regiszter olvasásakor a lemezvezérlő állapotát mutatja, míg beír­
ma, azaz 512 bájtos szektoroknak, és nem a 4096 bájtos M INIX 3 által belsőleg ni ide a vezérlőnek szánt parancsot lehet. Szintén általános, hogy egy I/O-eszköz
használt „block”-nak. Ezután még egy beállítás van. M inden meghajtóegységnél regiszterének olvasása vagy írása előidézi egy tevékenység előfordulását, függet­
definiált az egyszerre kérhető bájtok maximális száma, és ha szükséges, akkor en­ lenül az átm ozgatott adat részleteitől. E z az AT-lemezvezérlő parancsregiszterére
316 3. BEVITEL/KIVITEL 3.7. LEMEZEK 317

Regiszter Olvasási tevékenység írási tevékenység a w jvaitfor hívódik meg. A w jvaitfor egy kernelhívást alkalmaz, amellyel kéri a
0 Adat Adat rendszertaszkot, hogy olvasson egy I/O-kaput, így a w jvaitfor az állapotregiszter
1 Hiba Kompenzációírás egy bitjét tudja tesztelni. Ez ciklikusan ismétlődik, míg a bit elkészül vagy időtúllé­
2 Szektorszámláló Szektorszámláló pés áll elő. A ciklusból a visszatérés gyors, ha a lemez készenléti állapotban van. így
3 Szektorszám (0-7) Szektorszám (0-7) ha a vezérlő készenléti állapotban van, akkor minimális késéssel visszaad egy igaz
4 Cilinder alacsony bitek (8-15) Cilinder alacsony bitek (8-15) értéket, de igaz érték lehet egy késés után is, ha azonnal nem elérhető a vezérlő, il­
5 Cilinder magas bitek (16-23) Cilinder magas bitek (16-23) letve hamis érték keletkezik, ha a vezérlő nem kerül készenléti állapotba a megsza­
6 Meghajtóegység/fej kiválasztása (24-27) Meghajtóegység/fej kiválasztása (24-27) bott időn belül. Az időtúllépésről bővebben a w jvaitfor tárgyalásánál szólunk.
7 Állapot Parancs Egy vezérlő egynél több meghajtóegységet is m űködtethet, így valahányszor a
vezérlő készenléti állapotba kerül, egy bájt írása történik, amely alapján kiválasz­
(a) tódik a meghajtóegység, az olvasófej és a műveleti kód (12966. sor), és ezután is­
m ét a waitfor meghívása következik. Egy lemezmeghajtó egység néha sikertelenül
7 6 5 4 3 2 1 0 hajtja végre a parancsot, vagy helytelenül adja át a hibakódot - végül is egy m e­
1 LBA 1 D HS3 HS2 HS1 HSO chanikai eszközről van szó, amely m egakadhat, beszorulhat vagy eltörhet benne
valami így a biztonság kedvéért egy sys_setalarm kernelhívást ad ki a rendszer­
LBA: 0 = Cilinder/fej/szektor mód taszknak, hogy ütemezzen be egy ébresztő eljárást. Ezt követően az a parancs lesz
1 = Logikai blokkcímzési mód kiadva, amelynek hatására először az összes param éter beíródik a különböző re­
D: 0 = Fő meghajtóegység
giszterekbe, és végül bekerül a parancsregiszterbe a parancs kódja. Ez a sys_voutb
1 = Alárendelt meghajtóegység
HSn: CHS mód: Fejkiválasztás cilinder/fej/szektor módban kernelhívással történik, amely egy (value, address) párokból álló vektort küld a
LBA mód: Blokk-kiválasztó bitek 24-27 rendszertaszkhoz. A rendszertaszk sorban mindegyik értéket (value) az address ál­
tal definiált I/O-kapura írja. A sys_voutb híváshoz az adatvektor a p v j e t makró al­
(b) kalmazásával van konstruálva, amely az includeIminixldevio.h-bán van definiálva.
A műveleti kódnak a parancsregiszterbe való írása indítja el a műveletet. Mikor ez
3.23. ábra. (a) Egy IDE merevlemez-vezérlő vezérlőregiszterei. A zárójelben levő számok befejeződik, egy megszakítás generálódik, és egy nyugtázó üzenet is elküldésre ke­
a logikai blokkcím bitjei minden regiszterre LBA módban, (b) A meghajtóegység/fej rül. H a a parancs túllépi az időt, akkor a jelző lejár, és egy egyidejű figyelmeztető
kiválasztás regiszterének mezői
értesítés a lemezvezérlőt felébreszti.
A következő függvények viszonylag rövidek. A w jie e d je s e t (12999. sor) meghí­
is érvényes. Szokásosan az alacsonyabb számozású regiszterekbe olyan adat ke­ vására kerül sor, amikor időtúllépés következik be, mialatt várakozik a lemezmeg­
rül, amely alapján kiválasztódik egy lemezeim, ahonnan olvas, illetve ahová ír, és szakításra vagy készenléti állapot kialakulására. A wjieed_reset-nck csupán az a fel­
utoljára a parancsregiszterbe a műveletkód helyeződik el. A parancsregiszterbe írt adata, hogy figyelemmel kísérje mindegyik meghajtóegység state változóját a wini
adat határozza meg, hogy mi lesz a művelet. A művelet kódjának a parancsregisz­ vektorban, és kierőszakoljon egy kezdeti beállítást a következő hozzáféréshez.
terbe beírása eredményezi a művelet elkezdését. A w_do_close-nak (13016. sor) kevés dolga van a hagyományos merevlemezek­
Előfordul az is, hogy néhány regiszternek vagy a regiszterek mezőinek a használa­ kel. A C D -R O M tám ogatásához bővítő kód szükséges.
ta nagyban eltérhet a műveletek különböző módjainál. Az ábrán szereplő példánál A com_simple segítségével olyan vezérlőparancsok adhatók ki, amelyek bárm i­
maradva, attól függően, hogy a 6-os regiszter 6. bitjébe (az LBA bitbe) 0 vagy 1 ke­ lyen adatátvitel nélkül befejeződnek. Ebbe a kategóriába tartoznak azok a paran­
rül beírásra, vagy a CHS (Cilinder-Head-Sector, cilinder-fej-szektor), vagy az LBA csok, amelyek visszakeresik egy lemez azonosítóját, beállítanak bizonyos param é­
mód kerül kiválasztásra. A 3., 4., 5. regiszterbe és a 6. regiszter alsó 4. bitjébe írt tereket, a lemezt ism ételten beállítják. Ennek a használatára a w jd en tify-bán már
vagy onnan olvasott adatok értelmezése az LBA bit beállítása szerint különböző. láttunk egy példát. A hívása előtt a com mand struktúrának m ár hibátlanul inicia­
Most nézzük, hogyan történik egy parancsnak a vezérlőhöz küldése a com_out lizálva kell lennie. Vegyük észre, hogy közvetlenül a com_out meghívása után egy
(12947. sor) meghívásával. A függvény meghívására a cm d struktúra beállítása a tjn tr jv a it hívás történik. Ez lényegében egy receive-et hajt végre, ami blokkol,
után kerül sor (a dojransfer által, mint m ár korábban láttuk). M ielőtt bármelyik amíg egy értesítés érkezik, jelezve egy megszakítás bekövetkeztét.
regiszter megváltozna, az állapotregiszter olvasásával eldönthető, hogy a vezérlő M ár láttuk, hogy a co m jyu t egy sys_setalarm kernelhívást kezdeményez, mielőtt
foglalt-e. Ez a STATU S_BSY bit tesztelésével történik. Itt fontos a gyorsaság, de a rendszertaszkot kérné, hogy a regisztereket írja, ami beállít és végrehajt egy pa­
normális esetben a lemezvezérlő készen áll, vagy kész lesz rövid időn belül, ezért rancsot. Ahogyan az áttekintést adó fejezetben írtuk, a következő récéivé művelet
tevékeny várakozást használunk. A STATU S_BSY ellenőrzésére a 12960. sorban rendszerint egy megszakítási értesítést kaphat. H a egy figyelmeztető jelzés be­
318 3. BEVITEL/KIVITEL 3.7. LEMEZEK 319

következik, és megszakítás nem fordul elő, akkor a következő üzenet egy SYN_ lehetőség kezelése a ciklusban van implementálva, az óraütések figyelésével. Ha
A L A R M lesz. Ez esetben a w jim e o u t hívása történik a 13046. sorban. Az, hogy időtúllépés fordul elő, akkor kerül meghívásra a w jie e d je s e t.
mit kell tenni, a w_command-bán levő parancstól függ. Az időtúllépés egy előző A w jvaitfor függvény által használt timeout param étert a DEF_TIMEOUT_
műveletből valószínűleg el van halasztva, és a w_command-ba belekerül a CMD TICKS definiál a 12228. sorban 300 ütésre vagy 5 másodpercre. Egy hasonló para­
IDLE, ami azt jelenti, hogy a lemez a műveletét végrehajtotta. Ebben az esetben méter, a WAKEUP (12216. sor) az időzítőtaszkból az ütem ező ébresztését végzi, és
semmi nem történik. H a a parancs nincs teljesítve, és a művelet egy olvasás vagy 31 másodpercre van beállítva. H a azt nézzük, hogy egy szokványos processzus csak
egy írás, akkor lehet, hogy az I/O-kérések m éretének csökkentése segíthet. Ez két 100 ms időt kap futásra, akkor a foglaltsági várakozásra pazarolható időperiódus
lépésben történik, először a maximálisan kérhető szektorok száma 8-ra, majd ezt nagyon hosszúnak tűnik. Azonban ezek a számok az AT osztályú számítógépekhez
követően 1-re csökken. M inden időtúllépésnél kinyomtatódik egy üzenet, a w_ illeszkedő lemezes eszközöknél előírt szabványnak tesznek eleget, amely szerint 31
need_reset meghívásával az összes meghajtóegység a következő eléréseknek meg­ m ásodpercet kell adni egy lemeznek, hogy a megfelelő sebességre felgyorsuljon.
felelően újból beállításra kerül. Az igazság természetesen az, hogy ez a legrosszabb eset, és a legtöbb rendszernél a
Amikor alapállapotba hozásra van szükség, a w je s e t hívódik meg (13076. sor). felpörgetés csak bekapcsoláskor fordul elő, vagy esetleg egy hosszú tétlen periódus
Ez a függvény egy tickdelay függvényt használ, amely beállít egy jelzőórát, és után, legalábbis a merevlemeznél. A CD-ROM -oknál vagy más olyan eszközöknél,
azután ennek lejártára vár. Egy kezdeti késlekedés után, ami ahhoz kell, hogy a amelyeknek gyakran fel kell pörögniük, ez valószínűleg lényegesebb kérdés.
meghajtóegység az előző műveletből magához térjen, a lemezvezérlő vezérlőre­ Néhány további függvény található az a tjvin i.c-ben. A w_geometry a kiválasz­
giszterében egy bit be van billentve egy időre (kapuzójel) - azaz, egy adott időin­ tott merevlemezeszköz logikailag maximális cilinder-, fej- és szektorszámát ad­
tervallumig az 1 szintre van állítva, utána visszatér a 0 logikai szintre. A művelet ja vissza. Ebben az esetben valós számokról van szó, nem úgy, mint a RAM-le-
után a waitfor meghívására kerül sor, ami a meghajtóegységnek egy ésszerű időin­ mezmeghajtónál volt. A wj>ther ism eretlen parancsokat és ioctl-eket kap el. A
tervallumot ad a készenléti állapot jelzésére. Az újraindítás sikertelensége esetén M INIX 3 jelenlegi változata valójában nem alkalmazza. A w_hw_int meghívására
kinyomtatódik egy üzenet, és egy hibaállapottal visszatér. akkor kerül sor, amikor váratlanul egy hardvermegszakítás érkezik. Az áttekintő
Az adatátvitelt magukba foglaló lemezparancsok normálisan egy megszakítás részben m ár láttuk, hogy ez akkor történik, amikor egy időtúllépés a várt megsza­
előállításával fejeződnek be, ami egy üzenetet küld vissza a lemezmeghajtónak. kítás előfordulása előtt lejár. Ez megválaszol egy récéivé műveletet, amely blok­
Valójában m inden egyes szektor írásakor vagy olvasásakor egy megszakítás jön kolva várakozik a megszakításra, viszont a megszakítás nyugtáját egy rá következő
létre. A w jn r tjv a it függvény (13123. sor) egy ciklusban a récéivé-1 hívja, és ha egy récéivé találhatja meg. Az egyetlen, amit tesz, hogy újra engedélyezi a megszakítást
SYS A L A R M üzenet érkezik, akkor a w jim e o u t meghívására kerül sor. Az egyet­ az a ck jrq s függvény meghívásával (13297. sor). Ez keresztülmegy az összes ismert
len más üzenetfajta, amelyet a függvény láthat, az a H A R D J N T . Mikor ezt kapja, meghajtóegységen, és a sysjrqenable kernelhívás alkalmazásával biztosítja az ösz-
akkor kiolvassa az állapotregisztert, és meghívja az actjirgs-1 újrainicializálni a szes megszakítás lehetőségét. Végül az atjvini. c végénél két furcsa, kicsi függvény
megszakítást. található, az strstatus és az strerr. Ezek m akrókat használnak (a definíció m egtalál­
A w jn tr jv a it meghívása nem közvetlen; mikor egy megszakítás érkezését vár­ ható a 13313. és a 13314. sorban) a hibakódok sztringbe való összefűzéséhez. Ezek
juk, akkor az a tjn tr jv a it (13152. sor) függvény meghívása történik. M iután az a függvények, mint írtuk, a M INIX 3-ban nincsenek használva.
a tjn tr jv a it-h e z megszakítás érkezik, gyors ellenőrzés történik a meghajtóegység
állapotbitjeire. M inden rendben van, ha a tevékenységnek megfelelő bitek hibát
írnak, és a hiba teljesen világos. M áskülönben közelebbről kell megnézni. H a a 3.7.6. Hajlékonylemezek kezelése
regiszter egyáltalán nem olvasható, akkor pánik lép fel. H a a problém a egy hibás
szektor, akkor egy speciális hibakód adódik vissza, a többi problém a egy általános A hajlékonylemez-meghajtó hosszadalmasabb és bonyolultabb a merevlemez­
hibakódot eredményez. M inden esetben a STATUS j i D M B S Y bit van beállítva és meghajtónál. Ez ellentm ondásnak tűnhet, mivel a hajlékonylemez szerkezete
később visszaállítva a hívó által. egyszerűbbnek látszik a merevlemezénél, azonban az egyszerűbb szerkezet egy­
M ár számos helyen láttuk a w jvaitfor (13177. sor) meghívását, ami a lemezve­ szerűbb vezérlővel párosul, és így több odafigyelést igényel az operációs rendszer­
zérlő állapotregiszterében egy bitet tevékeny várakozással figyel. Ez olyan helyzet­ től. További bonyodalmak forrása az a tény, hogy ezek az adathordozó eszközök
ben van alkalmazva, ahol elvárt, hogy a bit valószínűleg az első tesztnél hibátlan, cserélhetők. Ebben az alfejezetben néhány olyan dolgot tárgyalunk, amelyeket az
és egy gyors teszt a kívánatos. A gyorsaság miatt a M INIX korábbi változatainál implementálónak figyelembe kell vennie a hajlékonylemezekkel kapcsolatban, de
egy m akrót használtak, amely közvetlenül olvasta az I/O-kaput - term észetesen ez a M INIX 3 hajlékonylemez-meghajtó kódjának részleteibe nem megyünk bele.
nem engedhető egy felhasználói szintű meghajtónál a M INIX 3-ban. Itt a megol­ Legfontosabb részei hasonlók a merevlemez megfelelő részeihez.
dás egy do...while ciklus egy minimum költséggel az első teszt elvégzése előtt. H a a A hajlékonylemez-meghajtóval kapcsolatban egy dolog m iatt nincs ok aggoda­
tesztelt bit hibátlan, akkor azonnal visszatér a ciklusba. Az időtúllépés m iatti hiba­ lomra, ez a különféle típusú vezérlők támogatása, amivel foglalkozni kellett a m e­
320 3. BEVITEL/KIVITEL 3.7. LEMEZEK 321

revlemez-meghajtó esetében. Bár az eredeti IBM PC-konstrukció nem tám ogatta Hajlékonylemeznél a SEE K m űveletet expliciten programozni kell. Sikertelen
a napjainkban használatos nagy jelsűrűségű hajlékonylemezeket, az IBM PC csa­ SEEK esetén egy R EC ALIBRATE m űveletet végrehajtó rutinra van szükség, ami
lád minden számítógépének hajlékonylemez-vezérlője egyetlen szoftvermeghajtó­ kikényszeríti a fej elmozdulását a 0. cilinderre. Ezzel a vezérlőnek lehetősége nyí­
val működik. A merevlemezzel ellentétes helyzet valószínűleg abból adódik, hogy lik arra, hogy a tervezett pályavonalra előremozdítsa a fejeket, azokat az ismert
a hajlékonylemeznél vélhetően hiányzik a motiváció a teljesítmény növelésére. A számszor léptetve. Természetesen a merevlemeznél is hasonló m űveletre van
hajlékonylemezeket igen ritkán használják a számítógéprendszer működése során szükség, de a meghajtóegység vezérlője anélkül vezérli a fejeket, hogy az eszköz-
m unkatárolóként; sebességük és tárolókapacitásuk is meglehetősen korlátozott a m eghajtó szoftvertől részletes útm utatót kapna.
merevlemezekéhez képest. A hajlékonylemezek valamikor fontosak voltak az új A hajlékonylemez-meghajtó egység néhány olyan sajátossága, ami bonyolítja a
szoftverek terjesztésében és a biztonsági másolatok tárolásánál, de m ióta a háló­ meghajtót:
zatok és a nagy kapacitású cserélhető tárolók váltak általánossá, a PC-khez újabb
hajlékonylemez-meghajtó egység szabványokat m ár nem terveznek. 1. A hajlékonylemez cserélhető eszköz.
A hajlékonylemez-meghajtók sem az SSF stratégiát, sem a liftes algoritmust nem 2. Többféle lemezformátum használatos.
alkalmazzák. Szigorúan egymás után fogadják a kéréseket, és végrehajtják azokat, 3. Motorvezérlés.
mielőtt egy másik kérést elfogadnának. Ez az elv jelent meg az eredeti MINIX-
tervben, mivel a M INIX-et személyi számítógépeken való használatra tervezték, Néhány merevlemez-vezérlő lehetőséget ad cserélhető eszközök használatára,
ahol az idő túlnyomó részében csak egy processzus aktív. így annak valószínűsége, ilyen például egy CD-ROM -m eghajtó egység, de általában a meghajtóvezérlő bár­
hogy egy lemezcserére kérés érkezzék, mialatt egy másik végrehajtása tart, nagyon milyen komplikált esetet képes kezelni anélkül, hogy támogatás lenne az eszköz-
kicsi. Éppen ezért kevés haszon származna egy olyan, meglehetősen bonyolult m eghajtó szoftverben. Egy hajlékonylemeznél azonban nincs beépített támogatás,
szoftverből, amire szükség lenne a kérések sorba állításánál. De azért sem lenne pedig egyre inkább kellene. A hajlékonylemezek leggyakoribb alkalmazásai közül
érdemes bonyolítani, m ert manapság a hajlékonylemezeket ritkán használják más­ bizonyosaknál - új szoftver telepítése vagy állományok biztonsági tárolása - való­
ra, mint egy merevlemezes rendszerből vagy abba történő adatmozgatásra. színűleg szükséges a lemezek cseréje a meghajtóegységben. Hiba léphet fel, ha az
Az elm ondható, hogy más blokkos eszközökhöz hasonlóan, a hajlékonyle- egyik hajlékonylemezre szánt adat egy másik lemezre kerül rá. Az eszközmeghaj­
mez-meghajtó is tud osztott I/O-kérést kezelni. Azonban a hajlékonylemez-meg­ tónak kellene valamit tennie ennek megelőzésére. Bár ez nem mindig lehetséges,
hajtó esetében a kérések vektora kisebb, mint a merevlemeznél, mégpedig a felső mivel nem m inden hajlékonylemez-meghajtó egység hardver teszi lehetővé an­
korlátot a lemez pályavonalán elhelyezkedő szektorok maximális száma jelenti. nak m eghatározását, hogy vajon a legutolsó hozzáférés óta az egység ajtaja nyitva
A hajlékonylemez hardverének egyszerűsége a felelős a néhány esetben bo­ van-e. Egy másik problém a a cserélhető eszközökkel kapcsolatban, hogy egy rend­
nyolult hajlékonylemez-meghajtó szoftverért. Az olcsó, lassú, kis kapacitású haj­ szer felfüggesztett állapotba kerülhet, amikor kísérletet tesz egy hajlékonylemez­
lékonylemez-meghajtó egységek nem rendelkeznek olyan kifinomult integrált ve­ m eghajtó egység elérésére, amelyben nincs lemez. Egy nyitott ajtó érzékelésével
zérlőkkel, amelyek részét képezik a m odern merevlemez-meghajtó egységeknek, ez a problém a megoldható lenne, de mivel erre nincs mindig lehetőség, így néhány
így a lemezműveletek azon aspektusaival, amelyek egy merevlemez-meghajtó egy­ intézkedést kell tenni az időtúllépéssel és a hibavisszaadással kapcsolatban, ha a
ség esetében a műveletbe rejtve vannak, a hajlékonylemez-meghajtó szoftvernek hajlékonylemezes művelet nem fejeződik be ésszerű időn belül.
expliciten kell foglalkoznia. A hajlékonylemez-meghajtó egység egyszerűségéből Cserélhető eszköz helyettesíthető másik eszközzel, és a hajlékonylemezeknél
adódó komplikációra példa a SE E K művelet, amely az olvasófejet adott pályavo­ sok különböző lehetséges formátum jöhet szóba. Az IBM-kompatibilis hardver
nalra mozgatja. Egyik merevlemez sem követeli meg a meghajtószoftvertől, hogy mind a 3,5 hüvelykes, mind az 5,25 hüvelykes lemezmeghajtó egységeket tám ogat­
expliciten meghívjon egy SEEK műveletet. Lehet hogy a merevlemeznél a prog­ ja, ezek pedig változatos m ódon formázhatok 360 KB-tól 1,2 MB-ig (5,25 hüvely­
ramozó számára látható cilinder-, fej-, szektorgeom etria nem egyezik meg a le­ kes lemeznél) vagy 1,44 MB-ig (3,5 hüvelykes lemeznél).
mez fizikai geometriájával. Valójában ez utóbbi bonyolultabb is lehet. Szokásosan A MINIX 3 hét különböző hajlékonylemez-formátum használatát támogatja.
többszörös zónák (cilinderek csoportja) vannak, több szektorral sávonként a Az ebből adódó problém a megoldására két lehetőség is van. Az egyik módszer
kintebbi zónákon, mint a bentebbieken. Azonban ez nem látható a felhasználó szerint minden lehetséges form átum ra mint különböző meghajtóegységekre hivat­
számára. A merevlemezek elfogadják a lemez abszolút szektorszámmal történő kozik, és gondoskodik több alárendelt eszközről. A M INIX régebbi változatai ezt
címzését, vagyis a logikai blokkos címzést (LBA), mint a cilinder-, fej- és szektor­ a módszert alkalmazták. Tizennégy különböző eszközt definiáltak, felsorakoztatva
címzés alternatíváját. A cilinder, fej, szektor hármassal történő címzésnél bármely ezeket az első meghajtóegységbeli 360 KB-os 5,25 hüvelykes lemeznek meg­
olyan geom etria használható, amely nem létező szektorokat nem címez, mivel a felelő /dev/pcO-tói a /dev/PSl-ig, ami az 1,44 MB-os 3,5 hüvelykes második meg­
lemez integrált vezérlője kiszámítja az olvasófej elmozdulásának helyét, és a p á­ hajtóegységbeli lemezhez tartozik. Ez kényelmetlen megoldás volt. A M INIX 3
lyavonalon belüli szektort is megkeresi, amikor szükséges. egy másik módszert alkalmaz: amikor az első hajlékonylemez-meghajtó egység
322 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 323

/dev/fdO-ként vagy a második Idevlfdl-ként van címezve, akkor a lemezmeghajtó 3.8.1. A terminálhardver
a meghajtóegységet elérve megvizsgálja az abban pillanatnyilag található lemez
formátum át. Néhány formátum több cilindert vagy több szektort tartalm az pálya­ Az operációs rendszer szempontjából a term inálokat három nagy csoportba sorol­
vonalanként, mint más formátumok. Egy hajlékonylemez form átum ának m egha­ hatjuk aszerint, ahogyan az operációs rendszer információt cserél velük, illetve
tározása a magasabb számozású szektorok és pályavonalak olvasása útján történik. alapvető elektronikai tulajdonságaik alapján. Az első csoport a tárcímleképezéses
Egy kizárásos módszerrel a formátum meghatározható. Ehhez idő kell, de a m o­ term inálok csoportja, amelyek egy billentyűzetből és egy képernyős megjelenítő­
dern számítógépeken valószínűleg csak 1,44 MB-os 3,5 hüvelykes lemezek van­ ből állnak, m indkettő elektronikailag hozzá van csatlakoztatva a számítógéphez.
nak, és elsőként ez a formátum van ellenőrizve. Másik lehetséges probléma, ha egy Ezt a típust használják az összes személyi számítógépben a billentyűzethez és a
lemez hibás szektorokat tartalmaz, és esetleg nem ismerhető fel. Egy segédprogra­ monitorhoz. A második csoportba tartoznak azok, amelyek egy RS-232 szabványt
m ot alkalmaznak a lemez azonosításához; az operációs rendszerben ezt túlságosan használó soros vonalon keresztül csatlakoznak, leggyakrabban egy modemen ke­
lassú lenne autom atikusan végrehajtani. resztül. Ezt a modellt használják néhány nagyszámítógépen, de a PC-knck ugyan­
A hajlékonylemez-meghajtóval kapcsolatos, utoljára m aradt nehézség a m otor csak van soros vonali csatolójuk. A harmadik csoport olyan terminálokból áll,
vezérlése. A lemezek csak akkor olvashatók vagy írhatók, ha forgásban vannak. A amelyek hálózaton keresztül kapcsolódnak a számítógéphez. Ez a csoportosítás
merevlemezeket úgy tervezik, hogy több ezer órát futhatnak elhasználódás nélkül, látható a 3.24. ábrán.
de a m otor állandó működése m iatt a hajlékonylemez-meghajtó egység és a le­
mezek gyorsan kopnának. H a a m otor még nincs bekapcsolva a meghajtóegység
elérésekor, akkor egy parancs kiadása szükséges, amely az egységet elindítja, és Tárcímleképezéses terminálok
utána fél m ásodpercet vár, mielőtt az adat olvasását vagy írását megkísérelné. A
m otor kikapcsolása és bekapcsolása lassú, ezért a M INIX 3 egy meghajtóegység A term inálok első nagy csoportját, ahogyan a 3.24. ábra is mutatja, a tárcímle­
használata után még néhány másodpercig az egység m otorját bekapcsolva hagyja. képezéses term inálok alkotják. Ezek integrált részei m agának a számítógépnek,
H a ezen intervallumon belül ismét felhasználásra kerül a meghajtóegység, akkor különösen a személyi számítógépeknek. Egy képernyős megjelenítőből és egy bil­
az idő további néhány másodperccel meghosszabbodik. H a a meghajtóegységet lentyűzetből állnak. A tárcímleképezéses megjelenítők egy speciális memórián, az
nem használják az adott intervallumon belül, akkor a m otor kikapcsolódik. ún. videó RAM-on keresztül csatlakoznak a számítógéphez, ez a tárterület része a
számítógépben található memória címtartományának, és a CPU ugyanúgy címzi,
mint a m emória többi részét (lásd 3.25. ábra).
A videó RAM kártyán található egy olyan lapka (chip) is, amelyet videovezérlőnek
3.8. A terminálok neveznek. Ez a lapka veszi elő a karakterkódokat a videó RAM-ból, és állítja elő a
képernyős megjelenítőt vezérlő videojelet. A képernyős megjelenítőknek két fajtá­
Évtizedeken keresztül a felhasználók olyan készülékekkel kommunikáltak a szá­ ja van: a katódsugárcsöves monitorok és a lapos megjelenítők. A katódsugárcsöves
mítógépekkel, amelyek a felhasználó inputját közvetítő billentyűzetből és a szá­
mítógép válaszait megjelenítő egységből álltak. Hosszú évekig ezeket az önálló
készülékeket term ináloknak nevezték, és vezetékkel kapcsolódtak a számítógép­
hez. A pénzügyi szektorban és az utazási irodákban a nagyszámítógépekhez még
mindig gyakran használják ezeket a term inálokat, amelyek rendszerint modemen
keresztül kapcsolódnak a nagyszámítógéphez, különösen ha távol helyezkednek
el tőle. A személyi számítógépek megjelenésével azonban a billentyűzet és a meg­
jelenítő egység inkább különálló periféria lett, mint egyetlen készülék, azonban
annyira szorosan összefüggenek egymással, hogy együtt tekintjük át őket a továb­
biakban a „term inál” elnevezés alatt.
Történetileg a term ináloknak sok formája alakult ki. A terminálmeghajtó prog­
ram feladata, hogy ezeket a különbségeket elrejtse, így az operációs rendszer és
a felhasználói program ok eszközfüggetlen részét nem szükséges átírni minden
egyes termináltípushoz. A következő alfejezetekben a m ár megszokott módon kö­
zelítjük meg témánkat, először a term inálok hardveréről és szoftveréről lesz szó 3.24. ábra. Termináltípusok
általánosságban, majd pedig a M INIX 3-szoftverről.
324 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 325

Grafikus Videó RAM Képernyő


RAM-cíi

25 sor

. . .X 3 X 2 X 1 X 0 OxBOOAO
. . . xDxCxBxA OxBOOOO

-*---160 bájt ---- *- 80 karakter


(a) (b)
3.25. ábra. A tárcímleképezéses terminálok közvetlenül a videó RAM-ba írnak
3.26. ábra. (a) A videó RAM tartalma az IBM monokróm megjelenítő esetén, x jelöli
monitor (Cathode Ray Ilibe, CRT) elektron-sugárnyalábot generál, amely vízszin­ az attribútumbájtokat, (b) A megfelelő képernyőkép
tesen pásztázza a képernyőt, és sorokat rajzol ki rá. A képernyő sorainak száma ti­
pikusan 480 és 1200 között változik a képernyő tetejétől az aljáig, míg egy sor 640- amely m eghatározza a színt, az inverz módot, villogó m ódot és így tovább. Ebben
1920 képpontból áll. Ezeket a képpontokat nevezik pixelnek. A videovezérlőjel a m ódban a 25 x 80 karaktert tartalmazó teljes képernyőhöz 4000 bájt videó RAM
modulálja az elektron-sugárnyaláb intenzitását, meghatározva, hogy egy adott pi­ szükséges. Minden m odern megjelenítő a mai napig támogatja ezt az üzemmódot.
xel világos vagy sötét legyen. A színes monitorokban három sugárnyaláb van: a pi­ A jelenlegi grafikus term inálok ugyanezt az elvet használják, azonban ekkor
ros, a zöld és a kék képpontokhoz, amelyeket egymástól függetlenül modulálnak. m inden egyes képpontot a képernyőn önállóan vezérelnek. A legegyszerűbb kon­
A lapos megjelenítők teljesen másként működnek, de egy CRT-kompatibilis figurációban, m onokróm képernyő esetén, m inden képpontnak egy bit felel meg
lapos megjelenítő ugyanolyan szinkron- és videojeleket fogad, mint egy CRT m o­ a videó RAM-ban. Egy másik szélsőséges esetben m inden képpontot egy 24 bites
nitor, és ezeket arra használja, hogy egy folyadékkristály cellát vezéreljen velük szám ábrázol, 8-8 bit a piros, a zöld és a kék színt. Egy 768 X 1024 pixel felbontású
m inden pixelpozícióban. színes képernyő képének tárolásához 24 bites pixelekkel 2 MB RAM szükséges.
Egy egyszerű m onokróm képernyő esetén egy karakter (beleértve a karakte­ A tárcímleképezéses megjelenítők megjelenésével a billentyűzet teljesen elvált
rek közötti helyközöket is) egy 9 pixel széles és 14 pixel magas dobozba fér el, és a képernyőtől. A billentyűzet soros vagy párhuzamos porton keresztül csatlakoz­
a képernyő 25 sort, soronként 80 karaktert jelenít meg. A képernyőnek így 350 tatható. M inden egyes billentyű leütésekor a CPU-hoz egy megszakításkérés ér­
egyenként 720 pixelt tartalm azó rasztersora van. M inden egyes képet m ásodper­ kezik, és a billentyűzetmeghajtó egy I/O-kapu kiolvasásával kapja meg a leütött
cenként 45-70 alkalommal frissítenek. A videovezérlő m egtervezhető úgy, hogy karaktert.
kiolvassa az első 80 karaktert a videó RAM-ból, előállít 14 rasztersort, majd ki­ Egy PC-n a billentyűzet egy beépített mikroprocesszort tartalmaz, amely egy
olvassa a következő 80 karaktert a videó RAM-ból, és előállítja a következő 14 speciális soros porton keresztül kommunikál az alaplapon lévő vezérlővel. Meg­
rasztersort, és így tovább. Valójában a karaktereket legtöbbször m inden egyes szakításkérés keletkezik, valahányszor egy billentyűt lenyomnak, és akkor is, ami­
rasztersor előállítása során kiolvassák a memóriából, hogy a videovezérlőben ne kor egyet felengednek. Továbbá a billentyűzethardver csupán a megnyomott gomb
legyen szükség pufferelésre. A 9-szer 14 bites karakterm inták a videovezérlő által billentyűkódját (scan code), és nem az ASCII (American Standard Code fór In­
használt ROM -ban vannak. (RAM is használható a felhasználók által definiálható form ation Interchange) kódját továbbítja. Amikor az A gombot lenyomják, a
betűkészletek támogatásához.) A ROM -ot 12 bites címmel címzik meg, amelyből 30-as billentyűkód kerül az I/O-regiszterbe. A meghajtóprogram feladata, hogy el­
8 bit a karakter kódja, 4 bit a rasztersor azonosítása. A RO M minden egyes bájtjá­ döntse róla, hogy kisbetűs, nagybetűs, c t r l - A , a l t - A , c t r l - a l t - A vagy valamilyen
nak 8 bitje 8 képpontot vezérel; a 9. - a karakterek közötti képpont - mindig üres. más billentyűkombináció. Mivel a meghajtóprogram tudja, hogy mely billentyű­
így 14 X 80 = 1120 videó RAM-beli memóriahivatkozásra van szükség a szöveg ket nyomták le, de még nem engedtek fel (például s h i f t ) , így elég információval
egy sorának a képernyőn való megjelenítéséhez. Ugyanennyi hivatkozás történik a rendelkezik e feladat végrehajtásához. Bár ez a fajta billentyűzetillesztés minden
karakterképeket tároló R O M -ra is. terhet a szoftverre helyez, ugyanakkor rendkívül rugalmas. Például a felhasználói
Az eredeti IBM PC gépeknek több képernyő üzemmódja volt. A legegyszerűbb program ok megtudhatják, hogy a lenyomott számjegy a billentyűzet felső sorából
esetben a konzol egy karakteres megjelenítő volt. A 3.26.(a) ábrán a videó RAM vagy a jobb oldali numerikus billentyűzetről érkezett. Elvileg a m eghajtóprogram
egy részletét láthatjuk. Minden egyes képernyőn lévő karakter - a 3.26.(b) ábrán ezt az információt meg tudja adni.
látunk egy példát - két bájtot foglal el a RAM-ban, az alacsony helyi értéken van
a m egjelenítendő karakter ASCII kódja. A magas helyi érték egy attribútumbájt,
326 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 327

RS-232-es terminálok banki, repülőjegy-foglalási és hasonló alkalmazásoknál. Az olyan term inálprogra­


mokat azonban, amelyek megengedik, hogy egy távoli számítógép szimuláljon egy
Az RS-232-es term inálok olyan eszközök, amelyek egy billentyűzetből és egy term inált, még mindig széles körben használják.
megjelenítőből állnak, amelyek egy soros interfészen keresztül bitenként kommu­ Egy karakter megjelenítéséhez a terminálm eghajtó program beírja a karak­
nikálnak (lásd 3.27. ábra). Ezek a term inálok egy 9 vagy 25 tűs csatlakozóval ren­ tert az illesztőkártyába, ahol az tárolódik, majd az UART bitenként továbbítja
delkeznek, amelyből egy tű az adatküldésé, egy tű az adatfogadásé és egy tű a föld. a soros vonalra. Még 56000 bit/s esetén is 140 (xs-ra van szükség egy karakter
A többi tű a különféle vezérlőjeleké, amelyek nagyobb részét nem használják. továbbításához. Ennek az alacsony átviteli sebességnek az eredménye, hogy a
Ahhoz, hogy egy karaktert egy RS-232-es terminálhoz eljuttassunk, a számítógép­ meghajtóprogram általában elküld egy karaktert az RS-232-es illesztőkártyának,
nek bitenként el kell küldeni a karakter kódját, amelyet megelőz egy start bit, és majd blokkolt állapotba kerül, és várja az illesztő által generált megszakítást, am i­
1 vagy 2, a karaktereket elválasztó stop bit követ. A stop bitek elé egy paritás bit kor a karaktert továbbította, és az UART képes egy újabb karakter fogadására. Az
is kerülhet, amely alapszintű hibafelderítést tesz lehetővé, bár ez csak nagyszámí­ UART, mint az a nevében is benne van, képes a karaktereket egyidejűleg fogadni
tógépes rendszer esetén szokásos követelmény. Az általánosan elterjedt átviteli és küldeni. Megszakításkérés keletkezik egy karakter beérkezésekor is, és általá­
sebességek 14400 és 56000 bit/s, az előbbi a fax, az utóbbi adatok átvitelére. Az ban lehetőség van kevés számú beérkező karakter pufferelésére is. Egy megsza­
RS-232-es term inálokat általában arra használják, hogy egy távoli számítógéppel kítás kiszolgálásakor a terminálmeghajtó program nak egy regisztert kell megvizs­
terem tsenek kapcsolatot egy modem cs egy telefonvonal segítségével. gálnia, hogy m eghatározza a megszakítás okát. Vannak olyan illesztőkártyák, am e­
Minthogy a számítógép és a terminál is karakterekkel dolgozik, de a soros vona­ lyek CPU -t és mem óriát is tartalm aznak, és több vonalat is tudnak kezelni, átvéve
lon bitenként kell kommunikálniuk, ezért kifejlesztettek olyan m ikroáram köröket, ezzel a CPU-tól az I/O terhének nagy részét.
amelyek megvalósítják a karakter-soros átvitel, illetve a soros átvitel-karakter kon­ Ahogy már említettük, az RS-232-es term inálok alosztályokba sorolhatók.
verziókat. Ezeket UART-nak (Universal Asynchronous Receiver TYansmitters), A legegyszerűbbek a papírra író (hardcopy) term inálok voltak. Ezek a billentyűze­
univerzális aszinkron adóvevőnek hívják. Az UART-okat úgy kapcsolják a számí­ ten leütött karaktereket továbbították a számítógépbe, a számítógép által küldött
tógépekhez, hogy egy RS-232-es illesztőkártyát csatlakoztatnak a rendszersínhez, karaktereket pedig papírra írták. Ezek a term inálok m ára elavultak, és igen ritkán
ahogyan a 3.27. ábra mutatja. A m odern számítógépekben az UART és az RS-232 láthatók.
interfész gyakran része az alaplap áram köreinek. Az alaplapon lévő UART-ot le A „buta” CRT-terminálok ugyanígy működnek, csak papír helyett képernyőt
lehet tiltani, és ezzel lehetővé lehet tenni egy modemillesztő kártya csatlakoztatá­ használnak. Ezeket „üvegre író”-nak (glass tty) is szokás hívni, mivel ugyanazt a
sát a sínhez vagy m indkettő m űködését. Egy modem ben ugyancsak van egy UART tevékenységet végzik, mint a papírra író tty terminálok. (A „tty” kifejezés - a Tele-
(amelyet esetleg más funkciókkal együtt integrálnak egy multifunkciós lapkára), type® rövidítése - , ami egy korábbi, a számítógépterminál-piacon úttörő munkát
a kommunikációs csatorna azonban inkább egy telefonvonal, mint soros kábel. végző társaság neve; a „tty” elfogadottá vált tetszőleges fajtájú terminál jelölésé­
Azonban a számítógép számára az UART ugyanúgy néz ki, függetlenül attól, hogy re.) A „buta” term inálok (glass tty-k) m ára szintén elavultak.
a médium egy dedikált soros kábel vagy egy telefonvonal. Az intelligens CRT-terminálok valójában kicsinyített, speciális célú számítógé­
Az RS-232-es term inálok kihalófélben vannak, PC-k foglalják el a helyüket, bár pek. Van bennük CPU és memória, és egy program ot is tartalmaznak, általában
még mindig előfordulnak régebbi nagyszámítógépes rendszerekben, különösen a ROM -ban. Az operációs rendszer szempontjából a „buta” term inálok és az intel­
ligens terminálok között a legfőbb különbség az, hogy az utóbbiak m egértenek
bizonyos vezérlőszekvenciákat. Például elküldve az ASCII ESC karaktert (033),
Számítógép
majd bizonyos másik karaktereket, a kurzor tetszőleges helyre mozgatható a kép­
RS-232 ernyőn, beszúrhatunk szöveget a képernyő közepén, és így tovább.

3.8.2. A terminálszoftver

A billentyűzet és a képernyő majdnem független eszközök, így különválasztva fog­


juk kezelni őket a továbbiakban. (Nem teljesen függetlenek, hiszen a leütött bil­
Sín
lentyűket meg kell jeleníteni a képernyőn.) A M INIX 3-ban a billentyűzet- és a
képernyőmeghajtó ugyanannak a processzusnak a részei; más rendszerekben szét­
3.27. ábra. Egy RS-232-es terminál egy adatvonalon keresztül, bitenkénti átvitellel kommunikál válhatnak különálló meghajtókká.
a számítógéppel. A számítógép és a terminál teljesen függetlenek egymástól
328 3- BEVITEL/KIVITEL 3.8. A TERMINÁLOK 329

A beolvasást kezelő szoftver a billentyűzet által szolgáltatott kódokat ASCII (American Standard Code fór
Inform ation Interchange) kódokra átalakító táblázatot befordítják a billentyű­
A billentyűzetmeghajtó alapfeladata, hogy összegyűjtse a billentyűzetről érkező zetmeghajtóba, azonban ez nem felel meg a nem angol nyelvet használóknak. A
adatokat, és továbbítsa a felhasználói programoknak, amikor azok a terminálról billentyűzet elrendezése különbözik az egyes országokban, az ASCII karakter-
olvasnak. Két lehetséges filozófiát fogadhatunk el a meghajtóprogram szem pont­ készlet még a Föld nyugati részén élő em berek többségének sem felel meg, ahol a
jából. Az első szerint a meghajtó feladata csak az, hogy fogadja az érkező adatokat spanyol, portugál és francia nyelvekben olyan ékezetes karakterekre és írásjelek­
és továbbítsa felfelé módosítás nélkül. A felhasználói program, amikor a term inál­ re van szükség, amelyeket az angolban nem használnak. Annak érdekében, hogy
ról olvas, ASCII kódok nyers sorozatát kapja. (Billentyűsorszámot továbbítani túl a különböző nyelvek számára szükséges rugalmas billentyűzetelrendezés iránti
primitív és túlságosan gépfüggő lenne.) igényt kielégítsék, sok operációs rendszer gondoskodik betölthető billentyűzet­
Ez a szemlélet különösen megfelel az olyan fejlett képernyőszerkesztők igényei­ térképekről vagy kódlapokról, amelyek lehetővé teszik, hogy megválaszthassuk a
nek, mint az emacs, amelyek lehetővé teszik a felhasználóknak, hogy tetszőleges billentyűkód és az alkalmazásnak átadott kód közötti hozzárendelést rendszerbe­
m űveletet rendeljenek bármely karakterhez vagy karaktersorozathoz. Ez azonban töltéskor vagy később.
azt jelenti, hogy ha a felhasználó a date szó helyett azt gépeli, hogy dste, majd kija­ H a a terminál kanonikus (feldolgozott) m ódban van, a karaktereket tárolni
vítja a hibát három visszatörlés (backspace), az ate és a kocsi vissza karakterek be­ kell, amíg egy teljes sor össze nem gyűlik, mivel a felhasználó később dönthet úgy,
gépelésével, a felhasználói program megkapja mind a l l begépelt ASCII kódot. hogy a sor egy részét törli. Akkor is szükség van pufferelésre, ha a terminál nyers
A program ok többsége nem kíván ennyi részletet. Csak a javított bem enő adat­ m ódban van, hisz előfordul, hogy a program még nem kérte az inputot, ezért a ka­
ra van szükségük, és nem arra, hogy pontosan milyen karaktersorozattal állították raktereket átm enetileg tárolni kell, megengedve az előre gépelést. (Azok a rend­
elő. Ez a megfigyelés vezet el a második filozófiához: a meghajtó kezeli a soron be­ szertervezők, akik az előre gépelést nem engedik meg a felhasználóknak, m egér­
lüli szerkesztési műveleteket, és csak a kijavított sorokat továbbítja a felhasználói demelnék, hogy kátrányba és tollba hempergessék őket, vagy ami még rosszabb,
programoknak. Az első filozófia karakterorientált, a második pedig sororientált. hogy kényszerítsék őket arra, hogy a saját rendszerüket használják.)
Eredetileg a nyers mód (raw mode) és a feldolgozott mód (cooked mode) kifeje­ Két közismert módja van a karakterpufferelésnek. Az első esetben a meghajtó
zésekkel hivatkoztak rájuk. A POSIX szabvány a kevésbé képszerű kanonikus egy közös puffergyűjtő területet alkalmaz, ahol m inden egyes puffer tartalm azhat,
mód kifejezést használja a sororientált módra. A legtöbb rendszerben a kanonikus mondjuk, 10 karaktert. M inden term inálhoz egy adatszerkezet kapcsolódik, mely
mód egy jól definiált konfigurációra vonatkozik. A nemkanonikus mód a nyers több más adat mellett egy m utatót is tartalm az az olyan pufferekből álló láncra,
móddal azonos, bár a terminál viselkedésének sok részlete eltérő lehet. A POSIX- amelyek az adott term inálról érkező adatokat tárolják. Ahogy érkeznek a karak­
kompatibilis rendszerek különféle könyvtári függvényeket biztosítanak, amelyek terek, újabb puffereket foglalnak le és fűznek hozzá a lánchoz. Amikor a karak­
tám ogatják bármelyik mód választását, és lehetőséget adnak a terminálkonfigurá­ tereket továbbították a felhasználói programnak, a puffért kiveszik a láncból, és
ció sok tulajdonságának változtatására. A MINIX 3-rendszerben ezt a feladatot az visszateszik a közös puffergyűjtő területre.
ioctl rendszerhívás támogatja. A másik megközelítésben a term inálhoz tartozó adatszerkezet közvetlenül
A billentyűzetmeghajtó első számú feladata a karakterek összegyűjtése. Ha tartalm azza a puffért, közös pufferterület nincs. Minthogy a felhasználók számá­
minden billentyűleütés megszakítást okoz, a meghajtó a karaktert a megszakítás ra megszokott, hogy begépelnek egy parancsot, amelynek végrehajtása egy kis
kiszolgálása során szerezheti meg. H a a megszakítást az alacsony szintű szoftver időbe kerül (mondjuk egy fordítás), majd előre gépelnek néhány sort. Hogy ez
átfordítja üzenetté, lehetővé válik, hogy az újonnan megszerzett karakter bekerül­ biztonságosan működhessen, a m eghajtónak term inálonként úgy 200 karaktert
jön az üzenetbe. Másik lehetőség, hogy a karakter a m em óriában lévő kis pufferbe kell lefoglalnia. Egy 100 terminálos nagyméretű osztott rendszerben az előre gé­
kerül, és egy üzenet értesíti a meghajtót, hogy valami érkezett. Ez utóbbi megol­ pelés biztosításához 20 K mem óriát állandóan lefoglalni nyilvánvalóan túlságosan
dás biztonságosabb akkor, ha üzenetet csak várakozó processzus kaphat, és van sok, míg egy közös puffergyűjtő területtel valószínűleg 5 K tárterület is elegendő.
valamekkora esély arra, hogy a billentyűzetmeghajtó még elfoglalt az előző karak­ Másrészről viszont a term inálonkénti pufferterület-foglalás egyszerűbbé teszi a
ter feldolgozásával. meghajtót (nincs láncoltlista-feldolgozás), ezért ezt használják inkább a csak egy­
Am int a billentyűzetmeghajtó megkapott egy karaktert, azonnal el kell kezde­ két term inált kiszolgáló személyi számítógépek esetén. A 3.28. ábra m utatja be a
nie a feldolgozását. H a a billentyűzet billentyűsorszámot küld, és nem az alkal­ két módszer közti különbséget.
mazói szoftver által használt karakterkódot, akkor a meghajtónak egy táblázat Jóllehet a billentyűzet és a képernyő logikailag különálló eszközök, sok fel­
alapján kell a kódok között a konvertálást végrehajtania. Nem minden IBM- használó ahhoz szokott hozzá, hogy a begépelt karakterek rögtön megjelennek a
„kompatibilis” konfiguráció használja a szabványos billentyűzetsorszámokat, így képernyőn. Néhány (régebbi) term inál kénytelen (hardver által) autom atikusan
ha a meghajtó ezeket is támogatni akarja, akkor a különböző billentyűzetekhez megjeleníteni, amit éppen begépelnek, ami nemcsak kellemetlen, ha jelszót gépel­
különböző táblázatokat kell hozzárendelnie. Egy egyszerű megközelítés, hogy nek be, de m eglehetősen korlátozza a fejlettebb szövegszerkesztők és egyéb prog-
330 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 331

Terminál­ Terminál­ H a a szabványos forma csak egy soremelés tárolása (ez a Unix és minden utód­
adatstruktúra adatstruktúra jának a konvenciója), akkor a kocsi vissza karaktereket soremeléssé kell átalakíta­
Központi
puffergyűjtő
ni. H a a belső forma szerint m indkettőt tárolni kell, akkor a meghajtónak be kell
Terminál terület Terminál szúrnia egy soremelést, ha kocsi vissza érkezik, és egy kocsi visszát, ha soremelést
kap. Akármi is a belső szabvány, előfordulhat, hogy a term inálnak kocsi visszát és
0
a soremelést is kell kapnia az echózáshoz, hogy a képernyőt megfelelően frissítse.
1 Pufferterület
a 0 számú Minthogy egy nagyszámítógéphez igen sokféle term inál csatlakozhat, a billentyű­
2 terminál zetm eghajtón múlik, hogy az összes különböző kocsi vissza/soremelés kom biná­
számára ciókat a belső rendszer szabványára konvertálja, és úgy rendezze, hogy az összes
3
echózás megfelelően történjen.
Pufferterület E h hez k apcsolódó problém a a kocsi vissza és so rem elés id őzítése. N éhány
az 1 számú term inálon a kocsi vissza vagy sorem elés m eg jelen ítése hosszabb ideig tarthat,
terminál
számára m int egy b etű é vagy szám é. H a a term inálba ép ített m ikroprocesszornak egy nagy
szövegblokkot kell m ásolnia, hogy görgesse a k épet, akkor a sorem elés lassú le­
het. H a egy m echanikus írófejnek kell a papír bal m argójához visszatérnie, a kocsi
(a) (b) vissza leh et lassú. M indkét esetb en a m eghajtóra vár, hogy kitöltő karaktereket
(k özöm b ös null karakterek) szúrjon be a k im enő folyam ba, vagy m egállítsa a ki­
3.28. ábra. (a) Központi puffergyűjtő terület, (b) Terminálonként saját pufferterület írást arra az időre, am íg a term inál utoléri m agát. A várakozáshoz szükséges idő
m en nyisége gyakran a term inál seb esség év el van kapcsolatban, például 4800 bit/s
ramok rugalmasságát. Szerencsére a PC-k billentyűzete nem jelenít meg semmit esetén nincs szükség várakozásra, d e 9600 bit/s esetén egy k itöltő karakterre lehet
billentyűleütéskor, így a szoftveren múlik a bem enő adatok megjelenítése. Ezt a szükség. A hardveres TAB-bal ren d elk ező term ináloknak, fő leg a papírra író fajták­
folyamatot echózásnak hívják. nak, szüksége leh et várakozásra t a b után is.
Az echózást bonyolítja az a tény, hogy a program is írhat a képernyőre, amíg a Kanonikus módú működés esetén számos bejövő karakternek speciális jelentése
felhasználó gépel. Az a minimum, hogy a billentyűzetmeghajtónak kell kiszámíta­ van. A 3.29. ábra bem utatja az összes POSIX által megkívánt speciális karaktert és
nia, hogy hová írja ki az újonnan beérkező adatokat úgy, hogy azt a program kim e­ azokat a továbbiakat, amelyeket a M INIX 3 ismer fel. Az alapértelmezés szerint ki­
nő adatai ne írják felül. osztott karakterek mindegyike vezérlő karakter, amely nem ütközhet a szöveges be-
Bonyolítja az echózást az is, ha egy 80 karakter sorhosszúságú term inálon 80-nál
több karaktert gépelnek be. Az alkalmazástól függően megfelelő lehet a sor meg­ Karakter POSIX-név Megjegyzés
törése és új sor kezdése. Néhány meghajtóprogram levágja a sort 80 karakterre, és ctrl - D EOF Fájlvége
eldobja a 80. oszlop után következő összes karaktert. EOL Sorvége (nem definiált)
Egy másik problém a a tabulátor ( t a b ) kezelése. M inden term inál rendelkezik ctrl -H ERASE Egy karakter visszatörlése (backspace)
t a b billentyűvel, de a megjelenítők a tabulátort a kim eneten tudják kezelni. A
CTRL-C IN T R Processzus megszakítása (SIGINT)
meghajtó feladata, hogy kiszámítsa a kurzor aktuális helyét, figyelembe véve mind CTRL-U KILL Az egész megkezdett sor törlése
a program ok kim enetét, mind az echózás által adott kim enetet, és kiszámítani a QUIT
CTRL-\ Processzus memóriakép nyomtatás kiváltása (SIGQUIT)
szóközök megfelelő számát, amit echózni kell.
CTRL-Z SUSP Felfüggesztés (a MINIX figyelmen kívül hagyja)
Ezzel elérkeztünk az eszközök ekvivalenciájának problémájához. Egy szöveg­
CTRL-Q START Kiírás elkezdése
sor végén logikailag szükség van egy kocsi vissza karakterre, hogy a kurzor vissza­
CTRL-S STOP Kiírás megállítása
kerüljön az 1. oszlopba és egy soremelésre, hogy a következő sorra álljon. Nem
ctrl -R REPRINT Bemenet újra megjelenítése (MINIX-kiterjesztés)
lenne szerencsés, ha a felhasználótól megkövetelnénk mindkét karakter leütését
CTRL-V LNEXT Betű következik (MINIX-kiterjesztés)
minden egyes sor végén (bár néhány régi term inálnak van olyan billentyűje, amely
CTRL-0 DISCARD Kiírás mellőzése (MINIX-kiterjesztés)
előállítja m indkettőt, 50 százalék esélye van rá, hogy ezt abban a sorrendben teszi,
ctrl - M CR Kocsi vissza (Nem változtatható)
ahogy a szoftver kéri őket). A m eghajtón múlt (és múlik ma is), hogy tetszőleges
CTRL-J NL Soremelés (Nem változtatható)
bejövő adatot az operációs rendszer által használt szabványos belső form ára kon­
vertáljon.
3.29. ábra. A speciálisan kezelt karakterek kanonikus mód esetén
332 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 333

m enettel vagy a programok által használt kódokkal, azonban az utolsó kettő kivé­ h a so n ló a crR L-C-hez, k ivéve azt, h o g y SIGQU IT szign ált k ü ld i el, a m ely eg y m e ­
telével mindegyik megváltoztatható az stty paranccsal, ha szükséges. A Unix régebbi m ó ria k ép kiírását váltja ki, h acsak n em fogják e l vagy n e m hagyják fig y elm en kívül.
változataiban ezek közül többnek is más volt az alapértelmezés szerinti értéke. Amikor e billentyűk bármelyikét leütik, a meghajtónak a kocsi vissza, sorem e­
Az E RASE karakter lehetővé teszi az éppen begépelt karakter törlését. A lés karaktereket kell echóznia, továbbá az összes összegyűjtött bem enő adatot ki
M IN IX 3-ban ez a visszatörlés (backspace, c t r l - H ) . E z nem kerül be a bejövő kell törölnie a tiszta lappal történő indítás érdekében. Történetileg a d e l - í széles
karakterek sorába, hanem kitörli az őt megelőző karaktert a sorból. H árom ka­ körben használták az IN T R kezdeti értékeként sok Unix-rendszerben. Mivel sok
rakterből álló sorozat formájában echózható, úgymint visszatörlés, szóköz, visz- program használja szövegszerkesztésre a d e l - í felcserélhetően a visszatörléssel
szatörlés, hogy az előző karakter eltűnjön a képernyőről. H a az előző karakter egy (backspace), ezért ma inkább a CTRL-C-t részesítik előnyben.
ta b volt, kitörléséhez szükséges annak nyomon követése, hogy a kurzor hol volt a Egy másik speciális karakter az EO F ( c t r l - D ) , amelynek hatása a M INIX 3-ban
ta b előtt. A rendszerek többségében visszatörléssel csak az aktuális soron belül tö­ az, hogy minden, a term inálhoz érkezett függőben lévő olvasási kérelem kielégí­
rölhetünk karaktereket, a kocsi vissza karakter nem törölhető ki, és nem lehet az tésre kerül, bármi is található a pufferben, még akkor is, ha a puffer üres. A sor
előző sorhoz visszatérni. elején c t r l - D karaktert gépelve a program 0 bájt hosszúságú bem enő adatot kap,
Amikor a felhasználó a begépelt sor elején vesz észre egy hibát, gyakran kényel­ amit úgy szokás értelmezni, mint a fájl végét, és erre a legtöbb program ugyanúgy
mesebb az egész sort törölni és elölről kezdeni. A K IL L karakter (a M INIX 3-ban viselkedik, m intha egy bem enő adatállomány végjeiét látná.
c t r l - U ) törli a teljes sort. M INIX 3-ban a törölt sor el is tűnik a képernyőről, né­ Néhány term inálm eghajtó sokkal ügyesebb soron belüli szerkesztést tesz lehe­
hány rendszer azonban echózza egy kocsi vissza és soremelés karakterrel a végén, tővé, mint amit itt vázoltunk. Speciális vezérlő karaktereik vannak egy szó törlé­
mivel néhány felhasználó szereti látni a régi sort. Következésképp ízlés dolga a sére, karakterenkénti vagy szavankénti előre- vagy hátralépésre, az épp gépelt sor
K IL L echózásának módja. Ugyanúgy, mint az ERASE esetén, általában nincs le­ elejére vagy végére ugrásra, és így tovább. Ezeknek a funkcióknak a hozzáadása a
hetőség arra, hogy az aktuális sor elé visszamenjünk. H a egy karaktercsoportot m eghajtó m éretét jócskán megnöveli, és felesleges is, amikor a fejlett képernyő­
törölnek, kérdés, hogy megéri-e a fáradságot a meghajtónak, vagy nem, hogy visz- szerkesztő program ok valójában nyers m ódban dolgoznak.
szaadja a puffért a közösbe. A POSIX szabvány megköveteli, hogy a szabványos eljáráskönyvtár tartalm az­
Előfordul, hogy az E RASE és K IL L karaktereket ugyanúgy kell bevinni, mint a zon néhány olyan függvényt, amelyek segítségével a program ok a term inálok para­
közönséges adatokat. Az L N E X T úgy működik, mint egy váltó k arakter (escape m étereit felügyelhetik, és amelyek közül a legfontosabbak a tcgetattr és a tcsetattr.
karakter, ESC). A M INIX 3-ban c t r l - V az alapértelm ezett értéke. Például a ré­ A tcgetattr a 3.30. ábrán látható termios struktúra m ásolatát kéri le, amely az összes
gebbi Unix-rendszerek a @ jelet használták K ILL jelként, de az internetes levele­ olyan információt tartalmazza, ami a speciális karakterek megváltoztatásához, a
zőrendszerek linda@cs.washington.edu formájú levélcímeket használnak. H a vala­ működési mód beállításához és a term inál más jellemzőinek módosításához szük­
ki jobban kedveli a régebbi konvenciókat, újradefiniálja a K IL L jelet mint @, de séges. A program meg tudja vizsgálni a pillanatnyi beállításokat, és az igényeknek
a levél címzéséhez a @ jelet mint szöveget kell bevinnie. Ezt teheti meg a c t r l - V megfelelően módosíthatja azokat. A tcsetattr ezután visszaírja az adatstruktúrát a
és a @ begépelésével. A c t r l - V maga is bevihető szövegként a c t r l - V c t r l - V terminálmeghajtóba.
begépelésével. Egy c t r l - V karaktert látva a meghajtó beállít egy jelzőt, mely azt
mondja meg, hogy a következő karakter mentesül a speciális feldolgozás alól. Az struct termios {
L N E X T karakter maga nem kerül be a beérkező karakterek sorába. tcflag_t cjflag; /* bemeneti módok */
tcflag_t c_oflag; /* kimeneti módok*/
A felhasználó számára vezérlő kódok állnak rendelkezésre, hogy m egaka­
tcflag_t c_cflag; /* vezérlő módok */
dályozza a képernyőkép kigördülését a látótérből, hogy befagyassza a képet,
tcflag_t cjflag; /* helyi üzemmódok*/
majd később továbbindítsa. A M INIX 3-ban ezek a STOP ( c t r l - S ) és a START
speed_t cjspeed; /* bemeneti sebesség */
( c t r l - Q ) kódok. Nem tárolódnak, hanem csak egy jelzőt állítanak be vagy töröl­ speed_t c_ospeed; /* kimeneti sebesség */
nek ki a terminál adatszerkezetében. Valahányszor kiírásra történik kísérlet, ezt cc_t c_cc[NCCS]; /* vezérlőkarakterek */
a jelzőt megvizsgálják. H a a jelző be van állítva, nem történik kiírás. Á ltalában a };
program kiírása mellett az echózás is le van tiltva.
Gyakran van szükség nyomkövetés közben egy éppen futó program megszünte­ 3.30. ábra. A termios struktúra. A MINiX 3-ban a tcflag_t egy short, a speed_t egy int
tésére. Az IN TR ( c t r l - C ) és a QUIT ( c t r l - \ ) karakterek használhatók erre a célra. és a cc_t egy char típus
A M INIX 3-ban a c t r l - C az összes processzusnak, amelyet a terminálról indítot­
tak, elküldi a SIGINT szignált. A c t r l - C megvalósítása elég érdekes. A nehéz része A POSIX szabvány nem határozza meg, hogy ezeket a követelményeket könyv­
a feladatnak a szignál eljuttatása a meghajtótól a rendszer azon részéhez, amely a tári függvényhívással vagy rendszerhívással kell-e megvalósítani. A M INIX 3 egy
szignálokat kezeli, amikor az valójában nem is kérte ezt az információt. A c t r l - \ rendszerhívást szolgáltat, amelynek neve ioctl, hívásának m ódja pedig:
334 3. BEVITEL/KIVITEL 3.8. ATERMINÁLOK 335

ioctl(file_descriptor, request, argp); ben tárolódik, m eghatározza azt a minimális karakterszám ot, amelynek beérkezé­
se szükséges ahhoz, hogy kielégíthető legyen egy read hívás. A c_cc[VTIME]-bán
feladata, hogy megvizsgálja és módosítsa sok 1/O-eszköz konfigurációját. Ezt a hívást tárolt TIME érték egy időkorlátot állapít meg az ilyen hívásokra. A M IN és TIME
használják a tcgetattr és tcsetattr függvények megvalósítására. A request változó értéke befolyásolja egymást, ahogyan az a 3.31. ábrán látható, ahol egy TVbájtot kérő hí­
határozza meg, hogy a termios struktúrát olvasni vagy írni kell-e, és az utóbbi eset­ vást m utatunk be. A TIM E = 0 és M IN = 1 esetén a szokásos nyers módhoz ha­
ben, hogy a kérést azonnal figyelembe kell-e venni, vagy elhalasztódjon mindaddig, sonlóan viselkedik a rendszer.
amíg a jelenleg sorban álló kiírások befejeződnek. Az argp változó egy m utató a hívó­
programban lévő termios struktúrára. A program és a meghajtó közötti kommuniká­
ciónak ezt a módját nem szépsége, hanem a Unix-kompatibilitás miatt választották. A kiírást kezelő szoftver
Következzen néhány megjegyzés a termios struktúrához. A négy, jelzőket tartal­
mazó szó nagyfokú rugalmasságot biztosít. A c jfla g egyes bitjei vezérlik azt a sok­ A kiírás egyszerűbb, mint a beolvasás, bár az RS-232-es term inálok meghajtói na­
féle módot, ahogyan a beolvasást kezelik. Például az IC RN L bit okozza a CR (ko­ gyon különböznek a tárcímleképezéses term inálok meghajtóitól. A szokásos m ód­
csi vissza) karakterek N L (soremelés) karakterekké konvertálását a bem enő ada­ szer az RS-232-es term inálok esetén, hogy minden terminálhoz kapcsolódik egy
tokban. Ez a jelző a M INIX 3-ban alapértelmezés szerint be van állítva. A c_oflag kimeneti puffer. A pufferek tartozhatnak ahhoz a közös pufferterülethez, ahol a
olyan biteket tartalmaz, amelyek a kiírás folyamatára vannak hatással, például az bem eneti pufferek is találhatók, vagy egy terminálhoz rendelhetik őket úgy, ahogy
OPOST bit engedélyezi a kiírás végrehajtását. Ez és az O NCLR bit eredményezi, a beolvasásnál láttuk. Amikor a program ok a term inálra írnak, a kimenő adatok
hogy a kiírásnál az N L karakterek CR N L szekvenciává konvertálódjanak; ez a először a pufferekbe kerülnek. Hasonlóan az echózott adatok is a pufferekbe m á­
M INIX 3-ban szintén alaphelyzetben be van állítva. A cj:flag egy vezérlőjelzőket solódnak. M iután az összes adat a pufferekbe került (vagy a pufferek megteltek),
tartalm azó szó. A M INIX 3 alapértelm ezett beállítása egy 8 bites karaktereket fo­ az első karakter kiíródik, és a meghajtóprogram várakozó állapotba kerül. Amikor
gadó vonalat engedélyez, valamint a modem bontja a kapcsolatot, ha a felhasználó a megszakítás megérkezik, a következő karakter kerül kiírásra, és így tovább.
a vonalon kijelentkezik. A c jfla g a lokális beállítások jelzőit tartalmazza. Egyik A tárcímleképezéses termináloknál egy egyszerűbb megoldás lehetséges. A ki­
bitje, az ECHO az echózást engedélyezi (ez kikapcsolható bejelentkezéskor, a írandó karaktereket egyesével kiolvassák a felhasználói területről, és közvetlenül
jelszó begépelésének biztonsága érdekében). A legfontosabb bitje az ICANON, a videó RAM -ba írják. Az RS-232-es term inálok esetén a kiírandó karaktere­
amely a kanonikus mód használatát engedélyezi. H a ez ki van kapcsolva, számos ket csupán a terminálhoz vezető vonalra kell küldeni. A tárcímleképezéses ter­
dologra nyílik lehetőség. H a az összes többi beállítást az alapértelmezés szerint minálok esetén vannak karakterek, amelyek speciális kezelést igényelnek, töb­
hagyjuk, a hagyományos cbreak móddal (karakterenkénti küldési móddal) egyen­ bek között a visszatörlés, a kocsi vissza, a soremelés és a csengetés ( c t r l - G ) . A
értékű üzemmódba kerülünk. Ebben a m ódban a karakterek anélkül kerülnek a tárcímleképezéses term inálok meghajtójának szoftveresen kell nyomon követnie
programhoz, hogy egy teljes sor bevitelét megvárnák, de az INTR, QUIT, START a videó RAM-ban az aktuális pozíciót, ahová a kiírandó karakterek kerülhetnek,
és STOP karakterek megőrzik hatásukat. Mindez azonban letiltható a jelzők bitjei­ és az aktuális pozíciót tovább kell mozgatnia. A visszatörlés, a kocsi vissza és a sor­
nek törlésével, hogy a hagyományos nyers móddal egyenértékű módhoz jussunk. emelés mind az aktuális pozíció megfelelő módosítását igényli. A T A B -ok ugyan­
A sokféle speciális karaktert, amelyek megváltoztathatók, a M INIX 3-kiterjesz- csak speciális kezelést igényelnek.
téseket is beleértve, a c_cc tömb tárolja. Ez a tömb tartalm az két param étert, am e­ Különösen akkor, ha a képernyő legalsó sorában egy soremelést írunk ki, és a
lyeket nemkanonikus mód esetén használnak. A M IN érték, amely c_cc\VMIN\- képernyő tartalm át gördíteni kell. Hogy lássuk, hogyan történik a görgetés, tekint­
sük a 3.26. ábrát. H a a videovezérlő a RAM olvasását mindig a memória OxBOOOO
TIME = 0 TIME >0
címénél kezdi, karakter m ódban a képernyő görgetésének egyetlen módja az
lenne, hogy 24 x 80 karaktert (minden karakterhez 2 bájt szükséges) a OxBOOAO
MIN = 0 Azonnal visszatér azzal, ami Azonnal elindul az időzítő. Az első bevitt karaktert, címről a OxBOOOO címre másolunk; ez bizony időigényes elképzelés. Bittérképes
hozzáférhető, 0 és N közötti vagy ha letelt az idő, akkor a 0 karaktert adja vissza
számú karakterrel üzemm ódban ez még rosszabb.
Szerencsére a hardver általában nyújt némi segítséget. A legtöbb videovezérlőnek
MIN > 0 Legalább MIN és legfeljebb A bájtok közti időzítő az első bájt után indul.
van egy regisztere, amely meghatározza, hogy a videó RAM mely címétől kezd­
Nbájt visszaadása. N bájtot ad vissza, ha az idő lejártáig ennyi
Meghatározatlan ideig tartó megérkezik, de legalább 1 bájtot. Meghatározatlan ve kell a karaktereket a képernyő legfelső sorához kiolvasni. Ezt a regisztert a
blokkolt állapot lehetséges ideig tartó blokkolt állapot lehetséges OxBOOAO címre állítva a OxBOOOO helyett az előzőleg még másodikként megjelenő
sor legfelülre kerül, és az egész képernyő feljebb gördül egy sorral. A meghajtónak
3.31. ábra. Nemkanonikus módban a MIN és a TIME értékei meghatározzák, hogy egy olvasási így m ár csak az a dolga, hogy ami szükséges, az új legalsó sorba másolja. Amikor
kérés mikor tér vissza. N a kért bájtok száma
336 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 337

Vezérlőszekvencia Jelentés 3.8.3. A MINIX 3 terminálmeghajtójának áttekintése


ESC [nA Felfelé mozgás n sorral
ESC [nB Lefelé mozgás n sorral A term inálm eghajtó forrása négy C fájlban található (hatban, ha az RS-232-es és
ESC [nC Jobbra mozgás n hellyel a pszeudoterminál tám ogatást is megengedjük), és ezek együtt messze a legna­
ESC [nD Balra mozgás n hellyel gyobb meghajtót alkotják a M INIX 3-ban. A term inálm eghajtó program m éretét
Kurzor mozgatása (m, rí) pozícióba (y = m, x = rí)
részben megmagyarázza az az észrevétel, hogy a meghajtó mind a billentyűzetet,
ESC [m: nH
mind a képernyőt kezeli, amelyek mindegyike önmagában is elég bonyolult esz­
ESC [sJ Képernyő törlése a kurzortól (0 a végéig, 1 az elejétől, 2 az egész)
köz, csakúgy, mint a két másik opcionális termináltípus. Mégis m eglepetést okoz
ESC [sK Sortörlés a kurzortól (0 a végéig, 1 az elejétől, 2 az egész sor)
a legtöbb em ber számára, hogy a term inál I/O harmincszor akkora mennyiségű
ESC [nL N sor beszúrása a kurzor pozíciójában
kódot igényel, mint az ütemező. (Ezt az érzést erősíti számos operációs rendsze­
ESC [nM N sor törlése a kurzor pozíciójában
rekről szóló könyv, amely harmincszor akkora teret szentel az ütemezésnek, mint
ESC [nP N karakter törlése a kurzor pozíciójában
az összes I/O-nak.)
ESC [n@ N karakter beszúrása a kurzor pozíciójában A term inálm eghajtó több mint egy tucat üzenettípust fogad. A legfontosabbak
ESC [nm Kiemelés engedélyezése n értékétől függően a következők:
(0 = normál, 4 = félkövér, 5 = villogó, 7 = inverz)
ESC M Visszafelé görgetés, ha a kurzor a felső sorban van
1. Olvasás a term inálról (az FS-től egy felhasználói processzus kezdeményezé­
sére).
3.32. ábra. A terminálmeghajtó által kiírás közben elfogadott ANSI-vezérlőszekvenciák. ESCjelzi 2. írás a term inálra (az FS-től egy felhasználói processzus kezdeményezésére).
az ASCII escape karaktert (0x1B), n, m és s opcionális numerikus paraméterek 3. Terminálparam éterek beállítása ioctl számára (az FS-től egy felhasználói pro­
cesszus kezdeményezésére).
a videovezérlő elérkezik a RAM legfelső címéhez, átfordul, és szépen folytatja a 4. Egy billentyűzetmegszakítás következett be (billentyűt nyomtak le vagy en­
bájtok kiolvasását a legalacsonyabb címtől kezdve. gedtek fel).
Egy másik feladat, amivel a tárcímleképezéses term inálok meghajtójának 5. Az előző kérés visszavonása (a fájlrendszertől, amikor egy szignál érkezik).
foglalkoznia kell, a kurzorpozicionálás. Á ltalában ennek megoldásához is nyújt 6. Egy eszköz megnyitása.
a hardver némi segítséget egy regiszter formájában, amely meghatározza, hogy 7. Egy eszköz lezárása.
a kurzornak hová kell lépnie. Végül itt van a csengetés problémája. A csengetés
megszólaltatásához a hangszóróra egy szinuszos vagy négyszögjelet kell küldeni, Más üzenettípusokat speciális célokra használnak, például diagnosztikai képer­
amely a videó RAM-tól meglehetősen elkülönült része a számítógépnek. nyők előállítására, amikor funkcióbillentyűket nyomnak le, vagy memóriakép-
A képernyőszerkesztő program oknak és sok más bonyolult program nak szüksé­ m entés kiváltására.
ge van arra, hogy a képernyőt sokkal összetettebb m ódon frissítsék, mint csupán Az íráshoz és az olvasáshoz használt üzenetek formátum a azonos, ahogy a 3.17.
a szöveg görgetése a képernyő alján. Hozzájuk alkalmazkodva több term inálm eg­ ábra m utatja, kivéve, hogy a PO SITIO N mező nem szükséges. Egy mágneslemez
hajtó tám ogatja a különféle vezérlőszekvenciákat (escape sequence). Bár néhány esetén a program nak meg kell adnia, hogy melyik blokkot akarja olvasni. Egy bil­
term inál egyéni vezérlőszekvencia-készletet támogat, előnyös, ha van egy szab­ lentyűzet esetén nincs választási lehetőség, a program mindig a következő begé­
vány, amely megkönnyíti a szoftver adaptálását egyik rendszerből egy másikba. Az pelt karaktert kapja. A billentyűzetek nem támogatják a seek (keresés) műveletet.
Amerikai Nemzeti Szabványügyi Intézet (American National Standards Institute, A tcgetattr és tcsetattr POSIX-függvényeket, amelyek a terminálok attribútum ai­
ANSI) definiált egy szabványos vezérlőszekvencia-készletet, amelyből a M INIX 3 nak (tulajdonságainak) lekérdezésére és módosítására használnak, az ioctl rend­
támogatja az ANSI-vezérlőszekvenciáknak egy a 3.32. ábrán látható részhalmazát. szerhívás támogatja. A helyes programozási gyakorlat az, ha ezeket és a többi, az
Ezek elegendők a gyakori műveletek végrehajtásához. Amikor a meghajtó meg­ include/termios.h-ban szereplő függvényt használjuk, és a C könyvtárra hagyjuk a
látja azt a karaktert, amellyel a vezérlőszekvencia kezdődik, beállít egy jelzőt, és könyvtárhívások ioctl rendszerhívásokká konvertálását. A M INIX 3-ban azonban
addig vár, amíg a vezérlőszekvencia hátralévő része is megérkezik. Amikor min­ szükség van néhány olyan vezérlő műveletre, amellyel a POSIX nem rendelkezik,
den m egérkezett, a m eghajtónak szoftveresen végre kell azt hajtania. Szöveg be­ például alternatív billentyűzettérkép betöltése, és ezekhez a programozónak exp­
szúrásához, törléséhez szövegblokkokat kell mozgatni a videó RAM-on belül. A licit m ódon az ioctl-t kell használnia.
hardver ebben m ár nem segít, kivéve a görgetést és a kurzor megjelenítését. Az ioctl rendszerhívás által a meghajtónak küldött üzenet egy kéréskódot és egy
m utatót tartalmaz. A tcsetattr függvény esetén az ioctl hívás a TCSETS, TCSETSW
vagy TCSETSF kéréstípusból és egy termios struktúra címét tartalm azó m jtató -
338 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 339

ból áll, amely olyan, mint a 3.30. ábrán látható struktúra. Minden ilyen hívás az ugyanott találhatók, mint ahol azok a pufferek, amelyek a megszakításkezelő ruti­
éppen aktuális beállításokat újakkal cseréli le, a különbség annyi, hogy a TCSETS noktól kapott bem eneteket fogadják. Az olyan lassú eszközök, mint a billentyűzet,
kéréstípus esetén az új beállítás azonnal hatályba lép, a T C SETSW típusú kérelem nem igényelnek olyan nagy puffért, mint amekkorát a gyors eszközök.
addig nem lép érvénybe, amíg az összes kiírandó adat átvitele meg nem történt, a
TCSETSF pedig megvárja a kiírás végét, és a még be nem olvasott bem enő adato­
kat törli. A tcgetattr függvényhívás egy TCG ETS kéréstípusú ioctl rendszerhívásra Terminálbemenet
fordítódik át, és a kitöltött termios struktúrát adja vissza a hívónak, így az eszköz
pillanatnyi állapota megvizsgálható. Azok az ioctl hívások, amelyek nem felelnek Hogy jobban megértsük, hogyan működik a meghajtóprogram, nézzük meg, hogy
meg a POSIX által definiált függvényeknek, mint például KIOCSM AP kérés, am e­ a term inálon begépelt karakterek milyen mechanizmuson keresztül találnak utat
lyet új billentyűzettérkép betöltésére használnak, másfajta adatszerkezet címét a rendszeren át ahhoz a programhoz, amely kéri őket. Bár ez a fejezet csupán átte­
tartalm azó m utatókat adnak át, ebben az esetben a m utató egy k e y m a p j címét kintés kíván lenni, mégis megadjuk a forrásprogram megfelelő sorainak (CD mel­
tartalmazza, amely egy 1536 bájtos struktúra (128 billentyű x 6 módosítóbillentyű léklet) számát, hogy segítsünk az olvasónak megtalálni m inden egyes felhasznált
16 bites kódjai). A 3.39. ábra foglalja össze, hogyan történik a szabvány POSIX- függvényt. (Bár kalandos útnak tűnhet a bem enettel kapcsolatos gyakorlatokhoz a
hívás ioctl rendszerhívássá konvertálása. kódot a tty.c, a keyboardx és a consolex fájlokból venni, amelyek mindegyike ter­
A terminálmeghajtó egy ttyjable nevű fő adatszerkezetet használ; ez az egyes jedelmes fájl.)
terminálokhoz rendelt tty struktúrákból álló tömb. Egy szokásos PC-nek egy bil­ Amikor egy felhasználó bejelentkezik a rendszer konzolján, akkor egy parancs-
lentyűzete és egy képernyője van, de a M INIX 3 képes maximum nyolc virtuális értelmező (shell) indul el, amelyben a szabványbemenet, -kimenet és a szabvány
term inál tám ogatására, a képernyőadapter-kártyán lévő m em ória m éretétől füg­ hibacsatorna a /dev/console eszközre van irányítva. A parancsértelm ező elindul és
gően. így a konzolnál ülő személy több példányban bejelentkezhet, és lehetősége olvasni próbál a szabványbemenetről a read könyvtári eljárás meghívásával. Ez az
van arra, hogy a képernyőre írást és billentyűzetről olvasást egyik „felhasználótól” eljárás egy olyan üzenetet küld, amely tartalm azza a fájlleírót, a puffercímet és a
a másikhoz kapcsolja. Két virtuális konzol esetén az a lt - F 2 választja ki a második helyszámlálót a fájlrendszerhez. Ez az (1) jelű üzenet a 3.33. ábrán. Az üzenet el­
konzolt, az a lt - F 1 pedig visszatér az elsőhöz, a lt és a nyílbillentyűk szintén hasz­ küldése után a parancsértelm ező blokkolt állapotba kerül, és vár a válaszra. (A fel-
nálhatók. Ráadásul a soros vonalak két távoli felhasználó csatlakozását is tám ogat­
ják RS-232-es kábelen vagy m odem en keresztül, a pszeudoterm inálok pedig a fel­
használók hálózaton keresztüli csatlakozását teszik lehetővé. A meghajtóprogram
írásakor ügyeltek arra, hogy könnyű legyen újabb term inálok hozzáadása. A
szabványos konfiguráció, két virtuális konzolt tartalmaz, és a soros vonalak és a
pszeudoterminálok le vannak tiltva.
M inden egyes tty struktúra a ttyja b le töm bben nyomon követi mind a beolva­
sást, mind a kiírást. A beolvasáshoz egy várakozási sort tart fenn, amelyben a már
begépelt, de a program által még be nem olvasott karakterek vannak, inform á­
ciókat tárol azokról a karakterbeolvasási kérésekről, amelyek még nem érkez­
tek be, és egy időkorlát, amely biztosítja, hogy az olvasási kérelm et úgy lehessen
végrehajtani, hogy a m eghajtó ne blokkoljon folyamatosan, ha nem gépeltek be
egyetlen karaktert sem. A kiíráshoz a még be nem fejezett kiírási kérelm ek pa­
ram étereit tárolja. Más mezők egyéb általános változókat tartalm aznak, mint
például az előbb tárgyalt termios struktúra, amely mind a beolvasás, mind pedig
a kiírás számos tulajdonságát befolyásolja. A tty struktúra tartalm az egy olyan
mezőt is, amely olyan információkra mutat, amelyek csak bizonyos csoportokba
tartozó eszközök számára, de nem az összes ttyjable-ben található összes eszköz
számára szükségesek. Például a konzolmeghajtó hardverfüggő részének szüksé­ 3.33. ábra. A terminálhoz érkező olvasási kérés, amikor épp nincs várakozó bejövő karakter.
ges az aktuális képernyő-pozíció, videó RAM pozíció és a megjelenítéshez az ak­ FS a fájlrendszer, TTY a terminálmeghajtó. A terminálmeghajtó egy üzenetet
tuális szín- (attribútum -) bájt, de ez az információ nem szükséges egy RS-232-es kap minden billentyű lenyomásakor, és tárolja a leütött karakter billentyűkódját
vonal támogatásához. Az egyes eszköztípusokhoz tartozó egyedi adatszerkezetek a várakozási sorban. Később ezeket értelmezi, és egy ASCII kódokat tartalmazó
pufferben összeállítja, amelyet azután a felhasználói processzus területére átmásol
340 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 341

használói processzusok csak a sendrec primitívet hajthatják végre, ami kombinálja meghívja ha n d lejven ts-et (14538. sor). A tty_events többféle tevékenységet is je­
a s e n d -e t egy receiv e-v el attól a processzustól, amelyhez elküldték az üzenetet.) lezhet (bár a beolvasás a legvalószínűbb), ezért handle_events mindig meghívja
A fájlrendszer fogadja az üzenetet, és megkeresi azt az i-csomópontot (i-node), az eszközspecifikus függvényeket, mind a beolvasásra, mind a kiírásra. Billentyű­
amely a m egadott fájlleíróhoz tartozik. Ez az i-csomópont a /dev/console karakter­ zetről történő bevitel esetén ez a k b je a d (15360. sor) meghívását eredményezi,
specifikus fájlhoz tartozik és tartalm azza a term inál fő- és mellékeszközszámát. A amely nyomon követi azokat a billentyűkódokat, amelyek a c t r l , s h if t és a lt
term inálok főeszközszáma 4, a konzol mellékeszközszáma 0. gombok lenyomását és felengedését mutatják, és átkonvertálja a billentyűkódo­
A fájlrendszer a dmap (device map) nevű eszköztérkép alapján keresi meg a kat ASCII kódokká. A k b je a d pedig hívja injjrocess-1 (14486. sor), amely fel­
TTY terminálmeghajtó számát. Ezután küld egy üzenetet a term inálm eghajtó­ dolgozza az ASCII kódokat, figyelembe véve a speciális karaktereket, az esetleg
nak; ezt m utatja a (2) nyíl a 3.33. ábrán. Á ltalában a felhasználó eddig az ideig beállított különböző jelzőket, beleértve azt is, hogy a kanonikus mód érvényben
még semmit sem gépelt be, így a terminálm eghajtó nem tudja a kérést kielégíte­ van-e vagy nincs. Ennek hatása legtöbbször az, hogy a ttyja b le-ben szereplő kon­
ni. Azonnal visszaküld egy választ a fájlrendszernek, hogy felszabadítsa a blokkolt zol bem enő sorához hozzáadja a karaktereket, bár néhány kódnak, mint például a
állapotból, és közli, hogy nincs felhasználható karakter; ezt m utatja a (3) nyíl. A backspace, más hatása van. Alaphelyzetben szintén az in jr o c e s s kezdeményezi az
fájlrendszer feljegyzi, hogy a processzus term inálbem enetre (azaz billentyűzetre) ASCII kódok echózását a képernyőre.
vár a konzolhoz tartozó ttyjable struktúrában, és halad tovább, hogy a következő Am ikor elegendő karakter érkezett be, a term inálm eghajtó egy újabb
kérést feldolgozza. Természetesen a felhasználói parancsértelm ező blokkolt m a­ kernelhívást (8) hajt végre, amellyel megkéri a rendszertaszkot, hogy az adatokat
rad, amíg a kért karakterek meg nem érkeznek. a parancsértelm ező által kért címre átmásolja. Ez a művelet nem üzenetküldés,
Mikor végül leütik a karaktert a billentyűzeten, ez két megszakítást is okoz, ezért szaggatott vonalak jelzik (9) a 3.33. ábrán. Több mint egy ilyen vonal látható,
egyet, amikor lenyomják, és egyet, amikor elengedik. Fontos tudni, hogy a PC-bil- mivel több ilyen művelet is történhet, amíg a felhasználó kérését teljesen kielégí­
lentyűzet nem ASCII kódokat állít elő; m inden egyes billentyű egy billentyűkódot tik. Amikor a művelet végül befejeződik, a terminálm eghajtó egy üzenetet küld a
(scan code) állít elő, amikor lenyomják, és egy másikat, amikor felengedik. Az al­ fájlrendszernek, hogy a munka elkészült (10), és a fájlrendszer erre az üzenetre
só 7 bit a „lenyomás” és a „felengedés” billentyűkódjában azonos. A különbség úgy reagál, hogy visszaküld egy üzenetet a parancsértelm ezőnek, hogy feloldja an­
a legmagasabb helyi értékű bitben van, ami 0, amikor a billentyűt lenyomták, és nak blokkol tságát (11).
1, amikor felengedték. Ugyanez érvényes a c t r l és s h if t módosítóbillentyűkre. Annak definíciója, hogy mikor érkezett be elegendő számú karakter, a term i­
Bár, végül is ezek a billentyűk nem eredményeznek ASCII kódokat, amelyeket a nálm ódtól függ. Kanonikus mód esetén a kérést akkor tekintik befejezettnek,
felhasználói processzusnak vissza lehetne adni, hanem billentyűkódokat generál­ amikor egy soremelés (linefeed), sorvége (end-of-line) vagy fájlvége (end-of-file)
nak, amelyek megmutatják, hogy melyik billentyűt nyomták le (a meghajtó képes kód beérkezett, és hogy a bem enetet megfelelően feldolgozhassák, a beolvasott
különbséget tenni a bal és a jobb oldali s h if t billentyűk között, ha szükséges), és sor hossza nem haladhatja meg a bem eneti sor m éretét. Nemkanonikus mód ese­
ezenkívül még billentyűkként két megszakítást okoznak. tén a beolvasás sokkal nagyobb mennyiségű karaktert is kérhet, és az in j>rocess-
A billentyűzetmegszakítás az IR Q 1. A megszakításvezeték nem érhető el a nek esetleg többször is kell karaktereket átvinnie, m ielőtt egy üzenet érkezik visz-
rendszersínen keresztül, és nem osztható meg semmilyen más I/O-kártyával. sza a fájlrendszerhez, ami jelzi, hogy a művelet befejeződött.
Am ikor a JiwintOl (6535. sor) meghívja az intrjiandle (8221. sor) eljárást, nem Jegyezzük meg, hogy a rendszertaszk az aktuális karaktereket a TTY cím terü­
kell ciklusok hosszú sorát bejárnia, hogy kitalálja, hogy a TTY-t kell értesíteni. A letéről közvetlenül a parancsértelm ezőére másolja át. Azok nem m ennek keresz­
3.33. ábrán bem utatjuk, hogy a rendszertaszk egy figyelmeztető üzenetet (4) küld, tül a fájlrendszeren. Blokkos I/O esetén az adat keresztülhalad a fájlrendszeren,
mivel a system/doJrqctl.c (nem szerepel a források között) fájlban lévő generic_ lehetővé téve a legutoljára használt blokkok egy gyorsítótárának létrehozását. H a
handler generált egyet, de ezt az eljárást az alacsony szintű megszakításkezelő el­ a kért blokk történetesen éppen a gyorsítótárban van, a kérést a rendszer azonnal
járások közvetlenül hívták. A rendszertaszkprocesszus nem aktiválódik. Amikor ki tudja elégíteni, anélkül hogy lemez I/O történne.
a ttyJ a s k (13740. sor) aktivizálja kbdjnterrupt-ot (15335. sor), ami viszont a Terminál I/O esetén a gyorsítótárnak nincs jelentősége. Továbbá a fájlrendszer­
scanjceyboard-ot (15800. sor) hívja meg. A scanjceyboard végzi el az (5, 6, 7) től a lemezmeghajtóhoz érkező kérés m inden esetben kielégíthető legfeljebb né­
kernelhívásokat, amelynek eredm ényeképpen a rendszertaszk olvas és ír néhány hány száz ms alatt, így nem okoz bajt, ha a fájlrendszernek várnia kell. A terminál
I/O-kapura, ami végül visszaadja a billentyűkódot, amelyet azután egy körkörös I/O befejezése akár órákat is igényelhet, vagy sosem ér véget (kanonikus módban
pufferben tárolnak. A tty_events jelzőt beállítják, amely m utatja, hogy a puffer ka­ a terminálmeghajtó egy teljes sorra várakozik, nemkanonikus m ódban szintén
raktereket tartalm az és nem üres. hosszú ideig várakozhat a M IN és TIM E beállításától függően). Em iatt elfogadha­
Ettől a ponttól kezdve m ár nincs szükség üzenetre. M inden alkalommal, ami­ tatlan lenne a fájlrendszer blokkolása addig, amíg egy term inál beolvasási kérést
kor a ttyJ a s k egy újabb ciklust kezd, megvizsgálja a tty jv e n ts jelzőt m inden egyes nem elégítettek ki.
term inálra, és m inden olyan eszköz esetén, amelynek a jelzője be van állítva,
342 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 343

Később előfordulhat, hogy a felhasználó m ár előre gépelt, és hogy a karakterek lenne úgy, hogy csak akkor kérjen megszakítást, ha m ár 14 karakter van a puffe­
m ár rendelkezésre állnak, mielőtt kérték volna őket a korábbi megszakításokban rében. Az Ethernet-alapú hálózatok sokkal nagyobb sebességgel tudnak karakte­
vagy a 4 esemény bekövetkezésekor. Ebben az esetben az 1, 2 és az 5-11 esem é­ reket továbbítani, mint egy soros vonal, de az Ethernet-kártyák egész csomagokat
nyek a beolvasási kérést követően gyors egymásutánban zajlanak le, a 3 esemény puffereinek, és csak egy megszakításra van szükség csomagonként.
pedig egyáltalán nem fordul elő. A term inálbem enetről szóló áttekintésünket azzal fejezzük be, hogy összegez­
A M INIX-rendszer korábbi verzióit ismerő olvasók em lékezhetnek arra, hogy zük azokat az eseményeket, amelyek akkor történnek, amikor a terminálmeghajtó
ezekben a verziókban a TTY (és m inden más) meghajtót a kernellel együtt fordí­ először aktiválódik egy olvasási kérés eredményeként, és amikor ismét aktiválódik
tottak le. Minden meghajtónak saját megszakításkezelője volt a kernel területén. azután, hogy megkapta a billentyűzetről a bem enetet (lásd 3.34. ábra). Az első
A billentyűzetmeghajtó esetében a megszakításkezelő maga is tudott pufferelni esetben, amikor egy üzenet érkezik a term inálmeghajtóhoz, amely a billentyű­
néhány billentyűkódot, és el tudott végezni bizonyos előfeldolgozásokat (a leg­ zetről kér karaktereket, a ttyJ a s k nevű főeljárás (13740. sor) hívja a d o je a d -e t
több billentyűelengedés kódját ki lehet dobni, csak az olyan módosítóbillentyű, (13953. sor), hogy szolgálja ki a kérést. A do_read eltárolja a hívás param étereit a
mint a s h if t billentyűkódját kell megőrizni). Maga a megszakításkezelő nem kül­ ttyja b le billentyűzethez tartozó bejegyzései között, abban az esetben, ha a puffer-
dött üzeneteket a TTY meghajtónak, mivel nagy a valószínűsége annak, hogy a ben nincs kellő számú karakter a kérés kielégítésére.
TTY nem kerülne blokkolt állapotba egy récéivé hatására, és képes üzeneteket fo­ Azután hívja az m jransfer-1 (14416. sor), hogy megkaphassa a m ár várakozó
gadni bármely adott időpontban. Ehelyett az órajelmegszakítás-kezelő ébresztette bem enő adatokat, majd pedig a handlejvents-Q t (14358. sor), amely viszont hív­
fel a TTY meghajtót periodikusan. Ezt a technikát alkalmazták, hogy elkerüljék a ja [a (*tp->tty_devread) függvénymutatón keresztül] a k b je a d -c t (15360. sor) és
billentyűzetbemenet elvesztését. újra az injransfer-1 azért, hogy m egpróbáljon a bem enő folyamból még néhány
Korábban bizonyos m értékben különbséget tettünk a várt megszakítások ke­ karaktert kinyerni. A k b je a d még számos más eljárást is hív, amelyek nem szere­
zelése, mint amilyeneket a lemezvezérlő generál, és az olyan megjósolhatatlan pelnek a 3.34. ábrán, hogy végrehajtsa a feladatát. Ennek az eredménye az, hogy
megszakításkérések között, mint amilyenek a billentyűzetről érkeznek. Azonban
a M INIX 3-rendszerben nincs különösebb teendő a m egjósolhatatlan megszakítá­
sokkal kapcsolatban. Hogyan lehetséges ez? Egy fontos dologról nem szabad elfe­
ledkeznünk, óriási teljesítménykülönbség van azok között a számítógépek között,
amelyekre a M INIX-rendszer korábbi verzióit írták és a jelenlegi típusok között.
A CPU órajelének sebessége megnőtt, míg az egy utasítás végrehajtásához szük­
séges órajelek száma lecsökkent. A M INIX 3-hoz legalább egy 80386-os procesz-
szor ajánlott. Egy lassú 80386-os nagyjából hússzor gyorsabban fogja végrehajtani
az utasításokat, mint az eredeti IBM PC. Egy 100 MHz-es Pentium talán 25-ször
olyan gyors, mint egy lassú 81386. Ezért talán a CPU-sebesség elegendő.
Egy másik dolog, amit figyelembe kell venni az, hogy a billentyűzetbemenet szá­
mítógépes szemmel nézve nagyon lassú. Percenként 100 szó sebességnél a gépelő
kevesebb mint 10 karaktert üt le másodpercenként. Még a leggyorsabb gépelő ese­
tén is a term inálm eghajtóhoz valószínűleg egy megszakításüzenet érkezik minden
billentyűzeten leütött karakter esetén. Azonban más adatbeviteli eszközök esetén
nagyobb adatsebesség valószínű - egy soros portra csatlakoztatott 56 000 bit/s se­
bességű modemről akár 1000-szerese vagy még nagyobb, mint a gépelőé. Ennél
a sebességnél körülbelül 120 karaktert fogadhat a modem órajelenként, de hogy
lehetővé váljon a m odemes kapcsolaton az adattöm örítés, a modemhez kapcsolt
soros portnak legalább kétszer ennyit kell tudnia kezelni.
Még egy dolgot a soros porttal kapcsolatban figyelembe kell venni: karaktere­
ket és nem billentyűkódokat továbbítanak, így még egy régi UART-tal is, amely
nem végez pufferelést, csupán egy megszakítás történik billentyűleütésenként ket­ 3.34. ábra. A beolvasás kezelése a terminálmeghajtóban. A fa bal oldali ágát hajtják végre
tő helyett. Sőt az újabb PC-k már olyan UART-okkal vannak ellátva, amelyek 16, egy karakterolvasási kérés feldolgozásakor. Ajobb oldali ágát pedig akkor, ha egy
billentyűzetüzenet érkezik a meghajtóhoz azelőtt, hogy a felhasználó karaktereket
sőt akár 128 karaktert is puffereinek. így nincs szükség karakterenként egy meg­
kért volna
szakításra. Például egy 16 karakteres pufferrel rendelkező UART konfigurálható
344 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 345

bármi, ami azonnal rendelkezésre áll, azt átmásolják a felhasználóhoz. H a sem­ címleképezéses képernyő, a kiírás a konzolra különösen egyszerű. Nem kellenek
mi sem áll rendelkezésre, semmit sem másolnak. H a az olvasási művelet véget ér megszakítások, az alapművelet-adatok átmásolása egyik m em óriaterületről a m á­
vagy az injransfer, vagy a handle_events hívásával, egy üzenetet továbbítanak a sikra. Másrészről a képernyő kezelésének összes részlete, beleértve a vezérlőszek­
fájlrendszernek, amikor az összes karakter átvitele m egtörtént; így a fájlrendszer venciák feldolgozását is, a m eghajtóprogram ra vár. Ahogyan az előző részben a
felszabadíthatja a hívót a blokkolás alól. H a az olvasási művelet nem fejeződött be billentyűzetbemenet esetén tettük, most is végigkövetjük azokat a lépéseket, am e­
(nincs vagy nincs elég karakter), a d o je a d visszajelez a fájlrendszernek, hogy fel lyek során a karakterek a konzol képernyőjére kerülnek. A példában feltételez­
kell-e függeszteni az eredeti hívót, vagy ha egy nem blokkoló olvasási kérésről van zük, hogy az aktív képernyőre történik a kiírás, a virtuális konzolok okozta kisebb
szó, akkor megszakítani az olvasást. problémákat később tárgyaljuk.
A 3.34. ábra jobb oldala összegzi azokat az eseményeket, amelyek akkor követ­ Am ikor egy processzus ki szeretne valamit írni, meghívja printf-et. A printf a
keznek be, ha a billentyűzetről érkező megszakítás következtében a terminálmeg­ write-ot hívja, hogy egy üzenetet küldjön a fájlrendszernek. Az üzenet egy m utatót
hajtó felébred. A m ikor egy karaktert begépeltek, a kbdjnterrupt (15335. sor) meg- tartalm az a kiírandó karakterekre (nem magukat a karaktereket tartalmazza). A
szakítás-„kezelő” meghívja a scan_keyboard-ot, amely a rendszertaszkot hívja, hogy fájlrendszer egy üzenetet küld a terminálmeghajtónak, amely kiolvassa és bem á­
elvégezze az I/O-műveletet. (A „kezelőt” azért tettük idézőjelek közé, m ert ez nem solja őket a videó RAM-ba. A 3.35. ábra m utatja a kiírásban részt vevő fontosabb
igazi megszakításkezelő, amelyet megszakításkérés esetén hívnak meg, ezt az eljá­ eljárásokat.
rást egy üzenettel aktiválják, amelyet a ttyjask-nak küldenek a rendszertaszkban Amikor egy üzenet érkezik a term inálmeghajtóhoz, hogy írjon a képernyőre, a
lévő generic_handler-bő\.) Ezután a kbdjnterrupt beteszi a kapott karakterkódot az dojvrite-ot (14029. sor) hívja meg, hogy tárolja el a param étereket a konzolhoz
/ÖM/billentyűzetpufferbe, és beállít egy jelzőt, hogy a konzoleszközzel kapcsolatos
esemény történt. Amikor a kbdjnterrupt visszaadja a vezérlést a ttyJa sk - nak, egy
tty_task
continue utasítás eredményeként a főciklus újabb iterációba kezd. Ez az üzenet be­
állítja, hogy az összes termináleszközt ellenőrizzék, és minden egyes megjelölt ter­
mináleszközre meghívódik a handle_events. A billentyűzet esetében a handle_events
meghívja a k b je a d és az injransfer eljárásokat, éppen úgy, ahogyan ez az eredeti
olvasási kérésnél történt. Az ábra jobb oldalán bem utatott események többször be­
következhetnek, amíg elegendő számú karakter nem érkezik, hogy a d o je a d által
fogadott kérést ki lehessen elégíteni a fájlrendszertől kapott első üzenet után. Ha
a fájlrendszer további karaktereket próbál meg kérni ugyanarról az eszközről, mi­ ^handle_events^
előtt az előző kérés befejeződött volna, hibaüzenetet kap. Természetesen minden
eszköz független; egy távoli terminál felhasználója részéről érkező olvasási kérést
elkülönítetten dolgozzák fel a konzolnál ülő felhasználóétól.
A k b je a d által hívott, de a 3.34. ábrán be nem m utatott függvények között
van a m apjcey (15303. sor), amely a hardver által generált billentyűkódokat
(scan kódokat) ASCII kóddá konvertálja, a m akejjreak (15431. sor), amely a
módosítóbillentyűk (mint például a s h if t ) helyzetét követi nyomon, valamint az
in jprocess (14486. sor), amely az olyan komplikációkat kezeli, mint amikor a té­
vedésből bevitt adatra a felhasználó visszatörléssel (backspace) megpróbál visz- „Könnyű" i
szamenni, továbbá kezeli a többi speciális karaktert, valamint a különféle beviteli karakterek t
m ódokban hozzáférhető lehetőségeket. Az in j>rocess hívja a tty jc h o -1 (14647. (^pause_escape^) (^scroH _screen^)
sor) is, így a begépelt karakterek a képernyőn is megjelennek.

Terminálkimenet

Á ltalában a konzolkimenet egyszerűbb, mint a term inálról történő adatfogadás,


m ert az operációs rendszer irányítja, és nem kell foglalkoznia kényelmetlen idő­ 3.35. ábra. Terminálkimenetnél használt főbb eljárások. Szaggatott vonaljelöli azt, amikor
pontokban érkező kiírási kérelmekkel. Minthogy a M INIX 3 konzolja egy tár- a karaktereket a cons_write egyenesen a ramqueue-bo másolja
346 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 347

tartozó tty struktúrában, a ttyjable tömb egyik elemében. Ezután a handlejvents c jo lu m n és c j o w mezők tárolják. A (0, 0) koordináta a képernyő bal felső sar­
hívása következik (ugyanennek a függvénynek a hívása történik, ha a tty events ka, ahonnan a hardver elkezdi a képernyő feltöltését. A videomegjelenítés a cj>rg
jelző be van állítva). Ez a függvény minden esetben meghívja a param éterében ki­ által m egadott címtől kezdődik és 80 x 25 karakteren keresztül (4000 bájt) folyta­
választott eszköz kiíró és beolvasó rutinjait is. A konzol képernyője esetén ez azt tódik. Más szavakkal a 6845-ös m ikroáram kör kiolvassa a videó RAM c jtr g által
jelenti, hogy ha van várakozó bem enő adat a billentyűzetről, akkor először azt dol­ m eghatározott szavát, és megjeleníti a karakterbájtot a képernyő bal felső sarká­
gozzák fel. H a van várakozó bem enő adat, az echózandó karakterek hozzáadód­ ban, felhasználva az attribútum bájtot a színek, a villogás stb. vezérlésére. Ezután
nak az esetleg már régebb óta kiírásra várakozó adatokhoz. Ezután következik a kiolvassa a következő szót, és megjeleníti a karaktert az (1, 0) pozícióban. Ez foly­
consjvrite hívása (16036. sor), ami a tárcímleképezéses képernyő kiíró eljárása. tatódik, amíg elér a (79, 0) pozícióba, amikor elkezdi a képernyő második sorát a
Ez az eljárás a p h y s jo p y -1 használja, hogy karakterblokkokat másoljon a fel­ (0,1) pozícióban.
használói processzus területéről egy lokális pufferbe, ezt és az ezt követő néhány Amikor a számítógépet először elindítják, a képernyő törlődik, a kimenő ada­
lépést esetleg néhányszor megismétli, mivel a lokális puffer csak 64 bájtot tárol. tok a e jta r t címtől kezdve kerülnek be a videó RAM-ba, a cj>rg-hoz pedig ugyan­
Amikor a lokális puffer megtelik, minden egyes 8 bites bájt egy másik pufferbe, a az az érték rendelődik, mint a e jta r t-hoz. Az első sor így a képernyő legtetején
ramqueue-ba kerül. Ez egy 16 bites szavakból álló tömb. A szavak másik bájtjába jelenik meg. Amikor a kiírást új sorban kell folytatni, akár azért, m ert az első sor
a képernyőattribútum -bájt aktuális értéke kerül, amely m eghatározza a háttér- és megtelt, akár azért, m ert az o u tjh a r soremelés karaktert érzékelt, a kiírandó ada­
előtérszíneket és más jellemzőket. Amikor lehetséges, a karakterek közvetlenül tok a e jta r t plusz 80 címre kerülnek. Végül mind a 25 sor betelik, és a képernyőt
a ramqueue-ba kerülnek, de bizonyos karakterek, mint például a vezérlőkarakte­ görgetni kell. Néhány program, például a szövegszerkesztők, a lefelé görgetést is
rek vagy a vezérlőszekvenciákat alkotó karakterek speciális kezelést igényelnek. megkívánják, amikor a kurzor a képernyő felső sorában van, és a szövegben előre
Speciális kezelésre akkor is szükség van, amikor a karakter képernyő-pozíciója kell haladni.
meghaladja a képernyő szélességét, vagy ha a ramqueue betelik. Ezekben az ese­ A képernyőgörgetést két m ódon lehet megvalósítani. Szoftveres görgetés ese­
tekben az o u tjh a r (16119. sor) kerül meghívásra, hogy továbbítsa a karaktere­ tén a (0, 0) pozícióra kerülő karakter mindig a videomemória elején található,
ket, és végrehajtsa a szükséges egyéb tevékenységeket. Például a scrolljcreen-1 a e jta r t által m utatott címhez képest a 0 címen, és a videovezérlő áram kör úgy
(16025. sor) hívja akkor, ha a képernyő utolsó sorában való kiírás közben sorem e­ van programozva, hogy erről a címről vegye az első adatot olyan módon, hogy a
lés karakter érkezik, és a parse escape dolgozza fel a vezérlőszekvenciák karakte­ c org értéke is ugyanezt a címet tartalmazza. Amikor a képernyőt görgetni kell, a
reit. Rendszerint az o u tjh a r hívja a flush-1 (16259. sor), amely a ramqueue tartal­ videó RAM 80-as relatív című helyének tartalm át, azaz a második sor elejét a 0-s
mát átmásolja a videokártya-memóriába, az assembly nyelven írt m e m j i d j o p y relatív címre másolják át, a 81-es című szót az 1-es című helyre, és így tovább. A
rutint felhasználva. A flush hívódik meg az utolsó karakter a ramqueue-ba való megjelenítés rendje változatlan, a 0-s címre tett adat a képernyő (0, 0) pozícióján
átvitele után is, hogy biztosan megjelenjen minden kiírás. A flush tevékenységének jelenik meg, és a képernyőn megjelenő kép látszólag egy sorral feljebb mozdul.
utolsó eredménye egy parancs kiadása a 6845-ös videovezérlő áramkörnek, hogy a Ennek az ára az, hogy a CPU 80 x 24 = 1920 szót mozgatott. Hardveres görgetés
kurzort állítsa a helyes pozícióba. esetén az adatokat nem mozgatják a memóriában, ehelyett a videovezérlő lapkát
Logikailag megfelelő lenne a felhasználói processzus területéről elhozott báj­ utasítják arra, hogy m áshonnan kezdje a képernyő megjelenítését, például a 80-as
tokat egy ciklusban egyesével beírni a videó RAM-ba. Azonban a karakterek ösz- címen tárolt szótól. Ennek lekezelése úgy történik, hogy cj>rg tartalm ához 80-at
szegyűjtése a ramqueue-ba és egy egész blokk átmásolása a m e m j i d j o p y hívásá­ hozzáadnak, ezt az értéket elm entik a későbbi felhasználás érdekében, és beírják
val hatékonyabb a Pentium osztályú processzorok védett (protected) memóriájú a videovezérlő m ikroáram kör megfelelő regiszterébe is. Ehhez vagy az szükséges,
környezetében. Érdekes m ódon ez a technika m ár a M INIX 3 korai változatainál hogy a vezérlő elég okos legyen ahhoz, hogy a RAM-ot körkörösen kezelje, azaz
alkalmazásra került, amelyek régebbi típusú, védett m emória nélküli processzo­ vegye ismét az adatokat a videomemória elejéről (a e jta r t-bán szereplő címről),
rokon futottak. A m e m j i d j o p y előfutára egy ütemezési problémával küszködött amikor elér a RAM végére (a c jim it-ben lévő címre), vagy az, hogy a videó RAM
- a régebbi típusú képernyők esetén a videomemóriába akkor kellett írni, amikor nagyobb kapacitású legyen, mint 80 x 25 = 2000 szó, ami egy képernyőnyi adat tá­
a képernyő üresjáratban volt, azaz amíg a CRT sugárnyaláb függőleges irányban rolásához elegendő.
alulról a legfelső sorba futott vissza, hogy elkerülhető legyen mindenféle szemét A régebbi képernyőillesztők általában kisebb memóriával rendelkeztek, de ké­
megjelenése a képernyőn. A MINIX 3 m ár nem gondoskodik ilyen elavult beren­ pesek voltak a RAM -ot körkörösen kezelni, így hardveres görgetést végezni. A z
dezések támogatásáról, mivel a hatékonyságot nagymértékben rontotta volna, de újabb illesztők rendszerint jóval nagyobb memóriával rendelkeznek, mint ami egy
a M INIX 3 m odern változata is hasznot húz más módon a ramqueue blokként tör­ képernyőnyi szöveg megjelenítéséhez szükséges, de vezérlőjük nem képes a RAM
ténő másolásából. körkörös kezelésére. így egy 32 768 bájt képernyőmemóriával rendelkező képer­
A konzol számára elérhető videó RAM memória határait a console struktú­ nyőillesztő 204 teljes, 160 bájtos sort tárolhat, így 179 hardveres görgetésre képes,
rában szereplő e jta r t és c jim it határozzák meg. Az aktuális kurzorpozíciót a mielőtt a körbefordulásra való képtelensége problém át okozna. De azután szűk-
348 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 349

Mezőnév Tartalom a csoportba tartozó szekvenciák mind az ESC [ karakterekkel kezdődnek. A „[”
A konzol videomemóriabeli kezdőcíme
a vezérlősorozat-bevezető jel. A 3.32. ábrán bem utattuk azokat az ANSI szabvány
c_start
alapján definiált szekvenciákat, amelyeket a M INIX 3 felismer.
cjim it A konzol videomemóriabeli végcíme
A vezérlőszekvenciák elemzése nem egyszerű dolog. A M INIX 3-ban az érvé­
c_column Aktuális oszlop (0-79), 0 a bal oldalon
nyes vezérlőszekvenciák lehetnek csupán 2 karakteresek, mint az ESC M, vagy
c_row Aktuális sor (0-24), 0 a legfelső sor elérhetik a 8 karakteres hosszúságot, abban az esetben, ha a szekvenciának két
c_cur Kurzor videó RAM-beli offset címe (eltolás) numerikus param étere van, és mindegyik értéke egy-egy kétjegyű szám lehet, mint
c_org RAM-beli hely, amelyre a 6845-ös bázisregisztere mutat például az ESC [20;60H, amely a kurzort a 20. sor 60. oszlopába viszi. Egy olyan
szekvencia esetén, amelynek egy param étere van, a param éter elhagyható; vagy
3.36. ábra. A console struktúra mezői, amelyek az aktuális képernyő-pozíciókra vonatkoznak ha két param étere van, elhagyható bármelyik vagy m indkettő. H a egy param étert
elhagytak, vagy olyan értéket adtak meg, amely az érvényes tartom ányon kívül
ség lesz az utolsó 24 sor adatának átm ásolására vissza a videomemória 0-s címé­ esik, akkor egy alapérték kerül a helyére. Az alapérték a legkisebb m egengedett
re. Bármelyik módszert használják, egy üres sort is kell a videó RAM -ba másolni, érték.
amely biztosítja azt, hogy a képernyő alján lévő új sor üres legyen. Tekintsük a következő m ódszereket arra, ahogyan egy program összeállíthat
Amikor virtuális konzolok használata lehetséges, a videoillesztő memóriáját egy olyan szekvenciát, amely a kurzort a képernyő bal felső sarkába mozgatja.
azonos m éretű részekre osztják a kívánt számú konzol számára, és m inden egyes
konzolnál megfelelően beállítják a e jta r t és a c jim it változókat. Ennek a görge- 1. ESC [H elfogadható, hisz nincsenek param éterek, így a legkisebb érvényes
tésre is van hatása. Egy virtuális konzolokat is támogatni képes, elég nagy m em ó­ értékekkel hajtódik végre.
riával rendelkező illesztő esetén, szoftveres görgetés történik időről időre, bár hi­ 2. ESC [1;1H a kurzort az 1. sor 1. oszlopába küldi. (Az ANSI szabványban a so­
vatalosan a hardveres görgetés van érvényben. Minél kisebb az a memória, amely rok és oszlopok számozása 1-től kezdődik.)
az egyes konzolok képernyője számára használható, annál gyakoribb, hogy szoft­ 3. Mind az ESC [1;H, mind az ESC [;1H szekvenciában hiányzik az egyik para­
veres görgetést kell használni. A felső határt akkor érik el, amikor a maximális méter, amelynek 1 a feltételezett értéke, ahogy az első példában láttuk.
számú lehetséges virtuális konzolt konfigurálják. Ekkor m inden görgető művelet 4. ESC [0;0H hatása ugyanaz, hiszen mindkét param éter értéke kisebb, mint a
szoftveres görgetés lesz. legkisebb érvényes érték, így az kerül a helyükre.
A kurzornak a videó RAM kezdetéhez viszonyított relatív pozíciója a c_column
és a c j o w alapján határozható meg, de gyorsabb, ha közvetlenül tároljuk (a c_cur Ezek a példák nem azt kívánják elősegíteni, hogy az em ber szabadon használhat
mezőben). Amikor egy karaktert ki kell írni, akkor azt a videó RAM a c_cur címé­ helytelen param étereket, hanem azt, hogy az a kód, amely ezeket a szekvenciákat
re helyezik el, majd a c_cur-1 ugyanúgy, mint a c_column-1, módosítják. A 3.36. ábra elemzi, egyáltalán nem egyszerű.
összefoglalja a console struktúra mezőit, amelyek befolyásolják a kurzor pozícióját A M INIX 3 ezt az elemzést egy véges állapotú automatával valósítja meg. A
és a képernyő memóriabeli kezdőcímét. console struktúrában lévő c_esc_state változó normális körülmények között 0 érté­
Azoknak a karaktereknek a feldolgozása, amelyek a kurzor pozíciójára hatással kű. Amikor az out_char felfedez egy ESC karaktert, a c_esc_state értékét 1-re vál­
vannak (például soremelés, visszatörlés), a c_column, a c_row és a c_cur értéké­ toztatja, és a következő karaktereket a parse_escape (16293. sor) dolgozza fel. Ha
nek megfelelő beállításával történik. Ez a flush végén történik a set_6845 meghívá­ a következő karakter a vezérlősorozat bevezető jele, akkor 2-re állítja be az állapo­
sával, amely beállítja a videovezérlő lapka regisztereit. tot (c_esc_state), egyébként a szekvenciát befejezettnek tekinti, és meghívja a do_
A terminálmeghajtó támogatja a vezérlőszekvenciákat, amivel lehetővé te­ escape-Qi (16352. sor). A 2-es állapotban, amíg numerikus karakterek érkeznek, a
szi, hogy a szövegszerkesztő és más interaktív program ok rugalmasan frissítsék param éter előző értékét (kezdetben 0) 10-zel szorozza, és hozzáadja az aktuális ka­
a képernyőt. A tám ogatott szekvenciák, amelyek az ANSI szabvány egy részhal­ rakter numerikus értékét. A param éterértékek egy töm bben tárolódnak, és amikor
m azát alkotják, így megfelelnek annak az igénynek, hogy a más hardver és ope­ egy pontosvesszőt érzékel, a feldolgozás a tömb következő elem ére lép. (Jóllehet, a
rációs rendszer számára fejlesztett program ok könnyen átvihetők legyenek a M INIX 3-ban a töm bnek csak két eleme van, de az elv ugyanez.) Amikor egy nem
M INIX 3-ba. Két csoportja van a vezérlőszekvenciáknak; az egyikbe azok tartoz­ numerikus karaktert talál, ami nem is a pontosvessző, a szekvenciát befejezettnek
nak, amelyek sohasem tartalm aznak változó param étert, a másikba pedig azok, tekinti, és szintén a do_escape-et hívja. A do_escape-be lépéskor az aktuális karak­
amelyek tartalm azhatnak ilyet. Az első típusból csak egyet tám ogat a M INIX 3: ez tert használják arra, hogy kiválasszák pontosan, milyen tevékenységet kell végezni,
az ESC M, amely visszafelé járja be a képernyőt, azaz feljebb viszi a kurzort egy és hogy miként értelmezzék a kapott param étereket, akár az alapértékeket, akár
sorral, és lefelé görgeti a képernyőt, ha a kurzor m ár a legfelső sorban van. A m á­ azokat, amelyek a karakterfolyamban érkeztek. Ezt m utatja a 3.44. ábra.
sodik csoportba tartozóknak egy vagy két numerikus param étere lehet. Az ebbe
350 3. BEVITEL/KIVITEL 3 .8 . ATERMINÁLOK 351

Betölthető billentyűzettérképek #include keymaps/us-std.src

Az IBM-billentyűzet nem közvetlenül ASCII kódokat állít elő. A billentyűket a keyboard.c állományban -, fordításkor kerül a M INIX 3-kernelbe, de egy
egy számmal azonosítják, kezdve azokkal a billentyűkkel, amelyek az eredeti PC-
billentyűzet bal felső részén voltak - az 1-es az esc billentyű, a 2-es az „1” (szám), ioctl(0, KIOCSMAP, keymap)
és így tovább. M inden billentyűhöz egy szám tartozik, beleértve a módosító billen­
tyűket is, mint a bal és a jobb sh if t billentyűk, a 42 és az 54 számok. Amikor egy hívás használható arra, hogy egy másik billentyűzettérképet töltsenek be a ker­
billentyűt lenyomnak, a M INIX 3 megkapja a billentyű sorszámát, mint billentyű- nelbe, a keymap címre. Egy teljes billentyűzettérkép 1536 bájtot foglal el (128 x
kódot (scan kód). Egy billentyűkód generálódik akkor is, amikor egy billentyűt 6 X 2). A kiegészítő billentyűzettérképek tárolása töm örített formában történik.
felengednek, de a felengedéskor előállított kódban a legmagasabb helyi értékű A genmap programmal készíthető egy új töm örített billentyűzettérkép. Fordításkor
bit 1-es lesz (ami ugyanaz, m intha 128-at adnánk a billentyű sorszámához). így a a genmap beilleszti az adott billentyűzethez tartozó keymap.src kódot, így a térkép
billentyű lenyomása és felengedése megkülönböztethető. Annak nyomon köve­ a genmap- be belefordítódik. Normális esetben fordítás után a genmap-e t azon­
tésével, hogy mely módosítóbillentyűket nyomtak le, de még nem engedtek fel, nal lefuttatják, az egy állományba kiírja a töm örített billentyűzettérképet, majd a
nagyszámú billentyűkombináció lehetséges. Általános célokra term észetesen az bináris genm ap-e t törlik. A loadkeys parancs beolvas egy töm örített billentyűzet­
olyan kétujjas kombinációk a legmegfelelőbbek a két kézzel gépelőknek, mint a térképet, a belsejében kicsomagolja, majd meghívja az ioctl-t, hogy az áthelyezze
sh ift - A vagy a c t r l - D , de speciális alkalmakra a három (vagy több) billentyűből a kernel memóriájába. A M INIX 3 indításkor autom atikusan végrehajthatja a
álló kombinációk is elképzelhetők, mint például a c t r l - shtft -A vagy a jól ismert loadkeys parancsot, de a program ot a felhasználó is bárm ikor lefuttathatja.
c t r l - a lt - d e l , amelyet a PC-felhasználók arról ismernek, hogy ezzel a rendszer A billentyűzettérkép forráskódja egy nagy, kezdőértékekkel feltöltött tömb. A
alapállapotba hozható és újratölthető. 3.37. ábra az src/kemellkeymapslus-std.src állományból m utat be néhány sort táb­
A PC-billentyűzet összetettsége nagyfokú rugalmasságot biztosít abban, hogy lázatos elrendezésben, ami bem utatja a térkép néhány adottságát. Az IBM PC-
m iként használják. Egy szabványbillentyűzeten 47 közönséges billentyű található billentyűzeten nincs olyan billentyű, amely a 0 billentyűkódot generálja. Az 1-es
(26 alfabetikus, 10 numerikus, 11 írásjel). H a a három módosítóbillentyűs kom ­ kód, az e s c billentyű sorában szereplő adatok azt mutatják, hogy a visszaadott ér­
binációt is használni akarjuk, mint a c t r l - a l t - s h i f t , akkor egy 376 (8 X 47) ka­ ték változatlan a s h i f t vagy a c t r l billentyű esetén, de más a kód az a l t és az e s c
rakterből álló készletet tudunk támogatni. És ez még nem a lehetőségek határa, együttes lenyomásakor. A fordításkor az egyes oszlopokba kerülő értékeket az
de egyelőre tegyük fel, hogy nem akarjuk megkülönböztetni a jobb és bal olda­ include/minix/keymap.h állományban definiált makrók határozzák meg:
li módosítóbillentyűket, vagy a numerikus billentyűzetet, vagy a funkcióbillen­
tyűk valamelyikét használni. Valójában nem csak a c t r l , a l t és s h i f t használható #defineC(c) ((c)&0x1F) /* Kontrollkód maszkja */
módosítóbillentyűként, nyugdíjba küldhetünk néhányat a közönséges billentyűk #define A(c) ((c) | 0x80) /* Nyolcadik bit beállítása (ALT) */
közül, és módosítóbillentyűkként használhatjuk őket, ha úgy döntünk, hogy egy #define CA(c) A(C(c)) /* CTRL-ALT */
#define L(c) ((c) | HASCAPS) /* A„Caps Lock befolyásolja"attribútum */
ilyen rendszert tám ogató meghajtót írunk.
Az ilyen billentyűzettel rendelkező operációs rendszerek egy billentyűzettérké­
pet (keymap) használnak, hogy meghatározzák, milyen kódot kell továbbküldeniük Billentyű-
Karakter Norm ál SHIFT altI alt2 ALT-SHIFT CTRL
egy programnak, attól függően, hogy melyik billentyűt nyomták meg, és hogy mi­ kód
lyen módosítók vannak érvényben. A M INIX 3 billentyűzettérképe logikailag egy 100 Nincs 0 0 0 0 0 0
128 sorból, amelyek a lehetséges billentyűkódokat képviselik, és 6 oszlopból álló 101 esc cm CA(T) CA(T) cm
C(T) CA(T)
tömb (ezt a m éretet úgy választották meg, hogy alkalmazkodjon a japán billentyű­ 102 '1' T A (T ) A('l') A(T) C('A')
zet méretéhez; az USA és más európai billentyűzetek nem tartalmaznak ilyen sok '=' A (V ) C('@')
113 A('=') A(
billentyűt). Az oszlopok képviselik a módosító nélküli, a s h if t , a c t r l , a bal a l t , a
116 'q' L('q') 'Q' A('q') A('q') A('Q') C('Q')
jobb a l t és az a l t - s h i f t kombinációk valamelyikét. Ezzel a sémával 7 3 2 [( 1 2 8 -6 ) x
128 CR/LF C('M') C('M') CA('M') CA('M') CA('M') C('J')
6] karakterkód állítható elő, megfelelő billentyűzet esetén. Ez megköveteli, hogy
129 CTRL CTRL CTRL CTRL CTRL CTRL CTRL
a táblázatban szereplő adatok 16 bites értékek legyenek. Az amerikai billentyűzet
159 FI FI SF1 AF1 AF1 ASF1 CF1
számára az a l t és a l t 2 oszlopok megegyeznek. A z a l t 2 - í a l t GR-nek hívják más
nyelvek billentyűzetein, és ezek a billentyűzettérképek olyan billentyűket is tám o­ 127 ?7? 0 0 0 0 0 0
gatnak, amelyeken 3 jel van; ezeknél az a l t GR-t használják módosítóbillentyűként.
A szabvány-billentyűzettérkép - amelyet a következő sor jelöl ki: 3.37. ábra. A billentyűzettérképet tartalmazó forráskód néhány adata
352 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 353

Az első három m akró ezek közül a m egadott karakter kódjának a bitjeit mani­ betűkészlete, amely a ROM -jába van beégetve, ami alaphelyzetben rendelkezésre
pulálja, hogy előállítsa az alkalmazás számára szükséges kódot. Az utolsó makró áll. Nem szükséges a M INIX 3-ba magába befordítani egy betűkészletet, az egyet­
a HASCAPS bitet állítja 1-re a 16 bites érték magas helyi értékű bájtjában. Ez egy len betűkészlet-támogatás, amelyre a kernelben szükség van, az az a kód, amely
jelző, amely azt mutatja, hogy ellenőrizni kell a capslock változó állapotát, és va­ végrehajtja a TIOCSFON ioctl műveletet.
lószínűleg módosítani kell a kódot annak megfelelően a visszatérés előtt. Az áb­
rában a 2, 13 és 16 billentyűkódokhoz tartozó sorok azt m utatják be, hogy egy ti­
pikus numerikus, írásjel és alfabetikus billentyű kezelése hogyan történik. A 28-as 3.8.4. Az eszközfüggetlen terminálmeghajtó implementációja
kód esetén egy speciális tulajdonság látható - az e n t e r billentyű alaphelyzetben
a CR kódot (OxOD) állítja elő, amelyet itt a C('M') reprezentál. Mivel azonban a Ebben a fejezetben a term inálm eghajtó program forráskódját fogjuk részletesen
Unix-állományokban a soremelés karakter az LF (OxOA) kód, és esetenként szük­ elemezni. Amikor a blokkos I/O-eszközöket tanulmányoztuk, láttuk, hogy több,
ség lehet ennek közvetlen bevitelére, a billentyűzettérkép erre a c t r l - e n t e r kom­ néhány eszközt tám ogató különböző meghajtóprogram alapulhat egy közös szoft­
binációt biztosítja, ami előállítja ezt a kódot, C('J')- veren. A termináleszközök esetében a helyzet hasonló, azzal a különbséggel, hogy
A 29-es billentyűkód az egyik módosítóbillentyűt jelenti, és úgy kell felismerni, egy terminálmeghajtó van, amely tám ogat több különféle termináleszközt. Az esz­
hogy nem számít, milyen másik billentyű van lenyomva, így tehát a c t r l értéket közfüggetlen kóddal fogjuk kezdeni. A későbbi fejezetekben pedig a billentyűzet
adja vissza, figyelmen kívül hagyva bármely más lenyomott billentyűt. A funk­ és a tárcímleképezéses konzolmegjelenítő eszközfüggő kódját fogjuk áttekinteni.
cióbillentyűk nem eredményeznek rendes ASCII értékeket, és a táblázatnak az
59-es billentyűkódhoz tartozó sora m utatja szimbolikusan azokat az értékeket (az
include/minix/keymap.h állományban vannak definiálva), amelyeket az F I billen­ A terminálmeghajtó adatstruktúrája
tyűnek különböző módosítóbillentyűkkel kombinált lenyomása állít elő. Ezek a
következők: F I: 0x0110, SF1: 0x1010, AF1: 0x0810 ASF1: OxOCIO és CF1: 0x0210. A tty.h állomány olyan definíciókat tartalm az, amelyeket a term inálm eghajtót
Az ábra utolsó, a 127-es billentyűkódhoz tartozó sora tipikusan egy a táblázat vé­ implementáló C fájlok használnak. Mivel ez a meghajtó több különböző eszközt
gének közelében található sorok közül. Sok billentyűzet számára - legtöbbjüket is támogat, ezért a mellékeszközszámot kell arra használni, hogy megkülönböztes­
Európában és az amerikai kontinenseken használják - nincs elég billentyű, hogy sék az egyes eljáráshívásokban melyik tám ogatott eszköz fordul elő; ezek a 13405
az összes lehetséges billentyűzetkód előállítható legyen, ezért a táblázatban a hi­ és a 13409 sorok között vannak definiálva.
ányzó billentyűkhöz tartozó bejegyzések nullákkal vannak feltöltve. A tty.h állományban található O N O C T T Y és O N O N B LO C K jelzők definíciói
(ezek az open hívás opcionális argumentumai), amelyek az include/fenti, h fájlban
található definíciók duplikációi, megismétlésük azért történt, hogy ne legyen szük­
Betölthető betűkészletek ség egy másik fájl beillesztésére. A d e v fu n j és a devjunargj típusokat (13423. és
13424. sor) általában függvények címét tartalm azó m utatókként definiálják, hogy
A régebbi PC-típusok a képernyőre kerülő karakterek generáláshoz a mintákat lehetőséget adjanak egy olyan indirekt hívási mechanizmusra, amely hasonlít ah­
csupán egy ROM -ban tárolták, de a m odern rendszerekben használt megjelenítő hoz, amit a lemezmeghajtók főciklusának kódjában láttunk.
egy RAM -ot biztosít a videokártyán, amelybe egyedileg konfigurálható karakter­ Az ebben a fájlban deklarált változók közül soknak az azonosítója a tty_ prefix-
m inták tölthetők be. Ezt a M INIX 3-ban az szel kezdődik. A legfontosabb definíció a tty.h állományban a tty struktúra (13426-
13488. sor). M inden egyes termináleszközre van egy ilyen adatstruktúra (a kon­
ioctl(0, TIOCSFON, font) zolmegjelenítő és a billentyűzet egyetlen term inálnak számít). A tty struktúrában
az első változó a tty_events; ez egy jelző, amely akkor van beállítva, ha egy megsza­
ioctl művelet végzi. A M INIX 3 egy 80 oszlop x 25 soros videó m ódot támogat, a kítás olyan változást okoz, ami igényli, hogy a terminálm eghajtó odafigyeljen erre
betűkészlet-állományok 4096 bájtot tartalmaznak. M inden bájt egy 8 képpontból az eszközre.
(pixel) álló sort reprezentál. A képpont világít, ha a bit értéke 1, és 16 ilyen sor A tty struktúra többi része úgy van szervezve, hogy egy csoportba gyűjti azokat a
kell m inden egyes karakter leírásához. Azonban a videoillesztő 32 bájtot használ változókat, amelyek a beolvasással, kiírással, az eszköz állapotával és a befejezetlen
m inden egyes karakter leírásához, hogy nagyobb felbontást biztosítson azokban a műveletekkel kapcsolatosak. A beolvasással foglalkozó részben a ttyjnhead és a
videomódokban, amelyeket a MINIX 3 jelenleg nem támogat. A loadfont utasítás ttyjntail definiálja azt a sort, ahol a beérkezett karaktereket gyűjtik. A ttyjncount
szolgál arra, hogy konvertálja ezeket a fájlokat abba a 8192 bájtos font struktúrá­ számlálja az ebben a sorban lévő karakterek számát, a tty_eotct pedig karaktereket
ba, amelyre az ioctl hívás hivatkozik, és ezt az eljáráshívást használja a betűkész­ vagy sorokat számlál a következők szerint. Minden eszközspecifikus hívás indirek-
let betöltésére. Azonban m inden videoillesztőnek van egy alapértelm ezés szerinti ten történik, azokat a rutinokat kivéve, amelyek inicializálják a terminált. Ezek ál-
354 3. BEVITEL/KIVITEL 3.8. ATERMINÁLOK 355

lítják be az indirekt hívásokhoz használt m utatókat. A tty_devread és a tty_cancel A ttyjable, amely egy tty struktúrákból álló tömb, extern-ként van deklarál­
mezők olyan eszközspecifikus eljárásokra m utatnak, amelyek az olvasás és a bevitel va (13491. sor). Minden egyes, az include/minix/config.h található N R CONS,
műveleteket hajtják végre. A tty jn in változót a tty_eotct-ve 1 történő összehasonlí­ N R J IS L IN E S és N R PTYS definíciókkal engedélyezett terminálhoz tartozik
tásokban használják. Amikor az utóbbi egyenlővé válik az elsővel, egy olvasási m ű­ egy tömbelem. A könyvben tárgyalt konfiguráció két konzolt engedélyez, de a
velet véget ér. Kanonikus beolvasás esetén a tty jn in 1-re van állítva, és a tty_eotct M INIX 3 új ráfordításával további virtuális konzolokat, egy vagy két duál soros vo­
a bevitt sorokat számlálja. Nemkanonikus beolvasás alatt a tty_eotct a karaktereket nalat és maximum 64 pszeudoterm inált adhatunk a rendszerhez.
számlálja, a tty jn in pedig a termios struktúra M IN mezőjének az értékét veszi fel. Van egy másik extern definíció is a tty.h állományban. A ttyjim ers (13516. sor)
A két változó összehasonlítása így megadja, hogy mikor van készen egy sor, vagy egy az időzítő által használt mutató, a tim e r j mezőkből álló csatolt lista fejének
mikor értük el a minimális karakterszámot az aktuális módtól függően. A tty jm r tárolására. A tty.h definíciós fájlra több fájl is hivatkozik, a ttyja b le és a ttyjim elist
egy időzítő ehhez a tty struktúrához, a termios TIME mezőjéhez használják. számára a hely a tty.c fordítása közben kerül lefoglalásra.
Mivel a kimeneti sort eszközspecifikus kód kezeli, a tty struktúra kimenettel Két makró, a buflen és a bufend definíciója található a 13520. és a 13521. sorok­
foglalkozó része nem tartalm az változókat, kizárólag m utatókból áll, amelyek ban. Ezeket gyakran használják a terminálmeghajtó kódjában, amely sokszor m á­
az olyan eszközspecifikus függvényekre m utatnak, amelyek kiírnak, echóznak, sol adatokat a pufferekbe vagy a pufferekből.
megszakítójelet küldenek és megszakítják a kiírást. Az állapotrészben a ttyj-eprint,
a ttyescaped és a ttyjnhibited jelzők találhatók, amelyek azt jelzik, ha az utolsó
beolvasott karakter speciális jelentéssel bír, például amikor egy c t r l -V (LNEXT) Az eszközfüggetlen terminálmeghajtó
karakter érkezett be, a tty_escaped értékét 1-re állítják, jelezve, hogy a következő
karakternek bármilyen speciális jelentését figyelmen kívül kell hagyni. A fő terminálm eghajtó és az eszközfüggetlen segédfüggvények mind a tty.c állo­
Az adatszerkezet következő része a folyamatban lévő DEV_READ, DEV_ mányban találhatók. Ezt számos makródefiníció követi. H a egy eszköz inicializálá-
W RITE és D E V J O C T L műveletekről tartalm az adatokat. E műveletek m ind­ sa még nem történt meg, az eszközspecifikus függvények m utatói nullákat fognak
egyikében két processzus vesz részt. A rendszerhívásokat kezelő kiszolgáló azo­ tartalmazni, a C fordító tölti fel őket. Ez teszi lehetővé a ttyjictive makró definiá­
nosítóját (ez általában az FS), a ttyjncaller (13458. sor) tartalmazza. A kiszolgáló lását (13687. sor), amely FALSE eredményt ad vissza, ha egy nullát tartalm azó
egy másik processzus nevében hívja meg a terminálm eghajtót, amelynek egy I/O- m utatót talál. Természetesen egy eszközt inicializáló kód nem érhető el indirekt
m űveletre van szüksége; ennek a kliensnek az azonosítója található a ttyjnproc- módon, hiszen éppen ennek a feladata többek között, hogy inicializálja a m utató­
ban (13459. sor). Ahogyan a 3.33. ábra mutatja, egy read során a karakterek a kat, amelyek az indirekt elérést lehetővé teszik. A 13690-13696. sorok feltételes
terminálmeghajtó területéről egyenesen az eredeti hívó m em óriaterületén lévő makródefiníciókat tartalmaznak, amelyek az RS-232-es vagy a pszeudoterminálok
pufferbe kerülnek. A ttyjnproc és tty jn jy ir határozzák meg a puffer helyét. A kö­ inicializálását egy nulla című függvény hívásával teszik egyenlővé, amikor ezek az
vetkező két változó, a ttyjn le ft és a tty jn c u m számon tartják a még szükséges és eszközök nincsenek konfigurálva. A do jpty ugyanígy tiltható le ebben a részben.
a m ár átvitt karakterek számát. Flasonló változók szükségesek a write rendszerhí­ Ez lehetővé teszi, hogy az ezekhez az eszközökhöz tartozó kódot teljes egészében
váshoz is. Az ioctl számára lehetséges azonnali adatátvitel a kérő processzus és a kihagyják, ha nincs rá szükség.
m eghajtó között, ezért szükség van egy virtuális címre, viszont nincs szükség olyan Mivel m inden egyes term inálnak sok konfigurálandó param étere lehet, és egy
változókra, amelyek egy művelet folyamatát követik. Egy ioctl kérést el lehet ha­ hálózatos rendszerben jó néhány term inál fordulhat elő, ezért egy termios_default
lasztani, például amíg a folyamatban lévő kiírás befejeződik, de amikor megfelelő struktúrát deklaráltak és töltöttek fel kezdőértékekkel a 13720-13727. sorokban
az időpont, a kérést egyetlen művelettel hajtják végre. (ezek mindegyike az includeltermios.h állományban van definiálva). Ezt a struktú­
Végül a tty struktúra tartalm az néhány olyan változót, amely nem tartozik egyik rát átmásolják a ttyja b le tömb egy term inálhoz tartozó elemébe, amikor iniciali­
kategóriába sem, idetartoznak az olyan függvények címét tartalm azó mutatók, zálni vagy újrainicializálni kell. A speciális karakterek alapértelm ezett értékeit a
amelyek a D E V IO C TL és DEV_CLOSE m űveleteket eszközszinten kezelik, a 3.29. ábra m utatta be. A 3.38. ábra a felhasznált különböző jelzők alapértelm ezett
POSIX stílusú termios struktúra és a winsize struktúra, amely tám ogatást nyújt
ablakorientált képernyős megjelenítésekhez. Az adatszerkezet utolsó része tárhe­ Mező Alapértelmezett érték
lyet biztosít m agának a bem enő adatokat tartalm azó sornak a tty jn b u f tömbben. cjflag BRKINTICRNL IXON IXANY
Figyeljük meg, hogy ez a töm b u l ó j típusú elemekből áll, nem pedig 8 bites char c_oflag OPOST ONLCR
karakterekből. Bár az alkalmazások és az eszközök 8 bites kódot használnak a ka­ c_cflag CREAD CS8HUPCL
rakterekhez, a C nyelv megköveteli, hogy a getchar beolvasó függvény egy nagyobb cjflag ISIG IEXTEN ICANON ECHO ECHOE
adattípuson legyen definiálva, így egy szimbolikus EO F értéket adhat vissza az ösz-
szes 256 lehetséges bájtértéken felül. 3.38. ábra. A termios jelzők alapértelmezés szerinti értékei
356 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 357

értékeit sorolja fel. A kód következő sora a winsize_defaults struktúrát deklarálja így a szabványos Unix üzenetküldési módszer nem működik a rendszerprocesz-
hasonló módon. A C fordítóra hagyják, hogy mindent nulla kezdőértékkel töltsön szusoknál. Egy SYS SIG üzenetet használnak egy rendszerprocesszus értesíté­
fel. Ez pontosan a megfelelő alapértelm ezés szerinti tevékenységet jelenti: „az ab­ sére. Egy szignál a terminálmeghajtó számára jelentheti azt, hogy a kernel leáll
lak m érete ismeretlen, használja az /etc/termcap-ot” . (SIGKSTOP), a terminálmeghajtó leáll (SIGTERM), vagy a kernel egy üzene­
A terminálmeghajtó belépési pontja a ttyJ a s k (13740. sor). M ielőtt a főciklusba tet kíván a konzolra nyomtatni (SIGKMESS), és az ezeknek megfelelő rutinokat
belépne, meghívja tty jn it-e t (a 13752. sor). A billentyűzet és a konzol inicializá- meghívják.
lásához szükséges információkat a gazda számítógépről a sys_getmachine kernel­ A nem eszközspecifikus üzenetek utolsó csoportja a PANIC_DUMP, DIAG-
hívással szerzik meg, ezután a billentyűzethardvert inicializálják. A kbJnit_once N O STIC S és az F K E Y CONTRO L. Ezekről akkor fogunk többet mondani, ha el­
rutint hívják meg ennek érdekében. Azért nevezik így, hogy megkülönböztessék érkezünk azokhoz a függvényekhez, amelyek kiszolgálják őket.
egy másik inicializáló eljárástól, amelyet m inden egyes virtuális konzol inicializá- Most a continue utasításról: a C nyelvben egy continue utasítás rövidre zár egy cik­
lásának részeként hívnak meg később. Végül egyetlen 0 kerül kiírásra, hogy kipró­ lust, és visszaadja a vezérlést a ciklus elejére. így ha bármelyiket az eddig em lített
bálja a kimeneti rendszert, és működésbe hozzon mindent, ami az első használatig üzenettípusokból detektálják, amint kiszolgálták, a vezérlés visszakerül a főciklus
nem kerül inicializálásra. A forráskódban a printf egy hívása látható, de ez nem elejére a 13764. sorban, az események ellenőrzését megismétlik, és ismét meghív­
ugyanaz a printf mint amit a felhasználói programok használnak, hanem egy spe­ ják a receive-et, és várják az új üzenetet. Különösen a bem enet esetén fontos, hogy
ciális változat, amely a konzolmeghajtóban található egyik lokális függvényt hívja, készek legyünk válaszolni olyan gyorsan, amilyen gyorsan lehet. Ugyancsak, ha az
amelynek a neve putk. üzenettípustesztek bármelyike a ciklus első részében sikeres volt, akkor nincs ér­
A főciklus, amely a 13764-13876. sorokban található, alapvetően ugyanúgy m ű­ telme, hogy elvégezzük bármelyik tesztet az első switch után.
ködik, mint bármely más meghajtó főciklusa - üzenetet kap, egy switch utasítást Korábban em lítettünk komplikációkat, amelyekkel a term inálm eghajtónak fog­
hajt végre az üzenet típusának megfelelően, hogy meghívja a megfelelő függvényt, lalkoznia kell. A második komplikáció az, hogy ez a m eghajtó több eszközt szolgál
majd egy válaszüzenetet állít elő. Vannak azonban bizonyos komplikációk. Az el­ ki. H a a megszakítás nem egy hardvermegszakítás, az üzenetben a T T Y J I N E m e­
ső, hogy az utolsó megszakítás óta további karaktereket olvashattak be, vagy a zőt használják arra, hogy megadja, melyik eszköznek kell válaszolnia az üzenetre.
kim eneti eszközre kiírandó karakterek várakozhatnak készen. M ielőtt a főciklus A mellékeszközszám dekódolása összehasonlítások sorozatával történik, amely­
megpróbálkozik egy üzenet fogadásával, mindig megvizsgálja a tp->tty_events jel­ nek eredm ényeként a tp-t a megfelelő ttyja b le elem re pozícionálják (13834—
zőket minden term inálra, és ha szükséges, meghívja a handle_events-<zí a befeje­ 13847. sor). H a az eszköz egy pszeudoterminál, a do_pty (a pty.c állományban van)
zetlen ügyek kezelésére. Csak amikor m ár semmi sem követel azonnali figyelmet, hívása következik, majd a főciklust újrakezdik. Ebben az esetben a do_pty gene­
kerül sor az üzenetet fogadó hívás végrehajtására. rálja a válaszüzenetet. Természetesen, ha a pszeudoterm inálok nincsenek engedé­
Az üzenettípusokat bem utató diagram, amely a tty.c állomány elejéhez közeli lyezve, a do_pty hívás a m ár korábban definiált üres m akrót használja. Rem élhe­
megjegyzésekben található, tartalmazza a leggyakrabban használt típusokat. Sok tően nem fordulhat elő az, hogy nem létező eszközök elérésére tesznek kísérletet,
üzenettípus, amely speciális szolgáltatásokat kíván a terminálmeghajtótól, nincs fel­ de mindig egyszerűbb egy újabb ellenőrzést beiktatni, mint végigellenőrizni, hogy
sorolva. Ezek nem egy bizonyos eszközre jellemzők. A ttyJ a s k főciklusa ellenőrzi, nincs-e m ásutt hiba a rendszerben. Abban az esetben, ha az eszköz nem létezik,
hogy vannak-e ilyenek, és kiszolgálja őket, mielőtt az eszközspecifikus üzeneteket vagy nincs konfigurálva egy E N X IO hibaüzenetet tartalm azó válaszüzenet kelet­
ellenőrizné. Először ellenőrzi, hogy van-e SYN _ALARM üzenet, és ha az üzenettí­ kezik, és a vezérlés ismét visszakerül a ciklus elejére.
pus ez, akkor meghívódik az expirejimers, ami kiváltja egy felügyeleti rutin végre­ A meghajtó további része hasonlít ahhoz, amit a többi meghajtó főciklusánál
hajtását. Ezután következik a continue utasítás. Valójában a következő néhány eset láttunk: az üzenettípus szerinti switch (13862-13875. sor). A kérés típusának meg­
mindegyike után egy continue következik. Hamarosan bővebben is szót ejtünk erről. felelő függvény, a do_read, a do_write és a többi függvényt hívják meg. Mindegyik
A következő ellenőrzött üzenettípus a H A R D J N T . Ez legvalószínűbben a helyi esetben inkább a meghívott függvény állítja elő a válaszüzenetet, mint hogy a
billentyűzeten egy billentyű lenyomásának vagy felengedésének a következménye. válasz konstruálásához szükséges információt visszajuttassa a főciklushoz. A fő­
Azt is jelentheti, ha a soros portok engedélyezve vannak, hogy bájtokat fogadott ciklus végén kizárólag akkor állítanak elő válaszüzenetet, ha nem érkezett érvé­
az egyik soros port - abban a konfigurációban, amelyet tanulmányozunk, nincse­ nyes típusú üzenet, ebben az esetben egy EINVAL típusú hibaüzenetet küldenek
nek, de benne hagytuk a fájlban a feltételesen leforduló kódot, hogy bemutassuk, vissza. Mivel a válaszüzeneteket sok különböző helyről küldik a term inálm eghaj­
hogy a soros port bem enetét hogyan kezelnék. Egy bitmezőt az üzenetben arra tón belül, egy közös rutint, a ttyjep ly-1 hívják, amely a válaszüzenetek megszer­
használnak, hogy a megszakítás forrását megadja. kesztésének részleteit kezelje.
Ezt követi a S Y S S I G ellenőrzése. A rendszerprocesszusoktól (a meghajtóktól H a a ttyja sk-h o z érkezett üzenet érvényes típusú üzenet, nem egy megsza­
és a kiszolgálóktól) megkövetelik, hogy blokkolt állapotba kerüljenek, ha üzenet­ kítás eredménye és nem egy pszeudoterm ináltól érkezett, a főciklus végén lévő
re várakoznak. A közönséges szignálokat csak az aktív processzusok kapják meg, switch kézbesíti a do_read, dojvrite, dojo ctl, do_open, do_close, do_select vagy
358 3. BEVITEL/KIVITEL 3-8. A TERMINÁLOK 359

a do_cancel függvények egyikéhez. Mindegyik hívás argum entum a a tp mutató, A 3.31. ábrán láttuk, hogy M IN és TIME befolyásolják egymást, így különféle le­
amely egy tty struktúrára m utat, és az üzenet címe. M ielőtt részletesen szemügyre hetőségeket nyújtanak arra, hogy egy olvasási kérés hogyan viselkedjen. A TIME
vesszük mindegyiket, megemlítünk néhány általános szempontot. Mivel a ttyJ a s k vizsgálata a 13983. sorban történik. A nulla érték megfelel a 3.31. ábra bal oldali
több termináleszközt szolgálhat ki, ezeknek a függvényeknek gyorsan kell vissza­ oszlopának, és ebben az esetben további vizsgálatra nincs szükség ezen a ponton.
térniük, hogy a főciklus folytatódhasson. H a TIME nem nulla, M IN -1 kell megvizsgálni. H a ez nulla, a settimer-1 hívják, hogy
Bár a doj-ead, dojvrite és d o jo c tl lehet, hogy nem képes azonnal elvégezni az elindítsák az időzítőt, amely egy várakozási idő letelte után megállítja a DEV_
összes kért munkát, annak érdekében, hogy az FS feldolgozhasson más hívásokat R EAD kérést akkor is, ha egyetlen bájtot sem fogadtak. A tp -> tty jn in értékét ek­
is, sürgős válaszadásra van szükség. H a a kérést nem lehet azonnal teljesíteni, a vá­ kor 1-re állítják, így a hívás azonnal véget ér, ha egy vagy több bájt érkezik az idő­
laszüzenet státusmezőjébe a SUSPEND (felfüggesztve) kód kerül. Ez megfelel a korlát letelte előtt. Ezen a ponton még semmilyen ellenőrzést sem végeztek a le­
3.33. ábrán a (3)-mal jelzett üzenetnek, és ez felfüggeszti azt a processzust, amely hetséges bem enetre, így lehet, hogy már egynél több karakter is várakozik, amivel
kezdeményezte a hívást, és feloldja fájlrendszer blokkolt állapotát. A (10) és (11)- teljesíteni lehetne a kérést. Ebben az esetben annyi karaktert, amennyi várakozik,
nek megfelelő üzeneteket később küldik el, amikor a művelet elvégezhető. H a a de maximum annyit, amennyit a read kérésben megadtak, visszaadnak, amint a be­
kérést m aradéktalanul kielégítették, vagy egy hiba történt, akkor az átvitt bájtok m enetet megtalálják. H a mind a TIME, mind a M IN nullától különböző értékűek,
száma vagy a hiba kódja kerül be a fájlrendszernek szóló válaszüzenetstátusz m e­ az időzítőnek más a szerepe. Az időzítő ilyenkor bájtok közötti időzítőként m ű­
zőjébe. Ebben az esetben egy üzenetet küldenek azonnal a fájlrendszertől az ere­ ködik. Csak akkor indul el, ha az első karakter m egérkezett, és minden következő
deti hívást kezdeményező processzushoz, hogy felébresszék. karakter után újraindul. A tp->tty_eotct számlálja a karaktereket nemkanonikus
A term inálról olvasás alapvetően különbözik egy lemezeszközről történő ol­ mód esetén, és ha ez nulla a 13993. sorban, akkor még egyetlen karakter sem ér­
vasástól. A lemezmeghajtó kiad egy parancsot a lemez hardverének, és egy idő kezett, és a bájtok közötti időzítő le van tiltva.
múlva visszaérkeznek az adatok; ezt csak egy mechanikus vagy elektronikus hiba Bármely esetről van is szó, a 14001. sorban egy injransfer hívás történik, amely
akadályozhatja meg. A számítógép megjeleníthet egy válaszadást igénylő kérdést a m ár a bem enő adatok sorában lévő bájtokat átmásolja közvetlenül az olvasást
(prom pt) a képernyőn, de semmilyen módon nem kényszerítheti a billentyűzet kérő processzusba. Ezután egy handle_events hívás következik, amely újabb ada­
előtt ülő személyt, hogy kezdjen el gépelni. Még arra sincs garancia, hogy egyálta­ tokat tehet a bem enő adatok sorába, és amely újból meghívja az injransfer-t. Ez a
lán fog ülni valaki ott. Hogy a kívánt gyors visszatérést meg lehessen valósítani, a nyilvánvaló hívásismétlés némi magyarázatot igényel. Bár az eddigi megbeszélés a
d o je a d (13953. sor) azzal kezdi, hogy tárolja azt az információt, amely lehetővé billentyűzetbemenet alapján folyt, a d o je a d kódja a kód eszközfüggetlen részében
teszi, hogy a kérést később teljesítsék, amikor a bem enő adat megérkezik. Először található, és kiszolgálja a soros vonallal csatlakozó távoli terminálokról történő
néhány hibaellenőrzést kell végezni. Hiba, ha az eszköz még mindig az előző kérés bem enetet. Lehetséges, hogy egy előző beolvasás olyan m értékben megtöltötte az
teljesítéséhez szükséges bem enetet várja, vagy ha az üzenetben kapott param éte­ RS-232-es bem enő adatokat tartalmazó pufferét, hogy a beolvasás fel lett függesztve.
rek hibásak (13964-13972. sor). H a ezek a tesztek lefutottak, a kérésre vonatkozó Az injransfer első meghívása nem indítja el a folyamot ismét, de a handle_events
információkat átmásolják az eszközhöz tartozó tp-> tty Jable struktúra megfelelő meghívásának m ár lehet ilyen hatása. Azt, hogy ez az injransfer egy második hí­
területére (13975-13979. sor). Az utolsó fontos lépés, a tp -> ttyjn left beállítása a vását is eredményezi, tekintsük ajándéknak. A fontos az, hogy biztosítsuk: a távoli
kért karakterek számára. Ezt a változót használják arra, hogy meghatározzák hogy terminál ismét küldhessen adatokat. Bármelyik hívás eredményezheti azt, hogy a
az olvasási kérés teljesítettnek tekinthető-e. Kanonikus m ódban a tp -> ttyjn left kérés teljesült, és válaszüzenetet küldjenek az FS számára. A tp~>ttyJnleft jelző­
m inden egyes visszaadott karakter után eggyel csökken, amíg csak egy sorvége jel ként működik, hogy lássák, megtörtént-e a válasz visszaküldése; ha az értéke még
nem érkezik, akkor egyből nullára csökken. Nemkanonikus módban másképpen nem nulla a 14004. sorban, a d o je a d önmaga generálja és küldi el a válaszüzene­
használják, de bármelyik esetben nullára csökken az értéke, ha a kérést teljesítet­ tet. Ez a 14013-14021. sorokban történik. (Feltesszük, hogy itt most nem egy select
ték, akár úgy, hogy lejárt a várakozási idő, akár úgy, hogy legalább a minimális szá­ rendszerhívás történt, és ezért nem fog meghívódni a selectje tr y a 14006. sorban.)
mú kért bájtot fogadták. Am ikor a tp-> ttyJnleft nullára csökken, egy válaszüze­ H a az eredeti kérés egy blokkolt állapotot nem okozó olvasási kérés volt, a fájl-
netet küldenek. Amint látni fogjuk, válaszüzenetet több helyen is előállíthatnak. rendszernek üzenetet küldenek, hogy egy E A G A IN hibakódot küldjön vissza az
Néha szükség van annak ellenőrzésére, hogy egy olvasó processzus vár-e még a vá­ eredeti hívónak. H a a hívás egy szokványos blokkolt állapottal járó olvasás, az
laszra; a tp-> tty Jn left nullától különböző értéke alkalmas jelző lehet erre a célra. FS egy SUSPEND kódot kap, amely a fájlrendszert felszabadítja a blokkolt álla­
Kanonikus m ódban a term inál addig várja a bem enő adatokat, amíg vagy a ké­ potból, de azt jelenti a számára, hogy az eredeti hívót továbbra is blokkolt álla­
résben megadott számú karaktert megkapja, vagy egy sor végét vagy a fájl végét potban hagyja. A term inálhoz tartozó tp->ttyJnrepcode mezőt a REVIV E ér­
elérte. A 13981. sorban tesztelik a termios struktúra IC A N O N bitjét, hogy a kano­ tékre állítják be ebben az esetben. H a a read kérést teljesítették, ezt a kódot he­
nikus mód érvényes-e a terminálra. H a ez nincs beállítva, a termios M IN és TIME lyezik el a fájlrendszernek küldött üzenetbe, ami azt jelenti, hogy az eredeti hívót
értékeit vizsgálják meg, hogy m eghatározzák a további teendőket. felfüggesztették, és most fel kell éleszteni.
360 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 361

A d o jvrite (14029. sor) hasonló a d o re a d -hez, de egyszerűbb nála, mivel a write zó tty struktúrába. A másolás a TCSETS híváskor azonnal végrehajtódik, míg a
rendszerhívás kezelésére kevesebb opció vonatkozik. Az ellenőrzések hasonlók T C SE TSW és TCSETSF hívások esetén, ha a kiírás befejeződött, egy s y s j ’ircopy
azokhoz, amelyeket a do read végez annak érdekében, hogy kiderítse, hogy egy kernelhívással szerzik meg az adatokat a felhasználótól, amit a setattr hívása kö­
előző kiírás nincs-e még mindig folyamatban, és hogy az üzenet param éterei ér- vet (14153-14156. sor). H a a tcsetattr függvényt olyan módosítással hívták meg,
vényesek-e, ezután pedig a kérés param étereit átmásolják a tty struktúrába. A hogy halassza el a tevékenységét az éppen folyamatban lévő kiírás végéig, akkor
handle_events-et ezt követően hívják meg, és ellenőrzik a tp - >ttyjDutleft-ct, hogy a kérésben szereplő param étereket elhelyezik a term inálhoz tartozó tty struktúrá­
befejeződött-e a feladat (14058-14060. sor). H a igen, akkor egy válaszüzenetet ba a későbbi feldolgozás számára, ha a 14139. sorban a tp->tty_outleft vizsgálata
m ár elküldött a handle_events, így nem m aradt más tennivaló. H a nem, egy válasz­ kideríti, hogy a kiírás még nem fejeződött be. A tcdrain a kiírás befejeződéséig
üzenetet állítanak elő olyan üzenetparam éterekkel, amelyek attól függnek, hogy felfüggeszt egy program ot, amíg a kiírás nem fejeződik be, és egy TCDRAIN típu­
vajon az eredeti write hívás blokkolt állapotot idézett-e elő. sú ioctl hívássá fordítják át. H a a kiírást m ár befejezték, nincs több teendő. Ha a
A következő függvény, a d o jo c tl (14079. sor) kódja hosszú, de nem nehéz meg­ kiírást még nem fejezték be, akkor az információt a tty struktúrában kell hagyni.
érteni. A d o jo c tl törzse két switch utasítás. Az első meghatározza annak a pa­ A POSIX tcflush függvénye törli a még beolvasatlan bem enő adatokat és/vagy az
ram éternek a hosszát, amelyre a kérésüzenetben található egyik m utató m utat el nem küldött kimenő adatokat az argumentumainak megfelelően. Az ioctl hívás­
(14094-14125. sor). H a a m éret nem nulla, a param éter érvényességét vizsgálják sá történő átfordítása egyértelmű, egy ttyjcancel függvény hívásából áll, amely az
meg. A tartalm at itt nem tudják ellenőrizni, azt megvizsgálhatják, hogy vajon egy összes term inált kiszolgálja, és/vagy a tp-> tty jjca n cel által m utatott eszközfüggő
megkövetelt m éretű struktúra a m egadott címen található-e azon a szegmensen függvény meghívásából (14159-14167. sor). A tcflow hasonlóan egyértelműen for­
belül, amelyben lennie kell. A függvény további része egy másik switch utasítás a dítódik át egy ioctl hívássá. A kiírás felfüggesztésére vagy újraindítására a tp->tty_
kért ioctl művelet szerint (14128-14225. sor). inhibited értékét TRUE-ra vagy FALSE-ra állítják, majd beállítják a tp->tty_events
Sajnos a POSIX megkövetelte m űveletek ioctl hívással történő tám ogatása azt jelzőt. A kiírás felfüggesztésére vagy újraindítására a megfelelő STOP (alaphely­
jelentette, hogy ki kellett találni elnevezéseket az ioctl művelet számára, am e­ zetben c t r l -S ) vagy a STA R T ( c t r l - Q ) kódot küldi el a távoli terminálnak, az esz­
lyek sugallják, de nem ismétlik meg a POSIX által megkövetelt elnevezéseket. A közfüggő echo rutint használva, amelyre tp->tty_echo m utat (14181-14186. sor).
3.39. ábra m utatja be a POSIX-kérések elnevezései és a M INIX 3 ioctl hívásában A további műveletek legtöbbjét a d o jo c tl kezeli, egyetlen kódsorban, amely
használt elnevezések közötti kapcsolatot. Egy TCG ETS művelet egy felhasználói meghívja a megfelelő függvényt. A KIOCSM AP (billentyűzettérkép betöltése) és
tcgetattr hívást szolgál ki, és egyszerűen visszaadja a term inálhoz tartozó tp->tty_ a TIOCSFON (betűkészlet betöltése) műveletek esetében megvizsgálják, hogy az
termios struktúra másolatát. A következő négy kéréstípusnak ugyanaz a kódja. A eszköz biztosan egy konzol-e, mivel ezek a műveletek más terminálokra nem al­
TCSETSW, TCSETSF és TCSETS kéréstípusok megfelelnek a POSIX-ban defi­ kalmazhatók. H a virtuális terminálokat használnak, akkor ugyanazt a billentyűzet­
niált tcsetattr függvény felhasználói hívásainak, és mindegyik ugyanazt az alapvető térképet és betűkészletet alkalmazzák mindegyik konzolhoz, mivel a hardver nem
tevékenységet végzi: egy új termios struktúrát másolnak át a term inálhoz tarto- nyújt semmilyen más egyszerű módot ennek megtételére. Az ablakméretező műve­
letek egy winsize struktúrát másolnak a felhasználói processzus és a terminálmeg­
POSIX-függvény POSIX-művelet lOCTL-típus lOCTL-paraméter hajtó között. Figyeljük meg a TIOCSW INSZ művelet kódja alatti megjegyzéseket.
tcdrain (nincs) TCDRAIN (nincs) Amikor egy processzus megváltoztatja ablakának a méretét, néhány Unix-verzióban
tcflow TCOOFF TCFLOW int=TCOOFF a kernelnek egy SIG W IN CH szignált kell küldenie a processzus csoportjához. Ezt
tcflow TCOON TCFLOW int=TCOON a szignált a POSIX szabvány nem írja elő, és a M INIX 3-ban nincs megvalósítva.
tcflow TCIOFF TCFLOW int=TCIOFF Azonban ha valaki úgy dönt, hogy használni akarja ezeket a struktúrákat, akkor
tcflow TCION TCFLOW int=TCION megfontolhatja olyan kódnak a hozzáírását, amely kezdeményezi ezt a szignált.
tcflush TCIFLUSH TCFLSH int=TCIFLUSH Az utolsó két eset a d o jo c tl-ben a POSIX megkövetelte tcgetpgrp és tcsetpgrp
tcflush TCOFLUSH TCFLSH int=TCOFLUSH függvényeket támogatja. Ezekhez az esetekhez semmilyen tevékenység nem kap­
tcflush TCIOFLUSH TCFLSH int=TCIOFLUSH csolódik, mindig egy hibajelzést adnak. Semmi rossz nincs ebben - ezek a függvé­
tcgetattr (nincs) TCGETS termios nyek feladatvezérlést (job control) tám ogatnak, ami azt a képességet jelenti, hogy
tcsetattr TCSANOW TCSETS termios a billentyűzetről felfüggeszthessenek és újraindíthassanak egy processzust. A fel­
tcsetattr TCSADRAIN TCSETSW termios adatvezérlést nem követeli meg a POSIX, és a M INIX 3 sem támogatja. Azonban
tcsetattr TCSAFLUSH TCSETSF termios a POSIX előírja ezeket a függvényeket akkor is, ha a feladatvezérlést nem tám o­
tcsendbreak (nincs) TCSBRK int=időtartam gatják, hogy biztosítsa a program ok hordozhatóságát.
A d o jjp e n -nek (14234. sor) egy egyszerű alapm űveletet kell végrehajtania -
3.39. ábra. POSIX-hivások és a nekik megfelelő lOCTL-műveletek megnöveli az eszközhöz tartozó tp->tty_openct változó értékét, hogy meggyőződ-
362 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 363

hessenek arról: a megnyitás m egtörtént. Azonban vannak bizonyos ellenőrzések, meghajtó főciklusának minden egyes lefutásakor minden egyes termináleszközre
amelyeket először végre kell hajtani. A POSIX specifikációja szerint közönséges megvizsgálják a tp->tty_events jelzőt, és ha ez azt m utatja, hogy egy adott terminál
term inálok esetén az első processzus, amely egy term inált megnyit, lesz a munka­ figyelmet igényel, meghívják a handle_events-et. A do_read és a dojvrite ugyan­
vezető (session leader), és amikor a m unkavezető meghal, akkor a term inál eléré­ csak meghívják a handle_events-et. Ennek a rutinnak gyorsan kell dolgoznia. Törli
sének jogát a processzus csoportjában lévő többi processzustól is megvonják. A a tp->tty_events jelzőt, majd meghívja az eszközspecifikus rutinokat, hogy olvassa­
dém onoknak szükségük lehet rá, hogy hibaüzeneteket írhassanak ki. H a a hibaki- nak és írjanak a függvények címeit tartalm azó tp->tty_devread és tp->tty_devwrite
m enetük nincs átirányítva egy fájlba, akkor egy olyan képernyőn kell megjelenjen, m utatók felhasználásával (14382-14385. sor).
amelyet nem lehet lezárni. Ezeket a függvényeket feltétel nélkül hívják meg, mivel semmilyen mód nincs
A M INIX 3-ban erre a célra egy Idev/log nevű eszköz szolgál. Ez fizikailag meg­ arra, hogy megállapítsák: egy olvasási vagy egy írási kérés állította-e be a jelzőt.
egyezik a /dev/console eszközzel, de egy saját mellékeszközszámmal címzik meg, Tervezéskor választottak így, mivel két jelzőnek az ellenőrzése m inden egyes esz­
és másként is kezelik. Ez egy csak írható eszköz, így a do_open egy EAC C ESS hi­ közre költségesebb lehet, mint két függvényhívás elvégzése minden olyan eset­
bával tér vissza, ha megkísérelnék olvasásra megnyitni (14246. sor). A do_open ál­ ben, amikor az eszköz aktív volt. Valamint a legtöbb esetben, amikor egy karak­
tal végzett másik teszt az O N O C T T Y jelzőt vizsgálja. H a ez nincs beállítva, és az ter érkezik egy terminálról, akkor azt cchózni kell, így mindkét hívásra szükség
eszköz nem a Idev/log, akkor a terminál a processzuscsoport vezérlőtermináljává van. Am int azt a d o jo c tl által hívott tcsetattr kezelésének tárgyalásakor megje­
válik. Ez úgy történik, hogy a hívó processzus számát beteszik a ttyja b le táblázat gyeztük, a POSIX elhalaszthatja a vezérlőműveletek végrehajtását az eszközö­
megfelelő elem ének tp->tty_pgrp mezőjébe. Ezt követően növelik meg a tp->tty_ kön, amíg az aktuális kiírás be nem fejeződött, ezért az eszközfüggő tty_devwrite
openct változó értékét és küldik el a válaszüzenetet. meghívása utáni időpont éppen megfelelő az ioctl műveletek elvégzéséhez. Ez a
Egy termináleszköz megnyitható többször is, ezért a következő, do_close nevű 14388. sorban történik, ahol a d evjo ctl-1 akkor hívják meg, ha van függőben lévő
függvénynek (14260. sor) nincs más teendője, mint csökkenteni a tp->tty_openct vezérlésiművelet-igény.
értékét. A 14266. sorban lévő ellenőrzés meghiúsítja az eszköz lezárására tett kí­ Mivel a tp->tty_events jelzőt a megszakítások állítják be, és egy gyors eszközről
sérletet, ha az éppen a Idev/log. H a ez a művelet az utolsó lezárás, a beolvasást a karakterek gyors ütem ben érkezhetnek egymás után, ezért van esély arra, hogy
megszakítják a tp-> ttyJcancel meghívásával. A tp->tty_ocancel és tp->tty_close mialatt az eszközfüggő olvasó és író, valamint a d e v jo c tl rutinok a munkájukat
mutatókkal hivatkozott eszközfüggő rutinokat ugyancsak meghívják. Ezután az elvégzik, egy újabb megszakítás ismételten beállítsa a jelzőt. Ezért magas a prio­
eszközhöz tartozó tty struktúra különböző mezőit visszaállítják alapértelmezés ritása a bem enő karakterek továbbmásolásának abból a pufferből, ahova a meg­
szerinti értékeikre, és elküldik a válaszüzenetet. szakításrutin először elhelyezte őket. így a handle_events egészen addig ismétli az
Az utolsó általunk tekintett üzenettípus kezelője a do_cancel (14281. sor). Ezt hív­ eszközfüggő rutinok hívását, amíg a tp->tty_events jelzőt beállított állapotban le­
ják meg, amikor egy szignál érkezik egy olyan processzus számára, amely blokkolt ál­ vőnek találja a ciklus végén (14389. sor). Am ikor a bevitel folyama megáll (lehet
lapotba került, amikor olvasni vagy írni próbált. Három állapotot kell megvizsgálni: ez a kiírás folyama is, bár az adatbevitel esetében sokkal valószínűbbek az ilyen
megismételt kérések), meghívják az injransfer-1, hogy átmásolja a karaktereket a
1. A processzus olvashatott, miközben megszüntették. bem eneti sorból egy pufferbe, amely azon a processzuson belül van, amely a read
2. A processzus írhatott, miközben megszüntették. m űveletet meghívta. Az injransfer maga küld egy válaszüzenetet, akár úgy, hogy
3. A processzust egy tcdrain felfüggeszthette, amíg a kiírás be nem fejeződik. a maximális számú kért karakter átvitelével teljesítette a kérést, vagy elérte a sor
végét (kanonikus módnál). H a ez így van, a tp -> tty je ft nulla lesz a handle_events-
Mindegyik esetet megvizsgálják a függvényben, és az általános tp-> ttyjcancel-t be történő visszatéréskor. Ezen a ponton egy további vizsgálat következik, és egy
vagy pedig a tp->tty_ocancel által m utatott eszközfüggő rutint hívják meg, ha válaszüzenetet küldenek, ha az átvitt karakterek száma elérte a kért minimális
szükséges. Az utolsó esetben az egyetlen megkövetelt tevékenység a tp-> ttyJoreq karakterszámot. A tp -> ttyJn left ellenőrzése megakadályozza, hogy duplikált üze­
jelző törlése, hogy ezzel jelezzék: az ioctl művelet m ostanra befejeződött. Végül a netet küldjenek.
tp->tty_events jelzőt beállítják, és egy válaszüzenetet küldenek. A következő rutin, amelyet megvizsgálunk, az injransfer (14416. sor), azért fe­
lelős, hogy a meghajtó m em óriaterületén levő bem eneti sorból az adatokat átvi­
gye annak a felhasználói processzusnak a pufferébe, amely a beolvasást kérte. Egy
A terminálmeghajtót tám ogató kód egyszerű blokkmásolás azonban itt nem lehetséges. A bem enő sor egy ciklikus
puffer, és a karaktereket ellenőrizni kell, hogy a fájl végét nem érték-e el, illet­
Most, miután megnéztük a ttyJ a s k főciklusa által hívott legfelső szintű függvé­ ve ha kanonikus mód érvényes, az adatátvitel csak a sor végéig tart. Ugyancsak a
nyeket, ideje, hogy megnézzük az ezeket tám ogató kódot is. A handle_events-cél bem enő sor 16 bites mennyiségekből áll, a fogadó fél puffere azonban egy 8 bites
(14358. sor) fogjuk kezdeni. Ahogy a korábbiakban m ár említettük, a term inál­ karaktereket tartalmazó tömb. Ezért egy közbülső, lokális puffer használatára
3.8. A TERMINÁLOK 365
364 3. BEVITEL/KIVITEL

van szükség. A karaktereket egyesével megvizsgálják, amikor a lokális pufferbe 0 V D N c c c c 7 6 5 4 3 2 1 0


helyezik őket, és amikor az megtelik, vagy a bem enő sort kiürítették, meghívják a
V: IN_ESC, az LNEXT lenyomásával (ctrl-V)
sys_vircopy rutint, amely átmásolja a lokális puffer tartalm át a fogadó processzus
D: IN_EOF, fájlvége (ctrl-D karakter)
pufferébe (14432-14459. sor). N: IN_EOT, sortörés (soremelés és egyebek)
A tty struktúra három változóját, a tp-> ttyjn le ft-e l, a tp->tty_eotct-1, valamint a cccc: az echózott karakterek száma
tp->tty_min-t használják arra, hogy eldöntsék, az injransfer-nek van-e bármilyen 7: a 7. bit kinullázásra kerül, ha az ISTRIP be van állítva
teendője, és az első kettő ezek közül a változók közül vezérli a főciklust. Ahogyan 6-Ó: az ASCII kód
azt m ár em lítettük, a tp-> tty jn le ft kezdetben megkapja a read hívásban kért ka­
rakterek számát. Általában ezt eggyel csökkentik, valahányszor egy karakter át­ 3.40. ábra. A bemeneti sorban levő karaktereket felépítő mezők
vitelre került, de hirtelen nullává válhat, ha egy feltétel jelzi a bem enet végének
elérését. Valahányszor ez a változó nullává válik, egy válaszüzenetet küldenek az zák. A 14435. sorban levő ellenőrzésben megvizsgálják, hogy az IN_EOF bit (a
olvasást kérőnek, így ez egy jelzőként is működik, amely mutatja, hogy küldtek-e 3.40. ábrán a D ) be van-e állítva. Ezt rögtön a belső ciklus elején megvizsgálják,
már üzenetet, vagy sem. így ha a 14429. sorban az ellenőrzés azt mutatja, hogy a m ert a fájlvége karaktert ( c t r l -D) magát nem továbbítják az olvasó processzus­
tp-> ttyjn le ft m ár nulla, akkor ez elég ok arra, hogy megszakítsák az injransfer nak, és nem számít bele a karakterek számába sem. M inden egyes karakter átvi­
végrehajtását üzenet küldése nélkül. telekor egy maszkot alkalmaznak, hogy nullázzák a felső 8 bitet, és csak az alsó 8
A vizsgálat következő részében a tp->tty_eotct-1 és a tp -> tty jn in -l hasonlítják biten található ASCII kódot viszik át a lokális pufferbe (14437. sor).
össze. Kanonikus módban mindkét változó a bem enet teljes sorainak számára, Több lehetőség is van annak jelzésére, hogy a bem enő adatok végét jelezzük,
míg nemkanonikus m ódban a karakterek számára utal. A tp->tty_eotct eggyel nő, de az eszközfüggő bem eneti rutin feladata annak meghatározása, hogy az érke­
ha a bem eneti sorba egy sortörés vagy egy bájt kerül, és eggyel csökkenti az in_ zett karakter egy soremelés, c t r l -D vagy más ilyen karakter, és hogy megjelöl­
transfer, amikor egy sort vagy egy karaktert eltávolít a sorból. Más szavakkal, azok­ jön m inden ilyen karaktert. így az injransfer-nek csak ezt a jelzést, az I N E O T
nak a soroknak vagy bájtoknak a számát tárolja, amelyeket a terminálmeghajtó bitet (a 3.40. ábrán az N) kell vizsgálnia a 14454. sorban. H a ilyet találtak, akkor
fogadott, de még nem továbbított az olvasó processzusnak. A tp->tty_min tárolja a tp->tty_eotct-1 eggyel csökkentik. Nemkanonikus m ódban minden egyes karak­
a sorok minimális számát (kanonikus módban), illetve a karakterekét (nem kano­ ter ilyennek számít, amikor beteszik őket a bem eneti sorba, és ekkor minden ka­
nikus módban), amennyit át kell vinni az olvasási kérés teljesítéséhez. Az értéke raktert megjelölnek az IN E O T bittel is, így a tp->tty_eotct azon karakterek szá­
mindig 1 kanonikus m ódban, illetve 0 és M AXIN PU T (M IN IX 3-ban ez 255) közé m át fogja tartalm azni, amelyeket még nem távolítottak el a bem eneti sorból. Az
esik nemkanonikus módban. A 14429. sor ellenőrzésének második fele azt ered­ egyetlen különbség az injransfer főciklusának működésében a két mód esetén a
ményezi, hogy az injransfer azonnal visszatér kanonikus m ódban, ha egy teljes sor 14457. sorban található. Itt a tp -> ttyjn left-et nullázzák, ha olyan karaktert talál­
még nem érkezett meg. Az átvitelt nem hajtják végre, amíg egy sor teljessé nem nak, amely sortörésként van megjelölve, de csak akkor, ha a kanonikus mód van
válik, így a sor tartalm a módosítható, például egy ERASE vagy KILL begépelésé­ érvényben. így amikor a vezérlés visszatér a ciklus elejére, akkor a ciklus megfe­
vel, m ielőtt a felhasználó az e n t e r billentyűt leüti. Nemkanonikus módban akkor lelően véget ér egy sortörés után kanonikus módban, de nemkanonikus módban a
történik azonnali visszatérés, ha a minimális számú beérkezett karakter még nem sortöréseket figyelmen kívül hagyják.
áll rendelkezésre. Amikor a ciklus befejeződik, van általában egy részlegesen megtelt, átvitelre
Néhány sorral később a tp -> ttyjnleft és a tp->tty_eotct vezérli az injransfer váró lokális puffer (14461-14468. sor). Ekkor ha a tp-> ttyjn le ft elérte a nullát,
főciklusát. Kanonikus m ódban az átvitel addig folytatódik, amíg a bem eneti sor­ egy válaszüzenet küldenek. Kanonikus m ódban ez mindig így van, de ha nem ka­
ban m ár egyetlen teljes sor sem marad. Nemkanonikus m ódban a tp->tty_eotct a nonikus mód van érvényben, és az átvitt karakterek száma kisebb, mint a teljes
függőben levő karakterek számát tartalmazza. A tp -> ttyjn in meghatározza azt, kérésé, akkor nem küldenek választ. H a elég jó mem óriánk van a részletek meg­
hogy a ciklusba beléptek-e, de azt nem, hogy m ikor kell megállni. Am int beléptünk jegyzésére, emlékezhetünk rá, hogy ahol az injransfer hívásait láttuk (a d o je a d
a ciklusba, vagy az összes rendelkezésre álló karaktert, vagy az eredeti hívásban és a handle_events függvényekben) az injransfer hívása után következő kód ak­
kért számú karaktert átviszik, aszerint, hogy melyik a kisebb. kor küld válaszüzenetet, ha az injransfer úgy tér vissza, hogy a tp -> tty jn in -ben
A bem enő sorban levő karakterek 16 bitesek. A felhasználói processzus számá­ szereplő mennyiségnél több karaktert vitt át, ami term észetesen éppen ez az eset.
ra ténylegesen továbbítandó karakterkód az alsó 8 biten található. A 3.40. ábra Annak az okát, hogy m iért nem az injransfer-bői küldik a válaszüzenetet feltétel
bem utatja, hogy a felső biteket hogyan használják. H árom közülük annak jelzé­ nélkül, akkor fogjuk látni, amikor megtárgyaljuk a következő függvényt, amely az
sére szolgál, hogy a karakter előtt leütötték-e az escape billentyűt ( c t r l -V ), a fájl injransfer-t más körülmények között hívja.
végét jelzi-e vagy egyike a sor végét jelző karaktereknek. Négy biten azt tároljuk, A következő függvény az in jprocess (14486. sor). Ezt a függvényt az eszközspe­
hogy hány karakterhelyre van szükség a képernyőn, ha az adott karaktert echóz- cifikus szoftver hívja olyan közös feldolgozás elvégzésére, amelyeket minden be­
366 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 367

m enetre végre kell hajtani. Paraméterei: egy m utató a forráseszköz tty struktúrá­ képernyőn echózva a karaktert. (A continue utasítás hagyja figyelmen kívül a ka­
jára, egy m utató a feldolgozásra váró karakterek 8 bites töm bjére és egy számláló. raktert, mivel az a külső ciklus újrakezdését váltja ki.) Azonban teljesen normális
A számláló értékét visszaadják a hívónak. Az in_process hosszú függvény, de a te­ feltételeket tételeztünk fel ehhez a példához, ezért tegyük fel, hogy a puffer még
vékenységei nem bonyolultak. A bem eneti sorhoz 16 bites karaktereket ad hozzá, nincs tele. A következő ellenőrzés (14616. sor), amely azt vizsgálja, hogy speciális
amit később az injransfer dolgoz fel. nemkanonikus m ódú feldolgozásra szükség van-e, nem teljesül, ami egy előreug-
Az injransfer a karakterek kezelésére a következő kategóriákat biztosítja. rást eredményez a 14629. sorra. Itt hívják meg az echo- 1, hogy a felhasználó szá­
m ára megjelenítsék a karaktert, mivel a tp -> ttyJ e rm io s.c jfla g ECHO bitje alap-
1. A közönséges karakterek 16 bitre kiterjesztés után kerülnek be a bem eneti értelmezés szerint be van állítva.
sorba. Végül a 14632-től 14636-ig terjedő sorokban „túladunk” a karakteren, betesz-
2. A későbbi feldolgozást befolyásoló karakterek módosítják a jelzőket, hogy je­ szük a bem eneti sorba. Ekkor a tp -> tty jn c o u n t-o t megnöveljük eggyel, de mivel
lezzék a hatást, de nem kerülnek be a bem eneti sorba. ez egy közönséges karakter, így nincs megjelölve az E O T bittel, a tp -> tty j o t e t
3. Azok a karakterek, amelyek az echózást vezérlik, azonnali hatást váltanak ki, nem változik.
de nem kerülnek be a bemeneti sorba. A ciklus utolsó sora meghívja az injransfer-1, ha a bem eneti sorba most át­
4. A különleges jelentőséggel rendelkező karakterek kódokat kapnak, mint pél­ vitt karakter éppen megtölti azt. Azonban normál feltételek mellett, amit felté­
dául az E O T bit, amit a felső bájtjuk tárol, amikor bekerülnek a bemeneti teleztünk ebben a példában, az injransfer semmit sem fog tenni, akkor sem, ha
sorba. meghívják, mivel (feltettük, hogy a bem enő sort normális m ódon szolgálják ki és
a megelőző bem enetet fogadták, amikor az előző bem eneti sor teljessé vált) a
Először nézzünk meg egy teljesen normális esetet: egy közönséges karaktert, tp->tty_eotct nulla, tp -> tty jn in értéke 1, és az injransfer elején levő ellenőrzés
mint például az „x” (ASCII kódja 0x78) leütnek egy rövid sor közepén, nincs sem­ (14429. sor) azonnali visszatérést eredményez.
milyen vezérlőszekvencia érvényben, egy olyan terminálon, amelyet a szabványos Most, hogy áthaladtunk az in j)rocess-en egy közönséges karakterrel szokásos
M INIX 3 alapértelm ezés szerinti tulajdonságaival állítottak üzembe. Amikor a feltételek mellett, menjünk vissza az in jjrocess kezdetére, és vizsgáljuk meg, mi
bem eneti eszközről ez a karakter megérkezik, a 3.40. ábrán jelzett 0-7 biteken történik kevésbé szokásos feltételek esetén. Először nézzük meg a karakterválasz­
fog elhelyezkedni. A 14504. sorban a legfelső bitjét, a 7. bitet kinullázhatják, ha tást (escape), amely lehetővé teszi, hogy a felhasználói processzusnak egy olyan
az ISTR IP jelző be van állítva, de a M INIX 3 alapbeállítása, hogy nem vágják le karaktert továbbítsanak, amelynek általában speciális hatása van. H a egy karak­
a legfelső bitet, megengedve teljes 8 bites kódok bevitelét. Ez egyébként nem be­ terválasztás érvényben van, akkor a tp -> ttyjsca p e d jelző be van állítva, és amikor
folyásolja az „x” karakterünk bevitelét. A M INIX 3 alapértelmezése megenge­ ezt észlelik (14510. sor), a jelzőt azonnal törlik, és beállítják az aktuális karakter­
di a bem enet bővített kezelését, ennek következtében a tp-> ttyJerm ios.cjflag nek a 3.40. ábrán K-vel jelölt IN ESC bitjét. Ez speciális feldolgozást követel meg,
IE X T E N bitjének vizsgálata (4507. sor) igazat ad, de a következő ellenőrzés már amikor a karaktert echózzák - a vezérlőkaraktereket „ ~ ” plusz vezérlőkarakter
hamis eredm ényt szolgáltat az általunk feltett feltételek mellett: nincs karaktervá­ form ában jelenítik meg, hogy láthatók legyenek. Az IN E SC bit megakadályozza
lasztás (escape) érvényben (14510. sor), a bem enet maga nem egy escape karakter azt is, hogy az adott karaktert a következő vizsgálatok speciális karakterként ér­
(14517. sor), és ez a bem enet nem a R E P R IN T karakter (14524. sor). telmezzék.
A következő néhány sorban található ellenőrzések szerint a bem enő karak­ A következő néhány sor magát az escape karaktert, az L N E X T karaktert
ter nem a speciális P O S IX J D IS A B L E karakter, sem a CR vagy az N L. Végül ( c t r l -V alapértelm ezés szerint) dolgozza fel. Amikor az L N E X T kódot észlelik, a
egy pozitív eredmény: kanonikus mód van érvényben; ez a normál alapértelm e­ tp-> ttyjs c a p e d jelzőt beállítják, és kétszer meghívják a rawecho-1 egy „ ~ ” és egy
zés (14324. sor). Az „x” karakterünk nem az ERA SE karakter, sem a K ILL, EO F visszatörlés (backspace) karakter kiírására. Ez arra emlékezteti a billentyűzetnél
( c t r l - D ) , N L vagy E O L valamelyike, így a 14576. sorig még semmi sem fog tö r­ ülő felhasználót, hogy egy karakterválasztás van érvényben, és amikor a következő
ténni vele. Itt azt találjuk, hogy az IX O N bit alapértelmezés szerint be van állítva, karaktert echózzák, az felülírja a „ ~ ”-ot. Az L N E X T karakter egy olyan karakter­
azaz a STOP ( c t r l -S ) és ST A R T ( c t r l - Q ) karakterek használata engedélyezett, re példa, amely hatással van a következő karakterekre (ebben az esetben csak a
de az ezután következő vizsgálatok ezekre nem találnak egyezést. A 14597. sorban közvetlenül utána következő karakterre). Ez a karakter nem kerül be a sorba, és
azt találjuk, hogy az ISIG bit, ami alapértelm ezés szerint be van állítva, megengedi két rawecho hívás után a ciklus újrakezdődik. Az előbbi két feltételvizsgálat sor­
az IN T R és a QUIT karakterek használatát, de ismét nem található egyezés. rendje lényeges, m ert lehetővé teszi azt, hogy az L N E X T karaktert kétszer egymás
Valójában az első érdekes dolog, amely egy közönséges karakterrel m egtör­ után lenyomják annak érdekében, hogy a m ásodikat egy processzus számára át­
ténhet, a 14610. sorban fordul elő, ahol ellenőrzik, hogy a bem eneti sor meg­ adják, mint aktuális adatot.
telt-e már. H a erről lenne szó, akkor a karaktert nem vennék figyelembe ennél A következő in jjrocess által feldolgozott speciális karakter a R EP RIN T karak­
a pontnál, hiszen kanonikus mód van érvényben, és a felhasználó nem látná a ter ( c t r l - R ) . Amikor egy ilyen karaktert találnak, akkor ez a reprint meghívását
368 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 359

okozza (14525. sor) a következőkben, amely az aktuális echózott kimenetet újra Az echo által visszaadott érték tartalmazza a képernyő-pozíciók számát, amelyet
megjeleníti. Ezután a REPRINT-et magát eldobják anélkül, hogy hatással lenne a az echózás m egjelenítésére használtak fel, ez maximum 8 lehet, TAB karakter ese­
bem eneti sorra. tén. Ezt a számlálót helyezték el a 3.40. ábrán a cccc-vel jelölt mezőbe. A közön­
M inden speciális karakter kezelését részletesen megvizsgálni unalmas lenne, és séges karakterek egy helyet foglalnak el a képernyőn, de ha egy vezérlőkaraktert
az in jjrocess forráskódja is világos. Csak néhány további dolgot említünk meg. Az [nem a TAB, N L, CR vagy egy D EL (0x7F)] echóznak, az egy „ ~ ” és egy nyom­
egyik az, hogy a bem eneti sorba elhelyezett 16 bites értékek felső bájtjának spe­ tatható ASCII karakter formájában jelenik meg, és két helyet foglal el a képer­
ciális bitjeivel könnyű hasonló hatású karakterek egy osztályát azonosítani. így az nyőn. M ásrészt egy N L vagy egy CR nem foglal el egyetlen helyet sem. A tényleges
E O T ( c t r l - D ) , az L E és a váltakozó E O L (alaphelyzetben nem definiált) m ind­ echózást term észetesen egy eszközfüggő rutin meghívásával kell elvégezni, azaz
egyikét a 3.40. ábrán D-vel jelölt E O T bittel megjelölik (14566-14573. sor), hogy a valahányszor egy karaktert ki kell juttatni az eszközre, egy indirekt függvényhívást
későbbi felismerésüket megkönnyítsék. kell elvégezni a tp -> tty jc h o felhasználásával, ahogyan az például a 14696. sorban
Végül megindokoljuk az injransfer korábban em lített furcsa viselkedését. V á­ történik közönséges karakterek esetén.
laszüzenetet nem m inden esetben generálnak, amikor véget ér, bár a korábban A következő függvényt, a rawecho-1 arra használjuk, hogy kikerüljük az echo
látott injransfer hívásokban úgy tűnt, m intha visszatéréskor m inden esetben ge­ által végrehajtott speciális tevékenységeket. Ez ellenőrzi, hogy az ECHO jelző be
nerálnának válaszüzenetet. Felidézve az injransfer meghívásának, amit az in_ van-e állítva, és ha igen, akkor elküldi a karaktert az eszközfüggő tp -> tty jc h o
process hajt végre, amikor a bem eneti sor m egtelt (14639. sor), nincs semmilyen rutinon keresztül mindenféle speciális feldolgozás nélkül. Itt egy rp nevű lokális
hatása, ha kanonikus mód van érvényben. De ha nemkanonikus módú feldolgo­ változó szolgál arra, hogy megakadályozza, a rawecho saját maga által hívott kim e­
zás lenne kívánatos, m inden egyes karakter E O T bitjét beállítják a 14618. sorban, neti rutinja megváltoztassa a tp-> ttyje p r in t értékét.
így m inden egyes karaktert megszámol a tp -> tty jo tc t a 14636. sorban. Ezután ez Amikor az in jjrocess egy visszatörlést talált, a következő függvényt, a backover-1
okozza azt, hogy belépünk az injransfer főciklusába annak meghívásakor, a meg­ (14721. sor) hívják meg. Ez úgy módosítja a bem enő sort, hogy eltávolítja a sor ko­
telt bem eneti sor m iatt nemkanonikus módban. Ilyen esetekben nincs szükség az rábbi fejét, ha a visszalépés lehetséges - ha a sor üres, vagy az utolsó karakter egy
injransfer befejeződésekor üzenetküldésre, hiszen valószínűleg lesz még több sortörés, akkor visszalépés nem lehetséges. Ekkor megvizsgálják az echo-nál és
beolvasni való karakter az in jjrocess- be való visszatérés után. Valójában bár a ka­ a rawecho-nál em lített tp-> tty reprint jelzőt. H a ez TRUE, akkor a reprint rutint
nonikus mód esetén a read által beolvasható karakterek számát korlátozza a b e­ (14732. sor) hívják meg, hogy a kimeneti sor egy nyers m ásolatát megjelenítsék a
m eneti sor m érete (M IN IX 3-ban 255 karakter), nemkanonikus m ódban egy read képernyőn. Ezután az utolsó kiírt karakter len mezőjét vizsgálják meg (ez a cccc
hívásnak képesnek kell lennie a POSIX által megkövetelt _PO SIX_SSIZE_M AX m ező a 3.40. ábrán), hogy meghatározzák, hány karaktert kell törölni a képernyő­
számú karaktert átvinni. Ennek értéke M INIX 3-ban 32767. ről, és minden egyes karakterre egy-egy visszatörlés-szóköz-visszatörlés sorozatot
A következő néhány függvény tty.c-ben a karakterbem enetet támogatja. A küldenek a rawecho segítségével, hogy eltávolítsák a nemkívánatos karaktereket a
tty jc h o (14647. sor) néhány karaktert speciálisan kezel, de többnyire csak meg­ képernyőről, és szóközzel (space) helyettesítsék.
jeleníti őket ugyanannak az adatbevitelre használt eszköznek a kimeneti oldalán. A következő függvény a reprint. A backover-en kívül a felhasználó is meghív­
Egy processzustól származó kimenet is továbbítódhat egy eszközhöz a bem enet hatja, ha megnyomja a R E P R IN T ( c t r l - R ) billentyűt. A 14764-től 14769-ig terje­
echózásával egy időben, ami összezavarja a dolgokat, ha a billentyűzet előtt ülő dő ciklus a bem eneti sorban visszafelé haladva megkeresi az utolsó sortörést. H a
felhasználó megpróbálja megnyomni a visszatörlést (backspace). Hogy ezt meg­ az utolsó betöltött helyen találja meg, akkor nincs teendő, és a reprint visszatér.
oldják, a tp~> ttyjeprint jelzőt mindig TRUE értékre állítják az eszközfüggő kiíró Egyébként kiírja a képernyőre a CTRL-R-t, amely a képernyőn mint a „ ~ R ” kétka­
rutinok esetén normál kimenetnél, így egy visszatörlés kezelésére meghívott függ­ rakteres sorozat jelenik meg, majd a következő sor elejére áll, és ismételten kiírja
vény azt jelezheti, hogy kevert kim enetet állítottak elő. Mivel a tty jc h o is az esz­ a bem eneti sort az utolsó sortöréstől a végéig.
közfüggő kimeneti rutinokat használja, a tp-> ttyje p r in t aktuális értékét meg kell Most érkeztünk el az outjjrocess-hez (14789. sor). Az in jjrocess-hez hasonlóan
őrizni echózás alatt; erre szolgál az rp lokális változó (14668-14701. sor). Azonban ezt is az eszközfüggő rutinok hívják, de ez egyszerűbb. Ezt csak az RS-232 és
amikor épp egy új bem eneti sor kezdődik el, az rp-1 FALSE értékre állítják ahe­ pszeudoterm inálok eszközspecifikus rutinjai hívják, a konzol rutinja nem. Az
lyett, hogy a régi értékét vennék, így biztosítják, hogy a tp-> tty je p r in t törlésre ke­ outjjrocess a bájtok ciklikus pufferén dolgozik, de nem távolítja el őket a puffer-
rüljön, amikor az echo véget ér. ből. Az egyetlen változtatás, amelyet a töm bön végrehajt az, hogy beilleszt egy
Észrevehettük, hogy a tty jc h o visszaad egy értéket, például az in jjrocess CR karaktert a pufferben levő N L karakter elé, ha mind az OPOST bit (kimenő
14629. sorában lévő hívásnál: adatok feldolgozása engedélyezett), mind az O N LCR (NL átalakítása CR-NL-re)
a tp->ttyJermios.oflag-ben be vannak állítva. A M INIX 3 esetében mindkét bit
eh = tty_echo(tp , eh) alapértelm ezés szerint be van állítva. A feladata még az, hogy az eszköz tty struk­
370 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 371

túrájában levő tp->tty_position változó értékét karbantartsa. A tabulátor és visz- A következő függvény, a ttyjep ly (14952. sor) m ár sokszor előkerült az előzők
szatörlés karakterek bonyolulttá teszik az életet. során. A feladata teljes m értékben világos: összeállít és elküld egy üzenetet. Ha
A következő rutin a d ev jo c tl (14874. sor). Ez a d o jo c tl-1 tám ogatja a tcdrain valamilyen okból a válaszküldés meghiúsul, akkor egy pánik állapot következik.
és a tcsetattr függvény végrehajtásában, amikor akár a TCSADRAIN, vagy a A következő függvények ugyanilyen egyszerűek. A sigchar (14973. sor) megkéri a
TCSAFLUSH opciókkal hívták meg. Ezekben az esetekben a d o jo c tl nem tudja PM-et, hogy küldjön egy szignált. H a a N O F LSH jelző nincs beállítva, akkor a sor­
befejezni a tevékenységét azonnal, ha a kimenet még nem kész, így a kérésre vo­ ban tárolt bem enet törlődik - a beérkezett karakterek vagy sorok számát nulláz­
natkozó információt eltárolják a tty struktúrának a késleltetett ioctl műveletek szá­ zák, és a bemeneti sor elejének és végének a címét tartalm azó m utatókat egyenlő­
m ára fenntartott részében. Am ikor a handleevents fut, az eszközfüggő kiíró rutin vé teszik. Ez az alapértelm ezés szerinti tevékenység. Am ikor a SIGHUP szignált
meghívása után először ellenőrzi a tp -> ttyjo req mezőt, és meghívja a d evjo ctl-1, venni kívánják, akkor a N O F LSH -1 be lehet állítani, lehetővé téve azt, hogy az in­
ha van függőben lévő művelet. A d ev jo c tl megvizsgálja a tp->tty_outleft-et, hogy put és az output folytatódhasson a szignál vétele után. A ttyjc a n c e l (15000. sor)
megállapítsa, befejeződött-e a kiírás, ha igen, akkor elvégzi ugyanazokat a tevé­ függvény feltétel nélkül kiüríti a várakozó bem enetet a sigchar-nál leírt módon, és
kenységeket, mint amiket azonnal végrehajtott volna, ha nem lett volna késlelte­ ezenfelül meghívja a tp-> ttyjc a n c e l által m utatott eszközfüggő függvényt, hogy
tés. A tcdrain kiszolgálásánál az egyetlen tevékenység a tp -> ttyjo req mező törlé­ az törölje a bem enő adatokat, amelyek magában az eszközben lehetnek, vagy az
se, és egy válaszüzenet küldése a fájlrendszernek, hogy ébressze fel azt a procesz- alacsony szintű kód puffereiben.
szust, amely az eredeti hívást kezdeményezte. A tcsetattr hívás TCSAFLUSH vál­ A ttyjn it-e t (15013. sor) akkor hívják meg, amikor a ttyJ a s k először elindul.
tozata meghívja a tp-> tty jca n ce l-1 a bem enet megszakítására. A tcsetattr mindkét Sorban végigmegy a lehetséges terminálokon, és beállítja az alapértelmezés sze­
változatánál lemásolják a termios struktúrát, amelynek címét az eredeti ioctl hívás­ rinti tulajdonságaikat. Kezdetben egy üres, semmilyen tevékenységet nem végző
kor átadják az eszköz tp-> ttyJerm ios struktúrájába. Ezután meghívják a setattr függvénynek a tty_devnop-nak a címe kerül be a tp-> tty jcancel, a tp-> tty jc a n c e l,
függvényt, amit hasonlóan a tcdrain-hez, egy válaszüzenet elküldése követ, a blok­ a tp-> tty ioctl és a tp -> tty jlo s e változókba. Ezután a tty init meghívja a terminál
kolt eredeti hívó processzus felébresztésére. kategóriájának (konzol, soros vonali vagy pszeudoterm inál) megfelelő eszközfüg­
A setattr (14899. sor) a következő eljárás. Amint m ár láttuk, ezt a d o jo c tl vagy gő inicializáló függvényeket. Ezek beállítják az indirekt m ódon hívott eszközfüggő
a d e v jo c tl hívja a termináleszköz tulajdonságainak m egváltoztatására, valamint függvények m utatóit valós m utatókra. Emlékezzünk arra, hogy ha egy kategórián
a do_close, hogy visszaállítsa a tulajdonságokat az alapértelm ezett értékekre. belül egyáltalán nincs eszköz konfigurálva, akkor egy olyan m akrót készítenek,
A setattr függvényt mindig meghívják azután, hogy egy új termios struktúrát másol­ amely azonnal visszatér, így nincs arra szükség, hogy egy nem konfigurált eszköz­
tak át az eszköz tty struktúrájába, hiszen pusztán a param éterek bemásolása nem höz tartozó kód egyetlen részét is lefordítsuk. A z s c r jn it hívása inicializálja a kon­
elég. H a a vezérelni kívánt eszköz most nemkanonikus módba kerül, az első teen­ zol meghajtóját, és meghívja a billentyűzet inicializálását végző rutint is.
dő, hogy a jelenleg a bem eneti sorban levő m inden karakter IN jE O T b itjé t be kell A következő három függvény az időzítőket támogatja. Egy felügyeleti időzítőt
állítani, m intha ezeket a karaktereket eredetileg is nemkanonikus m ódban helyez­ egy függvény címét tartalm azó m utatóval inicializálnak, hogy meghívja, amikor
ték volna a bem eneti sorba, ha akkor nemkanonikus mód lett volna érvényben. az idő lejár. A t t y j i m e d j u t az a függvény, amelyet a legtöbb időzítőhöz beállít a
Egyszerűbb végigmenni és ezt tenni m inden karakterre (14913-14919. sor), mint terminálmeghajtó. Beállítja az eseményjelzőket, hogy kikényszerítse mind a be­
megvizsgálni, hogy a karaktereknél ez a bit be volt-e m ár állítva. Semmilyen m ód­ menet, mind pedig a kim enet feldolgozását. Az expirejim ers kezeli a term inál­
szer nincs annak meghatározására, hogy mely tulajdonságok változtak meg éppen meghajtó időzítőket tartalm azó sorát. Emlékezzünk vissza, hogy ez az a függvény,
most, és melyek tartották meg előző értéküket. amelyet a ttyJ a s k főciklusából hívnak meg, amikor egy S Y N A L A R M üzenet ér­
A következő tevékenység a M IN és TIME értékek ellenőrzése. Kanonikus m ód­ kezik. Egy könyvtári rutint, a tm rsjxptim ers- 1 használják arra, hogy bejárja az
ban a tp -> tty jn in mindig 1; ezt a 14926. sorban állítják be. Nemkanonikus m ód­ időzítők csatolt listáját, lejárttá tegye őket, és meghívja a felügyeleti függvényét
ban a két érték kombinációi négy különböző működési m ódot tesznek lehetővé, mindegyiknek, amelyik lejárt. Visszatérve a könyvtári függvényből, ha a bem e­
amint az a 3.31. ábrán látható. A 14931-tól 14933-ig terjedő sorokban először a neti sor még aktív, egy sys_setalarm kernelhívást kezdeményeznek, ami egy másik
tp~ > ttyjnin felveszi a tp-> ttyJerm ios. ccc\V M IN \-b en átadott értéket, amelyet SY N _A L A R M üzenetet kér. Végül a settimer (15089. sor) beállítja az időzítőket
ezután módosítanak, ha az értéke nulla, és a tp-> ttyJerm ios.cjc[V TIM E ] nem arra, hogy nemkanonikus m ódban egy read hívásból mikor kell visszatérni. Ezt pa­
nulla. ram éterekkel hívják: a ttyj> tr egy m utató egy tty struktúrára, az enable egy egész
Végül &setattr gondoskodik arról, hogy a kiírás ne álljon meg, ha az XON/XOFF szám, amely TRUE vagy FALSE lehet. A tm rsje ttim e r és a tm rsjlrtim e r könyvtári
vezérlés le van tiltva, elküld egy SIGHUP szignált, ha a kiírás sebességét nullára rutinokat arra, hogy letiltsanak vagy engedélyezzenek egy időzítőt, az enable para­
állították, és végrehajt egy indirekt hívást a tp -> tty jo c tl által m utatott eszközfüg­ m éter szerint. H a egy időzítő engedélyezett, akkor a felügyeleti függvény mindig a
gő rutinra, hogy végrehajtsa azt, amit csak az eszközszinten lehet végrehajtani. korábban leírt t t y j i m e d j u t .
372 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 373

A tty_devnop leírása (15125. sor) szükségszerűen hosszabb, mint a végrehajt­ den egyes eszközt egyszer, hogy inicializálja. A /dev/console esetében meghívott
ható kód, mivel neki nincs ilyen. Ez egy tevékenység nélküli (no-operation) függ­ kód a consolex-ben van, és a billentyűzetet inicializáló kód innen kerül meghívás­
vény, amelyet indirekt módon hívnak, ha egy eszköz nem igényel egy kiszolgálást. ra. Ezt az implicit hierarchiát akár meg is lehetne fordítani. A korábbiakban előbb
Láttuk, hogy a tty_devnop-ot a tty init használja mint alapértelm ezett értékeket mindig az adatbevitelt vizsgáltuk a kiírás előtt, amikor az I/O-eszközöket vizsgál­
különböző függvénymutatókhoz, mielőtt egy eszköz inicializáló rutinját meghívja. tuk, és ezt a mintát fogjuk követni, amikor a keyboardx-1 tárgyaljuk ebben a feje­
A ttyx-ben lévő utolsó elem némi m agyarázatot igényel. A select egy rendszer- zetben, a consolex tárgyalását pedig a következő fejezetre hagyjuk.
hívás, amelyet akkor használnak, amikor több I/O-eszköz kér kiszolgálást váratlan A keyboardx ugyanúgy kezdődik, mint a legtöbb látott forrásfájl, jó néhány
időpontokban egy processzustól. A klasszikus példa egy kommunikációs program, #include utasítással. Ezek közül azonban az egyik nem szokásos. A keymaps/us-std.
amelynek figyelemmel kell kísérnie a lokális billentyűzetet és egy távoli rendszert, src (a 15128. sorban illesztik be) nem egy szokásos definíciós fájl; ez egy C for­
amely talán m odem en keresztül csatlakozik. A select hívás megengedi több esz­ rásfájl, amelynek eredm ényeként az alapértelm ezés szerinti billentyűzettérképet
közfájl megnyitását és figyelemmel kísérését, hogy mikor lehet róluk olvasni, vagy egy kezdőértékekkel feltöltött töm bként összeállítják a keyboard.o-bán. A bil­
mikor lehet rájuk írni blokkolás nélkül. A select nélkül két processzus használa­ lentyűzettérkép forrásfájl néhány jellegzetes bejegyzése látható a 3.37. ábrán. Az
tára lenne szükség a kétirányú kommunikáció kezelésére: egyik lenne a mester, #include utasítások után néhány m akró következik, amelyek különféle konstanso­
és felügyelné az egyik irányban történő kommunikációt, a másik pedig a szolga, kat definiálnak. Az első csoportot a billentyűzetvezérlővel történő alacsony szintű
aki felügyelné a másik irányú kommunikációt. A select egy olyan tulajdonságra kommunikációban használják. Közülük sok I/O-kapuk címe vagy olyan bitkombi­
példa, amely nagyon jó hogy van, de amely lényegesen bonyolítja a rendszert. A nációk, amelyeknek jelentősége van ezekben a kapcsolatokban. A következő cso­
M INIX 3 egyik tervezési célja az volt, hogy olyan egyszerű legyen, hogy elvárható port a speciális billentyűk szimbolikus neveit tartalmazza. A 15249. sorban a kör­
időn belül, elvárható erőfeszítéssel megérthessék, ezért bizonyos határokat kellett körös billentyűzetpuffer m éretét definiálják szimbolikusan mint K B J N BYTES,
szabnunk. Itt nem fogjuk tárgyalni a do_select (15135. sor) és a selectJry (14313. amelynek az értéke 32, majd a következőkben magát a puffért és a kezelését végző
sor), a select je tr y (14348. sor) kiszolgáló rutinokat. változókat. Mivel csak egyetlenegy van ebből a pufferből, figyelmet kell fordítani
arra, hogy a teljes tartalm át feldolgozzák, m ielőtt a virtuális konzolt váltják.
A változók következő csoportját arra használják, hogy különböző állapotinfor­
3.8.5. A billentyűzetmeghajtó megvalósítása mációkat tároljanak bennük, amelyeket meg kell jegyezni ahhoz, hogy egy billen­
tyűlenyomást megfelelő m ódon értelmezzenek. Ezeket különböző m ódon hasz­
A következőkben figyelmünket a M INIX 3-konzolt m űködtető eszközspecifikus nálják fel. Például a caps_down jelző (15266. sor) a TRUE és a FALSE (igaz és
kódra fordítjuk, amely egy IBM PC-billentyűzetből és egy tárcímleképezéses meg­ hamis) értékek között váltakozik, valahányszor a c a ps l o c k billentyűt megnyom­
jelenítőből áll. Az ezt alkotó fizikai eszközök teljesen különállók: egy szokványos ják. A shift jelzőt (15264. sor) TRUE-ra állítják, amikor valamelyik s h if t billentyűt
asztali számítógépben a megjelenítő egy illesztőkártyát használ (ebből legalább fél lenyomják, és FALSE-ra, amikor mindkét sh if t billentyűt felengedik. Az esc válto­
tucat különböző alaptípus létezik), amely a hátfalba van bedugva, míg a billentyű­ zót akkor állítják be, ha egy billentyűkód-választás érkezik. A következő karakter
zetet az alaplapba épített áram kör szolgálja ki, amely a billentyűzetben levő 8 bites megérkezése m inden esetben törli az értékét.
egylapkás célszámítógéppel tartja a kapcsolatot. A két aleszköz teljesen különböző A mapJceyO függvény (15297. sor) m akróként van megvalósítva. Visszaadja a
szoftvertámogatást igényel, amely a keyboard.c és a console.c fájlokban található. billentyűkódnak megfelelő ASCII kódot, figyelmen kívül hagyva a módosítókat.
Az operációs rendszer a billentyűzetet és a konzolt ugyanazon eszköz, a Ez megfelel a billentyűzettérkép-tömb első ( s h if t nélküli, norm ál) oszlopának.
/dev/console részeinek látja. H a elég nagy memóriával rendelkezik a képernyő­ Ennek „nagy testvére” a m apjcey (15303. sor), amely elvégzi a billentyűkód teljes
illesztő, akkor a virtuális konzol tám ogatását végző kódot is lefordíthatjuk, és a leképezését egy ASCII kódra, figyelembe véve a (több) lenyomott módosító bil­
/dev/console mellett további logikai eszközök is lehetnek, a /dev/ttycl, /dev/ttyc2 és lentyűt, a közönséges billentyűk mellett.
így tovább. Bármely időben csak az egyikről érkező kim enet jelenik meg a képer­ A billentyűzetmegszakítás-kezelő rutin, a kbdjnterrupt (15335. sor) kerül meg­
nyőn, és csak egy billentyűzetet használhatnak adatbevitelre, bármelyik konzol az hívásra valahányszor egy billentyűt lenyomnak vagy felengednek. Ez meghívja az
aktív. Logikailag a billentyűzet a konzol alá van rendelve, de ez csak két, viszony­ scode-ot, hogy elkérje a billentyűkódot a billentyűzetvezérlő lapkából. A billen­
lag kis dologban nyilvánul meg. Az első, hogy a ttyja b le táblázatban, amely a kon­ tyűkód legmagasabb helyi értékű bitje be van állítva, ha egy billentyű felengedése
zolhoz tartozó tty struktúrát tartalmazza, és ahol külön mezők állnak rendelke­ okozta a megszakítást, az ilyen kódokat figyelmen kívül lehet hagyni, hacsak nem
zésre a beolvasás és a kiírás számára, például a tty_devread és tty_devwrite mezők, az egyik módosítóbillentyűről van szó. Azonban annak érdekében, hogy a legke­
a keyboardx-ben, illetve a consolex-ben lévő függvénymutatókat bekapcsoláskor vesebb m unkát végezzük azért, hogy a megszakításkérést a lehető leggyorsabban
töltik fel. Azonban csak egy tty_priv mező van, és ez csak a konzol adatstruktúráira szolgáljuk ki, m inden nyers billentyűkódot a körkörös pufferbe tesznek, és az ak­
mutat. A második az, hogy a ttyJ a s k m ielőtt belépne a főciklusába, meghív min­ tuális konzol tp->tty_events jelzőjét beállítják (15350. sor). Céljaink érdekében
374 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 375

42 35 163 170 18 146 38 166 38 166 24 152 57 185 A k b je a d kiveszi a billentyűkódokat a billentyűzet körkörös pufferéből, és
L+ h+ h- L- e+ e- l+ I- l+ I- o+ o- SP+ SP- ASCII kódokat helyez el a saját lokális pufferébe, amely elég nagy ahhoz, hogy
elférjenek benne azok a vezérlőszekvenciák is, amelyeket a numerikus billentyű­
54 17 145 182 24 152 19 147 38 166 32 160 28 156 zetről érkező billentyűkódok esetén kell generálni. Ezután meghívja a hardverfüg­
w- R- 0+ o- r+ r- l+ I- d+ d- CR+ CR- getlen in jjrocess-1, hogy az a karaktereket a bem eneti sorba tegye. A 15379. sor­
R+ w+
ban az icount értékét eggyel csökkentik. A make_brake az ASCII kódot egy egész
3.41. ábra. A billentyűkódok a bemenő pufferben, a megfelelő leütésekkel, amelyek a számként adja vissza. Néhány speciális billentyűnek, mint például a numerikus
billentyűzetről bevitt sor karaktereinek felelnek meg. Az L és R a bal, illetve jobb oldali vagy a funkcióbillentyűknek, itt még OxFF-nél nagyobb kódja van. A HO M E és az
s h i f t billentyűtjelentik, +és-a billentyű lenyomását, illetve felengedését. A billentyű
IN S R T (0x101 és OxlOC, az include/minix/keymap.h-ban van definiálva) közé eső
felengedésének billentyűkódja 128-cal nagyobb, mint ugyanezen billentyű kódokat, amelyeket a numerikus billentyűzeten levő billentyűk lenyomása ered­
lenyomásának kódja ményez, háromkarakteres vezérlőszekvenciákká konvertálják a 3.42. ábrán látható
nu m padjn a p tömb segítségével.
feltesszük, ahogyan korábban is tettük, hogy select hívások nem történnek, és hogy Ezután a szekvenciát átadják az in jjrocess-nzk (1 5 3 9 2 -1 5 3 9 7 . sor). Nagyobb
a kbdjnterrupt ezután azonnal visszatér. A 3.41. ábra a pufferben levő billentyű- kódokat nem adnak át az in jjrocess-nek. Helyette egy ellenőrzést végeznek az
kódokat m utatja egy rövid bem eneti sor esetében, amely két nagybetűs karaktert alt - left - ar ro w , alt - rig ht - ar r o w , valamint alt- F 1 -F 1 2 közé eső kódokra, és ha
tartalmaz, mindegyiket megelőzi a s h i f t lenyomásának billentyűkódja, és követi egyiket megtalálják, meghívják a selectjo n s o le -1 a virtuális konzol váltására. A
a s h i f t felengedésének billentyűkódja. Kezdetben mindkét billentyűlenyomás és c trl- F 1 - F 1 2 billentyűknek ugyanilyen m ódon adnak speciális jelentést. A c t r l- F I
-felengedés kódját tárolják. m egm utatja a funkcióbillentyűk leképezéseit (lásd később). A ctrl -F 3 vált a hard­
Amikor egy H ARD IN T megszakításkérés érkezik a billentyűzettől a ttyja sk- veres és a szoftveres görgetés között a konzol megjelenítőjén. A ctrl -F 7 , ctrl -F 8
hoz, a teljes főciklus nem fut le. Egy continue utasítás a 13795. sorban a főciklus és a ctrl -F 9 szignálokat generál, amelyeknek ugyanaz a hatása, mint a ctrl -\, a
egy újabb futását váltja ki azonnal a 13764. sorban. (Ez kissé leegyszerűsített, a ctrl -C és a CTRL-U-nak eb b en a sorrendben, kivéve, hogy ez a hozzáren delés nem
forráskód listában benne hagytunk némi feltételes kódot, hogy bemutassuk: ha változtatható meg az stty paranccsal.
a soros vonali meghajtó is engedélyezve van, akkor annak a felhasználó oldalán A m akejjrea k (15431. sor) a billentyűkódokat ASCII kódokká alakítja, majd
lévő megszakításkezelőjét is meg kell hívni.) Amikor a vezérlés a ciklus elejére beállítja azoknak a változóknak az értékét, amelyek a módosítóbillentyűk álla­
kerül, és most a konzoleszköz tp->tty_events jelzője be van állítva, akkor meghív­ potát követik. Először azonban ellenőrzi a „mágikus” c t r l - a l t - d e l kombinációt,
ják a k b je a d (15360. sor) eszközfüggő rutint a konzol tty struktúrájának tp->tty_ amelyet m inden PC-felhasználó az MS-DOS alatt a rendszer újraindításának
devread mezőjében levő m utató segítségével. egyik módjaként ismer. Emlékezzünk arra a megjegyzésre, hogy ezt egy alacso­
nyabb szinten jobb volna kezelni. Azonban a M INIX 3 megszakításkezelésének
Billentyü Scan kód „ASCII" Vezérlöszekvencia egyszerűsége a kernel területén lehetetlenné teszi a c t r l - a l t - d e l észlelését ott,
hom e (kezdet) 71 0x101 ESC [ H amikor a megszakításkérést elküldik, a billentyűkódot még nem olvasták be.
Up Arrow (felfelé nyíl) 72 0x103 ESC [A Mivel szabályos rendszerleállítást szeretnénk, ezért a PC BlOS-rutinjainak meg­
pgup (lapozás felfelé) 73 0x107 ESC [V hívása helyett a sys_kill kernelhívást hajtjuk végre, ami kezdeményezi a SIG K ILL
- 74 0x10A ESC [ S szignál küldését az init-nek, az összes processzus szülő processzusának (15448.
Left Arrow (balra nyíl) 75 0x105 ESC [ D sor). Az init fogadja ezt a szignált, és úgy értelmezi, mint egy szabályos rendszer­
5 76 0x109 ESC [ G leállítás megkezdésére vonatkozó parancsot, még mielőtt visszatérne a betöltési
Right Arrow (jobbra nyíl) 77 0x106 ESC [ C felügyelőprogramhoz, ahonnan a rendszer teljes újraindítása vagy a M INIX 3 új­
+ 78 0x10B ESC [T ratöltése végrehajtható.
end (vége) 79 0x102 ESC [V Természetesen nem reális azt elvárni, hogy ez minden esetben működik. A leg­
Down Arrow (lefelé nyíl) 80 0x104 ESC [ B több felhasználó tisztában van a hirtelen leállás veszélyeivel, és nem nyomja meg
p g d n (lapozás lefelé) 81 0x108 ESC [ U a CTRL-ALT-DEL-t egészen addig, amíg valami tényleg el nem romlik, és a rendszer
ins (beszúrás) 82 OxlOC ESC [ @ normális irányítása lehetetlenné válik. Ilyenkor elképzelhető, hogy a rendszer már
annyira összezavarodott, hogy egy másik processzus számára szignált küldeni már
3.42. ábra. A numerikus billentyűzet által generált vezérlőszekvenciák. Amikor a közönséges nem lehetséges. Ezért van egy static változó, a C A D jo u n t a m akejjreak-ben. A
billentyűk billentyűkódját ASCII kódokká konvertálják, a speciális billentyűk legtöbb rendszerhiba esetén a megszakításrendszer még működik, így a billentyű­
„pszeudo-ASCII" kódokat kapnak, amelyeknek az értéke OxFF-nél nagyobb zetről még érkezhet bem enő adat és a term inálmeghajtó működésben maradhat.
376 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 377

A M INIX 3 kihasználja a számítógép-felhasználók viselkedését, akik előszeretet­ A se tje d s (15508. sor) kapcsolja be és ki a világító diódákat, amelyek jelzik,
tel csapkodják a billentyűket, ha valami nem akar megfelelően működni (lehet, hogy lenyomták-e a n u m l o c k , c a p s lock vagy sc r o l l lock billentyűket. Egy vezér­
hogy ez az egyik bizonyítéka annak, hogy az őseink a majmok voltak). H a az init lő bájt, a L E D CODE kerül egy kimeneti portra, jelezve a billentyűzetnek, hogy a
leállítása nem sikerül, és a felhasználó még kétszer megnyomja a c t r l - alt - d e l következő bájt, amely megjelenik, a fényeket fogja vezérelni, és a három világító
kombinációt, akkor egy sys_abort kernelhívás történik, amelynek következtében a dióda állapota a következő bájt három bitjén lesz kódolva. Természetesen ezeket
betöltési felügyelőprogramhoz kerül vissza a vezérlés, az init hívását megkerülve. a m űveleteket kernelhívások hajtják végre, amelyek kérik a rendszertaszkot, hogy
A make_break fő része könnyen érthető. A make változó tárolja azt, hogy a bil­ írjon a kimeneti portokra. A következő két függvény tám ogatja ezt a műveletet.
lentyűkódot a billentyű lenyomása vagy felengedése váltotta ki, és ezután a map_ A kb jv a it (15530. sor) hívását arra használják, hogy megállapítsák, a billentyűzet
key meghívása visszaadja az ASCII kódot a eh-ba. A következő utasítás egy, a eh kész-e parancssorozatok fogadására, és a k b jic k (15552. sor) hívásával ellenőrzik,
értéke szerinti switch (15460-15499. sor). Tekintsünk két esetet, egy közönséges és hogy a parancsot nyugtázták-e. M indkét parancs tevékenyen várakozik, folyama­
egy speciális billentyű leütését. Egy közönséges billentyű esetén a swtich-ben egyik tosan olvas a kívánt kód megérkezéséig. Ez egy nem ajánlott technika a legtöbb
eset sem teljesül, így a default esetben (15498. sor) visszaadják a billentyű kódját, I/O-művelet esetén, de a billentyűzeten levő LED-ek be- és kikapcsolását nem
ha a make változó értéke igaz. Ha valahogyan egy közönséges billentyűt billen­ kell túl gyakran végezni, így ha ezt nem hatékonyan végezzük, nem veszítünk sok
tyűfelengedésként fogadtak, akkor a -1 értéket adják vissza, és ezt a hívó k b je a d időt. Figyeljük meg, hogy mind a kb jva it, mind a k b jic k meghiúsulhat, és a visz-
figyelmen kívül hagyja. Egy speciális billentyűt, mint például a CTRL, a switch egy szatérési kódjukból megállapítható, ha ez történt. A z időkorlátokat úgy kezelik,
megfelelő helyén azonosítanak, jelen esetben a 15461. sorban. A megfelelő válto­ hogy korlátozzák az ismétlések számát a ciklusban egy számlálóval. Azonban a bil­
zó, ebben az esetben a ctrl, megjegyzi a make állapotát és a visszaadásra kerülő ka­ lentyűzeten levő LED -ek kapcsolgatása nem annyira fontos, hogy ezekkel a visz-
rakterkód helyére a -1 -et helyettesíti (amelyet majd figyelmen kívül hagynak). Az szatérési értékekkel bajlódjunk, így a setjed s vakon megy tovább.
ALT, CALOCK, N L O C K és az SLO C K billentyűk kezelése bonyolultabb, de m ind­ Mivel a billentyűzet a konzol részét képezi, így az inicializáló rutinja, a k b jn it
egyik speciális billentyűre az eredmény hasonló: egy változó felveszi vagy a billen­ (15572. sor) a console.c-ben levő serjn it-bői hívódik meg, nem közvetlenül a ttyx-
tyű állapotát (azoknál, amelyeknek csak akkor vannak hatása, amíg lenyomva tar­ ben levő tty jn it-bői. Ha a virtuális konzolokat engedélyezték (azaz az N R jC O N S
ják őket), vagy az ellenkezőjére változtatja az állapotát (a lock billentyűknél). nagyobb, mint 1 az includelminix!config. /z-bán), akkor a k b jn it-c t minden egyes
Még egy vizsgálatra érdem es eset van: az E X T K E Y kód és az esc változó. Ez logikai konzolra meghívják. A következő függvényt a kbjnit_once-t csak egyszer
utóbbi nem tévesztendő össze a billentyűzeten levő e sc billentyűvel, amely a OxlB hívják meg (15583. sor), amint a nevéből következik. Ez állítja be a világító diódá­
ASCII kódot adja vissza. Nincs mód rá, hogy az E X T K E Y kódot a billentyűzeten kat a billentyűzeten, és ellenőrzi a billentyűzetet, hogy ne legyen elmaradt, beolva­
levő egy vagy több billentyű lenyomásának kombinációjával előállítsuk; ez a PC bil­ sásra váró billentyűleütés. Majd két töm böt tölt fel kezdőértékekkel, a zfkeyjb s-X
lentyűzetének kiterjesztett billentyűelőtagja (prefix), a kétbájtos billentyűkódnak és az s fk e y jb s -1, amelyeket arra használnak, hogy a funkcióbillentyűket olyan
az első bájtja jelzi, hogy egy billentyű nem volt része az eredeti PC-billentyűzethez processzusokhoz kapcsolják, amelyeknek reagálni kell rájuk. Amikor mindez ké­
tartozó billentyűknek, de ugyanaz a billentyűkódja, mint annak, amit megnyom­ szen van, két kernelhívást hajt végre, meghívja a sysjrqsetpolicy és a sysjrqenable
tak. Sok esetben a szoftverek a két kódot egyformán kezelik. Például majdnem funkciókat, amelyekkel beállítja a billentyűzetmegszakítás kezelését, automatikus
minden esetben ez történik a normál „ / ” és a numerikus billentyűzeten levő „ / ” újraengedélyezést állít be, így m inden esetben egy figyelmeztető üzenetet külde­
esetén. Más esetekben szükség lehet a két billentyű megkülönböztetésére. Pél­ nek a ttyj a s k számára, amikor egy billentyűt lenyomnak vagy felengednek.
dául sok, az angol nyelvűtől eltérő billentyűzettérkép eltérően kezeli a bal és a Bár a következőkben több lehetőségünk lesz arra, hogy megvitassuk, hogyan
jobb oldali a lt billentyűket, így megenged olyan billentyűket, amelyeknek három m űködnek a funkcióbillentyűk, itt a jó alkalom z z f k e y jb s és az s fk e y jb s tömbök
különböző karakterkódot kell előállítaniuk. M indkét alt ugyanazt a billentyűkó­ leírására. Mindegyiknek 12 eleme van, mivel a m odern PC-billentyűzeteken 12 F
dot (56) generálja, de a jobb oldali lenyomásakor ezt megelőzi az E X T K E Y kód. billentyű van. Az első töm böt a m ódosító billentyűk nélküli F billentyűk, a m á­
Amikor az E X T K E Y kódot adják vissza, az esc jelző beállításra kerül. Ebben az sodikat a S H iF T -tel m ódosított F billentyűk esetén használják. Mindegyikük o b s j
esetben a make_break kilép a switch utasításból, kihagyva ezzel az utolsó lépést a típusú elemekből áll, ami olyan struktúra, amely egy processzusszámot és egy
normál visszatérés előtt, amely m inden más esetben törli az esc jelzőt (15458. sor). egész számot tárol. Ez a struktúra és ezek a tömbök a keyboardx fájlban vannak
Ez azt eredményezi, hogy az esc csak a közvetlenül ez után érkező kód esetén lesz deklarálva a 15279-15281. sorokban. Az inicializálás egy speciális, szimbolikus
érvényben. H a tisztában van a PC billentyűzetének működési elveivel, akkor ez NONE-nal jelölt értéket helyez el a struktúrap r o c j r komponensében, amivel jel­
egyszerre ismerős, de mégis egy kicsit furcsa, mivel a PC BIOS nem engedi meg, zi, hogy az nincs használatban. A N Ő N E olyan érték, amely kívül esik az érvényes
hogy valaki olvassa egy a lt billentyű kódját, és kiterjesztett kód esetén más értéket processzusszámok tartományán. Jegyezzük meg, hogy a processzusszám nem egy
ad vissza, mint a M INIX 3. pid, egy bejegyzést azonosít a processzustáblában. Ez az elnevezés félreérthető le­
het. Azonban üzenet küldésére egy processzusszámot alkalmaznak inkább, mint
378 3. BEVITEL/KIVITEL 3.8. ATERMINÁLOK 379

egy pid-et, m ert a processzusszámok indexelik a priv táblát, amely megadja, hogy képpen jelenítenek meg memóriaképet. Valójában csak a ctrl -F1 ad egy infor­
a processzus számára meg van-e engedve, hogy üzeneteket fogadjon. Az events mációs képernyőt; megjeleníti a funkcióbillentyűkhöz rendelt tevékenységeket.
egész szám egy számláló, amelyet kezdetben nullára állítanak. A rra fogják hasz­ A ctrl -F 3 váltja a hardveres és a szoftveres görgetést a konzolképernyőn, a többi
nálni, hogy eseményeket számláljanak vele. pedig szignálokat küld.
A következő három függvény mind elég egyszerű. A kb d jo a d m a p (15610. A funkcióbillentyűk magukban vagy a s h i f t billentyűvel együtt lenyomva olyan
sor) m ajdnem triviális. Ezt a tty.c-ben levő d o jo c tl hívja meg akkor, amikor a eseményeket váltanak ki, amelyeket a terminálmeghajtó nem tud kezelni. E red­
felhasználói adatterületről egy billentyűzettérképet át kell másolni, és felül kell ményezhetnek figyelmeztető üzeneteket egy kiszolgálónak vagy egy meghajtónak.
írni az alapértelmezés szerinti billentyűzettérképet. Az alapértelm ezett térkép a Mivel a szerverek és a meghajtók betölthetők, engedélyezhetők és letilthatók,
keyboardx fájl elejére beillesztett térképforrásfájl fordításával jön létre. miután a M INIX 3 már elindult, a billentyűk fix hozzárendelése a fordítás alkal­
A M INIX első megjelenése óta mindig biztosította különböző rendszer-infor- mával nem lenne kielégítő. A futás alatti változtatás engedélyezéséhez a ttyJ a s k
mációk m entését vagy más speciális tevékenységeket a rendszerkonzolon az F I, FK EY CONTROL típusú üzeneteket fogad. A d o j k e y j t l függvény (1 5 6 2 4 . sor)
F2 stb. billentyűk lenyomására. Más operációs rendszerek általában nem nyúj­ szolgálja ki az ilyen kéréseket. A kérések típusai: F K E Y MAP, FK E YJJN M A P vagy
tanak ilyen szolgáltatást, de a M INIX mindig is oktatási eszköz kívánt lenni. A FKEY_EVENTS. Az első kettő beregisztrál vagy töröl egy processzust a megadott
felhasználók bátran barkácsolhatnak vele; ez azt jelenti, hogy a felhasználóknak kulccsal az üzenetben megadott térképbe, a harmadik üzenettípus pedig visszaad
segítségre lehet szükségük a hibakereséshez. Sok esetben az F billentyűkkel előál­ egy a hívóhoz tartozó térképet a lenyomott billentyűkhöz, és nullázza az ezekhez a
lított kim enet akkor is hozzáférhető, ha a rendszer m ár összeomlott. A 3.43. ábra billentyűkhöz tartozó events mezőt. Egy kiszolgáló processzus, az információs szer­
összefoglalja ezeket a billentyűket és a funkcióikat. ver (information server, IS) inicializálja a betöltési memóriaképben található pro­
Ezeknek a billentyűknek két csoportja van. Ahogyan korábban megjegyeztük a cesszusok beállításait, és közreműködik a válaszok generálásában. De egyedi meg­
ctrl -F 1 -F 1 2 billentyűket a k b je a d detektálja. Ezek olyan eseményeket váltanak hajtók ugyancsak beregisztrálhatják magukat, hogy válaszolhassanak egy funkció-
ki, amelyeket a terminálm eghajtó kezelni tud. Ezek az események nem szükség- billentyűre. A hálózati meghajtók általában ezt teszik, mivel a csomagstatisztikákat
bem utató táblázat hasznos lehet a hálózati problémák megoldásában.
Billentyű Célja A func_key-1 (15715. sor) a k b je a d hívja annak meghatározására, hogy egy
FI A kernel processzustáblájának megjelenítése olyan speciális billentyűt nyomtak-e le, amely helyi feldolgozást kíván. Ezt min­
F2 A processzus memóriahasználatának megjelenítése den kapott billentyűkódra megvizsgálják. H a az nem funkcióbillentyű, akkor
F3 Betöltési memóriakép még legfeljebb három összehasonlítást tesznek, mielőtt a vezérlés visszakerül a
F4 A processzus privilégiumai k b je a d -hez. H a a funkcióbillentyű regisztrált, akkor a megfelelő processzusnak
F5 Betöltési felügyelőprogram paraméterei egy figyelmeztető üzenetet küldenek. H a a processzus olyan, hogy csak egyetlen
F6 Megszakításkezelők és rendszabályok billentyűt regisztrált be, akkor a figyelmeztetés önmagában is elegendő a procesz-
F7 Kernelüzenetek szus számára, hogy tudja, mit kell tennie. H a processzus az információs kiszolgáló
F10 Kernelparaméterek vagy olyan, ami több billentyűt regisztrált be, akkor egy párbeszédre van szükség
F II Időzítési adatok (ha engedélyezve van) - a processzusnak egy F K E Y E VE N TS kérést kell küldenie a term inálm eghajtó­
F12 Ütemezési sorok nak, hogy dolgozza fel a do J k e y jtl-\e \, ez pedig tájékoztatja a hívót, hogy mely
SF1 A processzuskezelő processzustáblája billentyűk az aktívak. A hívó azután m ár eljuthat m inden lenyomott billentyűhöz
SF2 Szignálok rendelt rutinhoz.
SF3 A fájlrendszer processzustáblája A scanjceyboard (15800. sor) a hardverkapcsolat szintjén működik, olvassa és
SF4 Eszköz-/meghajtó-hozzá rendelés írja az I/O-kapukat. A billentyűzetvezérlő a 15809-15810. sorokban értesül ar­
SF5 Nyomtatóbillentyű-hozzá rendelések ról, hogy egy karakter beérkezett, beolvas egy bájtot, majd visszaírja úgy, hogy a
SF9 Ethernet-statisztika (csak RTL8139 esetén) legfelső helyi értékű bitjét 1-re állította, és ezután még egyszer újraírja úgy, hogy
CF1 Billentyűzettérkép megjelenítése ugyanezt a bitet kinullázta. Ez megakadályozza azt, hogy ugyanazt az adatot két­
CF3 Hardveres/szoftveres görgetés váltás a konzolon szer beolvassuk egy következő olvasásnál. Nincs állapot-ellenőrzés a billentyűzet
CF7 SIGQUIT küldése; ugyanaz, mint a ctrlA olvasásánál, de ez semmikor sem okozhat problém át, mivel a scanjceyboard-ot
CF8 SIGINT küldése; ugyanaz, mint a ctrl-C csak egy megszakítás eredm ényeként hívják meg.
CF9 SIGKILL küldése; ugyanaz, mint a ctrl-U A keyboardx-ben levő utolsó függvény a do j a n ic jiu m p s (15819. sor). H a egy
rendszerpánik eredm ényeként kerül végrehajtásra, akkor a felhasználó számára
3.43. ábra. A func_key() által felismert funkcióbillentyűk biztosítja azt a lehetőséget, hogy a funkcióbillentyűket használva nyomkövetési
3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 381
380

információkat jelenítsen meg a képernyőn. A 15830-15854. sorokban levő cik­ Az a függvény, amelynek a címe minden egyes konzol tp->devwrite elemében
lus ismét a tevékeny várakozásra példa. A billentyűzetet olvassuk addig, amíg egy található, a consjvrite (16036. sor). Ezt csak egy helyről hívják, a tty.c-ben található
Esc-t meg nem nyomnak. Természetesen senki sem panaszkodhat, hogy a rendszer handle_events függvényéből. A console.c-ben lévő legtöbb függvény ennek a tám o­
összeomlása után hatékonyabb technikára lenne szükség, amíg az újraindítási pa­ gatására szolgál. Amikor ezt a függvény először hívják meg, miután a kliens pro­
rancsra vár. A cikluson belül egy ritkán használt, blokkolással nem járó olvasási cesszus egy write hívást kezdeményezett, a kiírásra kerülő adat a kliens pufferében
műveletet, az nb_receive-t használnak, hogy lehetőség legyen más üzenetek fogadá­ található, amelyet a tty struktúra tp->tty_outproc és a tp->out_vir mezőinek segítsé­
sára is, ha vannak ilyenek, és a billentyűzet ellenőrzésére: van-e bemenet, amely­ gével találunk meg. A tp->outleft azt mondja meg, hogy hány karaktert kell átvin­
nek várhatóan a következő üzenetben ajánlott lehetőségek egyikének kellene len­ nünk, és a tp->tty_outcum mező kezdetben nulla, jelezve azt, hogy még egyet sem
nie. Az üzenet akkor jelenik meg a képernyőn, ha belépünk ebbe a függvénybe. vittünk át. Ez a szokásos helyzet a consjvrite-ba történő belépéskor, m ert normális
körülmények között, ha egyszer meghívásra került, akkor az eredeti hívásban kért
Nyomjon ESC-t az újratöltéshez, DEL-t a leállításhoz, F billentyűket a rendszer összes adatot átviszi. Azonban ha a felhasználó le akarja lassítani az adatok kép­
nyomkövetéséhez. ernyőn való megjelenítését, leütheti a STOP ( c t r l -S ) karaktert a billentyűzeten,
amelynek az eredménye az lesz, hogy beállítódik a tp ->inhibited]c\z6. A consjvrite
A következő alfejezetben láthatjuk azt a kódot, amely megvalósítja a dojiew km ess azonnal visszatér, ha ez a jelző be van állítva, még akkor is, ha a write még nem fe­
és a do_diagnostics függvényeket. jeződött be. Ilyen esetben a handle_events folytatni fogja a consjvrite meghívását,
és amikor a tp->tty jnhibited jelző végre törlődik azzal, hogy a felhasználó leüti a
ST A R T ( c t r l - Q ) billentyűt, a consjvrite folytatni tudja a megszakított adatátvitelt.
3.8.6. A képernyőmeghajtó megvalósítása A consjvrite egyetlen param étere egy m utató az adott konzol tty struktúrájá­
ra, tehát az első teendő a cons változó inicializálása úgy, hogy az az adott kon­
Az IBM PC megjelenítőjét virtuális term inálokként konfigurálhatjuk, ha elegendő zol console struktúrájára mutasson (16049. sor). Eztán, mivel a handle events
memória áll rendelkezésre. Ebben a szakaszban a konzol eszközfüggő kódját fog­ hívja a consjvrite-ot, amikor elindul, az első tevékenység annak eldöntése, hogy
juk megvizsgálni. Ezenkívül megnézzük azokat a nyomkövetési (debug) kiíró ruti­ van-e egyáltalán elvégzendő feladat. H a nincs, akkor egy gyors visszatérés tö rté­
nokat, amelyek a billentyűzet és a képernyő alacsony szintű szolgáltatásait használ­ nik (16056. sor). Ezt követően a 16061-16089. sorok közötti főciklusba érkezünk.
ják. Ezek akkor is lehetőségeket adnak a konzolnál ülő felhasználóval történő kor­ Ez a ciklus felépítésében hasonló a tty.c-ben levő injransfer főciklusához. Egy 64
látozott kapcsolatra, amikor M INIX 3 más részei már nem működnek, és hasznos karaktert tárolni képes lokális puffért töltenek meg a sys_vircopy kernelhívással,
információkkal szolgálnak még egy m ajdnem teljes rendszerösszeomlás esetén is. hogy átvegyék az adatokat a kliens pufferéből. Ezt követően a forrásterület m u­
A konzolkiírás hardverfüggő megvalósítása a PC tárcímleképezéses képernyő­ tatóját és a számlálókat aktualizáljuk, majd a lokális pufferből minden egyes ka­
jére a console.c-ben van. A console struktúrát a 15981-15998. sorokban definiál­ raktert átviszünk a co n s-> cja m q u eu e töm bbe a megfelelő attribútum bájttal
ták. Bizonyos értelem ben ez a struktúra a tty. c-ben definiált tty struktúra egy ki- együtt, hogy később a képernyőre kerülhessenek a flush segítségével.
terjesztése. Inicializáláskor a konzol tty struktúrájának tp->tty_priv mezője egy Am int azt a 3.35. ábra m utatja, a karakterátvitelt a cons->ramqueue-ba több­
olyan m utató lesz, amely a saját console struktúrájára m utat. A console struktúra féle módon is megtehetjük. M inden egyes karakterre meghívhatjuk az outj:har-1,
első eleme egy m utató, amely a megfelelő tty struktúrára m utat vissza. A console de megjósolható, hogy az out_char egyik speciális szolgáltatására sem lesz szük­
struktúra komponensei pontosan azok, amik egy képernyős megjelenítő esetén ség, ha a karakter egy látható karakter, vezérlőszekvencia nincs folyamatban,
várhatók: a kurzor sor- és oszlopértékét rögzítő változók, a képernyő-memória a képernyő szélességét nem haladtuk meg, és a cons->c_ramqueue nincs tele.
kezdőcíme és a megjelenítéshez használható m em ória m éretkorlátja, az a m em ó­ H a az out_char teljes szolgáltatáskészletére nincs szükség, a karaktert közvetle­
riacím, amely a vezérlő m ikroáram kör báziscímmutatójába kerül, valamint a kur­ nül beleteszik a cons-> cjam queue-ba az attribútumbájtjával együtt (amelyet a
zor aktuális címe. A többi változót a vezérlőszekvenciák kezeléséhez használják. cons->c_attr-ból kaphatunk meg) és a co n s-> cjw ords-öt (a kimeneti sor indexe),
M iután a karakterek 8 bites bájtokként érkeznek, és össze kell őket kapcsolni az a cons-> cj:olum n-ot (a képernyőn a kurzor oszlop m utatója) és a tbuf-ot (egy
attribútum bájtokkal, és ezeket a 16 bites szavakat kell átvinni a videomemóriába, m utató a pufferbe) mind megnövelik. A karakter ilyen direkt m ódon történő behe­
az átvitelre kerülő blokkot a c_ramqueue-bán építjük fel, amely elég nagy tömb lyezése a cons->ramqueue-ba megfelel a 3.35. ábra bal oldalán látható szaggatott
ahhoz, hogy tárolja egy teljes 80 karakteres sor 16 bites karakter-attribútum pár­ vonalnak. H a szükséges, akkor az out_char-1 (16082. sor) hívják meg. Ez elvégzi az
jait. M inden virtuális konzolnak szüksége van egy console struktúrára, és ezek szá­ összes adminisztrációt, továbbá meghívja aflush-t, amely elvégzi a végső átvitelt a
m ára a co n sjable töm bben (16001. sor) foglalunk helyet. Am int azt a tty és más képernyő-memóriába, ha szükséges.
struktúrák esetén is tettük, a console struktúra elemeire rendszerint egy mutatóval Az átvitel a felhasználói pufferből a lokális pufferbe, majd a kimeneti sorba
fogunk hivatkozni, például cons-> cJty. mindaddig ismétlődik, amíg a tp -> ttyjju tleft azt mutatja, hogy van még átvien­
382 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 383

dő karakter, és a tp -> ttyjnhibited jelző nincs beállítva. Am ikor az átvitel megáll, nyelvű rutin (amely a drivers/tty/vidcopy.s-ben van definiálva). Ez a hívás 3840 bájt
akár azért, m ert a write művelet befejeződött, vagy azért, m ert a tp-> ttyjnhibited mozgatását kívánja a CPU-tól, ami nagy m unka, még assembly nyelven is.
beállítódott, ismét meghívják aflush-t, hogy a sorban levő utolsó karakterek is át­ A szoftveres görgetési módszer soha nem az alapértelm ezett: az operátornak
vitelre kerüljenek a képernyő-memóriába. H a a művelet befejeződött (amelyet kell ezt kiválasztania, ha a hardveres görgetés nem működik vagy nem kívánatos
úgy ellenőriznek, hogy a tp->tty_outleft nulla), egy válaszüzenetet küldenek a tty_ valamilyen ok miatt. Egyik ok lehet az, ha a screendump utasítást kívánjuk hasz­
reply meghívásával (16096-16097. sor). nálni akár azért, hogy a képernyő-memória tartalm át el tudjuk m enteni egy fájlba,
A handle_events-bői történő consjvrite hívásokon kívül kiírandó karaktere­ vagy a főkonzol képernyőjét szeretnénk látni, amikor egy távoli terminálról dol­
ket küldhetnek a konzolra az echo és rawecho függvények is a term inálmeghaj­ gozunk. H a a hardveres görgetés van érvényben, akkor a screendump valószínűleg
tó eszközfüggetlen részében. H a a konzol az aktuális kimeneti eszköz, akkor a váratlan eredm ényt ad, mivel a képernyő-m em ória kezdete valószínűleg nem fog
tp->tty_echo m utatón keresztül történő hívásokat a következő, cons_echo (16105. egybeesni a látható képernyő kezdőcímével a képernyő-memóriában.
sor) függvényhez irányítják. A cons_echo m inden feladatát az o u tjh a r -1, majd a A 16226. sorban a wrap változót ellenőrizzük, egy összetett vizsgálat első ré­
flush meghívásával végzi. A billentyűzetről a bem enet karakterenként érkezik, és szeként. A wrap igaz értéket ad az olyan régebbi megjelenítők esetén, amelyek
a gépelő személy az echózást észrevehető késleltetés nélkül szeretné látni, ezért a tám ogatták a hardveres görgetést, és ha az ellenőrzés sikertelen, egy egyszerű
karakterek kimeneti sorba helyezése nem lenne kielégítő. hardveres görgetés történik a 16230. sorban, ahol a videovezérlő lapka által hasz­
Az o u tjh a r (16119. sor) egy ellenőrzést végez, hogy egy vezérlőszekvencia nált c o n s - > c jr g m utatót, amely a képernyő kezdetét m utatja a videovezérlő
van-e folyamatban, meghívja a parsejscape-1, és azonnal visszatér, ha igen (16124- m ikroáram körben, úgy állítják be, hogy a képernyő bal felső sarkában megjele­
16126. sor). Egyébként egy switch utasítással megvizsgálja a speciális eseteket: null, nítendő legelső karakterre mutasson. H a a wrap értéke hamis (FALSE), akkor
visszatörlés, csengetés karakter és így tovább. Legtöbbjük kezelését egyszerű meg­ az összetett vizsgálat azzal folytatódik, hogy a görgetés során felfelé mozgatandó
érteni. A soremelés és a tabulátor kezelése a legbonyolultabb, hiszen ezek ered­ blokk túlcsordul-e az adott konzol számára m egadott memóriablokk határán. Ha
ményezhetnek bonyolult változást a képernyőkurzor pozíciójában és igényelhet­ igen, akkor ismét meghívjuk a v i d j i d j o p y - 1, hogy a blokkot mozgassa a konzol
nek görgetést. Az utolsó ellenőrzés az ESC kódra történik. H a ez érkezett, akkor m em óriaterületének elejére, és a kezdetének a m utatóját aktualizálják. H a nincs
a cons-> c esc state jelzőt beállítják (16181. sor), és így az o u tjh a r további hívá­ átlapolás, akkor a vezérlés egy egyszerű hardveres görgetési módszerre kerül,
sai a parsejscape-re terelődnek át, amíg a szekvencia be nem fejeződik. Végül az amelyet a régebbi videovezérlők mindig használtak. Ez a c o n s - > c jr g igazításá­
alapértelmezés szerinti tevékenységet hajtják végre a nyom tatható (látható) karak­ ból és az új kezdőpozíció értékének a videovezérlő lapka megfelelő regiszterébe
terekre. H a a képernyő szélességét meghaladtuk, akkor szükség lehet a képernyő történő beírásából áll. Ennek meghívását később hajtják végre, m iután a képer­
görgetésére és a flush meghívására. Mielőtt egy karaktert a kimeneti sorba tesznek, nyőn levő legalsó sort törölték, hogy a „görgetés” hatását keltsék.
megvizsgálják, hogy a sor nem telt-e meg, és ha igen, meghívják aflusht-t. Egy ka­ A lefelé görgetés kódja nagyon hasonlít a felfelé görgetés kódjához. Végül a
rakternek a sorba helyezése ugyanazokat az adminisztrációs feladatokat követeli m e m jid jo p y - 1hívják meg, hogy töröljék a n ew jine által megcímzett legalsó (legfel­
meg, mint amilyeneket korábban a consjvrite-bán láttunk. ső) sort. Ezután a set_6845 hívásával beírjuk az új kezdeti pozíciót, a c o n s -> c jr g
A következő függvény a scrolljcreen (16205. sor). A scrolljcreen kezeli mind értékét a megfelelő regiszterekbe, a flush pedig biztosítja, hogy az összes változás
a felfelé görgetést - azt a normál esetet, amelyet akkor kell végrehajtani, ha a kép­ láthatóvá váljék a képernyőn.
ernyő alján levő sor megtelt - , mind a lefelé görgetést, ami akkor fordul elő, ami­ A flu sh -t (16259. sor) már többször em lítettük. A flush átviszi a kimeneti sor­
kor a kurzormozgató parancsok megkísérlik a kurzort a képernyő legfelső sora ban lévő karaktereket a videomemóriába a m e m j i d j o p y segítségével, karban­
fölé mozgatni. M indkét irányú görgetés megvalósításra három lehetséges módszer tart néhány változót, biztosítja, hogy a sor- és oszlopszámok értelmesek legyenek,
ígérkezik. Ezeket a különböző videokártyáknak támogatniuk kell. kiigazítja őket, ha például egy vezérlőszekvencia megpróbálja a kurzort negatív
Vizsgáljuk meg a felfelé görgetés esetét. Kezdetben a chars értéke a képernyőn oszlopértékre állítani. Végül annak kiszámítása következik, hogy hol kell lennie a
levő karakterek száma, levonva belőle 1 sornak megfelelő számú karaktert. A kurzornak, és ezt összehasonlítják a c o n s -> c ju r -ral. H a nem egyeznek, és a most
szoftveres görgetést a v i d j i d j o p y egyetlen olyan hívásával végezzük, amely chars kezelt videomemória megegyezik az aktuális virtuális konzoléval, akkor set_6845
számú karaktert mozgat a m em óriában lejjebb, annyival, ahány karakter van egy hívásával beállítja a megfelelő értéket a videovezérlő kurzor regiszterébe.
sorban. A v i d j i d copy kezeli az átfordulást, azaz, ha olyan memóriablokk moz­ A 3.44. ábra bem utatja, hogy a vezérlőszekvenciák kezelését hogyan lehetséges
gatását kérik, amely túlcsordul a videomegjelenítő m em óriájának felső végén, egy véges autom atával reprezentálni. Megvalósítása a p a rsejsca p e (16293. sor)
akkor veszi a túlcsorduló részt a memóriablokk alsó címéről, és egy olyan címre függvénnyel történik, amelyet az o u tjh a r elején hívunk meg, ha a c o n s -> c js c _
mozgatja, amely magasabb címen található, mint az a rész, amelyet lejjebb mozga­ state nem nulla. Az ESC-et magát az o u tjh a r ismeri fel, és beállítja a cons->c_
tunk, azaz az egész blokkot körkörös töm bként kezeli. A hívás egyszerűsége azon­ escjta te -c t 1-re. Amikor a következő karakter megérkezik, a parsejscape felkészül
ban egy elég lassú m űveletet takar, még akkor is, ha a v i d j i d j o p y egy assembly a további feldolgozásra úgy, hogy egy „\0” karaktert tesz a consj js c j n t r o - ba, a
384 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 385

nül követő karakter egy speciális vezérlőszekvencia kezdő karaktere-e, vagy sem.
H a nem, akkor csak egy érvényes tevékenység lehet, a kurzor mozgatása egy sor­
ral feljebb, ha a szekvencia ESC M volt. Figyeljük meg, hogy az „M ” ellenőrzése
egy default ággal rendelkező sw itch utasításban történik, érvényességi vizsgálattal,
és előre gondolva arra a lehetőségre, hogy olyan vezérlőszekvenciákat is hozzá­
adhassunk a rendszerhez, amelyek nem az ESC [ form át használják. Sok vezér­
lőszekvenciánál a tipikus tevékenység a következő: megvizsgálják a cons->c_row
változót, hogy szükség van-e görgetésre. H a a kurzor már a 0. sorban van, akkor a
scrolljcreen-1 hívják meg a SC RO LL D O W N param éterrel; egyébként a kurzort
egy sorral feljebb viszik. Az utóbbit egyszerűen a c o n s -> c jo w csökkentésével és
&flush meghívásával érik el. H a egy vezérlőszekvencia-bevezető karaktert talál­
tak, akkor az 16377. sorban levő else utáni kód fog végrehajtódni. Megvizsgálják,
hogy egy „[” érkezett-e, az egyetlen, amit a M INIX 3 vezérlőszekvencia-bevezető
karakterként felismer. H a a szekvencia érvényes, akkor a vezérlőszekvencia első
3.44. ábra. A vezérlőszekvenciákat feldolgozó véges automata param étere (vagy 0, ha nem volt numerikus param éter) bekerül a value (16380.
sor) változóba. H a a szekvencia nem érvényes, akkor semmi sem történik, kivé­
param éterek tömbjének kezdetét jelző m utatót, a cons->cesc_param v[0] címét ve azt, hogy a következő nagy sw itch (16381-16586. sor) utasítás kimarad, és az
beteszi a cons-> c_escjarm p-bc, és kinullázza magát a param étertöm böt. Ezután escape állapotot nullára állítják a d o jsc a p e -bői való visszatérés előtt. Az érdeke­
az ESC-et követő első karaktert vizsgálják - csupán a „[” és az „M ” a m egengedett sebb esetben, amikor a szekvencia érvényes, végrehajtják a sw itch utasítást. Nem
értékek. Az első esetben a ,,[”-t bemásolják a cons-> cjsc_intro-ba, és az auto­ fogjuk az összes esetet megtárgyalni, csak megemlítjük azt a néhányat, amely jel­
m ata a 2-es állapotba kerül. A második esetben a d o jsc a p e függvényt hívják meg, lemző a vezérlőszekvenciák egyes tevékenységtípusaira.
hogy végrehajtsák a tevékenységet, és az escape állapotjelzőt nullára állítják. H a Az első öt, numerikus argumentumok nélküli, vezérlőszekvenciát az IMB PC-
az ESC-et követő karakter nem a m egengedettek közül való, akkor figyelmen kí­ billentyűzetén levő négy nyíl és a h o m e billentyű generálják. Az első kettő, az ESC
vül hagyják, és a rá következő karakterek ismét normálisan jelennek meg. [A és ESC [B hasonlók az ESC M-hez, azzal a különbséggel, hogy fogadhatnak
H a egy ESC [ szekvencia érkezik, a következő karaktert a 2-es escape állapot­ numerikus param étert, és így több mint egy sorral is képesek fel és le mozogni,
ban vizsgálják meg. Ennél a pontnál három lehetőség adódik. H a a karakter egy de nem görgetik a képernyőt, ha a m egadott param éter olyan mozgást határozna
numerikus karakter, a számértékét hozzáadjuk a cons->c_escjparmp által m u­ meg, amely a képernyő határain kívül esik. Ezekben az esetekben a flush lekezeli
tatott érték 10-szereséhez, amely m utató kezdetben a cons-> cescj> arm v[0]-ra a határokon túli mozgást, és korlátozza a mozgást a legalsó vagy legfelső sorig. A
m utat (és nulla a kezdőértéke). Az escape állapot nem változik. Ez lehetővé teszi következő két szekvencia, az ESC [C és az ESC [D, amelyek jobbra és balra moz­
számjegyek sorozatának bevitelét és egy nagy numerikus param éter előállítását, gatják a kurzort, hatását hasonlóan korlátozza a flush. Amikor a nyílbillentyűk ge­
bár a M INIX 3 által jelenleg értelm ezett legnagyobb érték 80, amelyet a kurzor nerálják a szekvenciákat, nincs numerikus argumentumuk, így az alapértelmezés
tetszőleges pozícióra való mozgatásához használt vezérlőszekvenciában használ­ szerinti egy sor vagy oszlop m értékű mozgás történik.
nak (16335-16337. sor). H a a következő karakter egy pontosvessző, akkor van egy Az ESC [H két param éterrel rendelkezhet, például ESC [20;60H. A param é­
másik numerikus param éter, a param éterre m utató változót továbbállítják, így terek abszolút és nem az aktuális kurzorpozícióhoz relatív pozíciókat határoznak
lehetővé teszik, hogy a következő numerikus értéket összegyűjtsék a második pa­ meg, és az 1-gyel induló számokat 0-val kezdőkké alakítják a megfelelő értelm e­
ram éterben (16339-16341. sor). H a a M AXJESC PARMS értékét megnövelnénk, zéshez. A h o m e billentyű az alapértelm ezés szerinti (nincs param éter) szekvenciát
hogy több param éter számára foglaljon helyet, akkor a fenti kódot nem kellene generálja, amely az (1 ,1 ) pozícióba viszi a kurzort.
megváltoztatni ahhoz, hogy további numerikus értékeket gyűjtsön össze, újabb Az ESC [í J és az ESC [sK törli a teljes képernyő vagy az aktuális sor egy részét, a
param éterek begépelése után. Végül ha a karakter nem számjegy és nem pontos- megadott param éter függvényében. M indkét esetben kiszámolják a karakterek szá­
vessző, akkor meghívják a d o jsc a p e -e t. mát. Például az ESC [ÍJ esetén a count értéke a képernyő kezdetétől a kurzor po­
A do_escape (16352. sor) egyike a M INIX 3-rendszer forráskódjában található zíciójáig terjedő karakterek száma lesz. A karakterek száma, valamint egy pozíció­
hosszabb függvényeknek, még akkor is, ha a M INIX 3 vezérlőszekvencia-készlete param éter a dst, ami lehet akár a képernyő kezdete, cons->cj>rg, akár az éppen
viszonylag szerény. Azonban teljes hosszában a benne levő kód könnyen érthető. aktuális kurzorpozíció, c o n s-> c ju r; ezek szoktak lenni azok a param éterek, ame­
Egy kezdeti flush hívás után, amellyel biztosítjuk azt, hogy a képernyő teljesen lyekkel a m e m j id j o p y - 1 meghívják. Ezt az eljárást egy olyan param éterrel hívják
naprakész legyen, egy egyszerű if elágazás van, aszerint hogy az ESC-et közvetle­ meg, amelynek hatására a megadott területet az aktuális háttérszínnel tölti fel.
386 3. BEVITEL/KIVITEL 3.8. A TERMINÁLOK 387

Regiszterek Funkció ha érvényes, akkor ezt használjuk a cons inicializálására, amely az aktuális konzol­
10-11 A kurzor mérete bejegyzésre mutat. Ezen a ponton lehet inicializálni a c o n s -> c tty mezőt az esz­
12-13 A megjelenítendő képernyő kezdőcíme köz fő tty struktúrájának címét tartalm azó mutatóval, és ezután már a tp->tty_priv
14-15 A kurzor pozíciója az eszköz consoleJ struktúrájára m utathat. Ezután a k b jn it-c t hívják meg, hogy
inicializálja a billentyűzetet, és ezután az eszközfüggő rutinok címét tartalm azó
3.45. ábra. A 6845-ös néhány regisztere m utatókat beállítják, hogy a tp->tty_devwrite a consjvrite-ra, míg a tp-> tty echo a
cons_echo-ra mutasson. A képernyővezérlő bázis regiszterének I/O-címét a BIOS-
A következő négy szekvencia beszúr és töröl sorokat és szóköz karaktereket ból nyerik, míg a videomemória kezdőcímét és m éretét a 16708-16731. sorokban
a kurzor pozícióban. M űködésük nem igényel részletes magyarázatot. Az utol­ határozzák meg, és a wrap jelzőt (amely azt határozza meg, hogyan kell görgetni)
só eset, az ESC [nm (figyeljünk arra, hogy a „n” egy num erikus param étert je ­ annak megfelelően állítják be, hogy milyen videovezérlőt használnak. A 16735.
löl, míg az „m” egy karakterliterál) a cons->c_attr-ra van hatással, arra az att­ sorban a videomemória szegmensleíróját inicializálja a rendszertaszk a globális
ribútum bájtra, amely a karakterkódok közé ékelődik, amikor azok kiíródnak a leírótáblában (GDT).
videomemóriába. Ezután következik a virtuális konzolok inicializálása. M inden alkalommal, ami­
A következő függvényt, a set_6845-öt (16594. sor) akkor használják, amikor a kor az serjn it-et meghívják, más-más tp értéket adnak át param éterként, és így
videovezérlő lapkát kell programozni. A 6845-ös lapkának 16 bites belső regiszte­ más line és cons értékeket használunk a 16750-16753. sorokban, így biztosítanak
rei vannak, amelyek 8 bites egységekben program ozhatok, minden egyes regiszter minden egyes virtuális konzol számára egy saját részt a rendelkezésre álló video-
írása négy I/O-kapu írásával jár. Úgy hajtják őket végre, hogy egy töm böt állítanak memóriából. Ezután minden egyes képernyőt letörölnek, indulásra kész állapotba
össze (vektort) portcím és értékpárokból, majd elvégzik a sys_voutb kernelhívást, hoznak, és végül kiválasztják a 0-s című konzolt, hogy ez legyen az, amit először
amely elvégezteti a rendszertaszkkal a kért I/O-feladatot. A 6845 típusú videove­ aktiválnak.
zérlő mikroáram kör néhány regisztere a 3.45. ábrán látható. Néhány rutin a term inálm eghajtónak magának, a kernelnek és más rendszer-
A következő függvény a get_6845 (16613. sor), amely a videovezérlő áram kör kom ponensnek a nevében jelenít meg kimenetet. Az első, a kputc (16775. sor)
regisztereiben található értékeket adja vissza. Ez ugyancsak a rendszertaszkot egyszerűen a putk-t hívja, amely egy szöveget ír ki bájtonként a következőkben
használja a feladatának elvégeztetésére. A jelenlegi M INIX 3-kódban sehol sem leírt módon. Ez a rutin azért van itt, m ert az a könyvtári rutin, amely a printf függ­
hívják meg, azonban hasznos lehet a további bővítések során, például grafikus tá­ vényt adja, olyan rendszerkom ponensekben használt, amelyek úgy vannak megír­
mogatás hozzáadásánál. va, hogy hivatkoznak egy ilyen nevű karakternyom tató rutinra, de más függvények
A beep (csengetés) függvényt (16629. sor) akkor hívjuk meg, amikor egy c t r l - G a term inálm eghajtóban egyp u tk nevűt várnak.
karaktert kell kiírni. Ez kihasználja a PC-nek azt a képességét, hogy hangot lehet A dojiew _km ess (16784. sor) a kerneltől érkező üzenetek kinyomtatására szol­
előállítani úgy, hogy a hangszórónak négyszöghullámjclct küldünk. A hang m eg­ gál. Az „üzenet” nem éppen a legjobb szó itt, mivel most nem a processzusok kö­
szólaltatása az I/O-kapuk egyfajta varázslatos manipulációjával kezdődik, amelyet zötti kommunikációban használt üzenetekről van szó. Ez a függvény arra szolgál,
csak az assembly programozók szerethetnek igazán. A kód egy érdekesebb része hogy szöveget jelenítsen meg a konzolon, információkat, figyelmeztetéseket vagy
az időzítőt használja a hang kikapcsolására. Mint rendszerprivilégiumokkal ren ­ hibajelzéseket adjon a felhasználónak.
delkező processzus (azaz egy bejegyzés a priv táblában) a terminálmeghajtó üzem ­ A kernelnek speciális mechanizmusra van szüksége, hogy információt jelenítsen
be állíthat egy időzítőt a tm rsjettim ers könyvtári függvény használatával. A 16655. meg. Robusztusnak kell lennie, hogy használható legyen rendszerindításkor, mi­
sorban ezt a következő, stop_beep függvénnyel végzik el, egy olyan függvénnyel, előtt a M INIX 3 minden kom ponense elindulna, vagy pánik során, a másik olyan
amelyet akkor kell meghívni, ha az időzítő lejárt. Ezt az időzítőt a term inálm eg­ alkalommal, amikor a rendszer főbb részei lehet, hogy nem elérhetők. A kernel a
hajtó saját időzítő sorában helyezik el. A sys_setalarm kernelhívás következik ez­ szöveget egy körkörös pufferbe írja, ez része egy struktúrának, amely m utatókat
után, amely arra kéri a rendszertaszkot, hogy egy időzítőt indítson el a kernelben. is tartalm az a következő kiírandó bájtra és a még fel nem dolgozott szöveg m é­
Am ikor az lejár, egy SYN_ALARM üzenetet kap a term inálm eghajtó főciklusa, a retét. A kernel egy SYS SIG üzenetet küld a term inálmeghajtónak, amikor van
ttyJask, amely meghívja az expirejimers függvényt, hogy lássa el a term inálm eg­ új szöveg, és az a dojiew _km ess függvényt hívja, amikor a ttyJ a s k főciklusa fut.
hajtóhoz tartozó összes időzítőt, amelyek közül az egyik az, amelyiket a beep állí­ H a a dolgok nem mennek simán (azaz a rendszer összeomlott), akkor a SYS SIG
tott be. üzenetet egy olyan ciklusban észlelik, amelyben szerepel egy blokkolással nem
Az scrjnit-Qt (16679. sor) a tty jn it hívja meg annyiszor, amennyi az N R CONS járó olvasási művelet a dojpanic_dumps-bán, amit a keyboard.c-ben láttunk, és a
értéke. Minden esetben egy tty struktúra címét tartalm azó m utató a param éte­ dojiew _km ess- 1 is innen hívják meg. Bármelyik esetben a sy s_ g etk m essa g e s rend­
re, amely a ttyja b le egy elem ére mutat. A 16693-16694. sorokban a line változót szerhívás lekéri a kernelstruktúra m ásolatát, és a bájtokat egyesével megjelenítik,
használják indexként a consjable tömbhöz; kiszámítják az értékét, ellenőrzik, és átadják őket a pu tk-nak, végül egy utolsó putk hívás egy nulla bájttal kikényszeríti
388 3. BEVITEL/KIVITEL 3.9. ÖSSZEFOGLALÁS 389

a kiírást a képernyőre. Egy lokális statikus változót használnak arra, hogy kövesse
a pufferben a pozíciót az egyes üzenetek között.
3.9. Összefoglalás
A do_diagnostics-nak (16823. sor) hasonló a feladata, mint a do_new_kmess- A bevitel/kivitel (I/O) fontos kérdés, amelyet gyakran elhanyagolnak. Bármelyik
nek, de a do_diagnostics-ot arra használják, hogy inkább rendszertaszkok üzene­ operációs rendszernek egy tekintélyes része az I/O-val foglalkozik. Ennek ellenére
teit jelenítse meg, ne pedig a kernelét. A D L 4G N O ST IC S üzenetet akár a ttyJ a s k az I/O-eszközmeghajtók gyakran felelősek az operációs rendszer problémáiért. Az
főciklusa, akár a do_panic_dumps ciklusa fogadhatja, és bármelyik esetben a eszközmeghajtókat gyakran olyan programozók írják, akik az eszközöket készítő
doJLiagnostics-ot hívják meg. Az üzenet tartalm az egy m utatót egy pufferre a hí­ gyáraknak dolgoznak. A hagyományos operációs rendszerek felépítése általában
vó processzusban és egy számlálót az üzenet méretével. Nem használnak lokális megkívánja, hogy az eszközmeghajtók számára megengedjék, hogy hozzáférhesse­
puffért; ehelyett ismételt sys_vircopy kernelhívásokat hajtanak végre, hogy megsze­ nek az olyan kritikus erőforrásokhoz, mint a megszakítások, az I/O-kapuk és a más
rezzék a szöveget bájtonként, egyesével. Ez védi a terminálmeghajtót: ha valami processzusokhoz tartozó memória. A M INIX 3 kialakítása olyan, hogy a m eghajtó­
elromlik, és egy processzus túlságosan nagyméretű kim enetet kezd el generálni, kat független, korlátozott privilégiumokkal rendelkező processzusokként elkülöní­
nem fordulhat elő puffertúlcsordulás. A karaktereket egyesével írják ki a p utk ti egymástól, így a meghajtóban fellépő hibától nem omlik össze az egész rendszer.
meghívásával, amit egy nulla bájt követ. Vizsgálódásunkat azzal kezdtük, hogy megnéztük az I/O-hardvert, az I/O-
A pu tk (16850. sor) karaktereket írhat ki a képernyőre bármely kód részéről, eszközök és az I/O-vezérlők kapcsolatát, amelyekkel a szoftvernek foglalkoznia kell.
amelyet a term inálm eghajtóhoz hozzászerkesztettek, és azok a függvények hasz­ Ezután áttekintettük az I/O-szoftver négy szintjét: a megszakításkezelő rutinokat, az
nálják, amelyeket éppen most tárgyaltunk, hogy szöveget írjanak ki a kernel vagy eszközmeghajtókat, az eszközfüggetlen I/O-szoftvert és azokat az I/O-könyvtárakat
más rendszerkom ponens nevében. Csak meghívja az out_char függvényt minden és háttértárolókat (spooler), amelyek a felhasználói címterületen futnak.
egyes nem nulla m egkapott karakterre, és meghívja aflush-t a nulla bájtra a szö­ A következőkben tárgyaltuk a holtpont problém áját és azt, hogy miként lehet
veg végén. vele megbirkózni. H oltpont akkor keletkezik, amikor processzusok egy csoport­
A console.c-ben levő többi m egm aradt rutin rövid és egyszerű, így gyorsan át­ jában minden egyes processzus kizárólagos hozzáférést kapott bizonyos erőfor­
nézzük őket. A togglejcroll (16869. sor) azt teszi, amit a neve is m utat, váltogatja rásokhoz, és mindegyik még egy másik erőforrást is meg akar kapni, amelyet a
azt a jelzőt, amely meghatározza, hogy hardveres vagy szoftveres görgetést hasz­ csoportban lévő valamelyik másik processzus m ár lefoglalt. Ilyenkor valamennyi
nálnak. Egy üzenetet is kiír az aktuális kurzor pozícióra, és megadja a kiválasztott blokkolt állapotba kerül, és egyik sem lesz képes futni a későbbiek során. A holt­
módot. A cons_stop (16881. sor) újrainicializálja a konzolt, olyan állapotba hozza, pontot úgy lehet elkerülni, ha a rendszert úgy alakítjuk át, hogy ez soha ne jöhes­
amelyet a betöltési felügyelőprogram vár a rendszer leállítása vagy újraindítása sen létre, például egy processzusnak csak egy erőforrás birtoklását engedjük meg
előtt. A cons_org0-1 (16893. sor) csak akkor használják, amikor az F3 billentyű­ egy adott időpillanatban. Úgy is elkerülhető a holtpont, hogy minden egyes erő­
vel m egváltoztatták a görgetési módot, vagy előkészülnek a rendszer leállítására. forráskéréskor megvizsgáljuk, hogy vezethet-e olyan helyzethez, amelyben holt­
A select console (16917. sor) kiválaszt egy virtuális konzolt. Az új sorszámmal hív­ pont (nem biztonságos állapot) lehetséges, és megtagadjuk vagy késleltetjük azo­
ják meg, és kétszer meghívja a setj5845-öt, hogy a videovezérlő a videomemória kat a kéréseket, amelyek problém ához vezethetnek.
megfelelő részét jelenítse meg a képernyőn. A M INIX 3-ban az eszközmeghajtók független processzusokként vannak meg­
Az utolsó két rutin erősen hardverfüggő. A conjo a d fo n t (16931. sor) egy betű­ valósítva, amelyek a felhasználói cím területen futnak. M egnéztük a RAM-lemez-
készletet (fontot) tölt le a grafikus illesztőbe, az ioctl TIOCSFON műveletének m eghajtót, a merevlemez-meghajtót és a terminálm eghajtót. Mindegyik meghajtó
támogatására. Meghívja aga_program-ot (16971. sor), hogy egy I/O-kapura elkül­ rendelkezik egy főciklussal, amely kéréseket kap, feldolgozza ezeket, esetenként
dött mágikus írások sorozatának eredm ényeként láthatóvá váljon a videovezérlő visszaküldve egy jelzést arról, ami történt. A főciklus, valamint a RAM-lemezmeg­
betűkészlet memóriája, amelyet norm ál körülmények között nem címezhet meg hajtó, a merevlemezegység és a hajlékonylemez-meghajtók közös funkcióinak for­
a CPU. Ezután a phys_copy-t hívják, hogy a betűkészlet adatait átmásolják erre a ráskódja egy közös könyvtárban található, azonban minden egyes meghajtó fordí­
m em óriaterületre, és egy másik mágikus írássorozattal visszaállítjuk a grafikus ve­ tása és szerkesztése a könyvtár egy saját lemásolt példányával történik. Mindegyik
zérlő normális működési módját. eszközmeghajtó saját cím terében fut. A számos term inált, amelyek a rendszer­
Az utolsó függvény a co n sjo ctl (16987. sor). Egyetlen funkciója van, beállítja a konzolt, a soros vonali kapcsolatokat és a hálózati kapcsolatokat használják, mind
képernyő m éretét, csak az sc rjn it hívja a BlOS-ból nyert értékekkel. H a szükség egyetlen term inálm eghajtó processzus szolgálja ki.
lenne egy valódi ioctl hívásra, hogy megváltoztassuk a sizeM INIX 3screen kódját, Az eszközmeghajtóknak változatos a kapcsolata a megszakításrendszerrel.
hogy új m éreteket adhassunk meg, akkor azt meg kellene írni. Azok az eszközök, amelyek gyorsan képesek elvégezni munkájukat, mint a RAM-
lemezek és a tárcímleképezéses megjelenítők, egyáltalán nem használnak megsza­
kításokat. A lemezmeghajtó munkájának nagy részét a saját kódjával végzi, és a
megszakításkezelők csak állapotinformációkat adnak számára. A megszakítások
3. BEVITEL/KIVITEL FELADATOK 391
390

m inden esetben szükségesek, és egy récéivé művelettel lehet megvárni az egyik be­ 10. M iért törekednek arra az operációsrendszer-tervezők, hogy eszközfüggetlen
következését. Billentyűzetmegszakítás bármikor bekövetkezhet. M inden megsza­ I/O-szolgáltatásokat biztosítsanak, ahol csak lehetséges?
kítás által generált és a term inálm eghajtónak küldött üzenetet a meghajtó főciklu­ 11. Az I/O-szoftverének négy rétege közül melyikben történik a következő?
sában fogadnak és dolgoznak fel. Amikor egy billentyűzetmegszakítás bekövetke­ (a) A sáv-, szektor- és fejcím kiszámítása egy lemezolvasáshoz.
zik, a feldolgozás első fázisa, hogy a beolvasást a leggyorsabban végezzük el, hogy (b) Az utóbbi időben használt blokkok gyorsítótárának kezelése.
a rendszer készen állhasson a következő megszakítás fogadására. (c) Parancsok írása az eszközregiszterekbe.
A M INIX 3-meghajtóknak korlátozott privilégiumaik vannak, és saját maguk (d) Annak ellenőrzése, hogy a felhasználó jogosult-e az eszköz használatára.
nem tudnak megszakításokat kezelni vagy I/O-kapukhoz hozzáférni. A megszakí­ (e) Bináris egész számok ASCII karakterekké konvertálása a nyomtatáshoz.
tásokat a rendszertaszk kezeli, amely egy üzenet küldésével értesíti a meghajtót, 12. A nyomtatásra várakozó kimeneti fájlokat miért gyűjtik össze általában egy le­
amikor egy megszakítás bekövetkezik. Az I/O-kapukhoz történő hozzáférés szin­ mezen, mielőtt kinyomtatásra kerülnek (spooling)?
tén a rendszertaszk közvetítésével történik. A m eghajtók nem tudják közvetlenül 13. Adjon példát olyan holtpontra, amely a fizikai világban fordulhat elő.
írni vagy olvasni az I/O-kapukat. 14. Tekintsük a 3.10. ábrát. Tegyük fel, hogy az (o) lépésben a C nem az R - qt, ha­
nem az S-et igényli. Vajon ez holtponthoz vezet? Tegyük fel, hogy S-et és R -et
is igényli. Ilyenkor mi a válasz?
15. Nézzük meg figyelmesen a 3.13.(b). ábrát. H a D még egy egységet kér, akkor
Feladatok ez biztonságos vagy nem biztonságos állapothoz vezet? Mi a helyzet akkor, ha
az igény nem D -tői, hanem C-től érkezik?
1. Egy lx sebességű DVD-olvasó 1,32 MB/s sebességgel tud adatot küldeni. 16. A 3.14. ábrán levő pályák vagy horizontálisak, vagy vertikálisak. El tud képzel­
Hányszoros sebességű az a DVD-meghajtó egység, amely egy USB 2.0 kapcso­ ni olyan helyzetet, amelyben diagonális pályák is létezhetnek?
laton keresztül még m eghajtható adatvesztés nélkül? 17. Tegyük fel, hogy a 3.15. ábra szerintiül processzus a legutolsó szalagegységet
2. Sok lemez tartalm az hibajavító kódot (E rror Correction Code, E C C ) minden igényli. H oltponthoz vezet-e ez az esemény?
egyes szektor végén. H a a hibajavító kód rossz, milyen tevékenységeket tud el­ 18. Egy számítógépnek hat szalagos egysége van, amelyért n processzus versenyez.
képzelni, és ezeket a szoftver vagy a hardver melyik része hajtja végre? M inden egyes processzusnak két meghajtóegységre van szüksége. Milyen n
3. Mi a m emórialeképezésű I/O? M iért használják időnként? esetén lesz a rendszer holtpontm entes?
4. Magyarázza el, hogy mi a közvetlen mem óriaelérés (Direct M emory Access, 19. Lehetséges-e, hogy egy rendszer olyan állapotba kerül, amely nem holtpont, és
DM A), és miért használják. nem biztonságos? H a igen, akkor adjunk rá példát. H a nem, bizonyítsuk, hogy
5. Bár a DM A nem használja a CPU-t, a maximális átviteli sebesség mégis kor­ m inden állapot vagy holtpont, vagy biztonságos.
látozott. Tekintsük egy blokk beolvasását a lemezről. Nevezzen meg három 20. Egy elosztott rendszernek, amely levelesládákat használ, két IPC primitívje
olyan tényezőt, amelyek alapvetően m eghatározhatják az átviteli sebességet. van, a send és a récéivé. Az utóbbi primitív megad egy processzust, ahonnan fo­
6. A CD-minőségű zene megköveteli, hogy m ásodpercenként 44 100-szor ve­ gadni akarunk, és blokkolt állapotba kerül abban az esetben, ha ettől a meg­
gyünk m intát a hangjelből. Tegyük fel, hogy egy időzítő megszakításokat gene­ adott processzustól nem kap üzenetet, még akkor is, ha van várakozó üzenet
rál ezzel a sebességgel, és m inden egyes megszakítás kezelése 1 jxs ideig tart más processzusoktól. Nincsenek megosztott erőforrások, de a processzusoknak
egy 1 GHz-es CPU-nak. Mi az a legalacsonyabb CPU-sebesség, amelyet még más okokból kifolyóan gyakran kell kommunikálniuk. Lehetséges a holtpont?
használhatunk anélkül, hogy adatot vesztenénk? Tegyük fel, hogy a megszakí­ 21. Egy elektronikus pénzátutalási rendszerben azonos processzusok százai m ű­
táskor végrehajtandó műveletek száma azonos, tehát ha megfelezzük az óra­ ködnek a következőképpen. Minden egyes processzus elolvas egy bem enő
jel-frekvenciát, akkor a megszakítások kezelési ideje megduplázódik. sort, amely megmondja a pénzmennyiséget, a terhelendő és a jóváírandó
7. A megszakítások egyik altematíváj a a folyamatos lekérdezés (polling). Vannak-e számlaszámot. Ezután zárolja mindkét számlát, átviszi a pénzt, majd felold­
olyan esetek, amikor úgy gondolja, hogy a lekérdezés a jobb megoldás? ja a zárolást, amikor kész. Amikor sok processzus fut párhuzamosan, akkor
8. A lemezvezérlőknek belső puffereik vannak, és ezek egyre nagyobbak m inden valós veszély van a holtpont kialakulására: az x számla zárolása után könnyen
egyes új modellnél. M iért? előfordulhat, hogy nem sikerül a zy számlát zárolni, m ert az y számlát már zá­
9. M inden eszközmeghajtónak két interfésze van az operációs rendszerrel. Az rolta egy olyan processzus, amely most éppen az* számlára vár. Tervezzen egy
egyik interfész olyan függvényhívások halmaza, amelyeket az operációs rend­ olyan sémát, amely megelőzi a holtpontokat. Csak akkor szabad elengedni a
szer hajt végre a meghajtón. A másik rendszerhívások egy olyan halmaza, számlákat, ha m ár befejeztük a tranzakciót. (Más szóval olyan megoldást nem
amelyeket a meghajtó kezdeményez az operációs rendszer felé. Nevezzen meg engedünk meg, amely zárol egy számlát, de rögtön elengedi, ha a másik számla
egy-egy valószínű hívást mindegyik interfészből. zárolva van.)
392 3. BEVITEL/KIVITEL FELADATOK 393

22. A bankár algoritmust futtatjuk egy olyan rendszerben, ahol m erőforrás osz­ 28. A lemezmeghajtóhoz a következő cilinderértékekkel érkeznek kérések: 10,
tály és n processzus van. Nagy m és n esetén egy állapot biztonságossága el­ 22, 20, 2, 40, 6 és 38, ebben a sorrendben. Egy keresés cilinderenként 6 ms.
döntésének műveletigényére a korlát m anb-\e 1 arányos. Mik az a és b értékei? M ekkora keresési (seek) idő szükséges, ha
23. Tekintsük a 3.15. ábrán látható bankár algoritmust. Tegyük fel, hogy az A és a (a) az elsőként érkezettet szolgáljuk ki elsőként;
D processzusok megváltoztatják igényüket egy újabb (1, 2, 1, 0) és (1, 2, 1, 0) (b) a legközelebbi cilindert szolgáljuk ki következőnek;
elemre. Kielégíthetők-e ezek az igények, és biztonságos állapotban m arad-e a (c) a liftes algoritmust használjuk (először felfelé mozgunk)?
rendszer? M inden esetben feltehetjük, hogy induláskor a fej a 20. cilinderen áll.
24. Hamupipőke és a herceg válófélben vannak. A közös tulajdonuk megosztása 29. Egy személyi számítógépeket árusító ügynök egy délnyugat-amszterdami
érdekében a következő algoritmusban állapodtak meg. Minden reggel mind­ egyetemen azt állította a term ékbem utatón, hogy cége jelentős erőfeszítéseket
egyikük egy levelet küld a másik ügyvédjének, amelyben egy dolgot kér a közös tett annak érdekében, hogy Unix-verziójuk nagyon gyors legyen. Példaképp
tulajdonból. Miután a levelek kézbesítése egy napot vesz igénybe, megállapod­ elmondta, hogy a lemezmeghajtó a liftes algoritmust használja, és szektor­
nak abban, hogy ha felfedezik, hogy mindketten ugyanazt a dolgot kérték, ak­ sorrendben sorba gyűjti az egy cilinderre érkező kéréseket. Egy hallgató,
kor a következő napon egy olyan levelet küldenek, amellyel visszamondják a Harry Hacker, akire az előadás nagy hatást gyakorolt, vett is egy ilyen gépet.
kérést. A tulajdonuk között található a kutyájuk, Woofer, Woofer kutyaólja, a Hazavitte, és írt egy program ot, amely 10 000 véletlenszerűen kiválasztott
kanárijuk, Tweeter és Tweeter kalitkája. Az állatok ragaszkodnak a házaikhoz, blokkot olvasott a lemezről. A legnagyobb m eglepetésére a m ért teljesítmény
így aztán megállapodtak abban, hogy az olyan megosztás, amely valamely álla­ azonos volt azzal, mint amit az elsőként érkezett, elsőként lesz kiszolgálva
tot elszakítaná házától, érvénytelen, és az egész megosztást teljesen elölről kell (FIFO ) algoritmustól vártunk volna. Hazudott-e az ügynök?
kezdeni. Mind Hamupipőke, mind a herceg kétségbeesetten akarja Woofert. 30. Egy Unix-processzus két részből áll: egy felhasználói és egy kernelrészből. A
így aztán nyaralni m entek (persze külön), és mindkét házastárs beprogramozott kernelrész mire hasonlít inkább: egy szubrutinra vagy egy korutinra?
egy személyi számítógépet a tárgyalás lefolytatására. Amikor visszaérkeztek a 31. Egy bizonyos számítógépóra-megszakítás kezelője 2 ms időt igényel (beleértve
vakációról, a számítógépek még mindig tárgyaltak. M iért? Lehetséges, hogy a taszkváltás idejét is) órajelenként. Az óra 60 Hz-es sebességgel működik. A
holtpont alakult ki? Lehet, hogy örökké fognak várni? Indokolja a válaszát. CPU-idő hány százalékát fordítják az óra kiszolgálására?
25. Tekintsünk egy lemezegységet, amelyen 1000 db 512 bájtos szektor található 32. A könyvben két példát is adtunk a felügyeleti időzítőkre: a hajlékonylemez
sávonként, 8 sáv cilinderenként, és 10 000 cilinder 10 ms körülfordulási idővel. m otorjának felpörgetésére és a nyom tatóterm inálok kocsi vissza kezelésére
A sávról sávra történő keresési idő 1 ms. Mi a maximálisan elérhető gyors írási használtuk ezeket. Adjon meg egy harm adik példát is.
sebesség? Mennyi ideig tarthat egy ilyen írás? 33. M iért kezelik az RS-232-es term inálokat megszakításokkal, míg a tárcímleké­
26. Egy lokális hálózatot a következőképpen használnak. A felhasználó rendszerhí­ pezéses term inálok nem megszakításvezéreltek?
vásokat ad ki ahhoz, hogy csomagokat íijon a hálózatra. Az operációs rendszer 34. Gondoljuk végig, hogyan működik egy terminál. A m eghajtó kiír egy karak­
átmásolja az adatokat a saját pufferébe. Ezután átmásolja az adatokat a háló­ tert, majd blokkolt állapotba kerül. Amikor a karakter m ár kiíródott, egy meg­
zati vezérlő kártyára. Amikor minden bájt biztonságosan megérkezett a vezér­ szakítás történik, és üzenetet kap a blokkolt meghajtó, amelynek hatására a
lő belsejébe, kiküldik őket a hálózatra 10 Mbit/s sebességgel. A fogadó hálózati következő karakter kerül kiírásra, majd ismét blokkolódik. Vajon jól m űkö­
vezérlő minden egyes bitet 1 (is-mal később tárol, mint azt elküldték. Amikor az dik-e ez a módszer 110 baudos vonalak esetén, ha az üzenetküldés, a karakter­
utolsó bit is megérkezett, a fogadó CPU egy megszakításkérést ad ki, majd az kiírás és a blokkolás ideje 4 ms? Mi a helyzet 4800 baudos vonalak esetén?
operációs rendszere átmásolja az újonnan érkezett csomagot a pufferébe, hogy 35. Egy bittérképes term inál 1200 x 800 képpontot tartalmaz. Egy ablak görge-
megvizsgálja. Amikor kiderítette, hogy a csomag melyik felhasználó számára ér­ téséhez a CPU-nak (vagy a vezérlőnek) a sor feljebb viteléhez az összes bitet
kezett, átmásolja az adott felhasználó területére. H a feltételezzük, hogy minden (amely az ablak része) át kell másolnia a videomemória egyik részéből a m á­
egyes megszakítás és a hozzá tartozó feldolgozás 1 ms, és hogy a csomagok 1024 sikba. Mennyi ideig tart annak az ablaknak a görgetése, amely 66 sor magas és
bájtosak (nem számítva a fejlécet), valamint hogy egy bájt másolása 1 jxs, mi a 80 karakter széles (5280 karakter összesen), ha m inden karakter 8 pixel széles
maximális sebesség, amellyel egyik processzus adatokat tud továbbítani a másik­ és 12 pixel magas, és egy bájt átmásolása 500 ns ideig tart? Mennyi a term inál­
nak? Tegyük fel, hogy a küldő blokkolt állapotba kerül, amíg a fogadó oldalon a hoz tartozó baudráta, ha m inden sor 80 karakteres? Egy karakter képernyőn
munka nem ér véget, és egy nyugtázás nem érkezik vissza. Az egyszerűség kedvé­ történő m egjelenítésének ideje 50 ^s. Számoljuk ki a baudrátát, ha ugyanez a
ért tegyük fel, hogy a nyugtázás visszaérkezésének ideje elhanyagolhatóan kicsi. term inál színes, 4 bit/pixeles felbontással. (Ekkor egy karakter képernyőn törté­
27. A 3.17. ábrán bem utatott üzenetform átum ot a blokkeszközök meghajtóinál nő megjelenítésének ideje 200 (xs.)
használjuk a kérés elküldésére. Lehet-e mezőket elhagyni karakteres eszkö­ 36. Miért gondoskodnak az operációs rendszerek olyan escape karakterekről,
zök esetében? Melyeket? mint a c t r l- V a M INIX-ben?
394 3. BEVITEL/KIVITEL

37. A c t r l - C (SIGINT) karakter érkezése után a M INIX-meghajtó törli az összes


term inálhoz tartozó kimenő sorban levő karaktert. M iért? 4. Memóriagazdálkodás
38. Sok RS-232-es term inálnak van olyan vezérlőszekvenciája, amely kitörli az
aktuális sort, és az alatta levő sorokat egy sorral feljebb mozgatja. Mit gondol,
hogyan van ez megvalósítva a terminálban?
39. Az eredeti IBM PC színes képernyőjénél a videó RAM -ba történő írás „hava­
zást” váltott ki (csúnya pöttyök jelentek meg az egész képernyőn), ha az írás
nem éppen a CRT sugárnyaláb vertikális visszatérésénél történt. A képernyő
képe 80 x 25 karakter, m inden egyes karakter 8 x 8 pixel méretű. Minden
egyes sor 640 pixele a sugárnyaláb egy horizontális letapogatásával rajzolódik
ki, amely 63,6 (is ideig tart, beleértve a horizontális visszafutási időt is. A kép­
ernyőt m ásodpercenként 60-szor rajzoljuk ki, amely megköveteli a sugárnya­
láb vertikális visszatérítését a képernyő tetejére. Az idő hányad részében áll
rendelkezésre a videó RAM, hogy beleírjanak? A memória fontos erőforrás, így gondosan kell vele bánni. Bár napjainkban az át­
40. írjon egy grafikus m eghajtót az IBM színes displayhez vagy más hasonló bit­ lagos otthoni számítógépek kétezerszer akkora memóriát tartalmaznak, mint a hat­
térképes megjelenítőhöz. A meghajtónak tartalm aznia kell parancsokat egye­ vanas évek kezdetének legnagyobb számítógépe, az IBM 7094, a programok mérete
di képpontok beállítására és törlésére, téglalapok képernyőn való mozgatására éppen olyan gyorsan nőtt, mint a memória. Parkinson törvényének paragrafusa sze­
és más olyan lehetőségekre, amelyeket érdekesnek tart. A felhasználói progra­ rint: „a programok és adataik mindig kitöltik a rendelkezésre álló memóriát.” Ebben
mok a meghajtóval úgy érintkezzenek, hogy megnyitják a Idev/graphics fájlt és a fejezetben bemutatjuk, hogyan kezelik az operációs rendszerek a memóriát.
erre írják a parancsaikat. Ideális esetben, amit m inden programozó szeretne, a m em ória végtelen nagy
41. M ódosítsa a M INIX hajlékonylemez-meghajtót úgy, hogy egysávos gyorsító­ és gyors, valamint nem felejtő, azaz áram szünet esetén is megőrzi tartalm át.
tárral rendelkezzen. Ezenkívül még azt is szeretnénk, ha olcsó lenne. Sajnos a technika nem képes
42. Valósítson meg egy olyan hajlékonylemez-meghajtót, amely inkább karakteres ilyen álmokat megvalósítani. így hát a legtöbb számítógép memóriája hierar­
eszközként, mint blokkeszközként működik, kikerülve a fájlrendszer gyorsító­ chikusan szerveződik az alábbi rétegekből: kicsi, nagyon gyors, drága és felejtő
tárát. Egy ilyen megoldással a felhasználók nagy adatterületeket olvashatnak gyorsítómemória; több száz megabájt, közepes sebességű és árú, felejtő központi
egyszerre a lemezről, amelyek DMA-val közvetlenül a felhasználói cím terület­ m emória (RAM ); valamint több tíz vagy néhány száz gigabájt, lassú, olcsó és nem
re vihetők, nagyban növelve így a hatékonyságot. Ezt a meghajtót főképp azok felejtő lemezes tároló. Az operációs rendszer feladata az, hogy megszervezze e
a program ok használhatnák, amelyeknek a fájlrendszertől függetlenül kell a memóriafajták használatát.
lemez bitjeit olvasni. A fájlrendszert ellenőrző program ok például ebbe a ka­ Az operációs rendszernek azt a részét, amely a hierarchikus m em ória kezelését
tegóriába tartoznak. végzi, memóriakezelőnek nevezzük. A feladata az, hogy nyilvántartsa mely m em ó­
43. Valósítsa meg a Unix PR O FIL rendszerhívását, amely hiányzik a MINIX-ből. riarészek szabadok vagy foglaltak, m em óriát foglaljon a processzusoknak, amikor
44. Módosítsa a term inálm eghajtót úgy, hogy az előző karakter törlésére szolgáló szükséges, illetve felszabadítsa, ha m ár nincs szükség rá, valamint vezérelje a cse­
speciális karakter mellett egy másik speciális karaktere is legyen az előző szó rét a központi memória és a lemez között, ha a központi tár túl kicsi a processzu­
törlésére. sok befogadásához. A legtöbb rendszerben (de a M INIX 3-ban nem) ezt a felada­
45. Egy új, cserélhető lemezes merevlemez típust adunk a MINIX 3-rendszerhez. tot a kernel látja el.
Az eszközt fel kell pörgetni, valahányszor a lemezt kicserélik, és a felpörgetés Ebben ’a fejezetben számos egyszerű vagy bonyolult memóriakezelő algoritmust
sokáig tart. A rra számíthatunk, hogy a rendszer futása alatt gyakran fogják cse­ vizsgálunk. A kezdetektől indulva először a legegyszerűbb m emóriakezelő rend­
rélgetni a lemezeket. Ezért az at_winic-ben levő waitfor rutin nem lesz megfele­ szert tárgyaljuk, majd fokozatosan haladunk az egyre bonyolultabbak felé.
lő. Tervezzen egy új waitfor rutint, amelyben ha a várt bitminta nem érkezik meg Am int m ár az első fejezetben is rám utattunk, a számítástechnika világában a
egy másodperces tevékeny várakozás után, akkor a rendszer olyan állapotba történelem megismétli önmagát: a miniszámítógépek szoftvere olyan volt, mint
kerül, amelyben a lemezmeghajtó egy másodpercig alszik, majd ismét teszteli a a mainframe gépeké, a személyi számítógépek szoftvere pedig a miniszámítógép
portot, majd ismét alszik egy másodpercig, egészen addig, amíg a keresett min­ szoftverére hasonlított. A folyamat most megismétlődik a kézi számítógépekkel,
ta nem érkezik meg, vagy amíg egy előre beállított TIM EOUT idő le nem telik. a PDA-kal és a beágyazott rendszerekkel. Ezekben a rendszerekben még mindig
egyszerű m emóriakezelő megoldásokat használnak. Ez az oka annak, hogy ezeket
a módszereket még érdem es tanulmányozni.
4. MEMÓRIAGAZDÁLKODÁS 4.1. ALAPVETŐ MEMÓRIAKEZELÉS 397
396

rendszerekben és miniszámítógépeken használták, ma m ár ritkán találkozunk ve­


4.1. Alapvető memóriakezelés le. A második modellt néhány kézi számítógép és beágyazott rendszer használja.
A memóriakezelő algoritmusokat két csoportra oszthatjuk: azok, amelyek a végre­ A harm adik modellel a korai személyi számítógépeknél találkozhatunk (például
hajtás közben mozgatják a processzusokat a központi tár és a lemez között (csere, M S-DOS-rendszerben); itt a rendszer ROM -ba égetett részét BlOS-nak (Basic
lapozás), és azok, amelyek nem. Az utóbbiak az egyszerűbbek, így először eze­ Input O utput System) nevezik.
ket tárgyaljuk. Ezután a cserét és a lapozást vizsgáljuk. A fejezet olvasása közben H a egy rendszer ilyen, akkor egy időben csak egy processzus futhat. Amint a
tartsuk észben, hogy a csere és a lapozás a m emória pótlására szolgál azért, hogy felhasználó begépeli a parancsot, az operációs rendszer betölti a kért program ot a
a rendszer egy időben az összes program ot futtatni tudja. Amennyiben valaha is lemezről, és végrehajtja. M iután a processzus befejeződik, az operációs rendszer
elérjük azt az állapotot, amikor a főmemória m érete elegendő lesz, abban az eset­ újabb parancsra várakozik. Am ikor megkapja a parancsot, betölti az új program ot
ben a különböző memóriakezelő megoldások közötti vita idejét m últtá válhat. a memóriába, felülírva az előzőt.
Más szemszögből vizsgálva, mint azt m ár említettük, úgy tűnik, hogy a szoftver
m érete legalább olyan gyorsan növekszik, mint a m emóriáé, így lehetséges, hogy
mindig szükség lesz hatékony memóriakezelő megoldásokra. Az 1980-as években 4.1.2. Multiprogramozás rögzített méretű partíciókkal
sok egyetemen m űködött időosztásos rendszer több tucat (többé-kevésbé elége­
dett) felhasználóval, mindössze 4 MB memóriával rendelkező VAX szerveren. A nagyon egyszerű beágyazott rendszereket kivéve, ma m ár ritkán találkozha­
Ma az egyfelhasználós Windows XP részére is legalább 128 MB m em óriát ajánl a tunk monoprogramozással. A legtöbb mai rendszer lehetővé teszi több procesz-
Microsoft. A multimédiás alkalmazások irányába m utató trend egyre több m em ó­ szus egy időben történő futtatását. Az időosztásos rendszerekben egyszerre több
riaigényt vetít előre, így nagy valószínűséggel a következő évtizedekben is szükség processzus tartózkodik a m emóriában, amikor az egyik egy I/O-művelet befeje­
lesz a hatékony memóriakezelő eljárásokra. zésére vár, addig egy másik processzus használhatja a központi egységet. így a
multiprogramozás növeli a CPU kihasználtságát. A hálózati szerverek mindig ren­
delkeznek több processzus (több kliens számára) egy időben történő futtatásához
szükséges képességekkel, manapság m ár a legtöbb kliensgép (például asztali szá­
4.1.1. Monoprogramozás csere és lapozás nélkül
mítógép) is rendelkezik ezzel a képességgel.
A legegyszerűbb memóriakezelési módszer az, hogy egy időben csak egy progra­
mot futtatunk, a m em óriát megosztva az operációs rendszer és a program között. Több
várakozási
E módszer három változata látható a 4.1. ábrán. A 4.1.(a) eset szerint az operá­ sor
ciós rendszer a m emória (RAM ) alacsony címein található, vagy a felső címeken
DO— 4-es szelet > 4-es szelet
a ROM -ban, amint a 4.1.(b) ábra mutatja. A 4.1.(c) esetben az eszközmeghajtók 700 K
a memória magas címein a R OM -ban találhatók, az operációs rendszer m aradék /
része az alacsony címeken a RAM-ban. Az első modellt régen a nagyszámítógépes
Egyetlen / .
3-as szelet 3-as szelet
várakozási sor / s'
OxFFF ...
Operációs Eszköz-
rendszer meghajtók
400 K
a ROM-ban a ROM-ban
Felhasználói
program
Felhasználói
program
□ — 2-es szelet
V 2-es szelet

Felhasználói 1-es szelet 1-es szelet


program DÓD—
Operációs 100 K
Operációs Operációs Operációs
rendszer rendszer rendszer rendszer
a RAM-ban a RAM-ban 0
0 0 (a) (b)
(a) (b) (c)
4.2. ábra. (a) Rögzített memóriaszeletek külön-külön várakozási sorral, (b) Rögzített
memóriaszeletek egyetlen várakozási sorral
4.1. ábra. A memória szervezésének három egyszerű módja operációs rendszer és egyetlen
felhasználói processzus esetén. Más lehetőségek is léteznek
398 4. MEMÓRIAGAZDÁLKODÁS 4.1. ALAPVETŐ MEMÓRIAKEZELÉS 399

A m ultiprogramozás megvalósításának legegyszerűbb módja az, hogy felosztjuk az operációs rendszer területén belül van. Ami nekünk kell, az a 100 K 4- 100-as
a m em óriát n (lehetőleg nem egyenlő m éretű) szeletre. Ezt a particionálást pél­ címre ugrás. H a a program a második partícióba töltődik, akkor a 200 K + 100-as
dául manuálisan elvégezhetjük a rendszerindításnál. címen levő eljárást kell végrehajtani, és így tovább. Ezt a problém át relokációs
Amikor egy munka beérkezik, a rendszer berakja annak a partíciónak a várako­ problém ának nevezzük.
zási sorába, amely a legkisebb azok közül, amelyekbe belefér a program. Mivel a Az egyik lehetséges megoldás az, hogy a program betöltésekor az operációs
partíciók m érete rögzített, amíg a munka fut, elvész a partíciónak az a része, amit rendszer módosítja az utasításokat. H a az első partícióba töltjük a programot, ak­
nem használ fel. A 4.2.(a) ábrán láthatjuk, hogy néz ki a fix partíciók rendszere kor 100 KB-ot, ha a másodikba, akkor 200 KB-ot kell m inden címhez hozzáadni.
partíciónként egy-egy külön várakozási sorral. Ahhoz, hogy a relokációt ilyen m ódon a betöltésnél hajtsuk végre, a szerkesztő­
Ennek a módszernek az a hátránya, hogy előfordulhat olyan eset, hogy a nagy nek bele kell raknia a program ba egy térképet, hogy a program ban mely szavak
partíció várakozási sora üres, de a kisebb partíciókra sok m unka várakozik, mint a relokálandó címek és melyek az utasításkódok, konstansok vagy egyéb nem
például a 4.2.(a) ábra 1. és 3. partíciója. Itt a kis munkának várnia kell a m em ó­ relokálandó elemek. Az OS/M FT m űködött ilyen módon.
riába kerülésre, annak ellenére, hogy sok üres m emória van. E módszer egyik le­ A betöltés alatti relokáció nem oldja meg a védelem kérdését. Egy rosszindula­
hetséges változata az, hogy csak egyetlen várakozási sor van, m int a 4.2.(b) ábra is tú program mindig konstruálhat új utasításokat, és rájuk adhatja a vezérlést. Mivel
m utatja. Amikor egy partíció kiürül, akkor az a munka töltődik be, amelyik bele­ ebben a rendszerben a program ok abszolút memóriacímeket használnak relatív
fér és a sorban a legelső. Mivel a nagy partíciókat nem érdem es kis munkákra p a­ címek helyett, nincs mód arra, hogy megakadályozzuk a program okat olyan uta­
zarolni, egy másik stratégia az, hogy az egész várakozási sorból kiválasztjuk a leg­ sítások létrehozásában és végrehajtásában, amelyek tetszőleges memóriacímet ol­
nagyobb munkát, amelyik belefér az üres partícióba. Megjegyzendő, hogy az utób­ vasnak vagy írnak. A többfelhasználós rendszerekben nagyon nem kívánatos, hogy
bi algoritmus hátrányosan különbözteti meg a kis munkákat, m int m éltatlanokat a program ok más felhasználóhoz tartozó m em óriát írjanak vagy olvassanak.
arra, hogy egy egész partíciót birtokoljanak, holott ezek a kis m unkák (gyakran in­ Az IBM által a 360-asban alkalmazott védelmi megoldás az, hogy 2 KB-os blok­
teraktív munkák) a legjobb kiszolgálást érdem elnék meg, nem a legrosszabbat. kokra osztják a memóriát, és m inden blokkhoz egy négybites védelmi kódot ren­
Az egyik megoldási mód, hogy legalább egy kis partíciónk legyen, ebben futhat­ delnek. A PSW (programállapotszó) tartalm az egy négybites kulcsot. A 360-as
nak a kis munkák, így nem kell egy nagy partíciót lefoglalni. hardverszinten elkap m inden kísérletet, amikor egy processzus egy olyan m em ó­
A másik megoldás az a szabály, hogy egyetlen munka sem mellőzhető A>nál riablokkot akar elérni, amelynek védelmi kódja különbözik a kulcstól. Mivel
többször a futásra kiválasztáskor. M inden olyan esetben, amikor nem a m unkát csak az operációs rendszer tudja megváltoztatni a védelmi kódokat és a kulcsot,
választottuk, az kap egy pontot. H a m ár k pontja van, akkor nem szabad elhanya­ a felhasználói processzusok védettek a többi processzustól és az operációs rend­
golni. szertől.
Ezt az operátor által reggel beállított, rögzített partíciókkal bíró rendszert sok A relokáció és a védelem együttes problém ájára alternatív megoldás az, hogy a
évig használták az OS/360-ban az IBM-nagygépeken. A neve M FT volt (M ulti­ gépnek két speciális regisztere van, a bázis- és a határregiszter. Amikor egy prog­
programozás fix számú feladattal, OS/MFT). Egyszerűen m egérthető és megvaló­ ram végrehajtódik, a bázisregiszterbe betöltődik a partíció kezdőcíme, a határ­
sítható: a bejövő m unkák egy sorban várakoznak, amíg a megfelelő partíció fel regiszterbe pedig a partíció hossza. M inden memóriacím autom atikusan gene­
nem szabadul, ezután a m unka betöltődik és lefut. Napjainkban azonban kevés rálódik a bázisregiszter és a hivatkozott memóriacím összeadásával. Például ha a
operációs rendszer - ha egyáltalán van ilyen - tám ogatja ezt a modellt (még a kö­ bázisregiszter értéke 100 K, egy CALL 100 utasítás valójában egy CALL 100 K
tegelt nagygépes rendszerekben sem). + 100 utasítás végrehajtását jelenti a program kód módosítása nélkül. A címeket
a határregiszterrel ellenőrzi a rendszer, hogy ne történhessen kísérlet a partíción
kívüli memóriacímek elérésére. A felhasználói program ok nem módosíthatják a
4.1.3. Relokáció és védelem bázis- és a határregiszter értékét.
A megoldás egy hátránya, hogy m inden egyes memóriahivatkozásnál szükség
A m ultiprogramozás két m egoldandó problém át vet fel: a relokáció és a védelem van egy összehasonlításra és egy összeadásra. Az összehasonlítás ugyan gyors, de
kérdését. M int a 4.2. ábrából is látszik, a különböző m unkák különböző címeken az összeadás speciális hardver nélkül lassú az átviendő terjedési ideje miatt.
futnak. Am ikor a program ot szerkesztik (azaz a főprogramot, az eljárásokat és a Ezt a modellt alkalmazta a világ első szuperszámítógépe, a CDC 6600. Az ere­
könyvtári függvényeket összerakják egyetlen címtérbe), a szerkesztőprogramnak deti IBM PC-ben használt Intel 8088-as processzor ennek a m odellnek a h atárre­
tudnia kell, hogy a program a m emória melyik címén fog kezdődni. giszter nélküli gyengébb változatával dolgozott. Ma m ár kevés számítógép hasz­
Példaként tegyük fel, hogy az első utasítás egy eljáráshívás a szerkesztő által ké­ nálja ezt a modellt.
szített bináris program 100-as címére. H a ez a program az első partícióba töltő­
dik be (a 100 K címre), akkor ez az utasítás a 100-as abszolút címre ugrik, amely
400 4. MEMÓRIAGAZDÁLKODÁS 4.2. CSERE 401

4.2. Csere Amikor a csere sok lyukat hoz létre a memóriában, a processzusok m ozgatásá­
val ezeket egy nagy lyukká lehetne összeolvasztani. Ezt a technikát memóriatömö-
A kötegelt feldolgozású rendszereknél a m em ória rögzített m éretű partíciókra rítésnek nevezik. Nagy processzorigénye miatt általában nem használják. Például
osztása egyszerű és hatékony módszer. M inden munka betöltődik a megfelelő egy 1 GB-os gépen, amely 2 GB/s (0,5 ns/bájt) sebességgel tud másolni, 0,5 m á­
partícióba, amikor a sor elejére kerül, aztán a befejeződéséig a memóriában m a­ sodpercig tart az egész m em ória tömörítése. Ez nem tűnik túl soknak, de zavaró
rad. Amíg a m unkák elegendő mem óriát és processzoridőt kapnak, nincs ok bo­ lehet egy videót néző felhasználónak.
nyolultabb modell alkalmazására. Amikor az operációs rendszer létrehoz vagy behoz egy processzust, döntést kell
Más a helyzet az időosztásos vagy a grafikus felületű rendszereknél. Gyakran hoznia, hogy mennyi m em óriát foglaljon le számára. H a a processzust egy rögzí­
nincs elég memória az összes aktív processzus befogadásához, így a felesleges pro­ tett m érettel hozza létre, és ez a m éret nem változik, akkor egyszerű a dolog, az
cesszusokat a lemezen kell tartani, és dinamikusan kell betölteni futtatásra. operációs rendszernek pontosan ennyi m em óriát kell lefoglalnia, se többet, se ke­
A m emóriakezelésnek két általános, (részben) az adott hardvertől függő meg­ vesebbet.
közelítése van. Az egyszerűbb stratégia a csere (swapping), a processzusokat tel­ Azonban problém a adódik, ha a processzus adatszegmense növekszik, például
jes egészükben mozgatja a m em ória és a lemez között. A másik stratégia neve dinamikusan foglal mem óriát, mint sok programnyelvben. H a a processzus mel­
virtuális memória; ez akkor is engedi a program okat futni, ha csak egy részük van lett egy lyuk van a memóriában, akkor ezt lefoglalhatja és hozzáadhatja a pro­
a központi m emóriában. Először a cserét, majd a 4.3. alfejezetben a virtuális m e­ cesszus m em óriaterületéhez. H a a processzus mellett egy másik processzus van a
m óriát vizsgáljuk. m emóriában, akkor az operációs rendszer elmozgathatja a növekvő processzust
A cserélő rendszerek működése a 4.3. ábrán látható. Kezdetben csak az ,4 pro­ egy nagyobb lyukba, vagy egy esetleg több processzust kirakhat a lemezre, hogy
cesszus van a m emóriában, ezután behozzuk a lemezről a fi és a C processzust. elegendő helyet csináljon. H a a processzus m ár nem tud tovább nőni a m em óriá­
A 4.3.(d) ábrában az^4 processzust kitettük a lemezre, ezután bejön a D, és a fi-t ban, és a lemezen kijelölt rész is tele van, akkor a processzusnak várnia kell vagy
kivisszük a lemezre, végül A ismét bejön. M iveM most más helyen van, az általa le kell állnia.
tartalm azott címeket relokálni kell vagy a szoftver által, amikor betöltődik, vagy a Ha várható, hogy a legtöbb processzus növekszik futás közben, akkor jó ötlet­
hardver által (ez a valószínűbb) a program futása közben. nek látszik egy külön m emóriarészt foglalni, amikor egy processzust behozunk
A rögzített partíciójú rendszerek (lásd 4.2. ábra) és a változó particiójú rend­ vagy áthelyezünk, hogy csökkentsük a mozgatások számát. Amikor egy procesz-
szerek között (lásd 4.3. ábra) az a fő különbség, hogy az utóbbiban a partíciók szust kiviszünk a lemezre, akkor elég csak a ténylegesen használt mem óriaterüle-
száma, helye és m érete dinamikusan változik, ahogy a processzusokat mozgatjuk
a központi m em ória és a lemez között. A változó particiójú rendszerekben rejlő
B verem
rugalmasság jobb memóriakihasználtságot eredményez, de bonyolultabbá teszi a Hely a növekedéshez
lefoglalást és felszabadítást. | Hely a növekedéshez

Badat

Éilli
Idő — Éppen használt
B program
V///////A W //M ,

IS I C c C C C
Hely a növekedéshez
A verem
| Hely a növekedéshez

A
B

A
B

A
ÉÉP Ilii illil
B B

D D
E

D
Operációs
Éppen használt
A adat

A program

Operációs
Operációs Operációs Operációs Operációs Operációs Operációs Operációs rendszer rendszer
rendszer rendszer rendszer rendszer rendszer rendszer rendszer
(a) (b) (c) (d) (e) (f) (g) (a) (b)

4.3. ábra. A memória változása a processzusok indulásakor és leállásánál. A vonalkázott terület 4.4. ábra. (a) Növekvő adatszegmens számára lefoglalt memóriaterület, (b) Növekvő adat- és
a szabad memóriátjelzi veremszegmens számára lefoglalt memóriaterület
402 4. m e m ó r ia g a z d A l k o d á s 4.2. CSERE 403

tét kimásolni, az extram em óriát felesleges. A 4.4.(a) ábrán látható egy m em ória­ de jelentős mennyiségű m em ória megy veszendőbe a processzusok utolsó egységé­
kép, amelyben két processzus van, mindegyikhez a növekedéshez foglalt egy-egy ből, ha a processzusok m érete nem pontos többszöröse az allokációs egységnek.
külön extra memóriarész. A bittérkép a memóriakezelés egyszerű módja rögzített mennyiségű memória
H a a processzusnak két növekvő szegmense van, például az adatszegmens adminisztrációra való felhasználásával, m ert a bittérkép m érete csak a memória és
(heap) a dinamikusan létrehozott és megszüntetett változóknak, és a veremszeg­ az allokációs egység m éretétől függ. A fő problém a az, ha egy k m éretű procesz-
mens a lokális változóknak és a visszatérési címeknek, akkor egy jó megoldás szust akarunk a m em óriába rakni, akkor a m emóriakezelőnek k darab egybefüggő
látható a 4.4.(b) ábrán. M inden processzusnak van egy veremszegmense, amely 0 bitet kell keresnie a térképen. A térképen egy adott hosszúságú sorozat keresése
a processzusnak lefoglalt m em ória tetejétől lefelé terjeszkedik, és egy adatszeg­ lassú művelet, m ert a keresett átnyúlhat a szóhatárokon. Ez egy ellenérv a bittér­
mense, amely a program kód után következik, és felfelé növekszik. A két szegmens képes módszerrel szemben.
között levő m emória egyszerre m indkettőhöz tartozik. H a túlcsordul, akkor a pro­
cesszust egy nagyobb lyukba kell áthelyezni, vagy ki kell vinni a lemezre, vagy le
kell állítani. 4.2.2. Memóriakezelés láncolt listákkal

A memóriakezelés másik m ódja az, hogy láncolt listába fűzzük a szabad és a fog­
4.2.1. Memóriakezelés bittérképpel lalt szegmenseket; itt szegmens alatt egyaránt értjük a processzusokat és a lyuka­
kat két processzus között. A 4.5.(a) ábrán látható memóriarészlet láncolt listás
Amikor dinamikusan foglalunk mem óriát, akkor azt az operációs rendszernek ke­ reprezentációját a 4.5.(c) ábra mutatja. A listának minden eleme a hozzá tartozó
zelnie kell. Két módszer van a mem óriahasználat nyilvántartására: a bittérkép és a lyuk (H ) vagy processzus (P) kezdőcímét, hosszát és a következő listaelem címét
szabadlista. Ebben és a következő alfejezetben ezt a két m ódszert tárgyaljuk. tartalmazza.
A bittérképes módszernél a m emória néhány szónyi vagy kilobájtnyi allokációs Ebben a példában a szegmensek listája kezdőcím szerint rendezett. Ennek a
egységekre osztott. M inden allokációs egységhez tartozik egy bit a bittérképen, sorrendnek az az előnye, hogy ha egy processzus befejeződött vagy kitettük a le­
ami 0, ha az egység szabad, és 1, ha foglalt (esetleg fordítva). A 4.5. ábra a m em ó­ mezre, akkor a lista egyszerűen karbantartható. Egy befejeződött processzusnak
ria egy részletét és a hozzá tartozó bittérképet mutatja. normális esetben két szomszédja van (kivéve, ha a m emória elején vagy végén ta­
Az allokációs egység m érete fontos tervezési szempont. H a az egység kicsi, lálható); ezek egyaránt lehetnek processzusok által foglalt területek vagy lyukak;
akkor a bittérkép nagy. H a az egység 4 bájt, akkor 32 bitnyi memóriához egy bit a négy lehetőség a 4.6. ábrán látható. Az (a) esetben az eddig foglalt processzuste­
szükséges a térképen, 32n bit m em ória n bitet használ a térképből, így a memória rületet egy lyukkal helyettesítjük, a (b) és a (c) esetben két listaelemet egyesítünk
1/33-ad része lesz a térkép. H a az allokációs egység nagy, akkor a bittérkép kicsi, egyetlen lyukká (a lista egy elemmel rövidebb lesz), a (d) esetben pedig három
elemből készítünk egy lyukat, és a lista két elemmel lesz rövidebb. Mivel a pro­
cesszustábla bejegyzése m agára a befejeződött processzus listaelem ére mutat, a
listát célszerű kétszeresen láncolni. így könnyebb ellenőrizni, hogy a keletkezett
lyuk összeolvasztható-e valamelyik szomszédjával.
Kezdőcím szerint rendezett listában számos algoritmus használatos a memó­
ria lefoglalására az új (vagy a lemezről éppen behozott) processzusok számára.
Feltesszük, hogy a memóriakezelő tudja, hogy mennyi mem óriát kell lefoglalni.

X befejeződése előtt X befejeződése után

(a) A X B A B
m

18-as pozíción
(b) A X * A
(b) (c)
kezdődik (c) X B //////////// B
m
4.5. ábra. (a) A memória egy részlete öt processzussal és három lyukkal. A beosztások a foglalási (d) X m f, 'w m m m
egységeket mutatják. A vonalkázott terület (a bittérképen 0) szabad, (b) A megfelelő
bittérkép, (c) Ugyanezek az adatok listában ábrázolva 4.6. ábra. A befejeződő Xprocesszus négy szomszédsági kombinációja
404 4. MEMÓRIAGAZDÁLKODÁS 4.3. VIRTUÁLIS MEMÓRIA 405

A legegyszerűbb algoritmus a first fit. A processzuskezelő addig keres a szegmen­ rint rendezett listát használó algoritmusnak, miszerint költséges ellenőrizni, hogy
sek listájában, amíg meg nem találja az első megfelelő m éretű lyukat. Ezt a lyukat egy felszabadult szegmenst a szomszédokkal össze tudjuk-e vonni. H a nem m űkö­
két részre vágja, az egyik lesz a processzusé, a másik megmarad szabadnak, kivé­ dik a lyukak összevonása, akkor a memória sok kis lyukra darabolódik fel, am e­
ve azt a statisztikailag valószínűtlen esetet, amikor a lyuk pontosan akkora, mint a lyekbe nem férnek bele a processzusok.
processzus. A first fit a leggyorsabb algoritmus, m ert a lehető legkevesebbet keres.
A first fit egy változata a next fit. A first fithez hasonlóan működik, kivéve azt,
hogy megjegyzi, hol találta az előző megfelelő lyukat, innen indul a következő ke­
resés, nem pedig a lista elejétől, mint a first fitnél. Bays (Bays, 1977) szimulációi 4.3. Virtuális memória
megm utatták, hogy a next fit valamivel rosszabb teljesítményű, mint a first fit.
Egy másik jól ismert algoritmus a bestfit. A best fit az egész listát végigkeresi, M ár sok évvel ezelőtt felm erült az a probléma, hogy a program ok túl nagyok vol­
és a legkisebb alkalmas lyukat adja meg. Ahelyett, hogy megállna egy nagy lyuk­ tak, és nem fértek bele a rendelkezésre álló memóriába. Gyakran alkalmazott
nál, amire később szükség lehet, a best fit megpróbál a szükségeshez közelebbi megoldás volt a program rétegekre darabolása, az overlays. Először a 0-s sorszá­
m éretű lyukat keresni. mú réteg kezd futni, amikor befejeződik, akkor hívja a következő réteget. Néhány
Példaként a first fit és a best fit algoritmusokra tekintsük újból a 4.5. ábrát. H a bonyolultabb rendszer megengedi, hogy egyidejűleg több réteg is a memóriában
egy 2 m éretű blokk szükséges, akkor ezt a first fit az 5-ös címen foglalja le, a best legyen. Az operációs rendszer a rétegeket a lemezen tartja, és szükség szerint cse­
fit pedig a 18-as címen. rélgeti a m em ória és a lemez között.
A best fit lassabb, mint a first fit, m ert m inden alkalommal átnézi az egész listát. Bár a program futása alatt a rétegek mozgatása a lemez és a m emória között az
Valamelyest meglepő, hogy a first fitnél és a next fitnél több m em óriát veszteget el, operációs rendszer feladata, a döntést, hogy miként darabolja rétegekre a prog­
ugyanis hajlamos arra, hogy kicsi, használhatatlan lyukakat csináljon a m em óriá­ ramot, a program ozónak kell meghoznia. Egy nagy program kis részekre bontása
ban. A first fit átlagban nagyobb lyukakat produkál. időrabló és unalmas munka. Nem tarto tt sokáig, amíg valaki kitalálta, hogyan le­
A kis lyukak m éretét vizsgálva jó ötletnek tűnik a worst fit algoritmus, amely a hetne az egész m unkát az operációs rendszerre bízni.
legnagyobb lyukat választja ki, így a szabadon m aradt lyukdarab elég nagy ahhoz, Az erre kifejlesztett módszert virtuális memóriának nevezik (Fotheringham,
hogy használható legyen. A szimulációk azonban megm utatták, hogy a worst fit 1961). A virtuális m em ória lényege, hogy a program, az adat és a verem együttes
nem olyan jó, mint a többi eljárás. m érete m eghaladhatja a fizikai m em ória mennyiségét. Az operációs rendszer csak
Mind a négy algoritmus felgyorsítható, ha a processzusok és a lyukak számára a program éppen használt részét tartja a m emóriában, a többi a lemezen van. Pél­
különálló listákat készítünk. Ilyenkor a lyukak, és nem a processzusok vizsgálatá­ dául egy 256 MB-os m em óriában is futhat egy 512 MB-os program, ha az operá­
nak szentelhetünk m inden energiát. Ennek az árát a m em ória lefoglalásánál és ciós rendszer mindig a megfelelő 256 MB-os részét tartja bent a memóriában.
felszabadításánál fizetjük meg, m ert a felszabadult szegmens helyét be kell illesz­ A virtuális memória a m ultiprogramozást tám ogató rendszereknél is működik,
teni a helyére a lyukak listájába, és el kell távolítani a processzuslistából. ekkor több program darabjai vannak a m emóriában. H a egy program nem fut­
H a külön processzus- és lyuklistát használunk, akkor a lyukak listáját a m éret hat, m ert saját darabjának behozatalára, vagyis I/O-műveletre várakozik, akkor
szerint is rendezhetjük, így a best fit gyorsabb lesz. H a a best fit a legkisebb lyuktól ugyanúgy, mint más multiprogramozást tám ogató rendszereknél, a CPU egy m á­
a legnagyobb felé haladva keres, akkor az első megfelelő m éretű lyuk jó lesz, ezért sik program nak adható.
nem szükséges tovább keresni. H a a lyuklista m éret szerint rendezett, akkor a first
fit és a best fit egyformák, a next fit pedig értelmetlen.
H a különálló listákat alkalmazunk, akkor lehetőség nyílik egy kis javításra. A 4.3.1. Lapozás
külön felépített lyuklista [lásd 4.5.(c) ábra] helyett használhatjuk magukat a lyu­
kakat listaelemként. Minden lyuk első szava a lyuk m érete, a második pedig a kö­ A virtuális m emóriát használó rendszerekben leggyakrabban a lapozás technikáját
vetkező listaelemre mutat. így nincs szükség a külön listára és a foglaltságot jelző alkalmazzák. Minden számítógépen van egy memóriacímhalmaz, amelyet a prog­
bitre. ramok elő tudnak állítani. Amikor a program egy olyan utasítást hajt végre, mint a
A következő algoritmus a quick fit, amely a leggyakrabban kért m éretekhez
külön lyuklistákat épít. Például egy n elemű táblázatban az első elem m utathat a MOV REG,1000
4 KB-os, a második a 8 KB-os, a harmadik pedig a 12 KB-os lyukak listájára, és
így tovább. Egy 21 KB-os lyukat egyaránt berakhatunk a 20 KB-os listába vagy a akkor az a REG-regiszterbe másolja az 1000-es m emóriarekesz tartalm át (vagy a
páratlan m éretű lyukak külön listájába. A quick fit nagyon gyorsan megtalálja a géptől függően fordítva). A címek indexeléssel, bázis- vagy szegmensregiszterből,
megfelelő m éretű lyukat, de megvan ugyanaz a hátránya, mint a többi m éret sze­ esetleg egyéb m ódon generálódhatnak.
406 4. MEMÓRIAGAZDÁLKODÁS 4.3. VIRTUÁLIS MEMÓRIA 407

A CPU elküldi az Virtuális címtér


MMU-nak a virtuális címet 60 K-64K X

56 K-60K X } Virtuális lap


52 K-56K X
48 K-52K X
44 K-48K 7 .
40 K-44K X
36 K-40K 5 - \ Fizikai
32 K-36K X \ \ memóriacím
28 K-32 K X 28 K-32 K
\
Az MMU a fizikai címet 24 K-28K X \y 24 K-28 K
küldi a memóriának
20 K-24K 3 v A 20 K-24 K
16K-20K 4 16K-20K
4.7. ábra. Az MMU helye és szerepe. Itt az MMU a CPU részeként van ábrázolva, mivel
12K-16K 0
/xT 12K-16K
napjainkban ez az általános. Logikailag azonban különálló integrált áramkör is X
lehetne, mint ahogy az az elmúlt években volt 8K-12K 6 8K-12K
4K-8K 1 4K-8K
Ezeket a program által generált címeket virtuális címeknek, ezek halmazát pe­ 0K-4K 2 / X }y0 K-4 K
dig virtuális címtartománynak nevezik. Egy virtuális memória nélküli gépben a
Lapkeret
virtuális címek közvetlenül a memóriasínre kerülnek, és a fizikai m emóriából a
címmel megegyező memóriaszót olvassák vagy írják. H a virtuális m em óriát hasz­
nálunk, akkor a virtuális címek nem kerülnek közvetlenül a memóriasínre, ehe­ 4.8. ábra. A laptábla által megadott kapcsolat a virtuális és a fizikai címek között
lyett a m emóriakezelő egységbe - MMU (Memory Management Unit) - kerülnek,
amely a virtuális címeket képezi le a fizikai címekre (lásd 4.7. ábra). Hasonlóan a
A 4.8. ábra erre a leképezésre m utat egy egyszerű példát. Példánkban a számító­
gép 16 bites címeket tud generálni 0-tól 64 KB-ig. Ezek a virtuális címek. A gépnek MOVE REG,8192
azonban csak 32 KB fizikai memóriája van, így bár írhatunk 64 KB-os programot,
azt nem lehet egészben betölteni a m emóriába és futtatni. A program teljes egé­ utasítás a
szében a lemezen van, és csak azok a részek töltődnek be, amelyekre szükség van.
A virtuális cím teret lapnak (page) nevezett egységekre osztják, ennek megfele­ MOVE REG,24576
lő egység a fizikai memóriában a lapkeret. A lapok és a lapkeretek mindig pontosan
egyforma méretűek. Ebben a példában ez 4 KB, a létező rendszerekben a lapméret alakra transzformálódik, m ert a 8192-es virtuális cím a 2-es lapra esik, ez a lap a
512 bájt és 1 MB közé esik. 64 KB-os virtuális címtér és 32 KB fizikai memória 6-os lapkeretbe esik (24576-28671-es fizikai címek). Harm adik példa a 20500-as
esetén 16 virtuális lap és 8 lapkeret van. A m emória és a lemez közötti átvitel la­ virtuális cím, ez 20 bájtra van az 5-ös lap kezdetétől, így a 12288 + 20 = 12308-as
ponként történik. fizikai címre képződik le.
Amikor például a program Egyedül az M M U leképezése azonban nem oldja meg azt a problémát, hogy a
virtuális címtér nagyobb, mint a fizikai memória. Mivel csak nyolc fizikai lapkeret
MOVE REG,0 van, az M M U a 4.8. ábrán csak nyolc lapot képez le a fizikai memóriára. A nem
leképezhető lapokat kereszt jelzi az ábrán. A hardverben egy jelenlét/hiány bit kö­
utasítással a 0-s címet éri el, akkor az MM U megkapja a 0-s virtuális címet. Ez a veti nyomon, hogy mely lapok vannak jelenleg fizikailag jelen a memóriában.
virtuális cím a 0-s lapra esik (0-4095), az a lap a 2-es lapkeretben (8192-12287) Mi történik, ha a program egy olyan lapra hivatkozik, ami nincs a fizikai m em ó­
található. így az M M U a kapott virtuális címet a 8192-es fizikai címre képezi le, riában? Például a
és ezt a címet küldi ki a memóriasínre. A memória semmit sem tud az MMU-ról,
csak megkapja és teljesíti a 8192-es cím írására vagy olvasására vonatkozó kérést. MOVE REG,32780
Ehhez hasonlóan az M M U a 0 és 4095 közti virtuális címeket a 8192 és 12287 kö­
zötti fizikai címtartományra képezi le.
408 4. MEMÓRIAGAZDÁLKODAS 4.3. VIRTUÁLIS MEMÓRIA 409

utasítás a 8-as virtuális lap 12. bájtjára hivatkozik. Az M M U észleli, hogy a lap offsetre vágja szét. A 4 bites lapszámokkal a 16 lapot, a 12 bites offsetekkel pedig
nincs a m emóriában, és egy laphiba megszakítással jelez az operációs rendszer­ egy lapon belül mind a 4096 címet reprezentálhatjuk.
nek. Az operációs rendszer vesz egy lapkeretet, a tartalm át kiírja a lemezre, be­ A lapszámot a laptábla indexeként használjuk, amely az adott virtuális laphoz
hozza ide a hivatkozott lapot a lemezről, módosítja a laptérképet, majd a megsza­ tartozó lapkeretet m utatja meg. H a a jelenlét/hiány bit 0, akkor megszakítást okoz
kítást okozó utasítástól folytatja a program végrehajtását. az operációs rendszer felé. H a a bit 1, akkor a lapkeret számát a kimeneti regiszter
Például ha az operációs rendszer az 1-es lapkeret kidobása mellett dönt, akkor felső három bitjébe másolja, a többi 12 bit a bejövő cím offset-része lesz. Ez a 15
a 8-as virtuális lapot a 4096-os fizikai címre tölti be, és két helyen megváltoztatja bit együtt a fizikai cím, ezt küldi a memóriasínre a fizikai m em ória címzéséhez.
a laptáblát. Elsőként az 1-es virtuális lapot meg kell jelölni, hogy nincs bent a m e­
móriában, így elkap m inden 4-8 KB közötti virtuális címre történő hivatkozást.
Ezután a laptáblában a 8-as virtuális lapnál levő keresztet egy 1-esre cseréli, így 4.3.2. Laptáblák
a megszakítást okozó utasítást újra végrehajtva a 32780-as virtuális cím a 4108-as
fizikai címre képződik le. A legegyszerűbb esetben a virtuális címek fizikai címekre történő leképezése úgy
Most vizsgáljuk meg, hogyan működik az M MU, és hogy m iért használhatunk történik, ahogyan az előbb leírtuk. A virtuális címeket szétvágjuk virtuális lap­
kettőhatvány m éretű lapokat. A 4.9. ábrán láthatjuk, hogyan képezi le az M M U a számra (felső bitek) és offset-részre (alsó bitek). Például egy 16 bites címmel és
8196-os (binárisan 0010000000000100) virtuális címet a 4.8. ábra laptérképe alap­ 4 KB-os lapm érettel a felső 4 bit jelezhetné a lehetséges 16 lap egyikét, míg az
ján. Az M M U a bejövő 16 bites virtuális címet egy 4 bites lapszámra és egy 12 bites alsó 12 bit tartalm azná a címet (0-4095) a kiválasztott lapon belül. Más elosztás,
például 3 vagy 5 bit felhasználása a lapra szintén lehetséges. A különböző vágások
különböző m éretű lapokat eredményeznek.
Kimenő fizikai A lapsorszámot a laptábla indexeként használjuk, hogy megtaláljuk a lap be­
1 1 0 0 0 0 0 0 0 1 0 0
O
O
O

cím (24580) jegyzését, amelyben a lapkeret száma található, ha a lap a m em óriában van. A vir­
tuális címben a lapsorszámot a lapkeret számára cseréljük, és az így kapott fizikai
15 000 0
címet küldjük a memóriához.
14 000 0 A laptábla célja az, hogy a virtuális lapokat lapkeretekre képezzük le. M atem a­
13 000 0 tikai értelem ben a laptábla egy függvény, ahol a virtuális lapszám az argumentum,
12 000 0 a lapkeret száma pedig az eredmény. E nnek a függvénynek az eredm ényét helyet­
11 111 1 tesítjük a virtuális címben a lapszám helyére, és így kapjuk a fizikai címet.
10 000 0 Az egyszerű leírás ellenére két fő problémával kell szembenéznünk:
9 101 1
A 12 bites eltolás
Lap­ 8 000 0 1. A laptábla nagyon nagy lehet.
közvetlenül
tábla " 7 000 0 másolódik 2. A leképezésnek gyorsnak kell lennie.
6 000 0 a bemenetről
5 011 1 a kimenetre
Az első pont abból következik, hogy a m odern számítógépek legalább 32 bites
4 100 1 virtuális címeket használnak. Például 4 KB-os lapm éretnél a 32 bites címtér több
3 000 1
mint egymillió lapból áll, a 64 bites cím tér pedig ennél is jóval több lapot tartal­
2 110 1 110
maz. Egymillió laphoz egymillió bejegyzés kell a laptáblában. Ne felejtsük el azt
1 001 1
. Jelenlét/ sem, hogy minden processzushoz egy saját laptábla tartozik, mivel saját virtuális
0 010 1 hiány bit
cím tere van.
A virtuális lap számát A gyorsaság azért szükséges, m ert a leképezést minden egyes memóriahivatko­
(2) a laptábla indexeként zásnál végre kell hajtani. Egy tipikus utasításnak utasításszava és gyakran memó-
használjuk
riaoperandusa is van, így utasításonként egy, kettő vagy több memóriahivatkozás
Bejövő virtuális történik. H a egy utasítás végrehajtása mondjuk 1 ns, akkor a leképezést 250 ps
0 0 1 0 0 0 0 0 0 0 1 0 0
o
o
o

cím (8196)
alatt el kell végezni, m ert különben a leképezés szűk keresztmetszet lesz.
A gyors lapleképezés fontos szempont a számítógépek tervezésénél. Bár ez a
problém a a csúcsgépeknél, amelyeknek nagyon gyorsaknak kell lenniük, a leg­
4.9. ábra. Az M M U belső működése 76 darab 4 KB-os lap esetén fontosabb, a kisgépeknél is számít, ahol fontos az ár/teljesítmény arány. Ebben
410 4. MEMÓRIAGAZDÁLKODÁS 4.3. VIRTUÁLIS MEMÓRIA 411

és a következő alfejezetben megvizsgáljuk a jelenlegi számítógépekben lapozásra Második szintű


laptáblák
használt hardvermegoldásokat.
A legegyszerűbb ötlet az, mint a 4.9. ábrán is látható, hogy legyen egy gyors
hardverregiszterekből álló tömb, a lap sorszáma szerint indexelve. Amikor egy
processzus elindul, a rendszer betölti a memóriából a processzus laptábláját a re­
A felső
giszterekbe. Ennek a megoldásnak az az előnye, hogy a leképezés alatt nem kell a 4 MB
memóriához nyúlni, m ert a laptábla a regiszterekben van. A hátránya az ára (kü­ memória
lönösen ha a laptábla nagy). Továbbá m inden processzusváltásnál a laptábla re­ laptáblája

giszterekbe töltése a teljesítményt is csökkenti.


A másik véglet, amikor a laptábla teljes egészében a központi m emóriában van,
és egy regiszter m utat a laptábla elejére. Ilyenkor csak egy regiszter értékét kell
átírni processzusváltásnál. Természetesen hátrány, hogy m inden utasításnál egy
vagy több memóriahivatkozás kell a laptábla eléréséhez. Ezen okok miatt ezeket
a megoldásokat ritkán használják tiszta formában. A következőkben néhány na­
gyobb teljesítményű változatot tanulmányozunk.
Bitszám 10 10 12
PT1 PT2 Offset
Többszintű laptáblák
(a)
Ahelyett, hogy egy nagy laptáblát állandóan a mem óriában tároljunk, sok rend­
szerben többszintű laptáblát alkalmaznak. Egy egyszerű példa látható a 4.10.
ábrán, a 32 bites virtuális címeket egy 10 bites PT1, egy 10 bites PT2 mezőre és
egy 12 bites offset-re osztjuk. Mivel az offset 12 bites, a lapméret 4 KB, és összesen 1023
220 darab virtuális lap van.
A többszintű laptáblás módszer titka az, hogy nem tart bent m inden laptáblát
egyszerre a memóriában, főként azokat nem, amelyekre nincs éppen szükség. Pél­ A lapokra
dául egy 12 MB-os program esetén az első 4 MB a programkód, a második az adat, mutat
a felső 4 MB a verem, ilyenkor a verem alja és az adatok vége között egy nagy ki­
használatlan lyuk van.
A 4.10.(b) ábrán láthatjuk, hogyan működik a példában a kétszintű laptábla.
A bal oldalon van a felső szintű laptábla a PT1 mezőhöz tartozó 1024 darab be­
jegyzéssel. Az 1024 bejegyzés mindegyike 4 M B-ot reprezentál a teljes 4 GB-os
(azaz 32 bites) virtuális címtérből. Amikor az M M U egy virtuális címet kap, akkor (b)
először a PT1 mezőjét veszi, majd ezt a felső szintű laptábla indexeként használja.
A kapott bejegyzés egy második szintű laptábla lapkeretére m utat. A felső szintű 4.10. ábra. (a) Egy 32 bites cím két laptáblamezővel. (b) Kétszintű laptábla
laptábla 0-s bejegyzése a programkód, az 1-es az adat, az 1023-as a verem laptáb­
lájára m utat. A többi bejegyzést nem használjuk. A PT2 mező a kiválasztott m á­ címek). Ez a bejegyzés tartalmazza a lapkeret számát, amiben a 0x00403004-es vir­
sodik szintű laptábla indexelésére szolgál, az itt talált bejegyzés m ár a lapot tartal­ tuális cím lapja van. H a ez a lap nincs a memóriában, a laptáblabejegyzés jelenlét/
mazó lapkeret számát adja meg. hiány bitjének nulla értéke jelzi a laphibát. H a a lap a memóriában van, akkor a
Példaként tekintsük a 0x00403004-es (decimálisán 4206596) virtuális címet; ez második szintű tábla lapkeretszáma és az offset (4) kombinációjából megkapjuk a
az adatszegmens 12292-es bájtja. Ennél a virtuális címnél a PT1 = 1, a PT2 = 3 és fizikai címet. Ezt a címet küldjük aztán a memóriasínre.
az offset = 4. Az M M U először a PT1 alapján a felső szintű laptábla 1-es bejegyzését Bár a 4.10. ábrán a cím tér több mint egymillió lapot tartalm az, csak négy laptáb­
kapja; ehhez a 4-8 MB-ig terjedő címek tartoznak. Ezután a P72-vel indexelve a m á­ lára van szükség: a felső szintű laptáblára, valamint a 0-4 MB-hoz, a 4-8 MB-hoz
sodik szintű laptáblában megkapjuk a 3-as bejegyzést, amelyhez a 12288-16383-as és a felső 4 M B-hoz tartozó második szintű laptáblákra. A felső szintű laptábla
címek tartoznak a 4 MB-os szeleten belül (azaz a 4206592-4210687-es abszolút fennm aradó 1021 bejegyzésének jelenlét/hiány bitje 0, hogy az esetleges hivatko­
412 4. MEMÓRIAGAZDÁLKODÁS 4.3. VIRTUÁLIS MEMÓRIA 413

záskor laphibát okozzon. Ebben az esetben az operációs rendszer észreveszi, hogy bit fontos szerepet játszik számos, a fejezetben később ism ertetendő lapcserélési
a processzus egy olyan címre hivatkozott, amely nem hozzá tartozik, és egy szig­ algoritmusnál.
nált küld a processzusnak, vagy leállítja azt. Példánkban a különféle m éretekre Végül az utolsó bit a gyorsítótár használatát tiltja le a lapra. Ez olyan lapoknál
kerek számokat választottunk, és a PT1 és PT2 egyforma, de a gyakorlatban ter­ hasznos, amelyek eszközregisztereket tartalm aznat. H a az operációs rendszer egy
mészetesen más értékek is használhatók. ciklusban egy I/O-eszköz válaszára várakozik, akkor fontos, hogy az adatot mindig
A 4.10. ábrán látható kétszintű lap tábla bővíthető három-, négy- vagy többszin­ az eszköztől vegye a gép, és ne a gyorsítótárban levő régi értéket használja. Ezzel
tűre is. Több szint nagyobb hajlékonyságot jelent, de kérdéses, hogy két szint fe­ a bittel a gyorsítótárazás letiltható. Azoknál a gépeknél, amelyeknek m emóriába
lett megéri-e a nagyobb bonyolultság miatt. ágyazott I/O helyett külön I/O-területük van, nincs szükség erre a bitre.
Megjegyzendő, hogy a lemezeim, ahol a lap van, amikor nincs a memóriában,
nem része a laptáblának. E nnek az oka az, hogy a laptábla csak a virtuális címről
A laptáblabejegyzés struktúrája fizikai címre való leképezéshez szükséges információkat tárolja. A laphibák keze­
léséhez szükséges adatok az operációs rendszeren belül egy szoftvertáblában van­
Most pedig a laptáblák egésze helyett vizsgáljuk meg a tábla egyetlen bejegyzé­ nak. A hardvernek nincs szüksége rá.
sét! A bejegyzés pontos szerkezete erősen gépfüggő, de minden gépen nagyjá­
ból ugyanazokat az információkat tárolják. Egy példát láthatunk a 4.11. ábrán.
A bejegyzés m érete gépenként változik, de általában 32 bites. A legfontosabb 4.3.3. TLB - címfordítási gyorsítótár
információ a lapkeretszám, az algoritmus célja ennek az értéknek az előállítása.
A következő adat a jelenlét/hiány bit. H a ez a bit 1, akkor a lap bent van a m em ó­ A legtöbb lapozási modellnél a laptáblák nagy m éretük miatt a mem óriában van­
riában az előbb megadott lapkeretben, ha 0, akkor a lap nincs a memóriában, és nak. Ez a tervezés nagy hatással van a teljesítményre. Például vizsgáljunk egy uta­
a lapkeretszám nem tartalm az értékes adatot. Egy olyan bejegyzés elérése, amely­ sítást, amely egy regisztert egy másikba másol. Lapozás nélkül ez az utasítás csak
nek ez a bitje 0, laphibát okoz. egy memóriahivatkozást okoz, amikor az utasításkódot beolvassuk. Lapozásnál
A védelmi bitek adják meg, hogy milyen elérés m egengedett. A legegyszerűbb a laptábla kezeléséhez további memóriahivatkozások szükségesek. A végrehaj­
esetben ez a mező csak egy bitet tartalm az, amely írható-olvasható lap esetén 0, tás sebességét általában az határozza meg, hogy a központi egység milyen gyor­
csak olvasható lapra pedig 1. Bonyolultabb esetben három független bit van, egy san kapja az utasításokat és az adatokat a memóriából, két laptábla-hivatkozás
az olvasás, egy az írás és egy a végrehajtás engedélyezésére m inden egyes lapra egy memóriahivatkozás mellett 2/3-ával csökkenti a teljesítményt. Ilyen feltételek
külön-külön. m ellett senki sem használná ezt a módszert.
A módosítás és a hivatkozás bit a lap használatát követi nyomon. Amikor a lapra A számítógép-tervezők éveket gondolkodtak ezen, és rájöttek a megoldásra.
írnak, akkor a hardver autom atikusan beállítja a módosítás bitet. A bit értéke ak­ A megoldás azon az észrevételen alapszik, hogy a program ok legtöbb hivatkozása a
kor számít, amikor az operációs rendszer visszaveszi a lapkeretet. H a a lap m ódo­ lapok egy kis részhalmazára történik, így az ezekhez tartozó laptáblabejegyzéseket
sított (dirty, azaz piszkos), akkor vissza kell írni a lemezre, egyébként pedig nem gyakran, a többit ritkábban használjuk. Ez a hivatkozáslokalitás egyik példája; ez­
(a lap clean, azaz tiszta), m ert ilyenkor a lemezen levő m ásolat érvényes. Ezt a bi­ zel a koncepcióval még foglalkozunk a későbbiekben.
tet gyakran dirty bitnek hívják, m ert a lap állapotát adja meg. A megoldás az, hogy egy kis hardvereszközzel szerelték fel a gépeket, amely a
A hivatkozás bit a lap hivatkozásakor (olvasásnál és írásnál egyaránt) 1 lesz. Ez laptábla megkerülésével képezi le a logikai címeket a fizikai címekre. Az eszközt
az érték az operációs rendszert segíti annak eldöntésében, hogy laphibánál melyik
lapot dobja ki. A nem használt lapot célszerűbb kidobni, mint a használtak. Ez a Érvényes Virtuális lap Módosított Védelmi kód Lapkeret
1 140 1 RW 31
Gyorsítótár 1 20 0 RX 38
letiltása Módosított Jelenlét/hiány 130 1 RW 29
1
1 129 1 RW 62
1 19 0 RX 50
1 21 0 RX 45
1 860 1 RW 14
1 861 1 RW 75

4.11. ábra. Egy jellegzetes laptáblabejegyzés 4.12. ábra. Egy TLB a lapozás felgyorsítására
414 4. MEMÓRIAGAZDÁLKODÁS 4.3. VIRTUÁLIS MEMÓRIA 415

TLB-nek (Translation Lookaside Buffer - cím fordítási gyorsítótár) vagy asszo­ szerűbb MMU, amely által hely szabadul fel a CPU-lapkán a gyorsítótárnak vagy
ciatív mem óriának hívják. A TLB az M M U-ban található és néhány bejegyzést egyéb teljesítménynövelő dolognak. A szoftveres TLB-kezelést Uhlig és mások
tartalmaz, a 4.12. ábrán például 8-at, de ritkán többet 64-nél. Mindegyik bejegyzés (Uhlig et al., 1994) alaposan tárgyalják.
egy lap adatait tartalmazza: a virtuális lapszám, a módosítási bit, a védelmi kód Számos stratégiát dolgoztak ki a szoftveres TLB-kezelés teljesítményének javí­
(olvasási/írási/futtatási jogok) és a valós lapkeret száma, ahol a lap van. Ezek a tására. Bala és mások (Bala et al., 1994) megközelítése egyaránt csökkenti a TLB-
mezők a laptáblabeli bejegyzés mezőinek felelnek meg. Egy további bit jelzi, hogy hibák számát és a hiba kezelésének költségét. A TLB-hibák elkerüléséhez az ope­
a bejegyzés érvényes (azaz használatban van), vagy nem. rációs rendszer kiszámíthatja, hogy a következőkben mely lapok használata a leg­
A 4.12. ábrán látható TLB-t például egy olyan processzus generálhatta, amely valószínűbb, és az ezekhez tartozó bejegyzéseket előre betöltheti a TLB-be. Pél­
egy 19 ,2 0 ,21-es virtuális lapon levő ciklust futtat, m ert ezek a lapok a védelmi kód dául ha egy kliensprocesszus egy távoli eljáráshívást végez egy ugyanazon a gépen
szerint olvashatók és végrehajthatók. Az adatok (mondjuk egy feldolgozott tömb) futó szerverprocesszushoz, akkor valószínű, hogy a szervernek nem sokára futnia
a 129-es és a 130-as lapon vannak, a 140-es lap tartalm azza a tömbszámításnál kell. Ezt tudván, amikor a rendszer a távoli eljáráshívást dolgozza fel a küldéshez,
használt indexeket. Végül a verem a 860-as és a 861-es lapon van. akkor megkeresheti, hogy hol a szerver kódja, adata és verme, és betöltheti ezen
Vizsgáljuk meg, hogyan működik a TLB. Amikor az M M U egy virtuális címet lapok bejegyzéseit a TLB-be.
kap, akkor először megvizsgálja, hogy a lap száma benne van-e a TLB-ben. A vizs­ A TLB-hibák kezelésének hardveres és szoftveres esetben egyaránt az a m ód­
gálat minden bejegyzésre egyidejűleg (párhuzamosan) zajlik. H a m egtalálta a la­ ja, hogy a laptáblából indexeléssel kiválasztjuk a hivatkozott lapot. A szoftveres
pot, és az elérés nem sérti a védelmi kódot, akkor a lapkeret számát közvetlenül a kezelésnél az a probléma, hogy a laptáblát tartalm azó lap indexe nem biztos,
TLB-ből veszi, nem kell a laptáblához fordulni. H a a lap száma benne van a TLB- hogy a TLB-ben van, így ez újabb TLB-hibát okozhat a feldolgozás alatt. Ezeket
ben, de az utasítás egy olyan lapra próbál írni, amely csak olvasható, akkor ugyan­ a hibákat kiküszöbölhetjük egy nagy (például 4 KB-os vagy nagyobb) szoftveres
úgy védelmi hiba generálódik, m intha a laptáblát használtuk volna. gyorsítótár használatával, amely TLB-bejegyzéseket tartalmaz, és lapja mindig a
Érdekes, hogy mi történik akkor, ha a virtuális lapszám nincs a TLB-ben. Ilyen­ TLB-ben van. H a először ezt a gyorsítótárat ellenőrzi, akkor az operációs rendszer
kor az M M U a laptáblához fordul, majd kidob egy bejegyzést a TLB-ből, és az ép­ jelentősen csökkenteni tudja a TLB-hibák számát.
pen hivatkozott lap adataival helyettesíti. H a erre a lapra újra szükség lesz, akkor
megtalálja a TLB-ben. H a egy bejegyzést kidobunk a TLB-ből, akkor a módosítás
bitjét vissza kell másolni a m emóriában levő laptáblabejegyzésbe. A többi érték 4.3.4. Invertált laptáblák
ugyanolyan. H a a laptáblából töltünk egy bejegyzést a TLB-be, akkor m inden m e­
zőt a m emóriából kell venni. A hagyományos laptábla egy tömb, amelyben minden laphoz pontosan egy be­
jegyzés tartozik, és a virtuális lapszámmal indexelhető. H a a cím tér 23Zbájtos és a
lapm éret 4 KB, akkor több m int egymillió laptáblabejegyzés szükséges. Egy ilyen
Szoftveres TLB-kezelés laptábla minimum 4 M B-ot foglal el. Nagyobb rendszerekben ez a m éret valószí­
nűleg elfogadható.
Mostanáig feltettük, hogy m inden lapozásos virtuális memóriájú gépnek hardve­ Azonban a 64 bites számítógépek elterjedésével drasztikusan megváltozik a
res laptáblája cs TLB-je van. A TLB vezérlése és hibáinak kezelése teljes egészé­ helyzet. H a a címtér 264 bites, 4 KB-os lapm éretnél több mint 1052 bejegyzést tar­
ben az M M U dolga. Az operációs rendszer csak akkor kap megszakítást, ha a lap talmazó táblára van szükségünk. Amennyiben minden bejegyzés 8 bájtos, a tábla
nincs a memóriában. több mint 30 millió gigabájtos. Nem lehetséges most sem, és valószínűleg a követ­
A múltban helytálltak ezek a feltételezések, azonban a m odern RISC-gépeknél, kező évtizedekben sem lesz az, hogy csak a laptáblának több m int harmincmillió
mint a SPARC MIPS, Alpha, H P PA és PowerPC, m ajdnem a teljes lapkezelés gigabájt legyen legfoglalva. Ezért valami más megoldást kell találni a 64 bites vir­
szoftveres. Ezeknél a gépeknél a TLB-bejegyzéseket is az operációs rendszer tölti tuális címtér lapozásához.
fel. H a egy keresett lap nincs a TLB-ben, akkor a laptáblához fordulás helyett egy Az egyik megoldás az invertált laptábla módszere. Ennél a valós tár minden lap­
TLB-hiba generálódik, és az operációs rendszer kapja meg a vezérlést. Az operá­ keretéhez tartozik egy bejegyzés ahelyett, hogy a virtuális cím tér minden lapjához
ciós rendszernek kell megkeresnie a lapot, kivennie egy bejegyzést a TLB-ből és lenne egy. Például 64 bites virtuális címtér, 4 KB-os lapm éret és 256 MB RAM
beraknia az újat, majd a laphibát okozó utasítástól újra kell indítania a procesz- esetén az invertált laptábla csak 65 536 bejegyzést tartalmaz. Egy bejegyzés azt tar­
szust. Ezt term észetesen nagyon kevés utasítással kell megtennie, m ert TLB-hiba talmazza, hogy az adott lapkeretet melyik processzus melyik lapja használja.
sokkal gyakrabban fordul elő, m int laphiba. Bár az invertált laptábla sok helyet takarít meg, van egy nagy hátránya: nehe­
H a a TLB elég nagy ahhoz (mondjuk 64 bejegyzés), hogy csökkentse a hiba­ zebb a virtuálisról fizikaira történő címfordítás. Amikor az n processzus a p lapra
arányt, akkor a szoftveres TLB-kezelés elég hatékony lesz. A fő nyereség az egy­ hivatkozik, a rendszer nem találja meg a fizikai lapot a laptábla p-vel való indexe-
416 4. MEMÓRIAGAZDÁLKODÁS 4.4. LAPCSERÉLÉSI ALGORITMUSOK 417

Hagyományos 4.4. Lapcserélési algoritmusok


laptábla mind
a 252laphoz egy Amikor laphiba keletkezik, akkor az operációs rendszernek ki kell választania egy
bejegyzéssel
lapot, amelyet kidob a memóriából, hogy helyet csináljon a behozandó lapnak. H a
2 52-1
a kidobandó lapot módosították, akkor a tartalm át vissza kell írni a lemezre. H a a
lapot nem m ódosították (például a lap program kódot tartalm az), akkor a lemezen
A 256 MB fizikai
memóriának 216 lévő példány ugyanolyan, így nincs szükség visszaírásra. A behozott lap egysze­
4 KB oldalkerete van Tördelőtábla rűen csak felülírja a kidobott lapot a lapkeretben.
2'6-1 2'6-1 Bár a kidobandó lapot véletlenszerűen is ki lehetne választani, a rendszer telje­
sítménye sokkal jobb lesz, ha egy ritkán használt lapot dobunk ki. H a egy gyakran
~i----1 használt lapot távolítunk el, akkor valószínű, hogy rövidesen vissza kell hozni, és
ez extraterhelést okoz. A lapcserélési algoritmusokkal több elméleti és gyakorlati
0 T~~~l
m unka foglalkozik, a következőkben a legfontosabb algoritmusokból m utatunk be
Virtuális lap A virtuális lapon T ~ \
néhányat.
szerint tördelővel Virtuális Lap­
indexelve indexelve lap keret Érdemes megjegyezni, hogy a „lapcsere”-probléma a számítógép-tervezés más
területein is felmerül. A legtöbb számítógép rendelkezik egy vagy több memória­
4.13. ábra. A tradicionális és az invertált laptábla összehasonlítása gyorsítótárral, amelyek a legutoljára használt 32 vagy 64 bájtos memóriablokkokat
tartalmazzák. Amikor egy gyorsítótár megtelik, néhány blokkot el kell távolítani be­
lésével. Ehelyett az invertált laptáblában meg kell keresni az (n ,p ) pároshoz tarto­ lőle. Ez a probléma ugyanaz, mint a lapcsere, a különbség csak a rövidebb időskála
zó bejegyzést. Sőt ezt a keresést minden hivatkozáskor meg kell csinálni, nemcsak (néhány nanoszekundum és nem néhány milliszekundum alatt kell végrehajtani).
laphiba esetén. Egy 64 KB-os táblázatban való keresés m inden memóriahivatko­ A rövidebb időskála magyarázata egyszerű: a hiányzó gyorsítótárblokkot a memó­
zásnál nem teszi a számítógépet villámgyorssá. riában keresik, ennek viszont nincs keresési ideje és nincs rotációs késleltetése.
A kiutat ebből a helyzetből a TLB használata jelenti. H a a TLB az összes gyak­ Egy másik példa a webböngészőben található. A böngésző eltárolja a merevle­
ran használt lapot tartalmazza, akkor a címfordítás éppen olyan gyors, mint a ren­ mezen lévő gyorsítótárában az előzőleg látogatott weboldalakat. Mivel a gyorsí­
des laptábla alkalmazásával. TLB-hiba esetén azonban az invertált laptáblában tótár m érete gyakran előre m eghatározott, így amennyiben a felhasználó sokat
szoftveresen kell keresni. Ezt a keresést például egy virtuális címek kivonatait tar­ használja a böngészőt, a gyorsítótár nagy valószínűséggel betelik. Amikor egy
talmazó hasító- (hash) tábla alkalmazásával valósíthatjuk meg. Az olyan virtuális weboldalt be kell tölteni, a böngésző ellenőrzi, hogy az adott oldal megvan-e a
lapokból, amelyek a m em óriában vannak és a kivonatuk azonos, egy-egy láncolt gyorsítótárban, illetve ha megvan, akkor frissebb-e az aktuális oldal, mint az eltá­
listát képezünk (lásd 4.13. ábra). Amennyiben a kivonattáblának annyi helye van, rolt. Amennyiben az oldal nincs a gyorsítótárban, vagy újabb, mint a gyorsítótár­
amennyi fizikai lapja a gépnek, az átlagos lánchossz egy lesz, nagyban gyorsítva a ban lévő, a böngésző letölti. Amennyiben újabb, akkor lecseréli vele a régi verziót
leképezést. Amikor a lapkeret számát megtaláltuk, az új párt (fizikai, virtuális) be­ a gyorsítótárban. H a a gyorsítótár betelik, dönteni kell arról, hogy melyik webol­
szúrhatjuk a TLB-táblába, és a hibás műveletet újraindíthatjuk. dalt törölje ki. A megfontolás hasonló, mint a virtuális m emória esetében, azzal a
Jelenleg az IBM-, Sun- és a Hewlett-Packard-munkaállomásokon használnak lényeges különbséggel, hogy itt a gyorsítótárban lévő lapokat nem írják, és ezek a
invertált laptáblát, de a 64 bites rendszerekkel az invertált laptábla is terjed. Az szerverre sem másolják vissza őket. A virtuális m em óriarendszerben a gyorsítótár­
invertált táblák létfontosságúak ezeken a gépeken. Egyéb megoldások nagymé­ ban lévő lapok lehetnek tiszták vagy piszkosak.
retű virtuális m em ória kezelésére lásd (Huck és Hays, 1993; Talluri és Hill, 1994;
Talluri et al., 1995). További információ a virtuális memóriával kapcsolatos hard­
verkérdésekről (Jacob és Mudge, 1998) művében található. 4.4.1. Az optimális lapcserélési algoritmus

A legjobb lapcserélési algoritmust egyszerű leírni, de lehetetlen megvalósítani. Az


algoritmus a következőképpen működik: laphiba esetén a m em óriában van a la­
poknak egy részhalmaza. Ezek közül a lapok közül egyre hivatkozunk a következő
utasításban (ez a lap tartalmazza az utasítást). A többi lapra esetleg csak tíz, száz
vagy ezer utasítás múlva lesz szükség. Minden lap megcímkézhető azzal a szám­
mal, ahány utasítás végrehajtódik, mielőtt először hivatkozunk rá.
418 4. MEMÓRIAGAZDÁLKODÁS 4.4. LAPCSERÉLÉSI ALGORITMUSOK 419

Az optimális lapcserélési algoritmus szerint a legnagyobb számmal jelzett lapot m inden lapjának mindkét bitjét nullára állítja. Időnként (például m inden órameg­
kell eltávolítani. H a egy lapra nem hivatkozunk a következő 8 millió, egy másikra szakításnál) nullázzuk az R bitjét, így megkülönböztetjük azokat a lapokat, am e­
pedig a következő 6 millió utasításban, akkor az előbbit eltávolítva a következő lyekre az utóbbi időben nem volt hivatkozás.
laphiba időpontját későbbre tolhatjuk ki. A számítógépek, akárcsak az emberek, Laphiba esetén az operációs rendszer az R és M bitek alapján négy csoportba
megpróbálják a kellemetlen eseményeket minél későbbre halasztani. osztja a lapokat:
Az egyetlen problém a ezzel az algoritmussal az, hogy nem lehet megvalósítani.
Egy laphiba pillanatában az operációs rendszer nem tudja, hogy a következőkben 0. osztály: nem hivatkozott, nem módosított;
milyen lapokra történik hivatkozás. (Korábban egy hasonló helyzetet láttunk az 1. osztály: nem hivatkozott, módosított;
SJF ütem ező algoritmusnál - honnan tudja a rendszer, hogy melyik a legrövidebb 2. osztály: hivatkozott, nem módosított;
munka?) A program szimulátoron való első futtatásával nyomon követhetjük a 3. osztály: hivatkozott, módosított.
hivatkozásokat, így a második futtatásnál az így kapott hivatkozási adatok alapján
m ár m űködhet az optimális algoritmus. Első pillantásra az 1. osztály lehetetlennek tűnik, de mégis előfordulhat, ha a
Ezen a m ódon összehasonlítható az optimális értékkel a megvalósítható 3. osztály valamely elem ének R bitje nullázódik az óramegszakítás során. Az óra­
algoritmusok teljesítménye. H a egy operációs rendszer például csak 1%-kal rosz- megszakítás nem nullázhatja le az M bitet, m ert ezt a információt használjuk fel
szabb az optimálisnál, akkor a jobb algoritmus keresése legfeljebb 1%-os javulást annak eldöntésére, hogy a lap tartalm át vissza kell-e írni a lemezre. R törlése
eredményezhet. M törlése nélkül, 1-es osztályú lapot eredményez.
A további zűrzavar elkerülése érdekében világossá kell tenni, hogy a laphivat­ NRU (Nőt Recently Used - nem m ostanában használt) algoritmus véletlensze­
kozásoknak ez a naplózása csak az éppen vizsgált program ról és csak egy specifi­ rűen kiválaszt egy lapot a legkisebb sorszámú nemüres osztályból, és ezt a lapot
kus esetről ad információt, az ebből szárm aztatott lapcserélési algoritmusok csak dobja ki a memóriából. Az algoritmus azon a felismerésen alapszik, hogy jobb egy
erre a program ra és az adott esetben bevitt adatokra lesznek jók. Bár ez a m ód­ olyan m ódosított lapot kidobni, amelyet azt utolsó óraütem ben (általában húsz
szer jó a lapcserélési algoritmusok kiértékelésére, a gyakorlatban létező rendsze­ ezred másodperc) nem használtak, mint egy tiszta lapot, amelyet gyakran hasz­
reknél nem használják. Az alábbiakban olyan algoritmusokkal foglalkozunk, am e­ nálnak. Az N R U algoritmus fő vonzereje az egyszerűség, a közepesen hatékony
lyek a valódi rendszerekben is használhatók. implementálhatóság és az, hogy gyakran megfelelő, bár nem optimális a kapott
teljesítmény.

4.4.2. Az NRU lapcserélési algoritmus


4.4.3. A FIFO lapcserélési algoritmus
Abból a célból, hogy az operációs rendszer hasznos statisztikákat készíthessen a
lapok használatáról, a virtuális memóriával rendelkező számítógépek többségében Egy másik egyszerű algoritmus a FIFO (First-In, First-O ut - elsőként be, elsőként
m inden laphoz két állapotbit tartozik. Az R bit minden hivatkozáskor (olvasás­ ki). Hogy megértsük, hogyan működik ez az algoritmus, képzeljünk el egy boltot,
kor és íráskor egyaránt) 1-re állítódik. Az M bit íráskor (azaz módosításnál) lesz ahol pontosan k term ék tárolására elegendő polc van. Egy nap egy cég bevezet egy
1. Ezek a bitek a 4.11. ábrán látható m ódon a laptáblabejegyzésben találhatók. új term éket. Mivel az új term ék gyorsan sikeres lett, a boltnak meg kell szabadul­
Ezeket a biteket minden memóriahivatkozásnál karban kell tartani, ezért lényeges, nia egyik régi term ékétől, hogy az újnak legyen helye.
hogy ezeket a beállításokat a hardver végezze el. H a egy bit egyszer egyesre vált, Az egyik lehetőség, hogy megkeresik azt a term éket, amelyet a legrégebben
akkor az is marad, amíg az operációs rendszer szoftveresen át nem állítja nullára. raktároznak (például 120 éve kezdték árulni), és ettől szabadulnak meg. A bolt­
H a a hardvernek nincsenek ilyen bitjei, akkor ezt a következőképpen szimulál­ nak egy láncolt listát kell kezelnie, az új terméket a lista végére teszik, és a lista ele­
hatjuk szoftveresen. H a egy processzus elindul, akkor minden laptáblabejegyzését jéről dobják el a régit.
megjelöljük, hogy nincs bent a memóriában. Am int egy lapra hivatkozunk, laphi­ Ezt az ötletet lapcserélési algoritmusként is használhatjuk. Az operációs rend­
ba lép fel. Az operációs rendszer beállítja az R bitet, és megváltoztatja a laptábla szer egy listába fűzi a mem óriában levő lapokat, a lista elején van a legrégebbi
bejegyzését, hogy az adott lapra mutasson C SAK OLVASHATÓ módban, majd a lap, a legutoljára beérkezett lap a lista végén található. Laphiba esetén az első
hibát okozó utasítástól újraindítja a processzust. H a később a lapra írunk, akkor lapot dobja ki, és a lista végére fűzi az új lapot. A bolti példánál maradva a FIFO
még egy laphiba lép fel, erre az operációs rendszer beállítja az M bitet, és átváltja kidobhatja a bajuszkenőcsöt, de ugyanúgy kidobhatja a lisztet, a sót és a vajat is.
a lap módját ÍRHATÓ-OLVASHATÓ-m. Számítógépeknél is előfordul ilyen probléma, em iatt a FIFO -t tiszta formájában
Az R és az M bitet a következő egyszerű lapcserélési algoritmusban hasz­ ritkán alkalmazzák.
nálhatjuk fel: amikor egy processzus elindul, az operációs rendszer a processzus
420 4. MEMÓRIAGAZDÁLKODÁS
4.4. LAPCSERÉLÉSI ALGORITMUSOK 421

4.4.4. A második lehetőség lapcserélési algoritmus


□ 0 0
A FIFO egyszerű módosítása a gyakran használt lapok kidobásának elkerülésére
az, hogy megvizsgáljuk a legrégebbi lap R bitjét. H a ez a bit nulla, akkor a lap régi
és nem használt, így eldobható. H a ez a bit egyes értékű, akkor töröljük a bitet, és 0 0 Amikor laphiba történik, akkor a mutatónál
a lapot a lista végére tesszük, a betöltési idejét pedig úgy módosítjuk, m intha most levő lapot vizsgáljuk.
jött volna be a memóriába. Ezután folytatjuk a keresést.
Ezt az algoritmust második lehetőségnek (second chance) hívják, egy példa a 0 Döntésünk az R bit értékétől függ:
R = 0: Kidobjuk a lapot
R = 1: Nullázzuk az R bitet, és a következő
4.14. ábrán látható. A 4.14.(a) ábrán az A - H lapokat látjuk egy láncolt listában ab­ lapra lépünk
ban a sorrendben, ahogy a m em óriába kerültek.
0 0
Az elsőként
betöltött lap \ o 3 7 8 12 14 15 18 A legutoljára 0 0
líH IH IH IH iH íH IH ír bKÖI“ 'ap
4.15. ábra. Az óra lapcserélési algoritmus
(a)

3 7 8 12 14 15 18 20 Azd-túgy Amikor laphiba történik, akkor a m utatónál levő lapot vizsgáljuk. H a az R bitje
E H IH IH IH IH IH IH ír S Sm ln'
betöltött lapot
nulla, akkor ezt a lapot kidobjuk, a helyére rakjuk az újat, és eggyel továbbléptet­
jük a m utatót. H a az R bit egy, akkor nullázzuk a bitet, és eggyel továbbléptetjük
(b) a m utatót. A keresés addig megy, amíg egy olyan lapot nem találunk, amelynek
R bitje nulla. Ezt óra (clock) lapcserélési algoritmusnak hívják, és csak az imple­
4.14. ábra. A második lehetőség működése, (a) A lapok FIFO sorrendben rendezettek.
m entációjában, nem a kiválasztott lapban különbözik a második algoritmustól.
(b) A laplista, ha a 20. időegységben laphiba történt, és az A lap R bitje I.
A lapok fölötti számok a betöltési időpontjukat mutatják

4.4.6. Az LRU lapcserélési algoritmus


Tegyük fel, hogy a 20. időegységben egy laphiba történt. A legrégebbi lap az^4,
amely a processzus indulásakor, a nullás időpontban került be a memóriába. H a Az optimális algoritmus egyik jó közelítése azon a megfigyelésen alapszik, hogy az
az A lap R bitje nulla, akkor ki lehet dobni a memóriából, az M bit értékétől füg­ utolsó néhány utasításnál gyakran használt lapokra valószínűleg újra szükség lesz
gően esetleg vissza kell írni a lemezre. Másrészt, ha az R bit 1, akkor a lapot a lista a következő néhány utasításban. Hasonlóan, a régen nem használt lapokat való­
végére kell tenni, R bitjét törölni, és betöltési idejét az aktuális időpontra (20) vál­ színűleg ezután sem használják. Ez az ötlet a következő algoritmust adja: amikor
toztatni. A kidobandó lap keresése a B lapnál folytatódik. laphiba történik, akkor a legrégebben nem használt lapot dobjuk ki. Ezt a straté­
Az algoritmus egy olyan régi lapot keres, amelyre nem volt hivatkozás az utol­ giát LRU (Least Recently Used - legrégebben használt) lapcserélésnek nevezik.
só időintervallumban. H a m inden lapra hivatkoztak, akkor úgy működik, mint Az LR U ugyan elméletileg megvalósítható, de nem túl olcsón. Az LR U imple­
a FIFO. Például képzeljük el, hogy a 4.14.(a) ábrán látható lapok R bitje mind mentálásához a mem óriában levő lapokból egy láncolt listát kell készíteni, a lista
egyes. Az operációs rendszer egyenként átrakja a lista végére a lapokat, és nullára elején van a legutoljára használt lap, a végén pedig a legrégebben használt lap.
állítja a biteket. Amikor visszaér az A laphoz, a lap R bitje m ár nulla, így az A lapot A nehézség az, hogy a listát m inden memóriahivatkozásnál karban kell tartani.
dobja ki, ezért az algoritmus mindig befejeződik. Megkeresni a lapot a listában, kivenni és a lista elejére fűzni még hardveresen is
nagyon időigényes művelet (feltéve, ha építhetünk ilyen hardvert).
Az LR U speciális hardverrel történő im plementálásának több más módja is
4.4.5. Az óra lapcserélési algoritmus van. Először nézzük a legegyszerűbb eljárást. Szükség van egy 64 bites számlálóra
(c), amely m inden memóriahivatkozásnál autom atikusan eggyel nő. Továbbá min­
Bár a második lehetőség egy ésszerű algoritmus, kevésbé hatékony, m ert állan­ den laptáblabejegyzésben kell lennie egy mezőnek, amely ezt a számlálóértéket
dóan mozgatja a lapokat körbe-körbe a listában. Hatékonyabb megoldás, ha a la­ tárolja. M inden memóriahivatkozás után a C aktuális értéke beíródik a hivatko­
pokat egy órához hasonló körkörös listában tároljuk, ahogy az a 4.15. ábrán látha­ zott lap bejegyzésébe. Laphiba esetén az operációs rendszer megkeresi a legki­
tó. A m utató mindig a legrégebbi lapra mutat. sebb számlálóértékkel rendelkező lapot; ez lesz a legrégebben használt lap.
4. MEMÓRIAGAZDÁLKODÁS 4.4. LAPCSERÉLÉSI ALGORITMUSOK 423
422

Lap Lap Lap Lap Lap Az NFU-val az a fő probléma, hogy nem felejt el semmit. Például egy többm e­
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 netes fordítóprogram esetén az első m enetben gyakran használt lapok a többi m e­
1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 netben is nagy számlálóértékkel rendelkeznek. H a az első m enet hosszabb, mint a
0 1
többi, akkor a kódját tartalm azó lapoknak mindig nagyobb lesz a számlálója, mint
0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0
a többi m enet lapjainak. így hát az operációs rendszer a hasznos lapokat fogja el­
0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 távolítani azon lapok helyett, amelyekre m ár nincs szükség.
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 Szerencsére az N FU kis módosítással jól szimulálja az LRU-t. A módosítás két
részből áll. Először is a számlálót egy bittel jobbra toljuk, m ielőtt az R -et hozzáad­
(a) (b) (c ) (d) (e)
nánk. M ásrészt az .R-et nem a jobb oldali, hanem a bal oldali bithez adjuk hozzá.
A 4.17. ábra mutatja, hogyan működik az öregítő (aging) néven ismert, m ódo­
0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 sított algoritmus. Tegyük fel, hogy az első időegység végén a 0-5-ös lapok R bitje
1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 rendre 1, 0, 1, 0, 1 és 1. Más szóval az első időegységben a 0, 2, 4 és 5-ös lapokra
1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 hivatkoztunk, így R bitjük egyes lett, a többié nulla maradt. A hat számláló eltolá­
0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 sa és i?-rel való növelése után a 4.17.(a) ábrán látható állapotot kapjuk. A további
1 0 0 0
négy oszlop a következő négy időegység után m utatja a hat számláló értékét.
(f) (g) (h) (i) (j) Laphiba esetén a legkisebb számlálóértékű lapot dobjuk ki a memóriából.
Világos, hogy a legutóbbi négy időegységben nem hivatkozott egyik lap számlálója
4.16. ábra. Az LRU-bitmátrix használatával, amikor a lapokra az alábbi sorrendben négy darab nullás bittel kezdődik, így kisebb, mint egy olyan lapé, amelyre a leg­
hivatkozunk: 0, 1,2,3,2, 1,0,3,2,3 utóbbi három időegységben hivatkoztunk.
Ez az algoritmus két dologban különbözik az LRU-tól. Tekintsük a hármas és
Most vizsgáljunk meg egy másik hardveres LRU-algoritmust. Egy n lapkere­ az ötös lapot a 4.17.(e) ábrán. Egyikre sem hivatkoztunk két időegység óta, de
tes géphez a hardver egy n x n-es bitmátrixot kezel, ami kezdetben csupa nulla. m indkettőt használtuk három időegységgel ezelőtt. Az L R U szerint ebből a kettő­
Amikor a k lapkeretre hivatkozunk, a hardver a mátrix fc-adik sorát csupa egyesre, ből kell kiválasztani egy lapot kidobásra. Az a baj, hogy nem tudjuk, a kettő közül
majd a fc-adik oszlopot csupa nullára állítja. A legkisebb bináris értékű sor tartozik
a legrégebben használt laphoz, a második legkisebb a második legrégebben hasz­ A 0-5-ös lapok A 0-5-ös lapok A 0-5-ös lapok A 0-5-ös lapok A 0-5-ös lapok
R bitje R bitje R bitje R bitje R bitje
nálthoz, és így tovább. Az algoritmus működése a 4.16. ábrán látható, ahol négy 0. órajel 1. órajel 2. órajel 3. órajel 4. órajel
lapkeret van, a hivatkozások rendre
1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0
0123210323
Lap
A 0-s hivatkozás után kapjuk a 4.16.(a) ábrán látható állapotot. M iután az első 0 10000000 11000000 11100000 11110000 01111000
lapra hivatkozunk, a 4.16.(b) ábrán látható szituációt kapjuk, és így tovább.
00000000 10000000 11000000 01100000 10110000

4.4.7. Az LRU szoftveres szimulációja 10000000 01000000 00100000 00100000 10001000

Bár mindkét előző LRU-algoritmus megvalósítható, kevés gép rendelkezik a szük­ 00000000 00000000 10000000 01000000 00100000

séges hardvertámogatással. Ezért olyan m egoldásra van szükség, amelyet szoftve­


resen lehet implementálni. Az egyik ilyen lehetőség az NFU (Nőt Frequently Used 10000000 11000000 01100000 10110000 01011000
- nem gyakran használt) algoritmus. Ehhez minden laphoz szükség van egy szoft­
10000000 01000000 10100000 01010000 00101000
veres számlálóra, ami kezdetben nulla. Az operációs rendszer m inden óram eg­
szakításnál megvizsgálja a m em óriában levő lapokat, és m inden egyes lap R bitjét (a) (b) (C) (d ) (e)
(amely 0 vagy 1 lehet) hozzáadja a számlálóhoz. Valójában a számláló azt adja
meg, hogy milyen gyakran használták a lapot. Laphiba esetén a legkisebb szám­ 4.17. ábra. Az öregítő algoritmus szoftveresen szimulálja az LRU-t. Tekintsük a fenti hat lapot
lálóértékű lapot dobja ki a memóriából. öt időegységen át. Az öt időegységet az (a)-(e) ábra mutatja
424 4. MEMÓRIAGAZDÁLKODÁS 4.5. A LAPOZÁSOS RENDSZEREKTERVEZÉSI SZEMPONTJAI 425

melyik lapot használtuk utoljára ebben az időegységben. Időegységenként egyet­ fogadja az egész m unkahalmazt, a processzus sok laphibát okoz, és lassabban fut,
len bit használatával nem tudjuk m egkülönböztetni az időegységen belüli korábbi m ert amíg egy utasítás végrehajtása néhány nanomásodpercig tart, addig egy lap
hivatkozásokat a későbbiektől. így a hármas lapot dobjuk ki, m ert nem volt rá hi­ beolvasása a lemezről néhány 10 ezred m ásodperc is lehet. Egy vagy két utasítás
vatkozás, az ötöst viszont két időegységgel azelőtt is használtuk már. végrehajtásával 10 ezred m ásodpercenként a folyamat évekig is eltarthat. H a egy
A másik különbség az LRU-hoz képest az, hogy az öregítő algoritmus véges sok processzus gyakran okoz laphibát, azt vergődésnek nevezik (Denning, 1968b).
bites (a példánkban 8 bites) számlálót használ. Tegyük fel, hogy két lap számlálója A m ultiprogramozást tám ogató rendszerekben a processzusokat gyakran kirak­
egyaránt nulla, ezekből véletlenszerűen dobjuk ki az egyiket. Lehet, hogy az egyi­ ják a lemezre (azaz m inden lapjukat eltávolítják a memóriából), hogy más pro­
ket csak 9, a másikat pedig 1000 időegység óta nem használtuk, ezt nem tudjuk a cesszusok is processzorhoz jussanak. A kérdés az, hogy mit kell tenni, amikor egy
számlálóból. A gyakorlatban egy 8 bites számláló általában elég egy 20 ezred m á­ processzus újból végrehajtódik. Tulajdonképpen semmit sem kell tenni, a procesz-
sodperc körüli időegységhez. H a egy lapra m ár 160 ezred másodperce nem hivat­ szus egész addig laphibákat okoz, amíg az egész m unkahalmaza be nem töltődik.
koztunk, az m ár valószínűleg nem fontos a továbbiakban. A problém a az, hogy húsz, száz vagy akár ezer laphiba előfordulása, valahányszor
egy processzus betöltődik, lassú és sok processzoridőt pazarol el, mivel az operá­
ciós rendszernek néhány ezred m ásodpercet el kell töltenie a laphibák feldolgozá­
sával, a nagyszámú lemez I/O-műveletet nem is említve.
4.5. A lapozásos rendszerek tervezési szempontjai Ezért sok lapozásos rendszer megpróbálja nyomon követni a processzusok
m unkahalmazát, és a program indítása előtt betölti a szükséges lapokat. Ezt a
Az előző alfejezetben elmagyaráztuk a lapozás m űködését, és m egadtunk, m o­ megoldást m unkahalm az modellnek hívják (Denning, 1970). Ez a tervezési mód
delleztünk néhány alapvető lapcserélési algoritmust. A puszta m űködés ismerete jelentősen csökkenti a laphibák számát. A program indítás előtti lapbetöltést előla­
nem elég, egy rendszer tervezéséhez többet kell tudni, hogy jól működjön. A kü­ pozásnak nevezik. Megjegyezzük, hogy a munkahalmaz idővel változik.
lönbség olyan, mint a sakkban ismerni a figurák lépéseit vagy jól játszani. A követ­ R égóta ismert, hogy legtöbb program hivatkozásai nemlineárisán oszlanak el a
kező alfejezetben néhány további szempontot vizsgálunk, amit a lapozásos rend­ saját címterében. A hivatkozások többsége egy viszonylag kicsi laphalmazban cso­
szerek tervezőinek figyelembe kell venniük a jó teljesítmény érdekében. portosul. A memóriahivatkozás betölthet egy utasítást vagy adatot, illetve elm ent­
het egy adatot. M inden t időpillanatban létezik egy olyan halmaz, amely minden,
a k legújabb hivatkozásokat tartalm azó lapot tartalmazza. Ez a w(k, t) halmaz a
4.5.1. A munkahalmaz modell munkahalmaz. Mivel a nagy k érték távolabbi m últat reprezentál, a hozzá tarto ­
zó lapok száma nem csökkenhet k növelésével. E nnek következtében w(k, t) m o­
A lapozás legegyszerűbb eseténél egy processzus úgy indul, hogy még egy lapja noton nem csökkenő függvénye /c-nak. Mivel egy program nem hivatkozhat több
sincs a memóriában. Amint a CPU a legelső utasítást próbálja olvasni, laphiba lapra, mint amennyit a címtere tartalmaz, és kevés program használ minden egyes
történik, erre az operációs rendszer behozza az első utasítást tartalmazó lapot. lapot, ezért w(k, t) felső határa véges. A 4.18. ábra szemlélteti a munkahalmaz m é­
Gyorsan következik néhány további laphiba a verem és a globális változók miatt. retének és fc-nak a viszonyát.
Egy idő múlva a processzus legtöbb szükséges lapja a mem óriában lesz, és a pro­
cesszus viszonylag kevés laphibával fog futni. Ezt a stratégiát igény szerinti lapozás­
nak hívják, m ert egy lap csak akkor töltődik be, amikor szükség van rá, előbb nem.
Természetesen könnyű egy olyan tesztprogramot írni, amely szisztematikusan ol­
vassa a teljes címtér összes lapját, és olyan sok laphibát okoz, hogy nem lesz elég a
memória a processzus rendes futásához. Szerencsére a legtöbb processzus nem így
működik. Lokális hivatkozásnak nevezik, ha egy processzus a végrehajtásának egy
fázisában csak a lapjainak egy kis részhalmazára hivatkozik. Például egy többm e­
netes fordító egy m enetében csak néhány lapra hivatkozik, más m enetekben pedig
más lapokra. A hivatkozás lokalitásának koncepciója széles körben alkalmazható a
számítástudományban, történetéről részletesebben olvashatunk (Denning, 2005).
A processzus által éppen használt lapok halm azát m unkahalm aznak nevezik
(Denning, 1968a; 1980). H a az egész munkahalmaz a m em óriában van, akkor a
processzus laphiba nélkül fut egész addig, amíg egy másik végrehajtási fázisba nem 4.18. ábra. A munkahalmaz a lapok egy halmaza, amelyekre a k legújabb memóriahivatkozás
ér (például a fordító következő m enete). H a a m em ória túl kicsi ahhoz, hogy be­ mutat. A w(k, t) függvény a munkahalmaz méretét mutatja be egy t időpillanatban
426 4. MEMÓRIAGAZDÁLKODÁS 4.5. A LAPOZÁSOS RENDSZEREKTERVEZÉSI SZEMPONTJAI 427

Tény, hogy a legtöbb program véletlenszerűen használja a lapok egy kis halma­ Kor
zát, de ez a halmaz az idő előrehaladtával lassan változik. Ez magyarázza a görbe A0 10 A0 A0
gyorsan em elkedő első részét és a nagyobb k értékekhez tartozó lassú em elke­ A1 7 Al Al
A2 5 A2 A2
dését. Például egy program, amely egy két lapot elfoglaló, négy lapon található 4 A3 A3
A3
adatot manipuláló ciklust hajt végre, mind a hat lapot hivatkozhatja, mind az ezer A4 6 A4 A4
utasításban, de egy más lap legújabb hivatkozása lehetett akár több millió utasí­ A5 3 A5
tással is ez előtt az inicializáló részben. Em iatt az aszimptotikus viselkedés miatt B0 9 B0 B0
a munkahalmaz tartalm a nem függ k választott értékétől. Más szavakkal, létezik a B1 4 B1 B1
B2 6 B2 B2
k értékeknek egy széles tartománya, amelyre a munkahalmaz változatlan marad.
B3 2 B3
Mivel a munkahalmaz az idő múlásával lassan változik, a legutóbbi leállításkor B4 5 B4 B4
használt munkahalmaz alapján jó tippeket adhatunk a program újraindításához B5 6 B5 B5
szükséges lapokra. Az előlapozás ezen lapok betöltését jelenti, mielőtt még a p ro­ B6 12 B6 B6
cesszus újra elindulna. Cl 3 C1 C1
C2 5 C2 C2
A munkahalmaz modell megvalósításához szükséges, hogy az operációs rend­
C3 6 C3 C3
szer nyilvántartsa, mely lapok tartoznak a munkahalmazba. Az egyik módszer
(a) (b) (C)
ezen információk megszerzésére az előbb ism ertetett öregítő algoritmus. H a egy
lap számlálójának felső n bitje tartalm az egyest, akkor a lap a munkahalmaz ele­ 4.19. ábra. A lokális és globális lapcsere összehasonlítása, (a) Eredeti állapot.
me. H a egy lapra az utolsó n időegységben nem hivatkoztak, azt kidobjuk a m un­ (b) Lokális lapcsere, (c) Globális lapcsere
kahalmazból. Az n param éter értéke kísérleti úton állapítható meg, de a rendszer
teljesítménye nem különösen érzékeny a pontos értékre. Általában a globális algoritmusok m űködnek jobban, m ert a munkahalmaz
A munkahalmazt fel lehet használni az óra algoritmus teljesítményének növe­ m érete a program futása során változik. H a lokális algoritmust használunk, és a
lésére is. Eredetileg, ha a m utató egy nullás R bittel rendelkező lapra m utatott, munkahalmaz nő, akkor vergődés lesz az eredmény, hacsak nincsen sok szabad
akkor ezt a lapot dobtuk ki. A javítás az, hogy megvizsgáljuk, hogy a lap eleme-e lapkeretünk. H a a munkahalmaz csökken, akkor a lokális algoritmusok m emóriát
az aktív processzus munkahalmazának. Ha eleme, akkor a lapot nem dobjuk ki, pazarolnak el. Ha globális algoritmust használunk, akkor a rendszernek mindig
hanem folytatjuk a kidobandó lap keresését. Ezt az algoritmust wsclocknak (m un­ döntenie kell, hogy mennyi lapkeretet adjon egy-egy processzusnak. Az egyik mód
kahalmaz óra algoritmus) hívják. erre, hogy az öregedés bitekkel figyeljük a munkahalmaz m éretét, de ez a m ód­
szer nem előzi meg a vergődést. A munkahalmaz m érete milliomod m ásodpercek
alatt változhat, de az öregedés bitek értéke egy durva mérték, sok időegység kell
4.5.2. Lokális vagy globális helyfoglalás a beállásához.
A másik megközelítés az, ha egy megfelelő algoritmus rendeli a lapkereteket
Az előzőkben számos algoritmust vizsgáltunk a laphiba esetén kidobandó lap ki­ a processzusokhoz. Az egyik módszer, hogy periodikusan meghatározzuk a fu­
választására. A választással kapcsolatos fő szempont (amit eddig a szőnyeg alá sö­ tó processzusok számát, és egyenlő arányban elosztjuk közöttük a lapkereteket.
pörtünk) a memória megosztása a párhuzam osan futó processzusok között. Például ha 12 416 rendelkezésre álló (azaz nem az operációs rendszerhez tartozó)
Tekintsük a 4.19.(a) ábrát. H árom futtatható processzusunk van: A , B és C. lapkeretünk és 10 processzusunk van, akkor m inden processzus 1241 lapkeretet
Tegyük fel, hogy az A processzus laphibát okozott. Vajon a lapcserélési algorit­ kap. A fennm aradó 5 lapkeretet tartaléknak használjuk laphibák esetére.
musnak az/1-hoz tartozó hat lap vagy a m em óriában levő összes lap közül kellene Bár ez a módszer jónak látszik, azonos mennyiségű m em óriát ad egy 10 KB-os
kiválasztania a legrégebben használt lapot? H a csak az A lapjai közül választunk, és egy 300 KB-os processzusnak ahelyett, hogy a processzusméretek arányában
akkor a kiszemelt lap az A 5 lesz, és a 4.19.(b) ábrán látható állapotot kapjuk. osztaná el a memóriát, azaz a 300 KB-os processzus harmincszor akkora helyet kap­
Másrészt, ha az összes lap közül választunk, tekintet nélkül arra, hogy a lap ki­ na, mint a 10 KB-os. Bölcs dolog lenne m inden processzushoz megadni egy mini­
hez tartozik, akkor a B3 lapot kapjuk, és a 4.19.(c) ábrán látható helyzetbejutunk. mumszámot, amivel még futni tud. Néhány gépen egy egyszerű kétoperandusú
Az előbbit lokális, az utóbbit globális lapcserélési algoritmusnak nevezzük. A lo­ utasítás végrehajtásához akár hat lapra is szükség lehet, m ert az utasításkód, a for­
kális algoritmusok a mem óriának egy rögzített m éretű szeletét foglalják le egy-egy rás- és a céloperandus mind-mind eshet laphatárra. H a csak öt lapot foglalunk le,
processzus részére. A globális algoritmusok dinamikusan osztják el a memória akkor az ilyen utasításokat tartalm azó program okat nem lehet lefuttatni.
lapkereteit a futó processzusok között, ilyenkor az egy processzushoz tartozó lap­ Amennyiben egy globális algoritmust használunk, m inden processzust ellátha­
keretek száma időben változik. tunk a méretével arányos számú lappal, de a foglalást a processzusok futása során
4.5. A LAPOZÁSOS RENDSZEREKTERVEZÉSI SZEMPONTJAI 429
428 4. MEMÓRIAGAZDÁLKODÁS

4.5.3. Lapméret
A lapméret gyakran választható értékű paraméter. H a a hardver lapmérete 512 bájt,
akkor az operációs rendszer könnyen tekintheti a 0 és 1,2 és 3 stb. lapokat 1 KB-osak-
nak, mindig két egymás melletti 512 bájtos lapkeretet lefoglalva a számukra.
Az optimális lapm éret m eghatározásához számos különböző tényezőt kell
egyensúlyba hoznunk. Ennek következtében nincs m inden tényezőre vonatko­
zó optimum. Kezdésként: nézzük azt a két tényezőt, amelyek a kicsi lapm éretet
indokolják. A véletlenszerűen kiválasztott kód-, adat- és veremszegmensek nem
foglalnak el egész számú lapot. Az utolsó lapnak átlagosan a fele üres marad, a
lapnak ezt a részét elvesztegetjük. Ezt a veszteséget belső töredezettségnek hívják.
4.20. ábra. Laphibaarány a lefoglalt lapkeretek számának függvényében
H a n darab szegmens van a m emóriában, és a lapm éret p bájt, akkor átlagosan
np/2 bájtot vesztünk el ilyen módon. Ebből az következik, hogy a lapm éretet érde­
dinamikusan frissíteni kell. A közvetlen megoldások egyike a laphiba-gyakoriság
mes kicsire választani.
(Page Fault Frequency, PFF) algoritmus. Ez az algoritmus megmondja, hogy nö­
veljük, vagy csökkentsük a processzuslap foglalását, de arról semmit sem mond, Egy másik érv a kis lapm éret m ellett az, hogy ha van egy program nyolc egymás
hogy melyik lapot kell kicserélni hiba esetén, csak a lefoglalt laphalmaz m éretét utáni 4 KB-os menettel, akkor 32 KB-os lapm éret esetén mindig 32 KB-ot fog­
szabályozza. lal le, 16 KB esetén mindig 16 KB-ot, 4 KB-os vagy kisebb lapméretnél pedig csak
A lapcserélési algoritmusok jó részére (az LR U -ra is) igaz, hogy a laphibák 4 KB-ot. Á ltalában nagy lapm éretnél több kihasználatlan rész van a memóriában,
aránya csökken, ha több lapkeretet foglalunk le. Ezt a tulajdonságot a 4.20. ábra mint kis lapméretnél.
illusztrálja. Másrészt kis lapm éret esetén a program több lapból áll, így nagyobb laptábla
A laphiba-gyakoriság, amelyen a PFF algoritmus alapszik, egyszerűen m érhe­ szükséges. Egy 32 KB-os program nak csak négy darab 8 KB-os, viszont 64 darab
tő: számolnunk kell a hibák számát m ásodpercenként, esetleg célszerű egy átlagot 512 bájtos lap kell. Az átvitel a lemezre és vissza laponként történik; ez leginkább
számítani az eltelt másodpercekre. Egy egyszerű m egoldásként hozzáadhatjuk a a lemez keresési és a felpörgetési idejétől függ, így egy nagy lap átvitele majd­
jelen hiba gyakoriságot az előzőhöz, és eloszthatjuk kettővel. A z A jelű szaggatott nem ugyanannyi ideig tart, mint egy kis lapé. Például a 64 512 bájtos lap betöltése
vonal m utatja az elfogadhatatlanul magas laphibaarányt, ilyenkor a processzusnak 64 x 10 ms, míg a négy darab 8 KB-os lapé 4 x 10,1 ms.
több lapkeretet kell adni, hogy csökkenjen a laphibák száma. A B jelű vonal m u­ Néhány gépnél a laptáblát külön regiszterekbe kell tölteni, amikor a központi
tatja azt az alacsony értéket, amiből az következik, hogy a processzusnak túl sok egység átkapcsol az egyik processzusról a másikra. Az ilyen gépeken kisebb lap­
lapkerete van. Ebben az esetben a processzustól el lehet venni lapkereteket. Ilyen m éretet használva, a laptábla betöltése annyiszor hosszabb ideig tart, mint ameny-
módon a PFF algoritmus a laphibák számát az elfogadható határok között igyek­ nyiszer a lapm éret kisebb. Sőt a laptábla által elfoglalt hely úgy nő, ahogy a lap­
szik tartani. m éret csökken.
H a úgy találjuk, hogy olyan sok processzus van a m emóriában, hogy lehetetlen Az utolsó pontot m atematikailag is elemezhetjük. Legyen az átlagos
mindet az A szint alatt tartani, akkor néhány processzust eltávolíthatunk a memó­ processzusméret s, a lapm éret p bájt. Továbbá legyen egy laptáblabejegyzés m é­
riából, és lapkereteiket szétoszthatjuk a többi processzus között, vagy felhasznál­ rete e bájt. Egy processzushoz körülbelül s/p lap kell; ez a laptáblában se/p bájtot
hatjuk tartalékként a további laphibák kezelésére. A döntés, hogy melyik procesz- foglal el. A belső töredezettség m iatt az utolsó lapon elvesztett memória átlagosan
szust vigyük ki, a teherelosztás egy formája. Azt mutatja, hogy a lapozás mellett p/2 bájt. így a teljes költség a laptábla és a belső töredezettség m iatt a következő
a csere is szükséges, csak most a cserét a lehetséges memóriaigény csökkentésére kifejezéssel jellemezhető:
használjuk, és nem a blokkok visszavételére. Az, hogy a m em óriaterhelés csök­
kentésére processzusokat mozgatunk ki, egy kétszintű ütem ezésre emlékeztet, költség = se/p + p/2
amelynek keretében néhány processzust a merevlemezre mozgatunk, és egy rövid
idejű ütem ező ütemezi a m egm aradó processzusokat. A két ötlet kombinálható Az első tag (a laptábla m érete) akkor nagy, ha a lapm éret kicsi. A második tag
azzal, hogy csak annyi processzust mozgatunk ki lemezre, hogy a laphibaarány el­ (belső töredezettség) akkor nagy, ha a lapm éret is nagy. Az optimum valahol kö­
fogadható legyen. zépen van. A p szerinti első deriváltat véve, az optim um ot az alábbi egyenletből
számoljuk:

-se/p2 + 1 / 2 = 0
430 4. MEMÓRIAGAZDÁLKODÁS 4.6. SZEGMENTÁLÁS 431

Ebből a formulából azt kapjuk, hogy az optimális lapméret: 4.6. Szegmentálás


p = V2se Eddig a virtuális m em óriát egydimenziós töm bként tárgyaltuk, m ert a virtuális cí­
mek nullától egy maximális címig terjedtek. Sok problém ánál azonban jobb kettő
Például í = 1 MB és e = 8 bájt esetén az optimális lapm éret 4 KB. A kereskede­ vagy több különálló virtuális cím teret használni, mint egyetlenegyet. Például egy
lemben kapható számítógépek 512 bájt és 1 MB közötti lapm éretet használnak. fordítóprogram több táblázatot is felépít a fordítás alatt, például az alábbiakat:
Egy tipikus érték az 1 KB, de manapság a 4 és a 8 KB a legelterjedtebb. A m em ó­
ria növekedtével a lapm éret is növekszik, ez a növekedés azonban nemlineáris. 1. A forráskód a lista nyomtatásához (kötegelt rendszerekben).
Négyszer nagyobb m em ória ritkán duplázza meg a lapm éretet. 2. A szimbólumtábla a változók nevével és attribútumaival.
3. Az egész és lebegőpontos konstansok táblája.
4. A program szintaktikai fája.
4.5.4. Virtuális memória interfész 5. A fordítóprogram saját verme.

Mostanáig úgy kezeltük a virtuális memóriát, hogy átlátszó a processzusok és a A z első négy tábla a fordítás alatt állandóan növekszik, az utolsó előre nem látha­
programozók számára, azaz csak egy nagy virtuális cím teret látnak a kisebb fizikai tó m ódon nő és csökken. Egy egydimenziós m em óriában a 4.21. ábrán látható m ó­
memóriával rendelkező számítógépen. Sok rendszerben ez igaz is, de néhány fej­ don öt darab nagy, egybefüggő részre kell osztani a virtuális címteret.
lettebb rendszerben a programozó vezérelheti a memóriahasználatot, és a prog­ Mi történik, ha egy egyébként m inden tekintetben hagyományos forrásprog­
ram javítása érdekében, a hagyományostól eltérő m ódon is használhatja a m em ó­ ram ban túl sok változó van? A szimbólumtáblának lefoglalt memóriaszelet bete­
riát. Ezekről lesz szó röviden ebben az alfejezetben. lik, és beleütközik a következő tábla területébe. A fordító egy üzenetet küld, hogy
Az egyik ok, hogy a m em ória kezelését a programozó kezébe adjuk, az, hogy túl sok változó van, és abbahagyja a fordítást, pedig lehet, hogy a többi táblánál
megoszthasson egy mem óriarészt kettő vagy több processzus között. H a a prog­ még m aradt kihasználatlan memória.
ramozó elnevezheti a m emóriarészeket, akkor a processzus átadhatja ezt a nevet A másik lehetőség az, hogy a fordító Robin H oodot játszik, helyet vesz el azok­
egy másik processzusnak, így a másik processzus is el tudja érni ezt a m em ória­ tól a tábláktól, amelyeknek sok szabad helyük van, és a helyszűkében levő táblák­
részt. H a kettő vagy több processzus osztozik ugyanazon a lapon, akkor nagy sáv- nak adja. Ez a módszer működik, de hasonló ahhoz, ha valaki saját maga kezeli
szélességű kapcsolat jöhet létre, m ert amit az egyik processzus a közös m emóriába program rétegeit, legjobb esetben csak kellemetlenség, legrosszabb esetben hosszú
ír, azt a másik elolvashatja. és unalmas munka.
A közös lapok a nagy teljesítményű üzenetküldő rendszerek implementálásá­
nál használhatók fel. Normális esetben, ha egy üzenetet küldünk, az jelentékeny Virtuális címtér
költséggel átmásolódik az egyik processzus címteréből a másikba. H a a processzu­
sok vezérelhetik a laptérképüket, akkor a küldő processzus kiszedi a lapjai közül
az üzenetet tartalm azó lapot (lapokat), a fogadó processzus pedig belapozza azt.
Ilyenkor az adatok helyett csak a lap nevét másoljuk át. } Szabad
Egy újabb fejlett memóriakezelő technika az elosztott közös memória (Feeley A szintaktikus fának I A fa által éppen
et al., 1995; Li és Hudak, 1989; Zekauskas et al., 1994). Az ötlet az, hogy hálózat­ lefoglalt memória í használt memória
ban futó processzusok között megosszunk lapokat, lehetőleg (de nem feltétlenül)
egyetlen közös lineáris címtérrel. H a egy processzus egy olyan lapra hivatkozik,
amely nincs belapozva, akkor laphibát okoz. A laphibakezelő, amely egyaránt le­ jjMtonst^sdk____
het a kernel- vagy a felhasználótérben, megkeresi a lapot tároló gépet, küld egy
üzenetet, hogy a kért lapot lapozzák ki, és küldjék el a hálózaton. Amikor a lap
megérkezik, belapozza, és újraindítja a hibát okozó utasítást.

A szimbólumtábla
beleütközött a forráskódba

4.21. ábra. Egydimenziós címtér növekvő táblákkal, az egyik tábla beleütközhet a másikba
432 4. MEMÓRIAGAZDÁLKODÁS 4.6. SZEGMENTÁLÁS 433

szegmensben levő eljárás meghívásánál az (n , 0) címet kell használni; a 0 az eljárás


belépési pontja.
Ha az n. szegmensben levő eljárást módosítjuk és újrafordítjuk, akkor a többi el­
járást nem kell megváltoztatni, mert a belépési címek nem változtak. Egydimenziós
memóriában az eljárások szorosan egymás mögé vannak pakolva. így ha egy eljá­
rás m érete megváltozik, az eltolja az azt követő eljárások belépési pontját. Em iatt
Szimbólum­ az összes olyan eljárást m ódosítani kell, amely egy elmozdult eljárást hívott, hogy
tábla az új címet használja. H a egy program ban több száz eljárás van, akkor ez a műve­
let költséges lehet.
Szintaktikus Hívási
Forráskód fa verem
A szegmentálás lehetővé teszi adatok vagy eljárások megosztását processzusok
között. Ennek leggyakoribb példája az osztott könyvtár. Az ablakozó rendszerrel
működő m odern munkaállomásoknál majdnem m inden program hoz hatalmas
grafikus könyvtárat kellene hozzáfordítani. Szegmentálás esetén a grafikus könyv­
Konstansok tárakat a processzusok között megosztott közös szegmensbe lehetne tenni és
0-s 1-es 2-es 3-as 4-es megosztani több processzus között, így ezeket a közös könyvtárakat nem kellene
szegmens szegmens szegmens szegmens szegmens minden processzus cím terének külön-külön tartalmaznia. H a egy tiszta lapozásos
rendszerben akarunk osztott könyvtárat használni, akkor bonyolultabb dolgunk
4.22. ábra. A szegmentált memória lehetővé teszi, hogy mindegyik tábla a többitől függetlenül van, az ilyen rendszerek valójában a szegmentálás szimulálásával teszik ezt.
növekedjen vagy csökkenjen Mivel a szegmens egy logikai egység, így az eljárásoknak és az adatoknak külön­
böző védelmi szintjük lehet. Az eljárásokat tartalm azó szegmens csak végrehajt­
Mi lehet a valódi módja annak, hogy a program ozót megszabadítsuk a táblák ható, nem lehet olvasni vagy módosítani. Egy lebegőpontos töm böt tartalm azó
memóriakezelésének gondjától, hasonlóan ahhoz, ahogy a virtuális memória fel­ szegmens csak olvasható és írható, de nem végrehajtható, így hibát okoz a kísérlet,
m entette a program ozót a program rétegekre szabdalása alól? hogy átadjuk rá a vezérlést. Ez a védelem segít megtalálni a programhibákat.
A legáltalánosabb megoldás az, hogy lehetővé tesszük több, egymástól telje­ A szegmentált memória teszi lehetővé a védelmet, de a védelemnek nincs értel­
sen független címtér létrehozását. A cím tereket szegmenseknek hívják. Minden me az egydimenziós m emória esetében. A szegmentált m emóriánál a programozó
szegmens egy lineáris cím tér nullától valamilyen maximális címig. Egy szegmens
hosszúsága nulla és egy m eghatározott maximum közötti tetszőleges szám lehet. Szempont Lapozás Szegmentálás
A különböző szegmensek általában eltérő hosszúak, sőt a szegmens m érete vál­ Tudnia kell-e a programozónak, Nem Igen
tozhat a program végrehajtása során. Például a veremszegmens m érete megnő, ha hogy ezt a technikát használja?
valamit belerakunk a verembe, és csökken, ha kiveszünk onnan valamit. Hány lineáris címtér használható? 1 Sok
Mivel mindegyik szegmens külön cím teret alkot, a szegmensek egymástól füg­ Lehet-e a teljes címtér nagyobb, Igen Igen
getlenül nőhetnek vagy csökkenhetnek. H a például a verem nek több hely kell, ak­ mint a fizikai memória mérete?
kor m egnőhet, m ert nincs semmi más a címterében, aminek nekiütközne. Termé­ Meg lehet-e különböztetni és Nem Igen
szetesen egy szegmens megtelhet, de a szegmensméret általában olyan nagy, hogy külön-külön védeni az adatokat és
ez az eset ritkán következik be. A szegmentált vagy kétdimenziós mem óriában a az eljárásokat?
címeknek két részből kell állniuk, a szegmens számából és a szegmensen belüli Egyszerű-e a változó méretű Nem Igen
címből. A 4.22. ábra az előbb látott fordítóprogram tábláit m utatja szegmentált táblázatok elhelyezése?
memóriában. Az ábrán öt független szegmens látható. Segíti-e az eljárások felhasználók Nem Igen
Kiemeljük, hogy a szegmens a legegyszerűbb formájában egy logikai egység, a közötti megosztását?
programozó is így használja. Egy szegmens egy vagy több eljárást, tömböt, vermet Miért fejlesztették ki ezt a Nagy lineáris címteret Lehetővé teszi, hogy a prog­
vagy skalárváltozókat tartalm azhat, de általában nem keverik össze egy szegmens­ technikát? kapjunk több fizikai ramot és az adatokat logikai
memória vásárlása egységekre vágjuk szét,
be a különböző típusokat. nélkül és segíti ezek védelmét és
A szegmentált m em óriának más előnye is van amellett, hogy a változó m éretű megosztását
adatszerkezetek egyszerűen kezelhetők. H a m inden eljárás egy külön szegmens
nullás címén van, akkor a program összeszerkesztése egészen egyszerű. Az n. 4.23. ábra. A lapozás és a szegmentálás összehasonlítása
434 4. MEMÓRIAGAZDÁLKODÁS 4.6. SZEGMENTÁLÁS 435

tudja, hogy mi van egy szegmensben. Mivel m inden szegmens csak egyféle dolgot 4.6.2. Szegmentálás lapozással: Intel Pentium
tartalmaz, a szegmens erre alkalmas védelmi kódot használhat. A lapozást és a
szegmentálást a 4.23. ábrán hasonlítjuk össze. A Pentium processzor legfeljebb 16000, egyenként 232 bájtos virtuális címterű
Egy lap tartalm a általában véletlenszerű. A programozónak nem kell tudnia, hogy szegmenst támogat. A processzor beállítható (az operációs rendszer által) csak
a programja lapozással fut. Bár néhány bit hozzáadásával a laptáblabejegyzésekhez szegmentáció, csak lapozás vagy m indkettő használatára. A legtöbb operációs
m eghatározhatunk védelmi szinteket, de ahhoz, hogy a programozó ezt használni rendszer a Windows XP-t és a legtöbb Unixot is beleértve, az egyszerű lapozásos
tudja, nyomon kell követnie, hogy hol vannak a laphatárok a processzus cím teré­ modellt használja; ez esetben m inden processzusnak egy 232 bájtos virtuális cím te­
ben. Mivel a szegmentált m em ória felhasználója úgy érzi, hogy mindig a központi rű szegmense lehet. Mivel a Pentium processzor képes sokkal nagyobb címterek
mem óriában van minden szegmens (vagyis úgy címezheti azokat, m intha ott len­ kezelésére is, és van egy operációs rendszer (OS/2), amely kihasználja a címzés
nének), minden szegmenst külön védhet anélkül, hogy az adminisztrációval kell­ m inden képességét, ezért a következőkben nagy vonalakban megismerkedünk a
jen foglalkoznia. Pentium processzorok virtuális memóriakezelésével.
A Pentium virtuális memóriájának szíve két táblázatból áll: a lokális leírótábla
(Local Descriptor Table, LDT) és a globális leírótábla (Global Descriptor Table,
4.6.1. A tiszta szegmentálás implementációja GDT). M inden program nak saját LDT-je van, de G D T csak egy van, ezt közösen
használja a gépen futó összes program. Az LD T tartalm azza a program saját lo­
A szegmentálás implementációja egy lényeges dologban különbözik a lapozástól: a kális szegmenseit (kód, verem, adat stb.), a GDT-ben pedig a rendszerszegmensek
lapok fix méretűek, a szegmensek nem. A 4.24.(a) ábra egy olyan fizikai memóriát találhatók, beleértve az operációs rendszer szegmenseit is.
mutat, amelyben kezdetben öt szegmens van. Nézzük meg, hogy mi történik, ha ki­ Egy szegmens eléréséhez a Pentium először betölti a szegmens szelektorát a
visszük az egyes szegmenst, és helyébe a hetes számú, kisebb szegmenst hozzuk be. gép hat szegmensregiszterének egyikébe. A futás során a CS-regiszter a kód-, a
Az eredmény a 4.24.(b) ábrán látható memóriakép lesz. A hetes és a kettes szegmens DS az adatszegmens szelektorát tartalmazza. A többi szegmensregiszter kevésbé
között van egy kihasználatlan terület; ez egy lyuk. Ezután a négyes szegmenst az ötös­ fontos. A szelektor egy 16 bites szám, felépítése a 4.25. ábrán látható.
sel helyettesítjük a 4.24.(c) ábrán látható módon, majd a hármas helyett a hatost hoz­ Egy bit azt mutatja, hogy a szegmens lokális vagy globális (azaz az LDT-ben vagy
zuk be, ahogy az a 4.24.(d) ábrán látható. H a a rendszer tovább fut, akkor a memória a GDT-ben van). 13 bit adja meg a GDT- vagy az LDT-beli bejegyzés sorszámát, így
részekre darabolódik, egyes részek szegmenst, mások lyukat tartalmaznak, a kis lyu­ ezek a táblák egyenként 8192 darab szegmensleírót tartalmazhatnak. A fennmaradó
kak összesen sok memóriát vesztegetnek el. Ezt a jelenséget külső töredezettségnek 2 bit a védelmi kód, ezt a későbbiekben pontosabban leírjuk. A nullás leíró tiltott.
(fragmentáció) hívják. A 4.24.(e) ábrán látható m ódon tömörítéssel javítható. A szegmensregiszterbe töltésével biztonságosan jelezhetjük, hogy a szegmensre­
giszter jelenleg nem érhető el. Amennyiben használjuk, akkor megszakítást okoz.
4-es szegmens 4-es szegmens
K) Amikor egy szelektort a szegmensregiszterbe töltünk, akkor a hozzá tartozó leíró
/'SS'
(7K) (7K) 5-ös szegmens 5-ös szegmens az LDT-ből vagy a GDT-ből a m ikroprogram-regiszterekbe töltődik, így gyorsab­
(4 K) (4 K) ban elérhető lesz. A 4.26. ábrán látható leíró 8 bájtos, tartalm azza a szegmens bá­
ziscímét, hosszát és egyéb információkat.
3-as szegmens 3-as szegmens 3-as szegmens 5-ös szegmens A szelektorból egyszerűen m eghatározhatjuk a deszkriptor helyét. Először a sze­
(8 K) (8 K) (8 K) 6-os szegmens (4 K) lektor második bitje alapján kiválasztjuk az LDT-t vagy a GDT-t. Ezután a szelek­
(4 K )
6-os szegmens tort egy belső regiszterbe másoljuk, és alsó három bitjét nullázzuk. Végül hozzá­
2-es szegmens 2-es szegmens 2-es szegmens 2-es szegmens (4 K)
(5 K) (5 K) (5 K) (5 K) adjuk az LDT vagy G D T tábla címét, így megkapjuk a leíró címét. Például a 72-es
2-es szegmens
:(3K)<
szelektor a GD T 9-es bejegyzésére mutat, ami a GD T + 72-es címen található.
(5 K)
1-es szegmens
(8K) 7-es szegmens 7-es szegmens 7-es szegmens 7-es szegmens
Bitszám 13 1 2
(5K) (5 K) (5 K) (5 K)
0-s szegmens 0-s szegmens 0-s szegmens 0-s szegmens 0-s szegmens Index
(4 K) (4 K) (4 K) (4 K) (4 K)
(a) (b) (c) (d) (e)
0 = GDT/1 = LDT Jogosultsági szint (0-3)
4.24. ábra. (a)-(d) A külső töredezettség kialakulása, (e) A töredezettség megszüntetése
tömörítéssel
4.25. ábra./A Pentium szelektora
436 4. MEMÓRIAGAZDÁLKODÁS 4.6. SZEGMENTÁLÁS 437

0: A szegmens nincs H a a szegmens a memóriában van, és az offset sem túl nagy, akkor a leíró 32 bites
0:16 bites a memóriában bázismezőjét hozzáadjuk az offsethez, így megkapjuk a lineáris címet (lásd 4.27.
szegmens 1: A szegmens a
1:32 bites memóriában van ábra). A bázismező a leíróban szétszórt három részből áll, hogy kompatibilis m a­
szegmens radjon a 286-ossal, ahol a bázis csak 24 bites volt. A bázismező (base) lehetővé teszi,
Jogosultsági szint (0-3) hogy egy szegmens a 32 bites lineáris címtér tetszőleges címén kezdődhessen.
H a a lapozás tiltott (a globális vezérlőregiszter egy bitjével), akkor a lineáris
0: A méret 0: Rendszer
bájtokban adott
cím maga a fizikai cím, és változatlanul továbbítódik a m emória felé. így lapozás
1: Alkalmazás nélkül a tiszta szegmentálással állunk szemben, ahol a szegmensek kezdőcíme a
1: A méret
lapokban adott leírójukban található. A szegmensek átfedhetik egymást, m ert túl sok időbe telne
Szegmens típusa
és védelem a diszjunktságot ellenőrizni.
H a a lapozás engedélyezett, akkor a lineáris címet virtuális címként értelm ez­
Kezdőcím Méret Kezdőcím zük, és a laptábla segítségével képezzük le a fizikai címre, ahogy azt a korábbi pél­
G D 0 P DPL S Típus
24-31 16-19 16-23
dákban láttuk. Az egyetlen gond, hogy a 32 bites virtuális címek és a 4 KB-os lap­
Kezdőcím Méret m éret miatt egy szegmens egymillió lapot is tartalm azhat, így kétszintű laptáblát
0-15 0-15
kell használni, hogy csökkentsük a kis szegmensek laptáblájának m éretét.
-32 bit -Relatív M inden futó programhoz tartozik egy lapcím tár, amely 1024 darab 32 bites be­
cím jegyzést tartalmaz; erre a cím tárra egy globális regiszter m utat. M inden bejegyzés
egy 1024 32 bites elem et tartalm azó laptáblára mutat. Egy laptáblabejegyzés egy
4.26. ábra. A Pentium kódszegmensének leírója. Az adatszegmens kissé különbözik ettől lapkeretre mutat. Ezt a sém át láthatjuk a 4.28. ábrán.
A 4.28.(a) ábrán látható lineáris cím három mezőre van osztva: dir (lapcímtár-
Most nézzük meg, hogyan konvertálódik egy (szelektor, offset) páros fizikai index), page (lap) és o ff (offset). A dir mezőt használjuk a laptábla címének kike­
címmé. Mivel a m ikroprogram tudja, hogy melyek a használt szegmensregiszte­ resésére a lapcímtárból. A laptáblából a page mező értéke alapján választjuk ki a
rek, a hozzájuk tartozó leírókat a belső regiszterekben tárolhatja. H a a szegmens
nem létezik (szelektora 0), vagy ki van lapozva, akkor megszakítást okoz. Lineáris cím
Ezután ellenőrzi, hogy az offset a szegmensen belül van-e, ha nem, akkor meg­ Bitszám 10 10 12
szakítást okoz. Logikailag 32 bit kellene a szegmens m éretének megadásához, de a
Lapcímtár Lap Offset
leíróban erre a célra csak 20 bit van, így más eljárást használnak. H a a leíró gbit-]e
(szemcsézettség) nulla, akkor a határmező (limit) a szegmens pontos m éretét adja
meg (legfeljebb egy megabájt). H a ez a bit 1, akkor a határmező bájtok helyett la­ (a)
pokban tartalm azza a szegmens m éretét. A Pentium lapm érete 4 KB, így a 20 bi­
A kiválasztott
tes m éret 232 bites szegmensekhez elég. szó
Lapcímtár Laptábla Lapkerét

Szelektor
1024
bejegyzés

Lapcímtár-
index

A bejegyzés A bejegyzés
a laptáblára mutat a lapkeretre mutat
(b)
4.27. ábra. A (szelektor, offset) pár átalakítása lineáris címmé
4.28. ábra. A lineáris cím leképezése fizikai címre
438 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 439

lapkeret fizikai címét. Végül az offset értékét a lapkeret fizikai címéhez hozzáadva den Pentium processzoron futó operációs rendszer így működik. Az OS/2 volt az
megkapjuk a kért fizikai címet. egyetlen, amely kihasználta az Intel M M U architektúrájának m inden lehetőségét.
A laptábla egy bejegyzése 32 bites, ebből 20 bit tartalm azza a lapkeret számát. M indent egybevéve elismerés jár a Pentium tervezőinek. Az ellentétes célok
A fennm aradó bitek az elérési, védelmi és egyéb bitek. ellenére (tiszta lapozás, szegmentálás és lapozott szegmentálás implementálása,
Minden laptábla 1024 bejegyzést tartalm az, amelyek 4 KB-os lapokra m utat­ valamint kompatibilitás a 286-ossal) a megoldás hatékony, meglepően egyszerű
nak, így egy laptábla 4 MB m em óriát tud kezelni. A 4 MB-nál kisebb szegmensek és világos.
lapcímtárában csak egyetlen bejegyzés van, amely a szegmens egyetlen laptáblájá­ M iután ism ertettük a Pentium virtuális memóriájának felépítését, megéri né­
ra mutat. Ilyen módon a kis szegmensek többletköltsége csak két lap, szemben az hány szót szólni a védelemről is, m ert ez a tém a szorosan kapcsolódik a virtuális
egyszintű laptábla egymillió lapjával. memóriához. A Pentium a 4.29. ábrán látható m ódon négy védelmi szintet tám o­
Az ismételt memóriahivatkozások megelőzésére a Pentium egy kicsi TLB-t gat, a nulladik szinttől, amely a legerősebb, a harmadik szintig, amely a leggyen­
használ a leggyakoribb dir-page kombinációk lapkeretre való leképezésére. H a gébb. Minden egyes futó program példánynak van egy szintszáma; ez a PSW -ben
egy kombináció nincs benne a TLB-ben, akkor a 4.28. ábrán látható m ódon meg­ két biten van kódolva. A szegmensekhez szintén tartozik egy-egy szintszám.
keressük a hozzá tartozó lapkeret számát, és berakjuk a TLB-be. Amíg a TLB- H a a program csak a saját szintjén levő szegmenseket használja, akkor minden
hibák ritkák, a teljesítmény jó. simán megy. A magasabb szintű szegmensekről m egengedett az adatok elérése.
H a lapozást használunk, akkor a leíróban a bázismező értéke célszerűen mindig Alacsonyabb szintű szegmenseken levő adatot tilos használni, az ilyen kísérlet
nulla. Ugyanis ha nem nulla, akkor egy kis offsetet okoz, ami m iatt a lapcímtár megszakítást okoz. Más szinteken (alacsonyabb és magasabb egyaránt) levő eljá­
egy középső bejegyzését fogjuk használni az első bejegyzés helyett. A bázismező rások meghívása m egengedett, de csak ellenőrzött módon. Egy szintközök közötti
létének valódi oka az, hogy lehetővé tegye a tiszta (nem lapozott) szegmentálást, hívásnál a CALL utasításnak a cím helyett egy szelektort kell tartalmaznia. Ez a
és a kompatibilitást a 286-os rendszerrel, ahol nem volt lapozás (azaz csak tiszta szelektor egy hívási kapu nevű leírót jelöl ki, ami a hívott eljárás címét adja meg.
szegmentálás volt). így nem lehet egy másik szinten levő tetszőleges kódszegmens közepébe ugrani,
Ez a modell lehetővé teszi, hogy olyan alkalmazások is fussanak, amelyeknek csak a hivatalos belépési pontok használhatók.
nincs szükségük szegmensekre, csak egy darab 32 bites, lapozott, virtuális cím­ A 4.29. ábrán ennek a m ódszernek egy tipikus felhasználása látható. A nullás
térre. M inden szegmensregiszterbe ugyanazt a szelektort kell tölteni, a hozzá szinten fut az operációs rendszer kernele, amely az I/O-t, a m em óriát és egyéb kri­
tartozó leíróban a bázis értéke nulla, a limit pedig a maximum. Az offset maga a tikus dolgokat kezeli. Az egyes szinten van a rendszerhívás-kezelő. A felhasználói
lineáris cím, m intha csak sima lapozást használnánk. Valójában manapság min- programok meghívhatják az itt levő eljárásokat, hogy rendszerhívásokat hajtsanak
végre, de az eljárásoknak csak egy m eghatározott és védett halmaza használható.
A második szint tartalm azza a könyvtári eljárásokat, esetleg megosztva több futó
program között. A felhasználói program ok meghívhatják ezeket az eljárásokat,
olvashatják az adatokat, de nem m ódosíthatják azokat. Végül a felhasználói prog­
ramok a legalacsonyabb védettségű harmadik szinten futnak.
A megszakítások kezelése a hívási kapukhoz hasonló mechanizmust hasz­
nál. Abszolút címek helyett leírókra hivatkozik; ezek a leírók m utatnak a végre­
hajtandó eljárásokra. A 4.26. ábrán látható type mező tesz különbséget a kód- és
adatszegmensek, valamint a különféle kapuk között.

4.7. A MINIX 3 processzuskezelője


A M INIX 3 memóriakezelése rendkívül egyszerű, nem használ lapozást, és ahogy
itt tárgyaljuk, cserélgetést sem használ. Amennyiben a M INIX 3-nak kicsi memó­
riával rendelkező gépen kell futnia, a forráskódban m egtalálható cserét bármikor
aktiválhatjuk. A gyakorlatban azonban a memóriák ma m ár olyan nagy méretűek,
4.29. ábra. A Pentium védelmi szintjei hogy a cserélgetésre ritkán van szükség.
440 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 441

Ebben a fejezetben egy felhasználói szintű szervert, a processzuskezelőt (pro- Érdem es hangsúlyozni, hogy más operációs rendszerekkel ellentétben, a
cess manager, PM) fogjuk röviden áttekinteni. A processzuskezelő a processzus­ M INIX 3 memóriakezelése nem része a kernelnek. Felhasználói szintű procesz-
kezeléssel kapcsolatos rendszerhívásokat fogadja. Ezek közül több közvetlenül is szusként fut, és a kernellel a szabványos üzenetváltási megoldással kommunikál.
kapcsolódik a memóriakezeléshez. A fork, exec és brk hívások tartoznak ebbe a A 2.29. ábrán látható a PM helyzete.
kategóriába. A processzuskezelő ezek mellett a különböző szignálokhoz tartozó A PM kernelen kívüli implementálása jó példa az elv és a megvalósítás szét­
rendszerhívásokat kezeli, beállítja a processzus tulajdonságait, mint például fel­ választására. A m emóriakezelő dönti el, hogy melyik processzus hova kerüljön a
használó és csoporttagság, illetve a CPU használati idő jelentése. A M INIX 3 pro­ m em óriában (elv). A m em óriatérképet a kernel állítja be (megvalósítás). A szét­
cesszuskezelőjének feladata a valós idejű óra lekérdezése és beállítása is. választás m iatt könnyű megváltoztatni a memóriakezelő elvet (algoritmust stb.)
Időnként, amikor a processzuskezelőnek a memóriakezeléssel foglalkozó ré­ anélkül, hogy az operációs rendszer alsóbb rétegeit módosítani kellene.
szére hivatkozunk, „m emóriakezelő”-nek fogjuk nevezni. Elképzelhető, hogy egy A PM kódjának nagyobb része a M INIX 3-rendszerhívásainak kezelésével (el­
jövőbeli kiadásban a processzuskezelő és a memóriakezelő teljesen elkülönül, de sősorban a fork és exec) foglalkozik, és csak a kisebb rész foglalkozik a processzus-
jelenleg a M INIX 3-ban ezeket a funkciókat egyetlen processzus kezeli. és lyuklista manipulálásával. A következő alfejezetben megismerjük a m emória
A PM feladata többek között egy cím szerint rendezett lyuklista karbantartása. szerkezetét, azt követően pedig megnézzük madártávlatból, hogyan dolgozza fel a
Amennyiben például egy fork vagy exec rendszerhívásnál szükség van szabad m e­ PM a processzuskezelő rendszerhívásokat.
m óriaterületre, akkor a PM megkeresi a lyuklistában az első megfelelő m éretű
lyukat. Mivel nincs csere, ha egy processzus bekerül a memóriába, egészen a befe­
jeződéséig ugyanazon a helyen marad. A M INIX 3 soha sem viszi ki lemezre, vagy 4.7.1. A memória szerkezete
helyezi át más m em óriaterületre a processzusokat, és a processzusnak lefoglalt te­
rület m éretét sem változtatja meg. A M INIX 3-programok lefordításánál eldönthetjük, hogy használjanak-e olyan
Ez a memóriakezelési stratégia egy kicsit szokatlan, így némi magyarázatot igé­ kom binált kód- és adatrészt (combined I and S space),* amelynél a program
nyel. H árom indokot tudunk felsorolni mellette: m inden m em óriaterülete (kód, adat, verem) a memória egy blokkján osztozik és
együtt van lefoglalva, illetve felszabadítva, vagy pedig szeparált kód- és adatrészt
1. A rendszer egyszerűsége, érthetősége így biztosítható. (separate I and D space) használjanak. Az eredeti M INIX-verziónál a kombinált
2. Az eredeti IBM PC CPU -architektúrája miatt (egy Intel 8088). kód- és adatrész volt az alapértelm ezett, a M INIX 3-ban azonban a szeparált. Az
3. Egyszerű legyen a M INIX 3-at átírni más hardverre. érthetőség kedvéért először az egyszerűbb közös m odellt vitatjuk meg. A szeparált
kód- és adatrészt használó processzusok m em óriahasználata sokkal hatékonyabb,
Először is, oktatási célú m intarendszerként a komplexitást kerülni kellett: egy de ezen megoldások sokkal komplikáltabbá teszik a rendszert. A bonyodalmakkal
250 oldalas forráskódot elég hosszúnak ítéltünk. A lapozás megvalósítása lehetet­ az egyszerű esetek megvizsgálása után fogunk foglalkozni.
len volt, mivel a rendszer arra az eredeti IBM PC-re lett tervezve, amelynek még A M INIX 3-ban normál m űködés esetén két alkalommal kell a m emóriát lefog­
MMU-ja sem volt. Az akkori számítógépek többsége sem rendelkezett MMU- lalni. Egyrészt, amikor egy processzus szétágazik (fork), ekkor mem óriát kell fog­
val, így ez a m emóriakezelő stratégia lehetővé tette a szoftver egyszerűbb átírását lalni a gyermekprocesszusnak. Másrészt, amikor egy processzus az exec-kel elindít
Macintosh-, Atari-, Amiga-platformokra. maga helyett egy másik processzust, ekkor fel kell szabadítani a processzusnak ki­
Ma m ár azonban megkérdőjelezhetjük a megoldás létjogosultságát. Annak el­ utalt memóriát, és ezt a lyuklistába be kell illeszteni, valamint le kell foglalni az új
lenére, hogy a rendszer sokat nőtt az évek alatt, az első pont még mindig igaz. De processzusnak szükséges részt. Az új processzus nem feltétlenül az éppen felsza­
m ára más szempontok is fontos szerepet kaphatnak. A m odern PC-k 1000-szer badított memóriarészbe kerül, ez attól függ, hol talál erre alkalmas lyukat. M em ó­
több memóriával rendelkeznek, mint az eredeti IBM PC. Annak ellenére, hogy a riát akkor is fel kell felszabadítani, ha egy processzus kilépéssel befejeződik vagy
program ok is nagyobbak, a legtöbb rendszer annyi memóriával rendelkezik, hogy leállítják egy szignállal. Létezik egy harm adik eset is: egy rendszertaszk igényelhet
ritkán van szükség cserére és lapozásra. Végezetül a M INIX 3 célplatformjai az m em óriát saját használatra is, például egy memóriam eghajtó m em óriát igényel a
alacsony szintű eszközökkel bővültek. M anapság operációs rendszerrel rendel­ RAM-lemezhez. Ez csak a rendszer inicializálásakor fordulhat elő.
keznek a digitális kamerák, DVD-lejátszók, m obiltelefonok és más eszközök. A A 4.30. ábra m utatja a memóriafoglalás két módját fork és exec esetén. Az (a)
M INIX 3, mint operációs rendszer, ésszerű választás ebben a világban, így a lapo­ esetben két processzusunk van a memóriában, az A és a B. H a az A szétágazik
zás és a csere megvalósítása nem létfontosságú. A háttérben folyik bizonyos m un­ (fork), akkor a (b) ábrán látható állapotba jutunk. A gyermekprocesszus az A pon-
ka a lehető legegyszerűbb virtuális memória kezelési megoldásának feltérképezé­
sére. Az ezzel kapcsolatos friss információk m egtalálhatók a weboldalon.
* A z I and D space utasítás- és adatrészként is használatos (A szerk.)
442 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 443

A veremszegmens
lefelé terjeszkedik
Szimbólumok
C
Adatszegmens Az adatszegmens
Af ájl felfelé nő (esetleg
merete csökken) a brk
Kódszegmens
e hívásnál
7 7 7 7 //////. Fejléc
A (a)
MINIX 3
4.31. ábra. (a) A program, ahogy a lemezen egy állományban tárolódik, (b) Egy egyszerű
(c)
processzus belső memóriaképe. Mindkét ábrán az alsó lemez- vagy memóriacímek
4.30. ábra. Memóriafoglalás, (a) Eredeti állapot, (b) Az A fork-ja után. alul, a felső címek felül vannak
(c) Miután a gyermekprocesszus egy exec-ef hajtott végre. A vonalkázott terület
a szabad memória. A processzusnak kombinált kód- és adatrésze van ződik, akkor az adat- és verem területét mindig fel kell szabadítani. A kódjának le­
foglalt területet csak akkor szabadíthatja fel, ha a processzustáblába segítségével
tos másolata. H a a gyermek elindítja (exec) a C fájlt, akkor a m em ória a (c) álla­ meggyőződött arról, hogy azt nem használja más processzus. Elfordulhat az, hogy
potba kerül. A gyermekprocesszus képe a C-vel helyettesítődik. amennyiben egy processzus kódrészét más processzus is használatba vette, akkor
Megjegyzendő, hogy a gyermeknek lefoglalt régi m em óriaterület még azelőtt a processzus indításakor több m em óriát foglaltunk le, mint amennyit a befejező­
felszabadul, hogy a C-nek helyet foglalnánk, így a C használhatja a gyermek m e­ désekor felszabadítottunk.
m óriaterületét. Ezen a m ódon feltételezve azt, hogy nagy lefoglalatlan m em ória­ A 4.31. ábrán láthatjuk, hogyan van tárolva a program a lemezen lévő fájlban,
blokk létezik, a fork és exec párosok sorozatával a processzusok szomszédosak le­ és hogyan néz ki a m em óriába töltés után M INIX 3-processzusként. A lemezen
hetnek, nem lesz lyuk közöttük, ellentétben azzal, ha az új m em óriát a régi felsza­ lévő fájl fejléce tartalmazza a programkép különböző részeinek és az egésznek
badítása előtt foglaljuk le. Amennyiben az új m em ória még a régi felszabadítása a m éretét. Az inicializálatlan statikus változók tárolására az operációs rendszer
előtt lenne lefoglalva, lyukak maradnának. megnöveli a kép adatrészének m éretét a fejléc bss m ezőjében m egadott értékkel,
A megoldás nem triviális. Példaként tegyük fel, hogy elfogyott a m emória az a hozzáadott részt pedig nullákkal tölti fel. A lefoglalandó m em ória teljes m éretét
exec futtatására. A szabad m emória mennyiségét még az előtt kell megállapítani, a totál mező tartalmazza. H a például egy program kódrésze 4 KB-os, adatrésze a
mielőtt a gyermek memóriáját felszabadítanánk, így a gyermek valamilyen módon bss-sel együtt 2 KB, verme 1 KB-os, és a program fejlécében összesen 40 KB m e­
jelezhetné a hibát. Ez azt jelenti, hogy a gyermek m em óriaterületét lyukként kell mória lefoglalása szerepel, akkor 33 KB kihasználatlan memória lesz az adat- és a
kezelni, annak ellenére, hogy az még használatban van. veremszegmens között. A lemezen levő programfájl tartalm azhatja a szimbólum­
A fork vagy az exec rendszerhívásnál mem óriát kell foglalni az új processzusnak. táblát is; ez a nyomkövetéshez kell, és nem töltjük be a memóriába.
Az első esetben pontosan ugyanannyit, mint a szülőprocesszus m érete. A második H a a programozó tudja, hogy az a.out nevű program adat- és veremszegmensé­
esetben a PM a végrehajtandó fájl fejlécéből határozza meg a processzus méretét. nek együttes növekedése legfeljebb 10 KB, akkor a fájl fejlécében levő adat meg­
M iután ez a memóriafoglalás lezajlott, a processzus semmilyen m ódon sem tud változtatására kiadhatja a
magának több m em óriát szerezni.
Az eddig elm ondottak olyan program okra vonatkoztak, amelyek kombinált chmem =10240 a.out
kód- és adatrésszel lettek fordítva. Az olyan programok, amelyeknek szeparált
kód- és adatrésze van, élvezhetik ennek az előnyeit, egy fejlettebb m em óriake­ parancsot, amely megváltoztatja a fejléc mezőt annak érdekében, hogy az exec hí­
zelési módot, az osztott kódot használva. Amikor egy ilyen processzus végrehajt vásakor a PM a kód- és adatszegmens m éreténél 10 240 bájttal többet foglal le. A
egy fork-ot, akkor elég csak az adat- és verem terület m ásolatának helyet foglalni, a fenti példánál maradva, így m inden egyes exec híváskor összesen 16 KB-ot fogla­
szülő kódját a gyermekprocesszus is használhatja. Amikor egy processzust exec-kel lunk le. Ebből a felső 1 KB a verem, 9 KB a hézag, ahova a verem- és az adatszeg­
indítunk el, akkor az operációs rendszer átnézi a processzustáblát, hogy egy m á­ mens nyúlhat, ha nagyobbra nő.
sik processzus használja-e m ár a kért kódot. H a igen, akkor elég csak az adatnak Egy olyan program, amely szeparált kód- és adatrészt használ (ezt a szerkesztő
és a veremnek helyet foglalni, és a mem óriában levő kód közösen használható. által a fejlécben beállított bit jelzi), a totál mező csak az adat- és veremszegmens
A közös kód bonyolítja a processzusok befejeződését. H a egy processzus befeje- együttes m éretét tartalmazza. Egy olyan program részére, amelynek a kódrésze
444 4. MEMÓRiAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 445

4 KB, adatrésze 2 KB, verme 1 KB és teljes m érete 64 KB, 68 KB-ot foglal le a A time, stime és times hívások, valamint a ptrace, amely a nyomkövetésnél hasznos,
rendszer (4 KB utasítás és 64 KB adat és verem), ebből 61 KB szolgál az adat és a ugyanilyen okból van itt.
verem futás közbeni növekedésére. Az adatszegmens határát csak a brk rendszer- A reboot az operációs rendszer m inden részében használatos, de elsődleges dol­
hívással lehet módosítani. A brk ellenőrzi, hogy az adatszegmens új m érete ütkö­ ga egy szignál segítségével ellenőrzött m ódon leállítani a processzusokat, így a PM
zik-e az aktuális veremmutatóval, ha nem, akkor elvégzi a változtatást. Ez teljes jó hely ennek kezelésére. Ugyanez igaz a svrctl-re is, amelynek a legfontosabb fel­
egészében a processzusnak eredetileg lefoglalt m em óriaterületen belül zajlik, az adata a csere engedélyezése vagy tiltása a PM-ben.
operációs rendszer nem foglal le újabb memóriát. H a az adatszegmens beleütkö­
zik a verembe, akkor a rendszerhívás meghiúsul. Üzenettípus Bemenő paraméterek A válasz
Megemlítünk egy jelentésbeli különbséget. H a a „szegmens” szót használjuk, fork (nincs) Gyermek azonosítója (Gyermek felé: 0)
akkor az operációs rendszer által definiált m em óriaterületre gondolunk. Az Intel exit Kilépési állapot (Nincs válasz, ha sikeres)
processzoroknak belső szegmensregiszterei és szegmensleíró-táblái vannak, ame­ wait (nincs) Állapot
lyek a szegmentálás hardvertámogatásáról gondoskodnak. Az Intel hardverterve­ waitpid Processzusazonosító és opciók Állapot
zőinek szegmensfogalma hasonló, de nem mindenben azonos a M INIX 3-ban hasz­ brk Új méret Új méret
nált szegmenssel. Ebben a szövegben a szegmens szó a M INIX 3 adatstruktúrái ál­ exec A kezdeti verem címe (Nincs válasz, ha sikeres)
tal definiált m em óriaterületként értelmezendő. Amikor a hardverről beszélünk, kill Processzusazonosító és a szignál Állapot
akkor határozottan a szegmensregiszterekre és a szegmensleírókra hivatkozunk. alarm Várakozás ideje (másodperc) Hátralévő idő
Ezt a figyelmeztetést általánosíthatjuk. A hardvertervezők gyakran próbálnak pause (nincs) (Nincs válasz, ha sikeres)
támogatást adni a gépen futó operációs rendszernek, a regiszterek és a procesz- sigaction Szignál száma, új akció, régi akció Állapot

szor egyéb elemeinek elnevezése gyakran visszatükrözi, hogy mire használható az sigsuspend Szignálmaszk (Nincs válasz, ha sikeres)

adott dolog. Ezek a jellemzők gyakran hasznosak az operációs rendszerek íróinak, sigpending (nincs) Állapot

de nem mindig ugyanúgy, ahogy a hardvertervezők előre gondolták. Ez zavarhoz sigproemask Mód, új és régi szignálhalmaz Állapot
sigreturn Környezet Állapot
vezethet, m ert ugyanannak a szónak kétféle értelm e van az operációs rendszer és
getuid (nincs) Valódi és tényleges UID
az alatta levő hardver szempontjából.
getgid (nincs) Valódi és tényleges GID
getpid (nincs) Processzus és szülő azonosítója
setuid Új felhasználói azonosító Állapot
4.7.2. Üzenetkezelés Állapot
setgid Új csoportazonosító
setsid Új azonosító Processzuscsoport azonosítója
Ahogy a M INIX 3 többi komponense, a processzuskezelő is üzenetvezérelt. A rend­
getpgrp Új azonosító Processzuscsoport azonosítója
szer inicializálása után a PM belép a főciklusába, amelyben üzenetekre várakozik,
time Mutató a helyre, ahova az aktuális idő megy Állapot
teljesíti az üzenetben levő kéréseket, és elküldi a válaszokat.
stime Mutató aktuális időre Állapot
A processzuskezelő által kapott üzenetek két kategóriába tartozhatnak. A m a­
times Mutató egy pufferre, a processzus és Az eltelt idő indulás óta
gas prioritású kommunikációra a kernel és az olyan rendszerszerverek között, gyermekórák számára
mint amilyen a PM is, a rendszerértesítő üzeneteket használják. Ezeket a speciá­ ptrace Kérés, processzusazonosító, cím, adat Állapot
lis eseteket a fejezet im plementációról szóló részében tárgyaljuk. A PM-hez be­ reboot Mód (leáll, újraindít, pánik) (Nincs válasz, ha sikeres)
érkező üzenetek többsége a felhasználói processzusoktól származik. A 4.32. ábra svrctl Kérés, adat (a függvénytől függ) Állapot
m utatja a lehetséges üzenettípusokat inputparam étereikkel és a válaszban vissza­ getsysinfo Kérés, adat (a függvénytől függ) Állapot
adott értékeikkel együtt. getprocnr (nincs) Processzusszám
A fork, az exit, a wait, a waitpid, a brk és az exec szorosan kötődik a memória memalloc Méret, mutató a címhez Állapot
lefoglalásához és felszabadításához. A kill, az alarm és a pause rendszerhívások, memfree Méret, cím Állapot
valamint a sigaction, a sigsuspend, a sigpending, a sigmask és a sigreturn szigná­ getpriority Pid, típus, érték Prioritás
lokhoz kapcsolódnak. Ezek szintén hatással vannak a m em óriára, m ert ha egy setpriority Pid, típus, érték Prioritás
processzust megszüntetünk, akkor a hozzá tartozó m emória felszabadul. A hét gettimeofday (nincs) Idő, eltelt idő az indítás óta
get/set rendszerhívás nem foglalkozik a memóriakezeléssel, viszont szorosan kap­
csolódik a processzusok kezeléséhez. M inden más rendszerhívást a fájlrendszer 4.32. ábra. A processzuskezelővel való kommunikációra szolgáló üzenetek, bemenő
vagy a PM kezel. Azért kerültek ide, m ert a fájlrendszer m ár túl bonyolult volt. paramétereik és válaszértékük
446 4. M E M Ó R IA G A Z D Á L K O D Á S 4.7. A M IN IX 3 P R O C E S S Z U S K E Z E L Ő JE 447

Felfigyelhetünk arra, hogy a két utolsónak tárgyalt hívás, a reboot és a svrctl, R E N D SZ E R (SYSTEM ) taszkok, vagy azért, m ert olyanok, mint az ÜRESJÁRAT
nem található meg az 1.9. ábrán. Ez igaz a 4.32. ábra még nem em lített getsysinfo, (IDLE) és a K ERN EL. A kernel processzustáblájában az ezeknek megfelelő be­
getprocnr, memalloc, memfree és getsetpriority hívásaira is. Ezek egyike sem része a jegyzések negatív számokkal vannak jelölve, és ezek a bejegyzések nem szerepel­
POSIX szabványnak és nem a hagyományos felhasználói processzusok kiszolgálá­ nek a processzuskezelő vagy fájlrendszer processzustáblájában. Töm ören, amit
sa a feladatuk. A M INIX 3-rendszer számára lettek létrehozva. Egy monolitikus eddig m ondtunk a fc-adik elemről, azok 0 vagy pozitív k értékekre igazak.
kernellel rendelkező rendszerben ezek a műveletek a kernelbe fordított függvény­
hívásokként lennének megvalósítva. A M INIX 3-ban azonban az operációs rend­
szer részeit képező kom ponensek a felhasználótérben futnak, és ezért további Processzusok a memóriában
rendszerhívásokra van szükség. Egyesek nem sokkal tesznek többet annál, m int­
hogy egy egyszerű interfészt nyújtanak a kernelhívások felé. Kernelhívásoknak A PM processzustábláját mproc-nak hívják, az /src/servers/pm/mproc.h fájlban ta­
nevezzük azokat a hívásokat, amelyek kernelszolgáltatásokat vesznek igénybe a lálható a definíciója. A processzus memóriafoglalását leíró mezőkön kívül néhány
rendszertaszkon keresztül. egyéb információt is tartalmaz. A legfontosabb mező az mp_seg tömb, amelynek
M int már az első fejezetben említettük, bár van sbrk könyvtári függvény, nincs három bejegyzése van a kód-, az adat- és a veremszegmens leírására. Mindegyik
sbrk rendszerhívás. A könyvtári függvény kiszámolja a szükséges m em óriát a pa­ elem egy struktúra, amely a megfelelő szegmens hosszát, virtuális és fizikai címét
ram éterként megkapott növelő és csökkentő tényezők figyelembevételével, és ez­ tartalmazza, bájt helyett m emóriaszeletben (click) megadva. A memóriaszelet m é­
után végrehajt egy brk rendszerhívást a m éret beállítására. Hasonlóan nincs külön rete implementációfüggő, a régi M INIX-verziókban 256 bájt volt, a M INIX 3-ban
rendszerhívás a geteuid és a getegid függvényekhez. A getuid és a getgid hívás egy­ 1024 bájt. Mindegyik szegmensnek m em óriaszelet-határon kell kezdődnie, és m é­
aránt visszaadja az effektív és a valódi azonosítót. Hasonló m ódon a getpid vissza­ rete csak a m emóriaszelet egész számú többszöröse lehet.
adja a hívó processzus és a szülőjének az azonosítóját is (PID). A memóriafoglalás módját a 4.33. ábra szemlélteti, ahol processzusunknak
Az üzenetkezelésnél használt legfontosabb adatszerkezet a table.c-ben dekla­ 3 KB-os kódja, 4 KB-os adatrésze van, majd egy 1 KB-os hézag után a 2 KB-os
rált call vec tábla. Ez tartalm azza a különböző üzeneteket feldolgozó eljárások cí­ verem következik, így a teljes memóriafoglalás 10 KB. A 4.33.(b) ábrán azt az ese­
mét. H a egy üzenet érkezik a PM-hez, akkor a főciklus az üzenet típusát elhelyezi tet láthatjuk, amikor a processzusnak nincs szeparált kód- és adatrésze, ilyenkor
a c a lljir globális változóba. Ezt az értéket használja a call_vec vektor indexeként, a kódszegmens mindig üres, az adatokat és a kódot az adatszegmens tartalmazza.
hogy megtalálja az üzenetet kezelő eljárást. Ez az eljárás hajtja végre a rendszerhí­ Am ikor a processzus a 0-s virtuális címre hivatkozik, akár ráugrik, akár olvassa
vást. Az eljárás által visszaadott értéket a válaszüzenetben elküldi a hívó procesz-
szusnak, hogy tájékoztassa a rendszerhívás sikerességéről vagy sikertelenségéről. Cím (hex) Virtuális Fizikai Hossz
Ez a módszer hasonlít az 1.16. ábrán látott, 7. lépésben alkalmazott rendszerhí- - Verem 0x8 OxdO 0x2
vás-kezelőkre m utató m utatókat tartalmazó táblához, de itt felhasználói szinten
21OK (0x34800) Adat 0 Qxc8 0x7
és nem kernelszinten fut.
Verem
Kód 0 0xc8 0
208K (0x34000)
W ///////, 207K (0x33c00) (b)
4.7.3. A processzuskezelő adatszerkezetei és algoritmusai
Adat
A processzuskezelőnek két fontos adatszerkezete van: a processzusok és a lyukak
táblája. Ebben az alfejezetben ezeket nézzük meg. 203K (0x32c00) Virtuális Fizikai Hossz
A 2.4. ábrán láttuk a processzustábla néhány mezőjét, amelyek egyik része a
Kód Verem 0x5 OxdO 0x2
kernelnek, másik része a processzuskezelőnek, illetve a fájlkezelőhöz kellett. A
MINIX 3-ban az operációs rendszernek ez a három része saját külön processzus­ 200K (0x32000) Adat 0 Oxcb 0x4
táblát használ, amelyben csak az adott részhez szükséges mezők találhatók meg.
Kód 0 0xc8 0x3
Az egyszerűség kedvéért a bejegyzések kevés kivétellel megfelelnek egymásnak,
így a PM táblájának /c-adik eleme ugyanahhoz a processzushoz tartozik, mint a fájl- (a) (c)

rendszer táblájának A:-adik eleme. Amikor egy processzus létrejön vagy megszűnik,
mind a három elem módosítja a saját tábláját, hogy az tükrözze az új állapotot. 4.33. ábra. (a) Egy processzus a memóriában, (b) A memória leírása kombinált kód- és adatrész
Azok a processzusok képeznek kivételt, amelyek nem láthatók a kernelen esetén, (c) A memória leírása szeparált kód- és adatrész esetén
kívül, vagy azért, m ert a kernelbe lettek fordítva, mint az ÓRA (CLOCK) és a
448 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE
449
(azaz utasítás vagy adat), a 0x32000-es (decimálisán 200 KB) fizikai címet használ­ Megosztott programkód
ja; ez a cím a 0xc8-as memóriaszeletben van.
Jegyezzük meg, hogy a verem kezdetének virtuális címe a processzus számára
A verem- és az adatterület tartalm a a processzus végrehajtása alatt változik de a
kezdetben lefoglalt m em ória nagyságától függ. H a a chmem paranccsal módo­
od változatlan marad. Ezért ez utóbbi m egosztható több processzus között ’ame
sítjuk a fájl fejlécét, hogy nagyobb dinamikus területet biztosítsunk (nagyobb a
lyek ugyanazt a program kódot hajtják végre, például több felhasználó egyszerre
hézag a verem- és az adatszegmens között), akkor a verem magasabb virtuális cí­
futtatja ugyanazt a parancsértelmezőt. A megosztott program kóddal vairv rövi­
m en kezdődik. H a a verem m érete egy memóriaszelettel nő, akkor a veremszeg­
den osztott koddal (shared text) hatékonyabb memóriakihasználás érhető el H a
mens bejegyzésének a (0x8, OxdO, 0x2) hármasról (0x7, Oxcf, 0x3)-re kell változnia.
aZf 8)íec egy Processzust, akkor először megnyitja a programfájlt és betölti
Vegyük észre, hogy ebben a példában, ha nem lett volna megnövelve a teljes m e­
a fejlecet. H a a processzus szeparált kód- és adatrészt használ, az mproc táblában
mória m érete, akkor a verem növelése egy m emóriaszelettel megszüntette volna
keres az mp_dev, az m p jn o és az mp_ctime mezőben. Ezek a többi processzus ál-
a helyközt.
3 HVC.®re ajt° tt Programfájlok eszköz- és i-csomópont számát, valamint az álla­
A 8088-as processzoron nincs veremtúlcsordulási hiba, így a M INIX úgy defi­
niálja a vermet, hogy a 32 bites processzorokon is csak akkor lépjen fel hiba, ha dót ha ? Z CJet tartal™azzák- H a egy másik processzus ugyanazt a program kó­
dot hajtja vegre, nem kell a kodot még egy példányban betölteni. Az új processzus
a verem m ár az adatszegmenst írja felül. így ez a változtatás csak a következő brk
rendszerhívásnál történik meg, ahol az operációs rendszer kiolvassa a verem m uta­
tót (SP) és újraszámolja a szegmensbejegyzéseket. Egy olyan gépen, ahol van ve­
remmegszakítás, a veremszegmens m ár akkor növelhető, amikor a verem m utató 0x3dc00
kilép a szegmensből. A M INIX 3 nem így működik a 32 bites Intel processzoro­ Verem
kon; ennek okát a következőkben ismertetjük. (2. proc.)
0x3d400
Korábban m ár em lítettük, hogy a hardvertervezők nem mindig ugyanazt produ­
0x3d000
kálják, mint amit a programozók szeretnének. A Pentiumon még védett módban
sem okoz megszakítást a M INIX 3, ha a verem kinövi a szegmensét. Bár az Intel Adat
hardvere védett m ódban észreveszi a szegmensen kívüli m em ória elérésének kí­ (2. proc.)
sérletét (a szegmens a 4.26. ábrán látható leíróval van definiálva), a M INIX 3-ban Virtuális Fizikai Hossz
0x3c000
az adat- és a veremszegmens leírója mindig ugyanaz. A M INIX 3 által definiált -Verem 0x5 0xf5 0x2
adat és verem ugyanazt a szegmens használja, és a közöttük levő hézagot hasz­
0x34800 - Adat 0 OxfO 0x4
nálhatják növekedésre, azonban ezt csak a M INIX 3 felügyelheti. A processzor Verem
nem veszi észre a hézaggal kapcsolatos hibákat, m ert a hézagot az adat- és a ve­ (1. proc.) - Kód 0 0xc8 0x3
Virtuális Fizikai Hossz 0x34000
rem terület részeként tartja számon. Természetesen azt észreveszi a hardver, ha a
Verem 0x33c00 2. processzus
kom binált adat-hézag-verem területen kívüli mem óriát próbáljuk elérni. Ez arra 0x5 OxdO 0x2
(c)
elég, hogy egy processzust megvédjünk a többi processzustól, de arra nem, hogy Adat 0 Oxcb 0x4 Adat
önmagától is. (1. proc.)
Kód 0 0xc8 0x3
Olyan döntést hoztunk, hogy megosztottuk a hardver által definiált szegmenst,
0x32c00
így a M INIX 3 dinamikusan m éretezheti a hézagot. A másik lehetőség az, hogy az 1. processzus
Kód
adat és a verem külön-külön szegmensben van. Ez ugyan biztonságosabb, de sok­ (a) (osztott)
kal memóriaigényesebb lenne. Mindenki számára rendelkezésre áll a forráskód,
0x32000
hogy kipróbálja a különböző változatokat.
A 4.33.(c) ábra m utatja a szegmensbejegyzéseket szeparált kód- és adatrész ese­
tén. Itt az adat- és a kódszegmens m érete egyaránt nagyobb nullánál. A 4.33.(b) (b)
és (c) ábrán látható mp_seg töm böt elsősorban a virtuális címek fizikai címekre
való leképezésére használjuk. H a adott egy virtuális cím, és az, hogy melyik cím­
.34. abra. (a) Az elozo ábrán latható processzus (szeparált kód- és adatrész) memóriatérképe
térbe tartozik, akkor egyszerű dolog eldönteni azt, hogy a cím legális (azaz a szeg­ (b) A memona elrendezése a második processzus indulása után. A második
mensen belülre esik), vagy nem, és ha legális, akkor könnyen m egadható a hozzá processzus is ugyanazt a megosztott kódot hajtja végre, (c) A második processzus
tartozó fizikai cím. Ezt a leképezést az umap kerneleljárás végzi el például az I/O- memoriatérképe
feladathoz vagy felhasználói térből és a felhasználói térbe másoláshoz.
450 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 451

mp_seg[T\ (kódszegmens) mezője a m ár betöltött kódterületre fog mutatni, csak Amikor egy processzus befejeződik, akkor az adat- és a veremszegmensét vissza
az adat és a verem lesz az újonnan lefoglalt helyen (lásd 4.34. ábra). Ha a procesz- kell láncolni a szabad listába. H a a processzus kombinált kód- és adatrészt hasz­
szus kombinált kód- és adatrészt használ, vagy nem fut még példánya, a 4.33. ábra nál, akkor ezzel az összes számára lefoglalt memória felszabadult, m ert az ilyen
szerint foglalunk memóriát, a kódot és az adatokat is betöltjük a lemezről. processzusok nem foglalnak külön m em óriát a kódjuknak. H a a processzus sze­
A szegmensadatokon kívül az mproc tábla tartalm azza a processzusnak és szü­ parált adat- és kódrésszel rendelkezik, és a processzustábla szerint más procesz-
lőjének az azonosítóját (pid), a valódi és effektív felhasználói és csoportazonosítót szus nem használja ezt a kódot, akkor ezt is fel kell szabadítani. Mivel ilyenkor
(uid, gid), információt a szignálokról és a kilépési állapotot, ha a processzus már a kód- és az adatszegmens nem feltétlenül szomszédos, két memóriaszeletet kell
befejeződött, de a szülője még nem hajtotta végre a wait-et. Az időzítő a sigalarm- visszaadni. M inden visszaadott m em óriaterületet össze kell olvasztani az esetleges
hoz, valamint a gyermekprocesszus által használt összesített felhasználói és rend­ szomszédos lyukakkal, hogy ne fordulhassanak elő egymás melletti lyukak. Em iatt
szeridő is m egtalálható az mproc táblában. A M INIX 3-ban ezeket a feladatokat a lyukak száma, helye és m érete a rendszerműveletek alatt állandóan változik.
a processzuskezelő látja el, ezzel szemben a M INIX régebbi verzióiban ezeket a Amikor minden felhasználói processzus befejeződött, akkor az egész memória új­
feladatokat a kernel látta el. ra a rendelkezésre áll. Ez nem feltétlenül egyetlen lyuk, m ert a fizikai m emóriát
megszakíthatják az operációs rendszer számára használhatatlan területek, például
a 640 KB és 1 MB közötti RO M és I/O-terület az IBM-kompatibilis gépeken.
A lyukak listája

A processzuskezelő másik nagy táblája a lyuktábla, az src/servers/pm/alloc.c-ben 4.7.4. A fork, az exit és a wait rendszerhívás
definiált hole, amely kezdőcím szerint rendezve tartalm azza a lyukakat. Az adat-
és a veremszegmens közötti hézag nem számít lyuknak, m ert az m ár egy procesz- Amikor egy processzus létrejön vagy megsemmisül, akkor m em óriát kell foglalni
szushoz tartozik, ezért nincs benne a szabad lyukak listájában. A lyuktábla minden vagy felszabadítani, és m ódosítani kell a kernel és a fájlrendszer processzustáblá­
eleme három mezőt tartalmaz: a lyuk kezdőcímét és hosszát memóriaszeletben ját. Ezeket a tevékenységeket mind a PM irányítja. A processzusok fork-kal tö rté­
megadva és a következő listaelem címét. A lista egyszeresen láncolt, így könnyű nő létrehozásának és végrehajtásának lépéseit a 4.36. ábrán láthatjuk.
megtalálni egy adott lyuk után következő lyukat, de az előző lyukért az egész listát Mivel egy fork-ot nehéz és kényelmetlen m enet közben leállítani, a PM egy
elölről végig kell keresni. számlálót tart fenn, amely az éppen futó processzusok számát adja meg, így köny-
Az alloc.c teljes forráskódja m egtalálható a mellékelt CD-n. A lyuklistát defi­ nyen eldönthető, hogy van-e szabad hely a processzustáblában. H a a tábla nincs
niáló kód rövid, így megtekinthetjük a 4. 35. ábrán. tele, akkor megkísérlünk m em óriát foglalni a gyermekprocesszusnak. H a a pro­
A lyukak és szegmensek m éretét hatékonysági okokból számoljuk bájtok he­ cesszusnak szeparált kód- és adatrésze van, akkor elég csak az adat- és verem ­
lyett memóriaszeletben. 16 bites m ódban 16 bites számokat használunk a címzés­ szegmensnek helyet foglalni. H a ez a lépés sikerült, akkor a fork biztos, hogy jól
hez, így 1024 bájtos m emóriaszeletben 64 MB m em óriát tudunk címezni, 32 bites működik. Ezután feltölti a lefoglalt memóriát, beállítja a processzustábla bejegy­
módban pedig 232 x 210= 242 bájtot, azaz 4 TB-ot (4096 gigabájtot). zését, választ egy PID-et, és tájékoztatja a rendszer többi részét az új processzus
A lyuklista két fő művelete egy m egadott m éretű m emória lefoglalása és a le­ létrejöttéről.
foglalt m em ória felszabadítása. M em ória lefoglalásához a lyuklista elejétől kezd­ Egy processzus akkor fejeződik be, ha a következő két dolog megtörtént: (1) a
ve keresünk, amíg egy megfelelő m éretű lyukat nem találunk (first fit). A szeg­ processzus kilépett (vagy leállították egy szignállal); és (2) a szülőprocesszus vég-
mensnek a lyukból adunk memóriát, és abban a ritka esetben, amikor a lyuk és a
szegmens m érete pontosan megegyezik, eltávolítjuk a lyukat a listából. Ez a mód­ 1. A processzustábla telítettségének ellenőrzése.________________________________
szer gyors és egyszerű, de külső és belső töredezettséget is okozhat (az utolsó m e­ 2. Memória lefoglalása a gyermekprocesszus adat- és veremszegmensének.________
móriaszeletben akár 1023 bájt is veszendőbe mehet). 3. A szülő adatainak és vermének átmásolása a gyermek területére.________________
4. Szabad bejegyzés keresése a processzustáblában és a szülő adatainak bemásolása.
PRIVÁTÉ struct hole {
5. A gyermek memóriatérképének beírása a processzustáblába.___________________
struct hole *h_next; /* a következő bejegyzésre mutató pointer */
6. A gyermek processzusazonosítójának kiválasztása._________________
phys_clicks h_base; /* hol kezdődik a lyuk? */
7. Informálni a kernelt és a fájlrendszert a gyermekről.___________________________
phys_clicks hjen ; /* milyen nagy a lyuk? */
} hole[NR_HOLES]; 8. Elküldeni a gyermek memóriatérképét a kernelnek.___________________________
9. Elküldeni a választ a szülőnek és a gyermeknek._______________________________
4.35. ábra. A lyuklista egy lyukstruktúrát (struct hole) tartalmazó tömb
4.36. ábra. A fork rendszerhívásnál végrehajtandó lépések
452 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 453

rehajtott egy wait rendszerhívást, hogy megtudja, mi történt. Ha egy processzus 1. A jogok ellenőrzése. Végrehajtható-e a fájl?__________________________________ _
m ár kilépett, vagy leállították, de a szülő még nem hajtotta végre a wait-et, akkor 2. A fejléc beolvasása, amelyből megkapjuk a szegmensek méretét és a teljes méretet.
a processzus felfüggesztett, ún. zombi állapotba kerül. Az ilyen processzus nem 3. A paraméterek és a környezeti változók átmásolása a hívótól.___________________
kerül ütemezésre, és nem kap szignálokat, felszabadítjuk a hozzá tartozó m em ó­ 4. Memória lefoglalása és a hívó processzus memóriájának felszabadítása.___________
riát, de nem távolítjuk el az azonosítóját a processzustáblából. A zombi állapot 5. Betölti az új processzus vermét.______________________________________________
átmeneti, és ritkán tart hosszú ideig. Amikor a szülő végrehajtja a wait-et, akkor a 6. Betölti az új processzus adatait (és kódját)._____________________________________
processzustábla bejegyzése felszabadul, és az operációs rendszer többi része is tu­ 7. A setuid, setgid bitek ellenőrzése, karbantartása._______________________________
domást szerez a processzus befejeződéséről. 8. A processzustábla bejegyzésének kitöltése.____________________________________
A problém a az, hogy mi van akkor, ha a szülőprocesszus m ár leállt. H a nem 9. Tudatni a kernellel, hogy a processzus futtatható._______________________________
teszünk semmit, akkor az összes gyermekprocesszus zombi marad. Ezért meg­
változtatjuk a processzustáblát, hogy az init processzus legyen a szülő. Amikor 4.37. ábra. Az exec rendszerhívásnál végrehajtandó lépések
a rendszer elindul, az init elolvassa az letc/ttytab fájlból a term inálok listáját, és
mindegyikhez elindít (fork) egy bejelentkező processzust. Ezután blokkolódik, és listában egy megfelelő m éretű lyukat, még mielőtt a régi processzus m em óriaterü­
a processzusok leállására vár. Ezen a m ódon gyorsan megszabadulhatunk az árva letét felszabadítanánk. H a először felszabadítjuk a régi területet, és utána a kere­
zombiktól. sés sikertelen, akkor nehéz visszatérni a régi állapotba.
Azonban ez a vizsgálat nagyon szigorú. Olyan esetben is visszautasíthatja az
exec végrehajtását, amikor lenne elég memória. Például tegyük fel, hogy az exec-et
4.7.5. Az exec rendszerhívás hívó processzus 20 KB-ot foglal el, és kódját nem osztja meg más processzusokkal,
a m em óriában egy 30 KB-os lyuk van, és az elindított processzusnak 50 KB-ra van
Amikor a terminálon begépelünk egy parancsot, akkor a parancsértelmezőről le­ szüksége. H a a felszabadítás előtt vizsgáljuk a lyuklistát, akkor úgy találjuk, hogy
válik egy új processzus, amely végrehajtja a kért parancsot. Lehetséges lenne a csak 30 KB szabad hely van, és az exec meghiúsul. H a először felszabadítjuk a régi
fork-ot és az exec-et egyetlen rendszerhívássá összevonni, de két külön rendszer- m em óriaterületet, akkor az exec sikeres lehet, attól függően, hogy az új 20 KB-os
hívást használunk, m ert így egyszerűbb a be- és kim enet átirányításának megvaló­ lyukat összeolvaszthatjuk-e a 30 KB-ossal. A bonyolultabb rendszer-implementá-
sítása. Amikor a parancsértelm ező szétválik, és a szabványos bem enet át van irá­ ciók egy kicsit jobban kezelik az ilyen problémákat.
nyítva, akkor a gyermekprocesszus lezárja a bem enetet, és megnyitja az újat, majd H a olyan processzust akarunk indítani, amelynek szeparált kód- és adatrésze
végrehajtja a parancsot. Em iatt az elindított processzus az átirányított bem enetet van, akkor két lyukat kell keresni a listában, egyet a kód-, egyet az adatszegmens­
örökli. A szabványos kim enetet hasonló m ódon kezeljük. nek. Ennek a két szegmensnek nem kell szomszédosnak lennie.
Az exec a legbonyolultabb rendszerhívás a M INIX 3-ban. Az aktuális m em ória­ Újabb problém a adódhat, ha a processzus virtuális cím teret használ. A gond az,
képet az újjal kell helyettesítenie, beleértve a vermet is. Az új képnek term észe­ hogy a m em óriát nem bájtokban, hanem 1024 bájtos m emóriaszeletben kezeljük.
tesen binárisan kompatibilisnek kell lennie. A futtatandó fájl lehet egy szkript is, Mindegyik memóriaszelet pontosan egy szegmenshez tartozik, nem lehet például
amelyet egy értelmező (például peri) fog futtatni. Ez esetben a bináris kép, am e­ olyan, hogy egy szegmens egyik fele adat, másik fele verem, mivel az egész memó­
lyet a m em óriába kell tölteni, a parancsértelm ező bináris képe a szkript nevével riakezelés m emóriaszeletenként történik.
mint argumentummal. Ebben a szakaszban csak az egyszerű esettel foglalkozunk, Hogy lássuk, miért okoz problém át ez a megszorítás, tekintsük a 16 bites Intel
később amikor az exec megvalósításával foglalkozunk, majd kitérünk a szkript fut­ processzor (8088, 80286) 64 KB-os címterét, ahol 1024 m éretű blokkokkal, 64
tatásához szükséges egyéb feldolgozásra is. Az exec a munkáját a 4.37. ábrán lát­ memóriaszeletünk lehet. Tegyük fel, hogy egy elkülönített adat- és kódszegmens­
ható lépésekben végzi el. sel rendelkező program nak 40000 bájt hosszú kódja, 32770 bájt adata és 32760
Mindegyik lépés több kisebb részből áll, néhány ezek közül meghiúsulhat. Pél­ bájtos verme van. Az adatszegmens 33 m em óriaszeletet foglal el. Bár az utol­
dául lehet, hogy nincs elég m em ória az új processzusnak. Ezért a régi processzus só memóriaszeletnek csak az utolsó 2 bájtja használt, ettől függetlenül az egész
m em óriaképét nem szabad tönkretenni, amíg az exec sikerességéről meg nem bi­ m em óriaszeletet le kell foglalnunk az adatszegmens részére. Együtt nem férnek el
zonyosodunk, így visszaadhatjuk a vezérlést a hívó processzusnak, ha valami hiba 64 memóriaszeletben, bár bájtban m ért összméretük beleférne a virtuális címtérbe.
történt. Normális esetben az exec-nek nincs visszatérési értéke, de ha nem sikerül, Elm életben ez a probléma minden olyan gépen létezik, amely egy bájtnál nagyobb
akkor hibakóddal visszakapja a vezérlést a hívó processzus. m em óriaszelet-m éretet használ, de a gyakorlatban a Pentium szintű processzorok­
A 4.37. ábra néhány lépése több magyarázatot igényel. Az első kérdés, hogy nál ritkán fordul elő, m ert azok nagy (4 GB-os) szegmenseket is megengednek.
van-e elég memória. M iután meghatároztuk, hogy mennyi m em ória kell (ez attól Az a rendszer, amely nem ellenőrzi a ritka, de lehetséges körülményeket, minden
is függ, hogy a kódszegmens megosztható-e más processzusokai), keresünk a lyuk- előzmény nélkül összeomolhat, amikor ezek a körülmények előfordulnak.
454 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 455

A másik lényeges probléma, hogy miként töltsük fel kezdetben a processzus Hogy jobban megértsük ezt a módszert, tekintsük a következő példát. Amikor
vermét. Az exec-et hívó könyvtári függvénynek három param étere van: a felhasználó begépeli az

execve(name, argv, envp); Is -I f.c g.c

ahol a name egy m utató a végrehajtandó fájl nevére, az argv egy m utatótöm bre parancsot, akkor azt a parancsértelm ező feldolgozza, és egy
mutat, amelynek elemei a program parancssori param étereire m utatnak, az envp
hasonlóképpen a környezeti változókat tartalmazza. execve("/bin/ls", argv, envp);
Könnyű lenne úgy im plementálni az exec-et, hogy egy üzenetben adja át ezt
a három m utatót a PM-nek, és az maga olvassa ki a fájlnevet és a két tömböt. könyvtári függvényhívást hajt végre. A két m utatótöm b tartalm a a 4.38.(a) ábrán
Ezután egyenként át kellene vinni az argum entum okat és a környezeti változókat. látható. Az execve eljárás a parancsértelm ező cím tcrében felépíti a 4.38.(b) ábrán
Ez minden elem re egy, de lehet, hogy több üzenetet jelent a rendszertaszk felé, látható kezdeti vermet. A verem változtatás nélkül átmásolódik a PM -hez az exec
m ert a PM nem tudja előre, hogy mekkorák lesznek ezek az adatok. végrehajtása alatt.
E módszer jobb m egértéséhez teljesen más stratégiát választunk. Az execve Amikor végül a vermet az elindított processzus területére másoljuk, az nem a
könyvtári eljárás saját vermet épít fel, és ennek a címét adja át a PM-nek. A verem nullás virtuális címre, hanem a lefoglalt memória végére kerül, a virtuális címet a
felépítése a felhasználói címtérben nagyon hatékonyan megoldható, m ert az egyes fájl fejlécének m em óriam éretet megadó mezője határozza meg. Például legyen ez
objektumok a lokális m emóriában, és nem egy másik címtérben vannak. a teljes m éret 8192, így a program által elérhető legutolsó bájt a 8191-es virtuális
címen van. Ezért a PM -nek a 4.38.(c) ábrán látható m ódon meg kell változtatnia a
\0 t s a 52 \0 t s a 8188 \0 t s a 8188 verem ben levő m utatókat, hogy azok az áthelyezett címekre mutassanak.
/ r s u 48 / r s u 8184 / r s u 8184
Amikor az exec befejeződik, és a program elindul, a verem a 4.38.(c) ábrán látha­
Környezeti
változók =
tó állapotban van, a verem m utató értéke 8136. Azonban megoldásra vár még egy
/ E M 44 / = E M 8180 / = E M 8180
probléma. A végrehajtandó fájl főprogramja valahogy úgy van deklarálva, hogy
0 0 H \0 c 40 0 H \0 c 8176 O H \0 c 8176

■ 1
g \0 c 36 g \0 c 8172 g \0 c 8172 main(argc, argv, envp);
l f \0 I 32 f \0 1 8168 f \0 I 8168
HOME =/usr/ast \o
- \o s I 28 - s 1 8164 - \o s I 8164 Ami a C fordítót illeti, a main is csak egy függvény, nem tudja, hogy a main külön­
0 24 0 8160 0 8160
leges, olyan kódot fordít belőle, amely a három param étert a szabványos C-kon-
venciók szerint kezeli, azaz a legutolsó param éter van elöl. A három param éter­
42 20 8178 8156 8178 8156
nek (egy egész szám és két m utató) a visszatérési cím előtti három szót kell elfog­
0 16 0 8152 0 8152 lalnia a veremben. Természetesen a 4.38.(c) ábra nem így néz ki.
Parancssori 38 12 8174 8148 8174 8148 A megoldás az, hogy a program ne a main függvénnyel kezdődjön. Ehelyett a
argumentumok 34 8 8170 8144 8170 8144 kód nullás címére szerkesztett crtso (C run-time, start-off) nevű, assembly nyelvű
0 31 4 8167 8140 8167 8140 indítóeljárás (-rutin) kapja meg először a vezérlést. Ez először berakja ezt a há­
g.c 28 0 8164 8136 8164 8136
rom szót a verembe, majd egy call utasítással meghívja a main függvényt. A main
— f.c
indulásának pillanatában a verem állapota a 4.38.(d) ábrán látható. Ezzel a trük­
envp 8156 8132
kel a main-t a szokásos m ódon hívhatjuk meg (valójában ez nem trükk, hanem a
-1 argv 8136 8128 hívás szokványos módja).
Is arge 4 8124 H a a programozó a main végén elhanyagolja az exit meghívását, akkor a végre­
return 8120 hajtás visszatér a main-t hívó indítórutinra, amikor a main befejeződik. Mivel a
main egy közönséges függvény, a végére a fordító odarakja a visszatéréshez szüksé­
(a) (b) (c) (d)
ges utasításokat. így a main visszaadja a vezérlést a hívó eljárásnak, és az meghívja
az exit-et. A 32 bites crtso kódjának legnagyobb része a 4.39. ábrán látható. A meg­
4.38. ábra. (a) Az execve-nek átadott tömbök, (b) Az execve által felépített verem. jegyzések világossá teszik az utasítások szerepét. Ami hiányzik, az a környezet ini-
(c) A verem, miután a PM elvégezte a módosításokat, (d) A verem, ahogy a main látja ciaíizálása, amennyiben a programozó nem definiálta, a verembe rakott regiszterek
a végrehajtás indulásakor feltöltése, és néhány sor, ami a lebegőpontos segédprocesszor meglétét jelző állapot­
bitet állítja be. A teljes programkód megtalálható az src/lib/i386/rts/crtso.s fájlban.
456 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELÓJE 457

push ecx ! A verembe rakja a környezeti változók címét Felkészülés: a programkód felkészül egy lehetséges jelre
push edx ! A verembe rakja a paraméterek címét (argv) Válasz: a jel megérkezett és a kód reagált rá______________
push eax ! A verembe rakja a paraméterek számát (argc)
Takarítás: a processzus normális állapotának a visszaállítása
call _main ! main(argc, argv, envp)
push eax ! A verembe rakja a kilépési állapotot
4.40. ábra. A szignálkezelés fázisai
call _exit
hit ! Megszakítás, ha az exit meghiúsul
lezajlik. A szignálra adott válasz a programozó által írt szignálkezelő eljárás le­
4.39. ábra. A C indítórutin (crtso) legfontosabb része futtatása is lehet. A 4.40. ábrán látható harmadik fázis is bekövetkezik. Amikor a
programozó által írt eljárás befejeződik, akkor egy speciális rendszerhívás vissza­
adja a vezérlést a processzus norm ál m űködésére. A programozónak erről nem
4.7.6. A brk rendszerhívás kell tudni, úgy írhatja meg a szignálkezelőt, mint egy közönséges eljárást, az ope­
rációs rendszer gondoskodik a meghívásáról, és befejeződése után rendbe teszi
A brk és sbrk könyvtári eljárásokat használjuk az adatszegmens felső határának a vermet.
állítására. Az előbbi param étere az abszolút m éret (bájtokban mérve), és a brk-t Az előkészítő fázisban számos rendszerhívás van, amelyet a processzus vég­
hívja meg. Az utóbbi az aktuális m érettől való eltérést (ez negatív és pozitív érték rehajthat, hogy megváltoztassa egy szignálra adott válaszát. A legáltalánosabb a
is lehet) kapja meg, kiszámolja az új m éretet, és meghívja a brk-t. Jelenleg nincs sigaction, amellyel m egadhatjuk, hogy a processzus figyelmen kívül hagyjon egy
sbrk rendszerhívás. szignált, saját szignálkezelő eljárást adhatunk meg, vagy visszaállíthatjuk az alap-
Érdekes kérdés, hogy honnan tudja az sbrk az aktuális m éretet az új m éret értelm ezett tevékenységet. A sigprocmask rendszerhívással blokkolhatunk egy szig­
kiszámításához. A megoldást a brksize nevű változó jelenti, ami mindig az aktuális nált, ezáltal a szignálok egy sorba kerülnek, és csak akkor fejtik ki hatásukat, ha
m éretet tárolja. A változó értéke kezdetben a fordítóprogram által beállított szim­ azt a processzus újra engedélyezi. Ezt a hívást bárhol lehet használni, még a szig­
bólum, amely a kód és adat együttes m éretét (egyesített adat- és kódrész esetén), nálkezelő eljáráson belül is. A M INIX 3-ban a szignálkezelés előkészítő szakaszát
vagy csak az adat m éretét (szeparált adat- és kódrész esetén) adja meg. A szimbó­ teljes egészében a PM bonyolítja, mivel a szükséges adatok a PM processzustáb­
lum neve fordítóprogram-függő, így egyik definíciós fájlban sem található meg. A lájában vannak. M inden processzushoz tartozik néhány sig setj típusú, egyébként
brksize. s nevű fájlban van, ennek helye rendszerfüggő, de ugyanabban a könyvtár­ bittérképváltozó, amelyekben minden szignált egy bittel reprezentálunk. Az egyik
ban van, m int a crtso.s. ilyen változó azokat a szignálokat adja meg, amelyeket a processzus figyelmen kí­
A brk egyszerű feladat a processzuskezelő számára. Csak ellenőrizni kell, hogy vül hagy, egy másik azokat, amelyeket elkap, és így tovább. M inden processzushoz
belefér-e még minden a címtérbe, m ódosítani a táblát, és informálni a kernelt. tartozik még egy sigaction struktúrákból álló tömb, amelynek m inden eleme egy
szignálhoz tartozik. A struktúra a 4.41. ábrán látható. A tömbelem tartalmazza
a szignált kezelő eljárás címét és egy sig setj változót, amely megmondja, hogy
4.7.7. Szignálkezelés milyen szignálokat kell a kezelő végrehajtása alatt blokkolni. Ezt a mezőt akkor
használjuk, ha a szignál alapértelm ezett tevékenysége helyett egy saját eljárást
Az első fejezetben úgy írtuk le a szignálokat mint módszert arra, hogy inform á­ akarunk végrehajtani.
ciót küldjünk olyan processzusoknak, amelyek nem feltétlenül várnak inputra. Itt említjük meg, hogy a rendszerprocesszusok, mint például a processzuskeze­
Szignálok halm azát definiáltuk, m inden szignálhoz tartozik egy alapértelm ezett lő, nem tudnak szignálokat fogadni. A rendszerprocesszusok a SYS_M ESS-nek
tevékenység, amely vagy leállítja a processzust, amelyiknek küldték, vagy figyel­ nevezett új kezelőtípust használják, amely tudatja a PM-mel, hogy továbbítsa a
men kívül hagyják. Könnyű dolog lenne a szignálkezelőt implementálni, ha csak szignált egy SYS SIG értesítő üzenetben. A SIG _M ESS üzenetek után nem kell
ez a két lehetőség lenne. Vannak azonban olyan rendszerhívások is, amelyekkel a takarítani.
processzusok megváltoztathatják a szignálokra adott válaszukat. Egy processzus
a sigkill kivételével bármilyen szignált figyelmen kívül hagyhat. Sőt a processzus struct sigaction {
által definiálhatja az adott szignált elkapó szignálkezelő eljárást is, amely végre­ __ sighandler_t sa_handler; /* SIG_DFL, SIGJGN, SIG_MESS vagy egy mutató
hajtódhat, ha egy szignál érkezik. A sigkill-t nem lehet ilyen m ódon kezelni, ha egy a függvényre */
processzus egy sigkill-t kap, akkor azonnal befejeződik. A program ozónak úgy tű­ sigset_t sa_mask; /* a kezelő alatt blokkolandó szignálok */
int sa_flags; /* speciális jelzők */
nik, hogy az operációs rendszer csak kétszer foglalkozik a szignálokkal: az előké­
szítő szakaszban, amikor a processzus m ódosíthatja a szignálokra adott válaszát, }
és a válasznál, amikor a szignál generálódik, és a hozzá tartozó választevékenység 4.41. ábra. A sigaction struktúra
4.7. A MINIX 3 PROCESSZUSKEZELŐJE
459
458 4. MEMÓRIAGAZDÁLKODÁS

M i generálja?
Ha egy szignál generálódik, akkor a MINIX 3-nak több alrendszere is működés­ Szignál Leírás
be lép. Először a PM a fenti adatstruktúrából kitalálja, hogy melyik processzusnak Felfüggesztés KILL rendszerhívás
SIGHUP
kell kapnia a szignált. H a ez elkapja a szignált, akkor meg kell hívni a szignálke­ Megszakítás TTY
SIGINT
zelő eljárását. Ehhez a processzus aktuális állapotát el kell m enteni, hogy később Kilépés TTY
SIGQUIT
visszatérhessünk a normális végrehajtáshoz. Ezt az információt a szignált kapó Illegális utasítás Kernel (*)
SIGILL
processzus vermében tároljuk, így ellenőrizni is kell, hogy van-e elég hely a verem ­ Nyomkövetés Kernel (M)
SIGTRAP
ben. Ezt az ellenőrzést a PM végzi, majd a rendszertaszk rakja a verembe az infor­ Abnormális befejeződés TTY
SIGABRT
mációt. A rendszertaszk állítja át a processzus programszámlálóját, hogy az a szig­ Lebegőpontos kivétel Kernel (*)
SIGFPE
nálkezelőt hajtsa végre. Amikor a processzus szignálkczelője befejeződik, akkor Leállítás (nem kapható el és nem hagyható figyelmen kívül) KILL rendszerhívás
SIGKILL
a sigreturn rendszerhívás hajtódik végre. A rendszerhívás alatt a PM és a kernel is A felhasználó által definiált szignál (1) Nem támogatott
SIGUSR1
közreműködik a processzus regisztereinek visszaállításában, hogy az folytathassa a Szegmentálási hiba Kernel (*)
SIGSEGV
normális működését. H a a processzus nem kapja el a szignált, akkor az operációs A felhasználó által definiált szignál (2) Nem támogatott
SIGUSR2
rendszer az alapértelm ezett tevékenységet hajtja végre, ami lehet, hogy leállítja Eqy olyan adatcsőbe írás, amelyet senki sem olvas FS
SIGPIPE
a processzust, és a fájlrendszert meghíva a lemezen egy core dump (a processzus Ébresztőóra, idő lejárt PM
SIGALRM
m emóriaképe) fájlt készít. Ebben a feladatban részt vesz a kernel, a fájlrendszer, Processzusbefejező szignál KILL rendszerhívás
SIGTERM
valamint a PM. Végül a PM megismételheti, akár többször is, ezeket a tevékeny­ A gyermekprocesszus befejeződött vagy leállt PM
SIGCHLD
ségeket, lehet, hogy egyetlen szignált egy processzuscsoportnak kell elküldeni. Folytatás a megállítás után Nem támogatott
SIGCONT
A M INIX 3 által ismert szignálok a POSIX szabványnak megfelelő /include/ Megállító szignál Nem támogatott
SIGSTOP
signalh fájlban vannak definiálva, listájuk a 4 .4 2 . ábrán látható. M inden kötele­ Interaktív megállító szignál Nem támogatott
SIGTSTP
ző POSIX-szignál definiált a M INIX 3-ban, de jelenleg nem mind tám ogatott. A háttérben futó processzus olvasni akar Nem támogatott
SIGTTIN
Például a POSIX-ban számos szignált találunk a processzusvezérlésre, amivel egy Nem támogatott
SIGTTOU A háttérben futó processzus írni akar
futó processzust a háttérbe vagy vissza helyezhetünk. A M INIX 3 ezt nem tám o­ Kernel
SIGKMESS Kernelüzenet
gatja, így azok a processzusok, amelyek ilyen szignálokat generálnak, nem hozha­ Kernelüzenet függőben Kernel
SIGKSIG
tók át a M INIX 3 alá. A M INIX 3 nem tám ogatja a munkavezérlést, de az ilyen Kernel leáll Kernel
SIGKSTOP
szignált generáló program ok portolhatók rá. Ezeket a szignálokat a rendszer fi­
4.42. ábra. A POSIX és a MINIX 3 által definiált szignálok. A (*)-ga!jelzett szignálok hardverfüggők.
gyelmen kívül hagyja. A munkavezérlést azért nem tám ogatja a rendszer, m ert
Az (M) betűveljelzett szignálokat a POSIX nem támogatja, csak a MINIX 3,
azt arra találták ki, hogy lehetőséget adjon a felhasználónak egy program elindí­
hogy kompatibilis maradjon a régebbi programokkal. A kernelszignálok
tására, majd ettől leválva más feladat elvégzésére. A M INIX 3-mal egy program
MINIX 3-specifikusak, és a kernel generálja őket, hogy értesítse a rendszertaszkokat
elindítása után a felhasználó az alt-F 2 billentyűk lenyomásával tud egy új virtuális a rendszereseményekről. Számos elavult nevet és szinonimát nem soroltunk fel
term inálra váltani, hogy amíg a program fut, valami mást tudjon csinálni. A virtuá­
lis term inálokat a „szegény em ber” ablakozó rendszereként tekinthetjük, amely,
amennyiben a helyi konzol előtt ülünk, szükségtelenné teszi a feladatkezelést és nyújtja. Az operációs rendszer írójának kell megírnia a kódot, hogy a megszakí­
annak szignáljait. A M INIX 3 ezenkívül még definiál néhány nem POSIX-szignált, tásban generálja a szignált. A második fejezetben láttuk, hogy a kernel!exception.c
valamint a régi forráskódok m iatt néhány szinonimát a POSIX-nevekre. tartalm azza ezt a kódot, és csak számos különböző feltétel fennállása esetén haj­
Szignálokat a hagyományos Unix-rendszerekben a kill rendszerhívás és a kernel tódik végre. így egy illegális utasítás végrehajtása esetén a sigill szignál csak 286-os
generálhat. A M INIX 3-ban egyes felhasználói szintű processzusok olyan dolgokat vagy fejlettebb/újabb processzorokon generálódik, ha 8088-ason fut a M INIX 3,
tesznek, amelyek a tradicionális rendszerekben a kernel feladatkörébe tartoznak. akkor soha nem találkozunk ezzel a szignállal.
A 4.42. ábrán m egtekinthető a M INIX 3 által ismert valamennyi szignál és azok Az, hogy a hardver bizonyos feltételek mellett megszakításokat vált ki, meg
származási helye. Speciális billentyűkombinációkkal kezdeményezhetünk sigint, nem jelenti azt, hogy az operációs rendszerek írói teljesen ki is használják eze­
sigquit sigkill szignálokat. A sigalrm szignált a processzuskezelő kezeli. A sigpipe ket a lehetőségeket. Például az Intel 286-ostól kezdve a memóriavédelem sok­
szignált a fájlrendszer generálja. Bármelyik processzusnak bármilyen szignált féle m egsértése válthat ki hibát. A kemel/exception.c-ben levő kód ezekből mind
küldhetünk a kill program segítségével. Egyes kernelszignálok a hardvertől függ­ a sigsegv szignált generálja. Különböző kivételek generálódnak a hardver altal
nek. Például a 8086-os és a 8088-as processzor nem támogatja az illegális műve­ definiált veremszegmens és más szegmensek határtúllépésénél, m ert ezeket a hi­
bákat különbözőképpen kell kezelni. Azonban a M INIX 3 memóriahasznalata
letkódok felismerését, ez a képesség csak a 286-ostól felfele érhető el, ahol meg­
szakítás történik az illegális kódok végrehajtásakor. Ezt a szolgáltatást a hardver miatt a hardver nem tudja az összes előforduló hibát detektálni. A hardver min-
460 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 461

den szegmenshez egy kezdőcímet és egy m éretet rendel. Egy hardverszegmensbe visszatérési címként. A sigreturn visszaállítja az eredeti veremállapotot, így a meg­
összevonva található meg a verem- és az adatszegmens. A hardver által definiált szakított processzus a megszakítás helyétől folytathatja végrehajtását.
szegmenskezdőcím ugyanaz, mint a M INIX 3-ban használt, de a szegmens m ére­ Mivel a szignálküldés utolsó m űveletét a rendszertaszk hajtja végre, itt érdemes
te nagyobb a M INIX 3-ban definiáltnál. A hardver által definiált adatszegmenst azt összefoglalni, hogy m iként adja át a felhasznált adatokat a PM a kernelnek. A
a M INIX 3 csak akkor használhatná el teljes egészében az adatokra, ha a verem szignálkezeléshez az is szükséges, hogy amikor egy processzus szignálkezelője fut,
üres lenne. Hasonlóan a verem csak akkor foglalhatná el a teljes szegmenst, ha és az időosztás miatt egy másik processzus kapja meg a processzort, akkor a pro­
az adatterület m érete nulla lenne. Bár a hardver sokféle memóriavédelmi hibát cesszor visszakapása után a szignálkezelő úgy fusson tovább, m intha semmi sem
észrevesz, nem veszi észre a leggyakoribb veremhibát, amikor a verem beleér az történt volna. Azonban a processzustáblában csak egy hely van a processzusregisz­
adatterületbe, m ert a hardver regisztereiben és leíróiban a verem és az adat terü­ terek értékének m entésére, amelyek az eredeti állapot visszaállításához kellenek.
lete fedi egymást. E rre a problém ára a 4.43. ábrán látható a megoldás. Az (a) ábra m utatja a pro-
Elképzelhető lenne, hogy a kernelhez hozzátegyünk egy olyan kódot, amely,
amint a processzus futási időt kap, mindig megvizsgálná az adott processzus re­
gisztereit, és egy sigsegv szignált generálna, ha a processzus túllépte a M INIX 3 Visszatérési Visszatérési Visszatérési Visszatérési
által megállapított adat- és veremszegmens határát. Ez nem éri meg, m ert nagyon cím cím cím cím
sok pluszutasítás végrehajtását jelentené. Lokális Lokális Lokális Lokális
A PM minden szignált ugyanúgy kezel, függetlenül az eredetétől. H a egy pro­ változók változók változók változók
(processzus) (processzus) (processzus) (processzus)
cesszus egy szignált küld, akkor a PM ellenőrzi, hogy van-e joga hozzá. Egy pro­
cesszus akkor küldhet szignált egy másiknak, ha a küldő egy rendszergazdai Veremkeret Veremkeret
processzus, vagy a küldő processzus valós vagy effektív felhasználói azonosítója (CPU-regiszterek) (CPU-regiszterek)
(eredeti) (eredeti)
megegyezik a fogadó processzus valós vagy effektív felhasználói azonosítójának
E
bármelyikével. Ezenkívül még számos feltétel van, ami a szignálok továbbítását Visszatérési Visszatérési OJ
szabályozza. Például egy zombi processzus nem kaphat szignált. Egy processzus, cím 2 cím 2 I
amely a sigaction meghívásával figyelmen kívül hagy egy szignált, vagy a sigproemask-
Sigframe Lokális változók
kal blokkolja, nem kapja meg az adott szignált. A szignál blokkolása és figyelmen struktúra (sigreturn)
kívül hagyása különböző dolog, m ert a blokkolt szignálok várakoznak, és miután
a processzus feloldja a blokkolást, megkapja a szignálokat. Végül, ha a szignállal Visszatérési
cím 1
megcélzott processzus vermében nincs elég hely az állapot elm entésére, akkor az
operációs rendszer leállítja a processzust. Lokális változók
H a m inden feltétel teljesül, akkor a processzus megkapja a szignált. H a a pro­ (kezelő)
cesszus nem gondoskodott a szignál elkapásáról, akkor nem kell a processzusnak
információt átadni. Ebben az esetben a PM végrehajtja az alapértelm ezett tevé­
kenységet a szignálra, ami általában a processzus leállítását jelenti, de lehet, hogy
core dum p fájlt is létrehoz. Néhány szignálra az alapértelm ezett akció a szignál fi­
Veremkeret Veremkeret Veremkeret
gyelmen kívül hagyása. A 4.42. ábrán látható nem tám ogatott szignálok a POSIX- Veremkeret (CPU-regiszterek) (CPU-regiszterek)
(CPU-regiszterek) (CPU-regiszterek)
ban definiáltak, de mivel a szabványban ez engedélyezett, a M INIX 3 figyelmen (módosított, (módosított,
(eredeti) (eredeti)
kívül hagyja őket. ip = kezelő) ip = kezelő)
A szignál elkapása a processzus saját szignálkezelő eljárásának végrehajtását je­
Előtte A kezelő A sigreturn Vissza a
lenti; ennek a címét a processzustábla sigaction struktúrája tárolja. A második fe­ végrehajtása végrehajtása normális módhoz
jezetben láttuk, hogyan tároljuk a megszakított processzus vermében a processzus
(a) (b) (c) (d)
újraindításához szükséges információt. A verem módosításával érjük el, hogy a
processzus szignálkezelője megkapja param éterként a szignál azonosítóját. Szintén
a verem módosításából következik, hogy a processzus szignálkezelőjének végrehaj­ 4.43. ábra. A processzus verme (felül) és a bejegyzés a processzustáblában (alul) a szignálkezelés
tása után a sigreturn rendszerhívás következik. Ezt a rendszerhívást sohasem hívja egyes fázisai alatt, (a) A processzus állapota, amikor nincs végrehajtás alatt.
meg közvetlenül a felhasználó processzusa. Úgy hajtódik végre, hogy a kernel be­ (b) Az állapot, amikor a szignálkezelő elindul, (c) A sigreturn végrehajtása alatti
lerakja a verembe a címét, így a szignálkezelő befejeződésekor ezt a címet veszi elő állapot, (d) Az állapot, miután a sigreturn befejeződött
462 4. MEMÓRIAGAZDÁLKODÁS 4.7. A MINIX 3 PROCESSZUSKEZELŐJE 463

cesszus megszakítása utáni állapotot. A félbeszakítás időpontjában a regiszterek A M INIX 3-ban az olvasási rendszerhívás E IN T R hibakóddal tér vissza, így a
értéke a kernel processzustáblájába másolódik. Ebben a helyzetben generálódhat­ processzus látja, hogy az olvasás megszakadt egy szignál miatt. Nem egészen nyil­
nak a szignálok, m ert a processzusnak küldött szignálokat egy tőle különböző, m á­ vánvaló annak eldöntése, hogy egy processzus egy rendszerhíváson blokkolt-e.
sik processzus generálja. Mivel a szignált generáló processzus és a szignál célpro­ A PM ezt a fájlrendszertől tudja meg.
cesszus különböző processzusok, így sohasem futhatnak egy időben. A POSIX által ajánlott, de nem kötelező működés az, hogy a read visszatér a szig­
A szignálkezelés előkészítéseként a processzustáblából a regiszterek értéke a nál vételének pillanatáig beolvasott bájtok számával. Az EIN TR visszaadása lehetővé
processzus saját vermébe másolódik, megőrzésre. Ezután egy sigframe struktúrát teszi, hogy riasztást állítsunk be, és elkapjuk a sigalrm szignált. Ez egyszerű módja az
helyezünk a verembe; ez tartalm azza a szignálkezelő befejeződése után a sigreturn időtúllépés megvalósításának, például befejezni a login-1 és megszakítani a m o­
által használt információkat: a könyvári eljárás címét, amely meghívja a sigreturn-t demvonalat, amikor a felhasználó m eghatározott ideig tétlen.
(rét addrl) és egy másik visszatérési címet (rét addr2), ahol a processzus végrehaj­
tása megszakadt. Amint láttuk, az utóbbi címet nem használjuk a normális végre­
hajtásnál. Felhasználói szintű időzítők
Bár a programozó közönséges eljárásként írja meg a szignálkezelőt, nem a call
utasítással hívjuk meg. A programszámláló értékét módosítjuk úgy a processzus­ A szignálokat leggyakrabban az alvó processzusok program ozott felébresztésére
táblában, hogy amikor a processzus újra végrehajtásra kerül, akkor a szignálkezelő használják. Egy hagyományos operációs rendszerben a kernel vagy a kernelszinten
induljon el. A 4.43.(b) ábra m utatja a szignálkezelő végrehajtása alatti állapotot. futó időzítőmeghajtó kezeli a riasztásokat. A M INIX 3-ban a riasztások kezelésé­
Mivel a szignálkezelő egy közönséges eljárás, a befejeződésekor a rét addrl-ct ki­ ért a processzuskezelő a felelős. Ezzel a kernel egyszerűbbé válik és a terhelése
vesszük a veremből, és végrehajtjuk a sigreturn-t. is csökken. H a az igaz, hogy m inden 1 kódsorra szükségképpen b hiba jut, akkor
A 4.43.(c) ábra mutatja a sigreturn végrehajtása alatti állapotot. A sigframe fennma­ ebből logikusan következik, hogy egy kisebb kernel kevesebb hibalehetőséget rejt.
radó része most a sigreturn lokális változóit tartalmazza. A sigreturn tevékenységének Amennyiben a hibák száma nem is változott, a hatásuk kevésbé lesz kritikus, mivel
része a veremmutató kiigazítása, hogy amikor befejeződik, mint egy normális eljárás, nem a kernelszinten, hanem a felhasználói térben fejtik ki hatásukat.
akkor a rét addr2 címet használja visszatérési címként. Azonban a sigreturn nem ilyen Tudunk-e úgy riasztásokat kezelni, hogy ne függjünk a kerneltől? A M INIX 3-ban
módon fejeződik be, hanem a többi rendszerhíváshoz hasonlóan úgy, hogy a kernel a válasz term észetesen nemleges. A riasztásokat és a hozzá tartozó időzítőket első­
ütemezője dönthet: átvált egy másik processzus végrehajtására. Végül is a processzus ként a kernelszintű időzítőtaszk kezeli egy láncolt listában vagy várakozó sorban;
újra ütemezésre kerül, és ezen a címen folytatódik tovább, m ert ez a cím van a kernel ez látható a 2.49. ábrán. A várakozási sor elején lévő időzítők lejárati ideje az óra
processzustáblájában. Ez a cím azért van benne a veremben is, mert így a felhasználó integrált áram kör m inden megszakítására összehasonlítódik az aktuális idővel, és
nyomon követheti a programot, és ez a cím bírja rá a nyomkövetőt a verem helyes amennyiben lejárt, akkor az időzítőtaszk főciklusa aktiválódik. Az időzítőtaszk ha­
használatára, amikor a szignálkezelőt futtatja. A verem mindig úgy néz ki, mint a tására egy értesítés lesz kiküldve a riasztást kérő processzusnak.
rendes processzusoknál: a lokális változók a visszatérési cím felett vannak. A M INIX 3 innovációja, hogy a kernelszintű időzítők csak rendszerprocesz-
A sigreturn igazi feladata a szignál fogadása előtti állapot visszaállítása. A leg­ szusokat szolgálnak ki. A processzuskezelő egy másik várakozási sort kezel a ri­
fontosabb, hogy a processzustáblában a regiszterek értékét a verembe m entett asztást kérő felhasználói processzusnak. Csak a várakozási sor elején található
másolat alapján visszaállítsa az eredeti értékre. Am ikor a sigreturn befejeződik, ak­ processzusnak kér riasztást az órától a processzuskezelő. Amennyiben nem kerül
kor a 4.43.(d) ábrán látható helyzetbe jutunk, amelyben a processzus újra ütem e­ új kérés a várakozási sor elejéhez, nem szükséges kérést intézni az órához sem.
zésre vár, abban az állapotban, ahogy megszakították. (Mivel az időzítőtaszk nem kommunikál közvetlenül egyetlen más processzussal
A legtöbb szignál alapértelm ezett tevékenysége a processzus leállítása. A PM- sem, ezért a riasztáskérelem az időzítőtaszktól a rendszertaszkon keresztül kerül
nek kell arra figyelnie, hogy mely szignálokat nem kezel le, blokkol vagy hagy fi­ a processzusokhoz.) Amikor a rendszer az óramegszakítás után lejárati riasztást
gyelmen kívül a szignált kapó processzus. H a a szülőprocesszus várakozik, akkor detektál, értesítést küld a processzuskezelőnek. A PM az ezután szükséges összes
a leállított processzust eltávolítja a processzustáblából. H a a szülő nem várakozik, teendőt ellátja: ellenőrzi a saját időzítő várakozási sorát, jelez a felhasználói pro­
akkor a processzus zombivá válik. Bizonyos szignálokra (például a sigquit) a pro­ cesszusoknak, illetve amennyiben van még aktív riasztási kérelem a várakozási so­
cesszuskezelő az aktuális könyvtárban egy core dump fájlt készít a processzusról. rának elején, akkor igényel egy újabb riasztást.
Könnyen m egtörténhet, hogy egy olyan processzus kap szignált, amely blokkolt, Az eddig leírtakból még nem tűnik úgy, hogy a megoldás sok feladatot venne le
m ert read-re várakozik egy olyan terminálon, amelyen éppen nincs elérhető adat. a kernel válláról. Azonban vannak más megfontolások is. Először is, előfordulhat,
H a a processzus nem kapja el a szignált, akkor a szokásos módon leállítható. H a el­ hogy több időzítő is lejár egy órajelre. Az, hogy két processzus egy időben kérjen
kapja, akkor felmerül a kérdés, hogy mit csináljunk a szignál feldolgozása után. T ér­ riasztást, valószínűtlennek tűnhet. Azonban annak ellenére, hogy az időzítőtaszk
jen vissza a processzus a várakozáshoz, vagy folytatódjon a következő utasításnál? m inden integrált áram kör megszakítására megvizsgálja a lejárati időket, mint azt
464 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 465

m ár láttuk, a megszakítások időnként le vannak tiltva. Egy PC BlOS-hívás elegen­ visszaadja a valódi és az effektív értéket, amelyet a getgid és a getegid függvény
dő megszakítást okozhat ahhoz, hogy sok m unkára legyen szükség az elmaradás használ fel. Ugyanígy működik a getpid, a processzus és a szülőprocesszus azo­
behozásához. Ez azt jelenti, hogy az időzítőtaszk által kezelt idő több órajelet is nosítójával tér vissza, a setuid és a setgid is egyszerre állítja a valós és az effektív
ugorhat, így m ár könnyen lehetséges, hogy több processzusnak is egyszerre jár le értéket. Két további rendszerhívás van ebben a csoportban, a getpgrp és a setsid.
az időzítője. Mivel ezeket a processzuskezelő kezeli, a kernelszintű kódnak nem Az előbbi a processzus csoportazonosítóját adja vissza, az utóbbi pedig beállítja
kell átfutnia a láncolt listáit a takarításhoz és többszörös értesítés generálásához. azt az aktuális processzusazonosító értékére. Ez a hét művelet a legegyszerűbb
Másodszor, a riasztásokat le lehet mondani. A felhasználó processzusa még az­ M INIX 3-rendszerhívás.
előtt befejeződhet, hogy a kért időzítő lejárt volna. Az is előfordulhat, hogy az idő­ A ptrace és a reboot rendszerhívásokat szintén a PM hajtja végre. Az előbbi a
zítő csak azt biztosította, hogy a processzus ne várjon végtelen sok ideig egy adott program ok nyomkövetését segíti, az utóbbi több szempontból is hatással van a
eseményre. Amint ez az esemény bekövetkezik, az időzítőt lemondják. Azzal, rendszerre. Azért tartozik a PM-hez, m ert az első dolga az, hogy az init kivételével
hogy a processzuskezelő foglalkozik a lemondásokkal, sok terhet vesz le a kernel az összes processzust leállítsa egy szignállal. Ezután, hogy befejezze a munkáját,
válláról. A kernelszintű láncolt listáknak csak az első elemével kell foglalkozni, meghívja a fájlrendszert és a rendszertaszkot.
vagy amikor az lejárt, vagy amikor a processzuskezelő megváltoztatja azt.
Az időzítők megvalósítása érthetőbb lesz, ha most teszünk egy kis kitérőt a ri­
asztást kezelő függvények bem utatására. Nehéz teljes képet adni egy-egy függvény
megismerésével a riasztás kezelésről, mivel nagyon sok függvényt használunk úgy 4.8. A MINIX 3 processzuskezelőjének
a kernel, m int a processzuskezelő kódjából.
Amikor a PM beállít egy riasztást a felhasználói processzusnak, a set_alarm implementációja
függvényt használja az időzítő beállítására. Az időzítőstruktúra tartalmazza töb­
bek között a lejárati időt, a riasztást igénylő processzus azonosítására szolgáló m e­ A PM m unkájának általános ism eretében most lássuk magát a kódot. A PM teljes
zőt, valamint egy m utatót, amely a végrehajtandó függvényre mutat. A riasztások egészében C-ben íródott, a forráskód megjegyzésekkel ellátott, így a legtöbb rész
kezelésére ez mindig a causejigalarm függvény. A következő lépésben a rend­ feldolgozása nem hosszú vagy bonyolult feladat. Először röviden áttekintjük a de­
szertaszkot megkérik egy kem eíszintű riasztás beállítására. Am ikor az időzítő le­ finíciós (header) fájlokat, majd a főprogram ot, végül az előbbiekben ism ertetett
jár, a kernel figyelő processzusa, a cause jila rm lefut, és elküld egy értesítést a pro­ rendszerhíváscsoportokhoz tartozó fájlokat.
cesszuskezelőnek. Ebben a folyamatban több függvény és m akró is szerepel, de az
értesítést végül a T M g etjvo rk függvénye kapja meg. A PM főciklusa detektálja az
értesítést mint SYN _A LA R M üzenetet, és ezután meghívja a PM pm_expirejim ers 4.8.1. A definíciós fájlok és az adatszerkezetek
függvényét. Ezután a PM térben több más függvény is lefut. A trnrs exptimers
könyvtári függvény hatására lefut a figyelő causejigalarm függvénye, amely meg­ A PM forráskönyvtárában számos ugyanolyan nevű fájl van, mint a kernel és a fájl-
hívja a checksig függvényt, az pedig a sig_proc függvényt. A sigjjroc eldönti, hogy rendszer forráskönyvtárában. Saját környezetükben ezek a fájlok hasonló funkciót
leállítsa-e a processzust, vagy küldjön egy SIG A L M üzenetet. Végezetül a szignál töltenek be. A struktúrák párhuzamos tervezése m iatt könnyebben m egérthető az
küldéséhez szükség van a kernelszintű rendszertaszk segítségére is, mivel m anipu­ egész M INIX 3 szerkezete. A PM még sok egyedi nevű saját definíciós fájllal is ren­
lálni kell a processzustáblát, és a processzus terében lévő verm et is. Ez látható a delkezik. Hasonlóan a rendszer más részeihez, a globális változók a PM-nél is a
4.43. ábrán. table.c fájlban találhatók. Ebben az alfejezetben a definíciós fájlokat és a table.c-1
vizsgáljuk meg.
Mint a M INIX 3 többi fő részének, a processzuskezelőnek is van egy fő definí­
4.7.8. Egyéb rendszerhívások ciós fájlja, a pm .h (17000. sor). E zt m inden fordításnál felhasználjuk, és ez illeszti
be a tárgymodulokhoz szükséges definíciós fájlokat a teljes rendszerre vonatkozó
A PM néhány további rendszerhívást is lekezel. Valós idejű órákkal foglalkozik a /usr/include könyvtárból és alkönyvtáraiból. A kemel/kemel.h-bán beillesztett leg­
time és az stime. A times visszaadja a processzus naplózott időit. Azért vannak itt több fájlt itt is használjuk. A PM-hez szükségesek még az include/fcntlh és az
kezelve, m ert a PM kényelmes hely erre. (Egy másik idővel kapcsolatos hívásra az include/unistd.h fájlban levő definíciók. A PM saját const.h, type.h, proto.h és glo.h
utime-ra még visszatérünk, amikor az 5. fejezetben a fájlrendszert kezeljük, mivel változatát szintén beilleszti a pm.h. Hasonló struktúrát láthattunk a kernelben.
a módosítási időket az i-csomópont szerkezet tárolja.) A const.h (17100. sor) a PM által használt konstansokat definiálja.
A getuid és a geteuid könyvtári függvények egyaránt a getuid rendszerhívást A type.h jelenleg nem használt, csak azért létezik ilyen vázformában, hogy a
használják, amely mindkét értéket visszaadja. H asonlóan a getgid rendszerhívás PM -ben a fájlok ugyanolyan szerkezetűek legyenek, mint a M INIX 3 többi részé­
466 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 467

ben. A proto.h (17300. sor) azokat a függvénydefiníciókat gyűjti egybe, amelyek a 2. Az s a jn a s k mező sig setj típusú, és meghatározza, hogy mely szignálokat kell
PM -ben m indenütt szükségesek. blokkolni, amíg a szignálkezelő fut.
Egyes függvények (17313. és 17314. sor) áldefiníciójára (dummy) is szükség van, 3. Az sa Jlags mező a szignálhoz használt állapotbiteket tartalmaz.
amikor a cserét befordítjuk a M INIX 3-ba. Azzal, hogy a m akrókat ide helyeztük,
egyszerűvé tettük a csere nélküli fordítást. H a nem így lenne, akkor ezeknek a Ez a tömb flexibilis szignálkezelést tesz lehetővé.
függvényhívásoknak az eltávolítását sok más forrásfájlban is el kellene végezni. Az mp Jlags mező különféle bitek gyűjteménye, mint ahogyan ez jelezve van a
A PM globális változóit a glo.h-ban (17500. sor) deklaráltuk. Az E X T E R N hasz­ fájl végén. A mező típusa előjel nélküli egész, 16 bites a kisebb gépeken, és 32 bi­
nálatával ugyanazt a trükköt alkalmazzuk, mint a kernelben, nevezetesen, hogy az tes 386-ostól felfelé.
E X T E R N egy makró, ami extern-re fejtődik ki, kivéve a table.c fájlban. Itt null érté­ A következő mező a processzustáblában az m p jjrocargs. Amikor elindul egy új
kű lesz, így az EX TE RN -ként deklarált változókhoz tárolóterület is rendelhető. processzus, akkor a verem a 4.38. ábrán látható m ódon épül fel, és ebben a mező­
Az első ilyen változó, az mp, egy m utató az mproc struktúrára, amely a procesz- ben tároljuk az új processzus argv tömbjének m utatóját. Ezt a ps parancs használja
szustábla PM -hez tartozó részében található, és a feldolgozás alatt lévő hívást fel. Például a 4.38. ábrán a 8164 értéket tárolnánk itt, azért, hogy ezt a ps ki tudja
kezdeményező processzushoz tartozó adatokat tartalmazza. A második változó a majd írni a parancssorra,
procsjn_use számon tartja, hogy a processzustáblának hány használt bejegyzése
van, így könnyű eldönteni, hogy a fork végrehajtható-e. Is -I f.c g.c
Az m j n üzenetpuffer a kérésüzenetek tárolására szolgál. A who az aktuális
processzus indexe, az ha olyankor hajtjuk végre, amikor az Is még aktív.
Mint látni fogjuk, az m p jw a p q mezőt a M INIX 3-ban nem használjuk. Akkor
mp = &mproc[who]; használjuk csak, amikor a csere engedélyezve van. Ilyenkor egy cserét váró pro­
cesszusokat tartalm azó várokozási sorra m utat. Az m p je p ly m ezőben készül a vá­
m iatt az m p-hez kapcsolódik. Am ikor egy üzenet érkezik, kivesszük belőle a rend­ laszüzenet. A régebbi M INIX-verziókban egy hasonló mező volt definiálva aglo.h
szerhívás számát, és a c a lljir változóba helyezzük. fájlban, és lefordítva a table.c fordítása során. A M INIX 3-ban az üzenetek össze­
H a egy processzus abnormálisán fejeződik be, akkor a M INIX 3 egy fájlba írja állításához szükséges terület m inden processzusnak külön-külön a rendelkezésére
a processzus m em óriaképét. A fájl nevét a corejiam e határozza meg. A co re jse t áll. Azzal, hogy m inden processzustábla sorhoz egy-egy választerület van biztosít­
egy bittérkép, amely megadja, hogy milyen szignálok okozzanak ilyen befejező­ va, a PM akkor is képes a bejövő üzenetek kezelésére, amikor a válaszüzenetet
dést, az ig n js e t pedig egy bittérkép a figyelmen kívül hagyható szignálokról. Fi­ nem lehet az összeállítása után azonnal elküldeni. A PM nem tud egyszerre több
gyeljünk arra, hogy a corejiam e extern-ként és nem EXTERN -ként van deklarál­ kérést kezelni, de amennyiben szükséges, a válaszokat el tudja halasztani, és meg­
va. A c a llje c tömb szintén extern-ként van deklarálva. Az okokra a table.c ismer­ próbálhatja utolérni saját magát azzal, hogy amikor az egyes kéréseket kiszolgálta,
tetése során térünk ki. nekiállhat kiszolgálni a még függő kéréseket.
Az mproc.h fájlban (17600. sor) van a processzustáblának a PM-hez tarto­ A processzustábla utolsó két eleme nagyzolásnak tűnhet. Az m p nice helyet
zó része. A legtöbb mezőt jól leírja a hozzá tartozó megjegyzés. Néhány mező a biztosít arra, hogy a processzus udvariasságát jelezze (nice), így a felhasználók le-
szignálkezeléssel áll kapcsolatban, az m pjgnore, az m p ja tc h , az m pjig2m ess, az csökkenthetik a processzusaik prioritását, például azért, hogy teret adjanak egy
m pjigm ask, az m p jig m ask2 és az m pjigpending bittérképekben m inden bit a fontosabb processzusnak. A M INIX 3-ban azonban ezt a mezőt belső használatra
processzusnak elküldhető szignált reprezentál. A sigset t típus 32 bites egész, így a is alkalmazzuk, mégpedig a rendszerprocesszusok (szerverek és eszközmeghaj­
M INIX 3 32-féle szignált tám ogathat. Jelenleg 22 szignál van definiálva, de mivel tók) szükségleteitől függő különböző prioritásainak beállítására. Az m p j a m e
a POSIX megengedi, jelenleg nincs mind támogatva. A z első szignálhoz tartozik mező segítségével a programozó kényelmesen megtalálhatja hibakeresés közben
a legkisebb helyi értékű (jobb oldali) bit. A POSIX szabványos függvényeket de­ a megfelelő processzustáblasort a m em óriam entésben. Van egy olyan rendszerhí­
finiál, amelyekkel a bittérképpel reprezentált szignálhalmazba be lehet tenni egy vás, amely a processzustáblában keres processzusnév alapján, és visszaadja a pro­
szignált, vagy ki lehet venni egyet anélkül, hogy a program ozónak tudnia kellene cesszus ID-jét.
részletekről. A szignálkezelésben fontos az m p sig a ct tömb. M inden szignáltípus­ Végezetül megemlítjük, hogy a processzustábla processzuskezelőhöz tartozó
hoz tartozik egy sigaction típusú elem (ez a struktúra az include/signaih fájlban része egy N R PROCS (17655. sor) töm bként van deklarálva. Emlékezzünk rá,
van definiálva). A sigaction struktúra három mezőt tartalmaz: hogy a processzustábla kernelhez tartozó része N R TASKS + N R PROCS töm b­
ként volt deklarálva a kemel/proc.h fájlban (5593. sor). Mint m ár az előzőkben el­
1. Az sa Jiandler mező adja meg, hogy a szignált alapértelm ezés szerint vagy sa­ mondtuk, az olyan felhasználói szintű processzusok, mint például a processzuske­
ját eljárással kell kezelni, esetleg figyelmen kívül kell hagyni.
468 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 469

zelő, nem tudnak a kernelbe fordított processzusokról. Ezek valójában nem első 4.8.2. A főprogram
osztályú processzusok.
A következő fájl, a param.h (17700. sor) olyan m akrókat tartalm az, amelyek­ A PM -et a kerneltől és a fájlrendszertől függetlenül fordítjuk. Ebből következik,
kel a rendszerhívások elérik param étereiket. Tartalmaz még tizenkettő m akrót a hogy saját főprogramja van, amely akkor indul el, amikor a kernel inicializálta
válaszüzenet mezőihez, valamint három makrót, amelyeket csak a fájlrendszerhez önmagát. A belépési pont a main.c 18041. sorában van. M iután a z p m j n i t meg­
küldött üzenetekben használunk. Példaként, amennyiben a kifejezés: hívásával inicializálta magát, a PM belép a 18051. sorban levő ciklusba. A ciklus­
m agban meghívja a g etjvork-ot, amely a bejövő üzenetekre várakozik. Ezután a
k = mjn.pid; kérés feldolgozására meghívja a c a llje c -bői kiválasztott do_X X X eljárást, és vé­
gül visszaküldi a választ, ha szükséges. Ez m ár ismerős konstrukció, így működik
megjelenik egy fájlban, amelyben a param.h be van illesztve, a C előfeldolgozó az I/O is.
fordítás előtt a Az előző leírás egy kicsit leegyszerűsített. M int ahogyan a 2. fejezetben em lítet­
tük, bármelyik processzusnak küldhetünk értesítő üzenetet. Ezeket a c a l l j r m e­
k = m jn.m l _i1; ző speciális értékeivel jelezzük. A 18055-18062. sorokban két, a PM által fogadha­
tó értesítő üzenet típust szűrünk ki, amelyek hatására a megfelelő kódrész végre­
alakra konvertálja (17707. sor). hajtódik. A valid j a l l j r üzenethez is tartozik egy szűrő a 18064. sorban, mielőtt
Mielőtt a végrehajtható kóddal folytatnánk, nézzük meg a table.c-t (17800. sor). még kísérletet tennénk a kérés végrehajtására (18067. sor). Annak ellenére, hogy
Fordítás során itt allokálódnak nglo.h-ban és az mproc.h-bán EXTERN -ne\ dekla­ a helytelen kérés valószínűtlen, érdem es letesztelni, mivel a teszt nagyon olcsó, és
rált globális változók. A enélkül a következmények súlyosak lehetnek.
Egy másik említésre m éltó rész a sw a p jn hívás a 18073. sorban. Mint m ár em ­
#define_TABLE lítettük a proto.h-val kapcsolatban, amennyiben a csere tiltva van (a M INIX 3-ban
ez az alapértelm ezett helyzet), akkor ez egy ál (dummy) függvényhívás, amely
utasítás miatt az EXTERN-bő\ null karakterlánc lesz. Ez ugyanaz a módszer, mint nem tesz semmit. Amennyiben viszont a csere engedélyezve van, akkor ez az a
amit a kernel kódjában láttunk. Mint m ár az előzőkben em lítettük, a corejiam e hely, ahol le kell ellenőrizni, hogy egy processzus behozható-e.
extern-ként és nem E X TE R N -kéni van deklarálva a glo.h-bán. Most megnézzük, Végezetül, annak ellenére, hogy a 18070. sorban található megjegyzés azt jel­
hogy miért. A corejiam e egy inicializáló karakterlánccal van deklarálva. Az ini- zi, hogy ez az a hely, ahol a választ visszaküldik, ez mégsem egészen így van. A
cializálás nem lehetséges egy extern definíción belül. setreply hívására létrejön egy válasz az előzőkben em lített aktuális processzus pro-
A másik fontos dolog a table.c-ben a c a llje c tömb (17815. sor). Ez egy inicializált cesszustábla-bejegyzésében. Ezután a ciklus 18078-18091. sorokban a procesz-
tömb, és így nem lehet E XTERN -kéni deklarálni aglo.h-ban. Amikor egy rendszer- szustábla m inden bejegyzését megvizsgálják, és m inden elküldhető függő választ
hívást kérő üzenet érkezik, kivesszük belőle a rendszerhívás számát, és ezt használ­ elküldenek, kihagyva azokat, amelyeket az adott pillanatban nem lehet elküldeni.
juk a c a llje c indexeként, hogy megtaláljuk a rendszerhívást kezelő eljárást. Azok A g etjvork (18099. sor) és a setreply (18116. sor) eljárás végzi az aktuális üzenet
a számok, amelyekhez nincs rendszerhívás, a n o j y s eljárást hívják meg, amely csak fogadását és a válasz visszaküldését. Mivel a kernelnek nincs saját bejegyzése a
egy hibakódot ad vissza. Megjegyzendő, hogy a c a llje c tömböt a PROTOTYPE processzustáblában, ezért az első függvény kis trükköt alkalmaz, hogy a kerneltől
makróval definiáltuk. Ez egy inicializált függvénytömb, így a PROTOTYPE a leg­ érkező üzenet PM -től származónak játszódjék. A második függvény, mint azt már
egyszerűbb mód arra, hogy a forráskód a klasszikus (Kernighan-Ritchie) és a szab­ em lítettük, nem küldi el valójában a választ, csak beállítja későbbi küldésre.
ványos C-vel is kompatibilis legyen.
Egy utolsó megjegyzés a definíciós fájlokról: mivel a M INIX 3-at még mindig
aktívan fejlesztik, vannak még kiforratlan részek. Az, hogy egyes forrásfájlok a A processzuskezelő inicializálása
pm l-ben a kernelkönyvtárból is illesztenek be definíciós fájlokat, például az egyik
ilyen kiforratlan megoldás. Amennyiben erről nem tudunk, nehéz lehet meg­ A m a in .c fájlban a leghosszabb eljárás a PM -et inicializáló p m jn it. Ezt a rendszer
találni egyes fontos definíciókat. Azokat a definíciókat, amelyeket több fontos indulása után többet m ár nem használjuk. Annak ellenére, hogy a szervereket és
MINIX 3-komponens is használ, az includel könyvtárban lévő definíciós fájlokban a m eghajtókat külön-külön fordítjuk le és külön-külön processzusban futnak, kö­
kellene elhelyezni. zülük egyeseket indításkor a betöltési memóriakép (boot image) részeként betölt
a betöltési felügyelőprogram. Nehéz elképzelni egy operációs rendszer m űködé­
sét PM vagy fájlrendszer nélkül, így induláskor ezek a részek valószínűleg mindig
betöltődnek. Egyes eszközmeghatjók szintén a betöltési mem óriakép részei. Bár a
470 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELÓJÉNEK IMPLEMENTÁCIÓJA 471

cél az volt, hogy minél több M INIX 3-meghajtó legyen önállóan betölthető, nem cs ds kód adat bss verem
igazán lehetett például a fájlrendszermeghajtó korai betöltését elkerülni. 0000800 0005800 19552 3140 30076 0 kernel
A p m j n i t legfontosabb feladata az előre betöltött processzusok futásához szük­ 0100000 0104c00 19456 2356 48612 1024 pm
séges PM -táblák inicializálása. M int már em lítettük a PM két fontos adatszer­ 0111800 011c400 43216 5912 6224364 2048 fs
kezetet kezel: a lyuktáblát (vagy üresm em ória-tábla) és a processzustábla egy 070e000 070f400 4352 616 4696 131072 rs
részét. Először a lyuktábláról beszélünk. A m em ória inicializálása komplikált.
Egyszerűbb lesz megérteni, ha először megtekintjük a memória szervezését a PM 4.44. ábra. A betöltési felügyelöprogram által kiírt első néhány betöltési memóriakép
indítása közben. A M INIX 3 m inden információt biztosít ehhez. komponens memóriahasználata
M ielőtt a M INIX 3 betöltési memóriaképe betöltődik a memóriába, a betöltési
felügyelőprogram meghatározza a rendelkezésre álló m emória felépítését. Az in­ betöltötte a kernelt a 0x800 címtől kezdődő üres m emóriába. A PM, a fájlrend­
dítóm enüben az e s c billentyű lenyomásával tekinthetjük meg az indítóparam éte­ szer, a reinkarnációs szerver és más komponensek, amelyek itt nem jelennek meg,
reket. Egy sor a képernyőn az üresmemória-blokkokat m utatja az alábbi módon: az 1 M B-tól kezdődő üresmemória-blokkba töltődtek be. Ez egy tervezői döntés
volt, 588 KB alatt elegendő m em ória m aradna még ezeknek a komponenseknek.
memory= 800:923e0,100000:3df0000 Amikor azonban, mint a példánkban is, a M IN IX 3-at nagy blokkgyorsítótárral
fordítjuk, a fájlrendszer nem fér el a kernel fölötti térben. Egyszerűbb volt, de
(A M INIX 3 indítása után is meg tudjuk ezt tekinteni a sysenv parancs segítsé­ semmiképpen sem elemi fontosságú, m indent a magasabb memóriarégiókba töl­
gével vagy az F5 billentyű lenyomásával. A pontos számok term észetesen mások teni. Ezzel semmit sem veszítettünk, futás közben a m emóriakezelő a többi me­
lehetnek.) móriarészhez hasonlóan felhasználhatja ezt az 588 KB alatti lyukat.
Ez két üresmemória-blokkot ír le. Ezenfelül két foglalt memóriablokk is van. A PM inicializálása, a hamis riasztások elkerülése végett egy ciklussal kezdő­
A 0x800 cím alatti memória a BIOS adatait, az elsődleges indítórekordot (m aster dik, amely során letiltja a processzustáblában található m inden elem időzítőjét.
boot record) és az indítóblokkot tartalmazza. A pontos felhasználás valójában Ezután a mellőzendő, illetve a szemetet tartalm azó memóriakiírásokat (core
nem érdekes, és nem is áll rendelkezésünkre a betöltési felügyelőprogram indítá­ dump) okozó szignálokat definiáló globális változók lesznek inicializálva. A követ­
sakor. A 0x800 címen kezdődő üres memória az IBM-kompatibilis gépek „alap- kező lépésben az előbb látott m em óriahasználatot dolgozzuk fel. A 18182. sorban,
m em óriá”-ja (base memory). Ebben a példában a 0x800 (2048) címtől kezdődően mint az előzőkben szintén láttuk, a rendszertaszk megkapja a betöltési felügyelő­
0x923e0 (599008) bájt áll a rendelkezésünkre. E fölött van 640 KB-től 1 MB-ig program memória karakterláncát. A mi példánkban két bázis:méret pár van, am e­
található „felső m em óriaterület” (upper memory), amely a ROM és dedikált I/O- lyek az üres m em ória blokkjait mutatják. Aget_mem_chunks hívás (18184. sor) át­
adapterek RAM részére van elkülönítve, kizárva a hagyományos processzusokat. konvertálja az ASCII karakterláncot binárissá, és beírja a bázis- és m éretértékeket
Végezetül a 0x100000 (1 MB) címtől 0x3df0000 bájt szabad hely van. Ezt a tarto­ azt itt definiált elemekként:
mányt gyakran „kibővített m em óriá”-nak (extended memory) nevezik. A példából
megállapíthatjuk, hogy a gépben 64 MB RAM memória van. struct memory {phys_clicks base; phys_clicks size;};
Amennyiben figyelemmel kísértük a számokat, azt vehettük észre, hogy az üres
memória m érete 638 KB-tál kevesebb, mint vártuk volna. A M INIX 3 betöltési a mem_chunks tömbbe (18192. sor). A mem_chunks tömb még nem a lyuklista, ez
felügyelőprogram igyekszik a lehető legmagasabb memóriacímre betölteni magát. csak egy olyan tömb, amelyben a lyuklista inicializálása előtt gyűjtjük az információt.
Esetünkben 52 KB helyet igényel, így valójában 584 KB üres memória van. Itt cél­ A kernel lekérdezése és a kernel memóriahasználat clickbe való konvertálása
szerű megemlítenünk, hogy a memória sokkal összetettebb is lehet, mint ahogyan után a patch_mem_chunks függvényt hívjuk meg, hogy kivonja a kernel m em ória­
itt felvázoltuk. Például van egy M INIX-lemezt szimuláló MINIX-függvény, amely használatát a mem chunks tömbből. A memória, amely a M INIX 3 indítása előtt
még nem lett átírva M INIX 3-ra és MS-DOS-fájlt használ. Ezért a M INIX 3 be­ használva volt, most a kernel m em óriahasználataként van elkönyvelve. A mem_
töltési felügyelőprogramja előtt be kell töltenünk néhány MS-DOS-komponenst. chunks nem teljes, de a betöltési m em óriaképben lévő normál processzusok által
Amennyiben ezek nem a jelenleg használt m em ória szomszédságában lennének használt memória is el lesz könyvelve a 18201-18239. sorok közötti processzustáb-
betöltve, a betöltési felügyelőprogram több mint két üres régiót jelezne. la-bejegyzéseket inicializáló ciklusban.
Amikor a betöltési felügyelőprogram betölti a betöltési m em óriaképet a m e­ A betöltési mem óriakép részét képező processzusok attribútum ait a kernel/
móriába, kiírja a képernyőre a képhez tartozó komponensek adatait. A 4.44. áb­ table.c fájlban (6095-6109. sor) deklarált image táblában találhatjuk. A főciklus­
rán látható egy ilyen képernyő egy része. Ebben a példában (tipikus, de lehetsé­ ba lépés előtt a sys_getimage kernelhívás a 18197. sorban egy m ásolatot bizto­
ges, hogy nem teljesen azonos azzal, ami az olvasó előtt jelenik meg, mivel ez a sít az image tábláról a PM-nek. (Pontosabban ez nem igazi kernelhívás, hanem
M INIX 3 egy kibocsátás előtti verzióján készült), a betöltési felügyelőprogram egy az include/minix/syslib.h fájlban definiált több tucat m akró közül, amelyek
472 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 473

könnyen használható interfészeket biztosítanak a sys_getinfo kernelhívás felé.) Ezután az FS m ár szabadon folytathatja saját inicializációját, és a PM
A kernelprocesszusok nem láthatók a felhasználói térből, és a processzustábla inicializációja is majdnem befejeződött. A 18253. sorban meghívódik a m em jn it,
PM- (valamint az FS-) részeit nem kell a kernelprocesszusokkal kapcsolatos in­ amely inicializálja a futó rendszerm em ória kezeléséhez szükséges, az üres m em ó­
formációkkal inicializálni. Valójában nem foglalunk le helyet a kernelprocesszus- ria régióit tartalm azó láncolt listát és a hozzá tartozó változókat a mem_chunks-ba
bejegyzések számára. A kernelprocesszusok negatív azonosítóval rendelkeznek összegyűjtött információk segítségével. A rendes memóriakezelés a M INIX 3 által
(programtáblaindex), és mellőzve vannak a 18202. sorban lévő tesztben. A kernel­ használt és a szabad m em óriát kiíró üzenet:
processzusok számára nem kell meghívniuk a patch_mem_chunks függvényt sem,
m ert a kernelm em ória használatában a kernelbe fordított processzusok m ár bele Physical memory: totál 63996 KB, system 12834 KB, free 51162 KB
vannak számítva.
A processzustáblához hozzá kell adnunk a rendszer- és a felhasználói procesz- után indul.
szusokat, amelyek más-más elbánásban részesülnek (18210-18219. sor). Az init A következő függvény a get_nice_value (18263. sor). A betöltési memóriakép
az egyetlen felhasználói processzus, amely a rendszerindításkor betöltődik, így processzusainak „udvariassági szintjé”-nek m egállapítására kerül meghívásra.
egy ellenőrzés történik az I N I T P R O C N R azonosítóra (18210. sor). Induláskor Az image tábla tartalm az egy várakozásisor-értéket a betöltési mem óriakép min­
ezenkívül csak rendszerprocesszusok töltődnek be. A rendszerprocesszusok spe­ den processzusához, amely alapján a processzus az ütemező megfelelő prioritású
ciálisak: nem lehet őket cserélni, rendelkeznek egy dedikált elemmel a kernel priv várakozási sorába kerül. Az értékek 0-tól, amely az olyan magas prioritású pro­
táblájában, valamint speciális, az állapotjelzőikkel jelzett jogosultságaik vannak. cesszusokat jellemzi, mint a CLO CK (órataszk), 15-ig tartanak, amely az ID L E -1
A szignálkezeléshez m inden processzus megfelelő alapértelm ezett beállításokkal jellemzi. A hagyományos Unix-rendszerekben az „udvariasság szintje” pozitív és
inicializálódik (van ugyan némi különbség a rendszerprocesszusok és az init kö­ negatív értékeket is felvehet. Ezért a felhasználói processzusok számára a get_
zött). Először lekérik m inden processzus m em óriatérképét a g e tjn e m jn a p függ­ nice value leképezi a kernel prioritás értékeket a 0 köré. Ehhez felhasználja az
vény segítségével, amely többek között a sys_getinfo rendszerhíváson alapul, majd include/syslresource.h-bán m akróként definiált P R IO M IN , PRIO M A X -20 és
a patch_mem_chunks hívás segítségével beállítják a mem_chunks töm böt (18225— +20 értékű konstansokat. Ezek a kemel/proc.h-bán definiált M IN U SERjQ és a
18230. sor). M A X U SE R jQ között skálázódnak, lehetővé téve a nice parancs használatát ak­
Végezetül egy üzenetet küldenek a fájlrendszernek, amely hatására minden kor is, am ikor több vagy kevesebb várakozási sor alkalmazása mellett döntöttünk.
processzusnak készül egy bejegyzés (18233-18236. sor) a processzustábla FS-hez A felhasználói szintű processzusok fájának gyökere az init, amely a 7-es prioritású
tartozó részébe. Mivel a betöltési memóriakép m inden processzusa a rendszergaz­ sorban helyezkedik el, és egy 0 „udvariassági szint”-et kap, amelyet a gyermekei
dához tartozik, és azonos alapértelm ezett értékekkel rendelkezik, ezért az üzenet­ megörökölnek a fork után.
nek elegendő a processzus PID -jét tartalm aznia az FS processzustábla elemeinek A m a in x két utolsó függvényét m ár em lítettük. A get_mem_chunks csak egyszer
inicializálásához. Az üzenetek elküldéséhez a send m űveletet használjuk, így nem kerül meghívásra (18280. sor). A betöltési felügyelőprogramtól ASCII karakter­
várunk választ. Az üzenet elküldése után a processzus neve megjelenik a konzolon láncként visszakapott hexadecimális bázis:méret párokkal jellem zett memória az
(18237. sor): információt átalakítja memóriaszeletté és a mem_chunks töm bbe írja. A patch_
mem_chunks, amely folytatja az üresmemória-lista építését, többször is meghívó­
Building process table: pm fs rs tty memory lóg driver init dik; egyszer a kernel hívja magának, majd az init-hez, ezután meghívja még min­
den, a p m j n i t főciklusba inicializált rendszerprocesszus is. Futása során kijavítja a
Ebben az esetben a képernyő meghajtója beépül az alapértelm ezett lemezmeghaj­ nyers betöltési felügyelőprogram információkat. A munkája egyszerűbb, mivel az
tóba. Több lemezmeghajtót is befordíthatunk a betöltési m emóriaképbe, a label= adatokat memóriaszelet-mértékegységben kapja meg. A p m j n i t megkapja min­
indítóparam éterrel tudjuk az alapértelm ezett m eghajtót megadni. den egyes processzus kód- és adat-memóriafoglalásának báziscímét és m éretét.
A PM saját speciális processzustábla-bejegyzéssel rendelkezik. A főciklus befe­ Minden egyes processzus számára meg lesz növelve az üres blokkok tömbjében a
jeződése után a PM néhány m ódosítást hajt végre a saját bejegyzésén, majd elküld legutolsó elem bázisa az adat- és a kódszegmensek együttes hosszával. Ezek után
egy végső, N Ő N E szimbolikus azonosítójú üzenetet a fájlrendszernek. Mivel ezt ennek a blokknak a m érete lesz lecsökkentve ugyanezzel az értékkel, hogy jelez­
az üzenetet a sendrec hívás segítségével küldi el, a PM blokkolódik, amíg nem kap zük a processzushoz tartozó m em óriaterület foglaltságát.
választ. Amíg a PM végigmegy az inicializáló kódon, addig a fájlrendszer a récéivé
ciklust hajtja végre (24189-24202. sor, a kód a következő fejezetben lesz leírva). A
N Ő N E processzusazonosítójú üzenet tudatja a fájlrendszerrel, hogy m inden rend­
szerprocesszus inicializálva lett, így ki tud lépni a ciklusból, és elküld (send) egy
szinkronizáló üzenetet a PM-nek, hogy az ki tudjon lépni a blokkolt állapotából.
474 4. MEMŐRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 475

4.8.3. A fork, az exit és a wait implementációja a fre e jn e m eljárással felszabadítja a szegmenst. Ezt követi az adat- és a verem ­
szegmens felszabadítása egyetlen művelettel, szintén a fre e jn e m segítségével. H a
A fork, az exit és a wait rendszerhívás a forkexit.c fájlban levő d o jo rk , do_pm_exit a processzus szülője várakozik, akkor a cleanup eljárás üríti ki a processzustábla
és dojvaitpid eljárásokkal vannak megvalósítva. A d o jo r k eljárás (18430. sor) a bejegyzését. H a a szülő nem várakozik, akkor a processzus zombi állapotba kerül,
4.36. ábrán látható lépéseket követi. Megjegyzendő, hogy a p r o c s jn jis e (18445. amit az mp Jlags ZO M BIE bitje jelez, és egy SIG C H ILD szignált küld a szülőnek.
sor) második hívása lefoglalja a rendszergazda számára a processzustábla utolsó M iután a processzus teljesen megszűnt vagy zombi lett, a p m j x i t végignézi a
néhány helyét. A gyermekprocesszus memóriaigényének kiszámításához az adat- processzustáblát (18582-18589. sor), és a processzus összes gyermekének átállítja
és a veremszegmens közötti területet is be kell számítani, a kódszegmenst viszont a szülőbejegyzését az init processzusra. H a az init várakozik, és a gyermekprocesz-
nem kell figyelembe venni. Két lehetőség van: vagy m egosztható a szülő kódszeg­ szus már leállt, akkor erre a gyermekre is meghívja a cleanup-ot. Egy ilyen hely­
mense, vagy a processzusnak egyesített adat- és kódrésze van, és ekkor kódszeg­ zetet láthatunk a 4.45.(a) ábrán. A 12-es számú processzus állt le, a szülője (7-es)
mensének hossza nulla. A számítás elvégzése után az a llocjnem eljárással fog­ várakozik rá. A 12-esre meghívjuk a cleanup-ot, így az 52-es és 53-as processzus
laljuk le a memóriát. H a ez sikeres volt, akkor a gyermek és a szülő kezdőcímét az init gyermeke lesz; ezt a 4.45.(b) ábra mutatja. Ebben az állapotban az 53-as,
memóriaszeletből abszolút bájtra konvertáljuk, és a sys_copy segítségével egy üze­ amely m ár leállt, egy várakozást végrehajtó (wait) processzus gyermeke, így meg
netet küldünk a rendszertaszknak, hogy végezze el a másolást. lehet szüntetni.
Ezután van egy üres hely a processzustáblában. Aproc_in_use-ra. vonatkozó előb­ Amikor egy szülőprocesszus wait vagy waitpid hívást hajt végre, akkor a program
bi teszt garantálja, hogy van ilyen. Miután megtaláltuk, kitöltjük: először a szülő be­ futása a 18598. sorban levő dojvaitpid eljárásban folytatódik. A két hívás a para­
jegyzését másoljuk ide, majd módosítjuk az mp _parent, mp Jlags, m p jh ild u tim e , m éterekben különbözik, így a végrehajtott tevékenység is más. A lokális változó­
mp_child_stime, mp_seg, mp_exitstatus és mp_sigstatus mezőket. Ezek közül néhány kat a 18613-18615. sorban állítjuk be, így a dojvaitpid bármelyik hívást le tudja
mező különleges kezelést igényel. A z m p jta tu s mezőnek csak néhány bitje örökölt. kezelni. A 18623-18642. sorban levő ciklus végignézi a processzustáblát gyermek­
Az m p je g tömb tartalmazza a kód-, adat- és veremszegmensek címét. H a a processzus processzusok után kutatva, és ha talál ilyet, akkor megvizsgálja, hogy zombi-e,
kódszegmense megosztható, akkor kód bejegyzése a szülő kódszegmensére mutat. m ert akkor eltávolítható. H a talált egy zombi gyermekprocesszust (18630. sor),
A következő lépés a processzusazonosító m eghatározása a gyermek részére. akkor eltávolítja, és a d ojvaitpid visszatér a SUSPEND kóddal. H a egy nyomkö­
A getJree_pid azt csinálja, amire a neve utal. A feladata nem olyan egyszerű, mint vetett gyermekprocesszust talál, akkor a legyártott válaszüzenetet módosítja, hogy
gondolnánk, ezért erre még visszatérünk. jelezze a processzus leállását, majd a dojvaitpid befejeződik.
A sysjork és a te lljs tudatja a kernellel és a fájlrendszerrel, hogy egy új procesz- H a a wait-et hívó processzusnak nincs gyermeke, akkor az egy hibakódot kap
szus jött létre, és módosítani kell a tábláikat. (A sys_ kezdetű könyvtári eljárások vissza (18653. sor). H a van gyermeke, de egyik sem zombi vagy nyomkövetett, ak­
egy-egy üzenetet küldenek a kernelen belül futó rendszertaszknak a 2.45. ábrán kor megvizsgáljuk, hogy meghívták-e a dojvaitpid-et egy olyan jelzőbittel, amely
látható szolgáltatások igénybevételére.) A processzusok létrehozását és megszün­ jelzi, hogy a szülő nem akar tovább várakozni. H a igen (ez a normális eset), akkor
tetését mindig a PM kezdeményezi, és a befejezés után a folyamat a kernelben és a 18648. sorban beállítunk egy jelzőbitet, jelezve, hogy várakozik, és a szülőt fel­
a fájlrendszerben folytatódik. függesztik, amíg egy gyermeke be nem fejeződik.
A do J o r k végén a gyermekprocesszusnak szóló üzenetet küldünk ki explicit Amikor egy processzus befejeződik, és a szülője vár, akkor az események sor­
módon. A gyermek azonosítóját tartalm azó válaszüzenetet a kérésre érkezett vá­ rendjétől függetlenül meghívjuk a cleanup (18660. sor) eljárást, és ez elvégzi a
laszként a main ciklusban küldjük el a szülőnek. végső teendőket. A szülőt fel kell ébreszteni a wait vagy waitpid által okozott vára-
A PM által kezelt következő rendszerhívás az exit. Ezt a rendszerhívást a
do_pm_exit eljárás fogadja (18509. sor), de a munka nagy részét átadja a néhány
sorral lejjebb levő p m exit eljárásnak. A munkamegosztást az indokolja, hogy a
p m jx it-e t akkor is meghívjuk, ha a processzus befejeződik egy szignál miatt. A fel­
adat ugyanaz, csak a param éterek mások, ezért kényelmes így szétvágni a dolgokat.
Amennyiben a processzus időzítőt futtat, akkor a pm_exit első dolga leállítani
azt. A gyermek által használt idő ezután a szülő idejéhez adódik. Ezután értesíti a
kernelt és a fájlrendszert, hogy a processzus nem fut többé (18550. és 18551. sor).
A sys_exit rendszerhívás üzenetet küld a rendszertaszknak, hogy törölje a procesz-
szus által használt bejegyzést a kernel processzustáblájából. Ezután a m em óriake­
zelő felszabadítja a processzusnak lefoglalt memóriát. A find_share függvény meg­
keresi, hogy a processzus megosztja-e másokkal a kódszegmensét, ha nem, akkor 4.45. ábra. (a) Az állapot, amikor a 12-es processzus befejeződik, (b) A befejeződés utáni állapot
476 4. MEMŐRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELÖJÉNEK IMPLEMENTÁCIÓJA 477

kozásból, vissza kell neki adni a befejeződött gyermekprocesszus azonosítóját és a A p a tc h jta c k munkája egy példával illusztrálható legjobban. Tegyük fel, hogy
kilépés-, valamint a szignálkódját. A fájlrendszer m ár felszabadította a gyermek­ egy néhány argumentummal rendelkező Perl-szkriptet hajtunk végre a parancs­
nek lefoglalt memóriát, a kernel m ár nem ütemezi, és felszabadította a kernel sorban:
processzustáblájában a processzus bejegyzését. Ennél a pontnál a gyermekpro­
cesszus örökre eltűnt. perl_prog.pl filel file2

Amennyiben a Perl-szkript a mágikus szót tartalm azó sorral kezdődik, akkor a


4.8.4. Az exec implementációja p a tc h jta c k létrehoz egy olyan vermet a Perl bináris futtatására, m intha ezt írtuk
volna be:
Az exec forráskódja a 4.40. ábrán látható leírást követi; ez a exec.c fájlban lévő
do exec (18747. sor) eljárásban található. Néhány egyszerű ellenőrzés után a PM /usr/local/bin/perl -wT perl_prog.pl filel file2
beolvassa a végrehajtandó fájl nevét a felhasználói szintből (18773-18776. sor).
Emlékezzünk rá, hogy az exec-et megvalósító könyvtári eljárások a régi kernelké­ H a ez sikeres volt, akkor a sor első részével, a parancsértelm ező bináris útvonalá­
pen belül hoznak létre egy vermet (lásd a 4.38. ábra). Ez a verem lesz behelyezve val tér vissza. Ezután a ciklus törzsét hajtja végre még egyszer: beolvasva a fájl fej­
a PM m em óriaterületére a következő lépésben (18782. sor). lécét és m eghatározva a futtatandó fájlszegmens m éreteit. A szkript első sorában
A következő lépés ciklusként van megvalósítva (18789-18801. sor). Az egysze­ megjelölt parancsértelm ező nem lehet szkript. Ez az, am iért az r változót használ­
rű bináris futtatandó esetén csak egyszer megy végig a cikluson. Először ezzel az juk. A változót csak egyszer lehet növelni, ezzel egyre korlátoztuk a p a tc h jta c k
esettel foglalkozunk. A 18791. sorban egy üzenetet küld a fájlrendszernek, hogy hívásainak számát. Amennyiben a második alkalommal is szkriptet jelez a kód, ak­
váltson át a felhasználó könyvtárára, m ert a m egadott útvonal és fájlnév a fel­ kor a 18800. sorban lévő ellenőrzés megszakítja a ciklust. A szkript kódja, amelyet
használó és nem a PM könyvtárához képest értelmezendő. Ezután az allowed lesz szimbolikusan az E SC RIP T reprezentál, egy negatív szám (a 18741. sorban van
meghíva - és amennyiben engedélyezve van, megnyitja a fájlt. H a a teszt nem sike­ definiálva). Ebben az esetben, a 18803. sorban lévő ellenőrzés hatására a d o j x i t
rül, akkor az érvényes fájlleíró helyett egy negatív a végrehajtásszámmal tér vissza, egy hibakóddal fog visszatérni, amely jelzi, hogy a fájl nem futtatható, vagy pedig
és a do_exit befejeződik, jelezve a hibát. H a a fájl létezik és futtatható, akkor a PM a parancssor túl hosszú.
beolvassa a fájl fejlécét a readjieader segítségével, és kiolvassa belőle a szegmen­ Az exec m unkájának befejezéséhez m aradt még egy kis teendő. A fin d jh a r e
sek m éretét. Az egyszerű bináris fájlra a readjieader hatására kilép a ciklusból a a futó processzusok közül keres olyat, amely megoszthatja az új processzussal a
18800. sorban. kódszegmensét (18809. sor), a n e w jn e m pedig lefoglalja az új kép számára szük­
A következőkben a futtatható szkript kezelését írjuk le. A M INIX 3, mint a leg­ séges memóriát, valamint felszabadítja a régi memóriát. Az elindított program
több Unix-szcrű rendszer, tám ogatja a futtatható szkripteket. A readjieader el­ futásához a m em óriában lévő képnek és processzustáblának is készen kell lennie.
lenőrzi a fájl első két bájtját a mágikus szó (shebang szekvencia, # !) után keresve, A 18819-18821. sorokban a futtatandó fájl i-csomópontja, fájlrendszere és m ódo­
és amennyiben m egtalálta azt, akkor egy speciális kódot ad vissza, jelezve, hogy a sítási ideje lesz elmentve a processzustáblába. A vermet ezután a 4.38.(c) ábrán
fájl egy szkript. Az ilyen m ódon megjelölt első sor megadja a parancsértelm ezőt látható módon előkészítik, és átmásolják a m em óriába lévő új képbe. Ezután az
és az esetleges speciális param étereket, opciókkal is. Egy szkript például ilyen első r w je g (18834-18841. sor) átmásolja a kód- (amennyiben nem megosztott kód)
sorral is kezdhető: és adatszegmeneseket a merevlemezről a memóriába. Amennyiben a setuid vagy
setgid bitek be vannak állítva, akkor értesíteni kell a fájlrendszert, hogy tegye bele
#!/bin/sh az effektív azonosító információkat a processzustábla FS-hez tartozó részében lé­
vő bejegyzésbe (18845-18852. sor). A fájltábla PM részébe egy az új program ar­
így tudattuk, hogy a Bourne-parancsértelmező fogja értelmezni vagy: gum entum aira m utató m utatót m entünk el azért, hogy a p s parancs meg tudja ezt
m utatni a parancssoron. A továbbiakban szignál bittérképeket állítunk be, illetve
#! /usr/local/bin/perl -wT értesítjük az FS-t, hogy zárjon le m inden olyan fájlleírót, amelyet le kell zárni exec
után. Végezetül a parancs neve lesz elmentve azért, hogy a ps vagy pedig a hiba­
jelzi a Peri-értelmezőt és az esetleges hibák jelzését igénylő kapcsolókat. Ez azon­ keresés közben ki lehessen írni a képernyőre (18856-18877. sor). A kernelt álta­
ban bonyolítja az exec dolgát. Amikor egy szkriptet szeretnénk futtatni, akkor a lában az utolsó lépésben értesítik, de ha a nyomkövetés engedélyezve van, akkor
d o jx e c -n e k nem a szkriptet, hanem az értelmezőt kell a m em óriába töltenie. egy szignált m ár el kellett küldenünk (18878-18881. sor).
Amikor szkriptet kell kezelni, akkor a p a tc h jta c k lesz meghíva a ciklus alján lévő Bár a vezérlés összes lépése a d o jx e c eljárásban van, a munka részleteit vég­
18801. sorban. ző eljárások az exec.c-ben találhatók. A readjieader eljárás (18889. sor) nemcsak
478 4. MEMŐRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 479

a fájl fejlécét és a szegmensek m éretét olvassa be, hanem ellenőrzi, hogy a fájl A 4.46. ábrán látható az f i fájlon dolgozó s.sh szkript esetén az előzőkben leírt
valóban egy M INIX 3 által futtatható fájl-e azon a processzoron, amelyre az ope­ feldolgozás. A parancssor a következő is lehet:
rációs rendszer aktuális példányát fordították. A 18944. sorban lévő A J8 0 3 8 6
konstans érteke az #ifdef...#endif szekvenciával van definiálva a fordításkor. A bi­ s.sh fi
náris futtatható program oknak ahhoz, hogy a 32 bites M INIX 3-on és Intel pro­
cesszoron elfogadhatók legyenek a fejlécükben, tartalm azniuk kell ezt a kons­ a szkript mágikus szót tartalm azó sora, amely jelzi, hogy a Bourne-parancsértel-
tanst. Amennyiben a M INIX 3-at 16 bites m ódban fordítanánk, akkor ez az érték mezőt kell hívni:
A J 8 0 8 6 lenne. Amennyiben kíváncsiak vagyunk a lehetséges értékekre, tám oga­
tott processzorokra, az include/a. out. h fájlban találjuk ezek listáját. #! /bin/sh
A n ew jn em eljárás (18980. sor) ellenőrzi, hogy van-e elég m em ória az új pro­
cesszus számára. Az adat- és a veremszegmensnek kell helyet keresni, ha a kód­ A 4.46. ábra (a) részében láthatjuk a hívó m em óriaterületéről átmásolt vermet.
szegmens m egosztható egy másik processzussal, vagy egy lyukat a kom binált kód-, A (b) részben láthatjuk a p a tc h jta c k és az insertj r g segítségével végrehajtott
adat- és a veremszegmensnek. Egy lehetséges javítás, hogy az utóbbi esetben két transzformációkat. M indkét diagram kapcsolódik a 4.38.(b) ábrához.
lyukat keresünk. A M INIX korai változataiban a kód-, az adat- és veremszegmen­ Az exec.c-ben definiált következő függvény a r w je g (19208. sor). Az exec fut­
seknek foytonosnak kellett lenniük. Ez a M INIX 3-ban m ár nem szükséges. H a tatása során egyszer vagy kétszer hívódik meg az adat-, valamint esetenként a
talált megfelelő m éretű lyukat, akkor felszabadítja a régi memóriát, és lefoglalja kódszegmens betöltésére. Ahelyett, hogy blokkról blokkra olvasnánk a fájlt, és
az újat. H a nincs elég memória, akkor az exec rendszerhívás meghiúsul. A m em ó­ a beolvasott blokkot a célterületre másolnánk, a fájlrendszer az egész szegmenst
riafoglalás után a n ew jn em beállítja a m em óriatérképet az m p je g mezőben, és a közvetlenül a felhasználó területére olvassa be. Valójában ezt a hívást kissé külön­
sys_newmap kernelhívással értesíti a kernelt. legesen dolgozza fel a fájlrendszer, m ert úgy tűnik, m intha a felhasználó procesz-
A n ew jn em fennm aradó része feltölti nullákkal a bss szegmenst, a hézagot és a szusa olvasná be a szegmenst. Csak a fájlrendszer olvasási rutinjának első néhány
vermet. (A bss az adatszegmensnek az a része, amely az inicializálatlan globális vál­
tozókat tartalmazza.) A m unkát a rendszertaszk hajtja végre a sys_memset segítsé­ \0 t 52
gével (19064. sor). Sok fordítóprogram külön kódot generál, hogy a bss szegmenst s a / r 48
lenullázza, de a M INIX 3 olyan fordítóprogram okkal is tud dolgozni, amelyek ezt Környezettömb s u / = 44
nem teszik meg. Az adat- és a veremszegmens közötti hézagot azért töltjük fel nul­
0 \0 t 40 E M 0 H 40
lákkal, hogy a brk rendszerhívással kiterjesztett adatszegmens új területe nullákat
tartalmazzon. Ez nemcsak a program ozónak kényelmes, hogy az új változók kez­ s a / r 36 \0 1 f \0 36
dőértéke nulla, hanem a többfelhasználós rendszerek biztonságát is növeli, m ert s u / = 32 h s s 32
az új processzus nem éri el az előző processzus által otthagyott adatokat. HOME = /usr/ast HOME = /usr/ast
E M 0 H 28 \0 h s / 28
A következő eljárás a patch j> tr (19074. sor), amely a verem ben levő m utatók \0 1 f \0 24 n i b / 24
módosítását végzi el, a 4.38.(b) és (c) ábrán látható módon. A verem ben minden h s s 20 0 20
m utatóhoz hozzáadja a báziscímet.
0 16 40 16
A következő két függvény szorosan együttműködik. Az előzőkben m ár leírtuk a Tényleges
Argumentum­ 32 12 0 12
feladatukat. Am ikor egy szkriptet futtatunk, a szkript értelmező binárisa az, am e­ argumentum­
lyet le kell futtatni. Az insertj r g (19106. sor.) karakterláncokat illeszt be a verem tömb 0 8 tömb 37 8
PM-nél található másolatába. Ezt a p a tc h jta c k vezérli, amely a szkript minden, 25 4 0 32 4
a mágikus szót tartalm azó sorában lévő karakterláncát megtalálja, majd meghívja - f1 20 0 fi 24 0
az insert jir g függvényt. A m utatókat term észetesen ki kell javítani. Az insert j r g - s.sh s.sh
dolga egyszerű ugyan, de sok m inden elrom olhat, és ezeket tesztelni kell. Itt érde­
/bin/sh
mes megemlíteni, hogy a lehetséges hibák lekezelése a szkriptek esetén különösen
fontos. A szkripteket felhasználók írják, akik m inden számítástechnikai szakem­ (a) (b)
ber szerint a problém ák legfőbb okai. Komolyra fordítva a szót, a legfontosabb kü­
lönbség a szkript és a lefordított bináris között az, hogy a lefordított bináris esetén 4.46. ábra. (a) Az execve-nek átadott tömbök és a szkript futása közben létrehozott verem.
megbízhatunk a fordítóban, hogy sok hibát m ár a fordításkor kiszűr. A szkriptek (b) A patch_stack feldolgozása után a verem és a tömbök így néznek ki. A szkript
nincsenek ilyen m ódon validálva. nevét átadják a szkriptértelmező programnak
480 4. MEMŐRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 481

sorából derül ki, hogy valami trükk következik. Ezáltal jelentősen gyorsul a szeg­ Rendszerhívás A rendszerhívás szerepe
mensek betöltése. sigaction Módosítja a szignálra adott választ
Az exec.c utolsó eljárása a find_share (19256. sor). Ez a futó processzusok közül sigproemask Megváltoztatja a blokkolt szignálok halmazát
keres a fájlok i-csomópont, eszköz és módosítási idő param étereinek összehason­ kill Szignált küld egy másik processzusnak
lításával egy olyat, ami megoszthatja az új processzussal a kódszegmensét. Ez egy alarm ALRM szignált küld önmagának megadott idő múlva
egyszerű keresés az mproc-bán a megfelelő mezők alapján. A keresésből term é­ pause Felfüggeszti a processzus futását a szignál érkezéséig
szetesen ki kell hagyni az új processzust. sigsuspend Megváltoztatja a blokkolt szignálok halmazát, majd PAUSE
sigpending Megvizsgálja a függőben levő (blokkolt) szignálokat
sigreturn A szignálkezelő után takarít
4.8.5. A brk implementációja
4.47. ábra. A szignálokhoz kapcsolódó rendszerhívások
Ahogy m ár láttuk, a M INIX 3 az alap-memóriamodellt használja: amikor létreho­
zunk egy processzust, akkor az adatai és a verme számára egy összefüggő m em ó­ szignálokra. A sigaction a POSIX szabvány része, legtöbb esetben ez az ajánlott
riaterületet biztosítunk. A processzust soha nem helyezzük át a memóriában, és hívás. A signal könyvtári függvényt pedig a szabványos C definiálja, és ezért hasz­
sohasem visszük ki a lemezre, a területének m érete nem változik. Csak annyi tör­ nálnunk kell az olyan program okban, amelyeket nem POSIX-rendszerekben is le
ténhet, hogy az adatszegmens elvesz a hézag alsó, a verem pedig a felső részéből. akarunk fordítani. A do sigaction (19544. sor) kódja egy ellenőrzéssel kezdődik,
Ezek m iatt a brk implementációja a break. c-ben különösen egyszerű. Csak elvégzi amely megvizsgálja, hogy létezik-e a m egadott kódú szignál, és ellenőrzi azt is,
az ellenőrzést, hogy az új m éret legális-e, és módosítja a processzustáblát. hogy vajon a hívás nem kísérlet-e a sigkill szignálra adott válasz megváltoztatására
A rendszerhívást kezelő eljárás ugyan a d o b r k (19328. sor), de a munka javát (19550-19551. sor). (A sigkill szignált nem szabad figyelmen kívül hagyni, elkapni
az adjust (19361. sor) végzi. Utóbbi ellenőrzi, hogy az adatszegmens összeütkö­ vagy blokkolni. Ez az utolsó lehetőség, amivel a felhasználók vezérelhetik a p ro­
zik-e a veremmel. H a igen, akkor a brk nem hajtható végre, de a processzust nem cesszusaikat, és a rendszergazda felügyelheti a felhasználókat.) A sigaction egyik
állítja le azonnal. Azért, hogy a processzus megállapíthassa (jó eséllyel) azt is, ha param étere a sig_osa m utató, amely egy sigaction struktúrára mutat, ebben kapjuk
a verem túl nagyra nőtt, és ez esetben m aradjon elég hely a verem nek egy rövid meg a szignálhívás előtti attribútumait, az új attribútumokat pedig a másik param é­
futásra, a vizsgálat előtt egy biztonsági faktort (SAFETY_BYTES) adunk az adat­ terben, a sigjtsa mutatóban kapjuk meg.
szegmens tetejéhez. Ez esetben a hívás után a processzus visszakapja a vezérlést Első lépésként meghívjuk a rendszertaszkot, hogy másolja át az aktuális attribú­
(egy hibaüzenettel), így kiírhatja a megfelelő üzeneteket, és leállhat. tum okat a sig_osa által m utatott struktúrába. A sigaction-1 úgy is meg lehet hívni,
Megjegyzendő, hogy a SAFETY_BYTES és a SA F E T Y CLICKS #define utasí­ hogy a sigjisa m utató N U L L értékű, ilyenkor csak lekérdezzük, de nem változtat­
tásokkal vannak definiálva az eljárás közepén (19393. sor). Ez szokatlan, m ert az juk meg a szignál attribútum ait. Ebben az esetben a do_sigaction azonnal visszatér
ilyen definíciók a fájl elején vagy a definíciós fájlokban szoktak lenni. A forráskód (19560. sor). H a a sigjisa nem N U LL, akkor a szignál új tevékenységét megadó
megjegyzéséből kiderül az ok: a program ozónak nehéz volt meghatározni a biz­ struktúrát a PM területére írjuk.
tonsági faktor m éretét. így hívta fel a figyelmet erre, és valószínűleg a kísérletezést A 19567-19585. sorok aszerint módosítják az mp_catch, az m pjgnore és az
is ösztönözni szerette volna. mp_sigpending bittérképeket, hogy a szignálhoz tartozó új akció a szignál fi­
Az adatszegmens kezdőcíme állandó, így amennyiben az adjust-nak meg kell gyelmen kívül hagyása, az alapértelm ezett tevékenység vagy a szignál elkapása.
változtatnia az adatszegmens m éretét, csak a m éretm ezőt kell megváltoztatnia. A sigaction struktúra sa Jiandler mezőjét használjuk a szignál vagy a S IG JG N , il­
A verem egy rögzített végponttól lefelé terjeszkedik, így ha az adjust észreveszi, letve a SIG DFL speciális szignálok (ezeket értenünk kellene, amennyiben az ed­
hogy a verem m utató, amelyet param éterként megkapott, a verem alsó határa alá dig tárgyalt POSIX-jelkezelést m egértettük) elkapásakor végrehajtandó eljárásra
ért, akkor módosítja a verem kezdetét és hosszát. m utató pointer átadására. Egy speciális, a M INIX 3-ra jellemző SIG_M ESS is be­
érkezhet; ezzel a továbbiakban még foglalkozunk.
Annak ellenére, hogy a műveletek egyszerű bitmanipulációk, amelyeket meg­
4.8.6. A szignálkezelés implementációja valósíthattunk volna egyszerű makrókban is, a sigaddset és a sigdelset könyvtári
függvényeket használjuk a szignálok bittérképének kezelésére. Azért hogy köny-
A szignálokhoz a 4.47. ábrán felsorolt nyolc POSIX-rendszerhívás kapcsolódik. Eze­ nyen hordozható program okat írhassunk még olyan rendszerekben is, ahol a
ket a hívásokat, valamint magukat a szignálokat is a signalc fájlban dolgozzuk fel. szignálok száma több, mint az integer típus bitszáma; ezek a függvények szerepel­
A sigaction és a signal függvények a sigaction rendszerhívást használják; ezek­ nek a POSIX szabványban. A könyvtári függvények használata könnyebbé teszi a
kel a függvényekkel határozza meg egy processzus, hogyan válaszoljon az egyes M INIX 3 átvitelét más architektúrákra.
482 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 483

Az előzőkben egy speciális esetet említettünk. A S I G M E S S kódot (19576. szignál, akkor ezt tudatja a rendszertaszkkal. Az üzenetek egy bittérképpel együtt
sor) csak speciális jogosultságú (rendszer-) processzusok használhatják. Normális érkeznek, lehetővé téve a kernelnek több szignál generálását egy üzenettel. A kö­
esetben ezek a processzusok blokkolódnak a kérésüzenetekre várva. így a hagyo­ vetkező függvény a handle_sig, amely a bittérképet bitenként dolgozza fel (19750-
mányos szignálfogadási eljárás, amely során a PM megkéri a kernelt, hogy egy 19763. sor). Egyes kernelszignálok különleges figyelmet igényelnek: a processzus
szignálkeretet helyezzen el a vevő vermében, el lesz halasztva mindaddig, amíg ID -t időnként megváltoztatják annak érdekében, hogy a szignált egy csoport kap­
egy üzenet fel nem ébreszti a fogadót. A SIG M E SS kód jelzi a PM-nek, hogy a ja meg (19753-19757. sor). Egyébként m inden beállított bit egy check_sig hívást
normál üzeneteknél magasabb prioritású értesítő üzenetet kézbesítsen. Mivel az eredményez, hasonlóan, mint a d o j i l l esetében.
értesítő üzenet argum entum a tartalm azza a függő szignálok halmazát, segítségé­
vel több szignált is kézbesíthetünk egy üzenetben.
Végül kitöltjük a PM processzustáblájának szignálokhoz kapcsolódó többi m e­ Riasztások és időzítők
zőjét is. Minden szignálhoz van egy bittérkép, az sa jn a sk, amely megadja, hogy
a szignálkezelő futása alatt milyen szignálokat kell blokkolni. M inden egyes szig­ Az alarm rendszerhívást a do_alarm eljárás (19769. sor) kezeli. A set_alarm függ­
nálhoz tartozik még egy sa Jiandler nevű m utató; ez a szignálkezelő eljárás címét vényt hívja meg, amely egy külön függvény, mivel arra is használják, hogy amikor
tartalmazza, vagy egy-egy különleges értéket annak a jelzésére, hogy a szignált van még aktív időzítővel rendelkező processzus, akkor kikapcsolja azt az időzí­
figyelmen kívül hagyjuk, az alapértelm ezett m ódon kezeljük vagy üzenetgenerá­ tőt. Ezt a set_alarm hívás 0 riasztási idővel történő meghívásával valósítják meg.
lásra használjuk. A könyvtári eljárás címét, amely a szignálkezelő leállásakor a A set_alarm a processzuskezelőn belül kezelt időzítőket használja a munkája so­
sigreturn-t meghívja, az mp_sigretum változóban tároljuk. Ez a cím annak az üze­ rán. Először megállapítja, hogy van-e m ár időzítő a célprocesszus számára, ha
netnek az egyik mezője, amelyet a PM kap. van, akkor lejárt-e már, ha igen, akkor a rendszerhívás vagy az előző időzítésből
A POSIX megengedi a processzusoknak, hogy megváltoztassák a saját szig­ m aradt idővel tér vissza, vagy ha nem volt előző időzítés, akkor nullával. A kó­
nálkezelésüket, még a szignálkezelő eljáráson belül is. Ez arra jó, hogy a szignál dok közötti megjegyzések rávilágítanak a hosszú időzítőkkel kapcsolatos néhány
feldolgozása közben megváltoztassuk a következő szignálra adott választ, majd problémára. Egy igen csúnya kódrész (19918. sor) a hívás argumentumát, amely
később visszaállítsuk az eredeti állapotot. Az alábbi rendszerhívások ezeket a m ásodpercben van megadva, elosztja a m ásodpercenkénti óraimpulzusokat meg­
szignálmanipulációkat támogatják. A sigpending-et a do_sigpending (19579. sor) adó H Z nevű konstanssal, így megkapjuk az időt impulzusszámban. Három típus-
eljárás kezeli; ez az mp_sigpending-ct adja vissza, így a processzusok ellenőrizhe­ konverzió szükséges az eredmény clock J adattípusúvá alakításához. A következő
tik, hogy mely szignálok várakoznak. A sigprocmask-hoz a do_sigprocmask függ­ sorban pedig a számítás inverzét hajtjuk végre, az impulzusokat megadó clock j -
vény tartozik; ez a blokkolt szignálok halmazát adja vissza, és lehetőséget nyújt, ből unsigned long típusúba lesznek az adatok konvertálva. Az eredmény az eredeti
hogy megváltoztassuk egyetlen szignál blokkoltságát, vagy akár az egész halmazt argumentum unsigned long típuskonverziójával lesz összehasonlítva. Amennyiben
helyettesítsük egy új értékkel. H a a szignál nem blokkolt, akkor a check_pending nem egyenlők, az azt jelenti, hogy a kért idő valamelyik adattípusnál a korlátokon
meghívásával (19635. és 19641. sor) ellenőrizzük, hogy van-e várakozó szignál. kívül esett, és ekkor a „soha” érték lesz behelyettesítve. Végezetül vagy a pm_set_
A do_sigsuspend (19657. sor) kezeli a sigsuspend rendszerhívást. Ez a hívás felfüg­ timer, vagy a pm _canceljim er lesz meghíva, amelyek segítségével időzítőt adunk
geszti a processzust, amíg az egy szignált nem kap. A többi itt tárgyalt eljáráshoz hozzá vagy veszünk el a processzuskezelő időzítősorából. Az első híváshoz tartozó
hasonlóan ez is bittérképekkel dolgozik, az mp Jlags sigsuspended bitjét állítja be, legfontosabb argumentum a cause_sigalrm, amely az időzítő lejártakor meghívan­
ezzel megelőzi a processzus végrehajtását. Itt újra meghívjuk a check__pending-et. dó felügyelőfüggvényt specifikálja.
Végül a do sigretum kezeli a sigreturn-t, ezt a felhasználói szignálkezelő befejezé­ A p m JO C X jim er függvények elrejtik a kernelszinten kezelt időzítőkkel történt
sénél használjuk. Visszaállítja azt az állapotot, ami a kezelő indulásánál érvényben kommunikációt. M inden riasztási igény, amely végezetül riasztási kérelemmel
volt, és meghívja a check_pending-et (19682. sor). végződik, végső soron a kernelszintbeli időzítőbeállítást fogja igényelni. Az egyet­
Amikor egy felhasználó processzus, mint a kill parancs, meghívja a kill rend­ len kivétel ez alól, ha egy időben több igény ugyanabban az időben lejáró időzítőt
szerhívást, a PM d o j i l l (19689. sor) függvénye lesz meghíva. A kill egyetlen meg­ igényelne. A processzusok azonban lem ondhatják vagy megszüntethetik a riasztá­
hívásával egy egész processzuscsoportnak lehet szignált küldeni, így a d o j i l l a saikat. Kernelhívásra csak akkor van igény, ha a processzuskezelő időzítő várako­
check j i g eljárással alkalmas címzetteket keres a processzustáblában. zási sorának első elem ét szeretnénk módosítani.
Néhány szignál, mint például a sigint, a kerneltől ered. A ksig_pending (19699. Amikor egy PM számára létrehozott időzítő a kernelszintű időzítő várakozási
sor) akkor lesz aktiválva, amikor a kernel elküldi a függő szignálokat tartalm a­ sorában lejár, a rendszertaszk értesíti erről a tényről a PM -et egy SYN _ALAR M
zó üzenetet a PM-nek. Több processzusnak is lehet függő szignálja, így a 19714- típusú üzenettel, amelyet a PM főciklusa detektál. E nnek hatására meghívódik a
19722. sorok közötti ciklus ismételten lekéri a rendszertaszktól a függő szignálo­ pm_expirejimers, amely végül meghívja a cause_sigalrm függvényt.
kat és átadja őket a handle_sig függvénynek, majd amikor már nincs több függő
484 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 485

A cause_sigalrm (19835. sor) az előbb em lített felügyelőfüggvény. Megkapja az megszakításkezelő a H ARD IN T üzenetet (5) küldi el az időzítőtaszknak, amely
értesítendő processzus számát, leellenőriz néhány állapotjelzőt, majd alapállapot­ ennek hatására frissíti az időzítőit. A cause_alarm időzítő felügyelőfüggvény egy
ba hozza az A L A R M _ O N állapotjelzőt, és kiküldi a SIG A LR M szignált a chek_sig értesítést (6) küld a PM-nek. A PM ekkor frissíti az időzítőit, és a processzustábla
függvény meghívásával. hozzá tartozó részéből megállapítja, hogy a SIG A L R M szignálhoz van-e regiszt­
A SIG A LR M szignálra az alapértelm ezett tevékenység a processzus leállítása, rált kezelője a kérdéses processzusnak, majd elküld egy üzenetet (7) a rendszer­
amennyiben nem kapták el. A SIG A LR M elkapására egy kezelőeljárást kell instal­ taszknak, hogy végezze el a szignálküldéshez szükséges veremmanipulációkat. Ezt
lálni a sigaction segítségével. A saját eseménykezelővel elkapott SIG A L R M szignál a (8) üzenettel nyugtázza. Ezután a felhasználói processzust ütemezik, hogy végre
esetén fellépő események teljes sorozata a 4.48. ábrán látható. H árom üzenetso­ tudja hajtani a kezelőjét, amelyben meghívja a sigreturn (9) hívást, amely visszatér
rozat van. Az (1) üzenettel a felhasználó egy a PM -nek küldött üzenettel alarm hí­ a PM-hez. Ezután a processzuskezelő elküld egy üzenetet (10) a rendszertaszknak
vást kezdeményez. A PM ekkor létrehoz egy időzítőt, a processzusnak fenntartott a takarítás inicializálására, amit az nyugtáz (11). Az ábrán nincs jelölve egy másik
időzítő várakozási sorban, és egy üzenettel nyugtázza ezt (2). Ezután egy darabig üzenetpár (3), amely a PM-ből megy a rendszertaszkhoz a rendszer eddigi futási
semmi sem történik. Amikor a kérésre létrehozott időzítő eléri a várakozási sor idejének lekérdezésére.
elejét, vagy m ert az előtte lévő időzítők lejártak, vagy m ert lem ondták őket, egy új A következő a pause rendszerhívás, amelyet a do_pause eljárás (19835. sor)
üzenetet küldenek (3) a rendszertaszknak, hogy hozzon létre egy új kernelszintű kezel. Annak ellenére, hogy segítségével a riasztásig (vagy más szignálig) felfüg­
időzítőt a processzuskezelőnek. Amikor ez sikerült, akkor a rendszertaszk nyug­ geszthetünk egy processzust, nincs igazából közeli kapcsolata a riasztásokkal és
tázza ezt egy üzenettel (4). Egy darabig ismét semmi sem történik. Am int az idő­ időzítőkkel. Csak egy bitet kell beállítani és a SUSPEND kódot kell visszaküldeni,
zítő eléri a kernelidőzítő sorának elejét, az óra-megszakításkezelő detektálja, amely visszatartja a PM főciklusát a válaszküldéstől, így blokkoljuk a hívó procesz-
hogy az lejárt. A szekvencia többi üzenete m ár gyorsan követi egymást. Az óra- szust. Még a kernelt sem kell értesíteni, m ert az tudja, hogy a processzus blokkolt.

Szint
Szignálokat tám ogató függvények

Korábban a signal.c számos segédfüggvényét em lítettük. Most nézzük meg ezeket


részletesebben. A legfontosabb a sig_proc (19864. sor), amely ténylegesen küldi a
szignálokat. Először elvégez egy sor vizsgálatot. Szignálküldést megkísérelni meg­
szűnt vagy zombi (19889-19893. sor) processzusoknak olyan komoly probléma,
ami rendszerösszeomlást okozhat. Egy éppen nyomon követett processzus leáll,
ha szignált kap (19894-19899. sor). H a a címzett processzus nem veszi figyelembe
a szignált, akkor a sig_proc a 19902. sorban befejezi a m unkáját. Néhány szignálra
ez az alapértelm ezett tevékenység, például a POSIX szabványú, nem kötelezően
támogatandó, a M INIX 3-ban nem tám ogatott szignálokra. H a a szignál blokkolt,
akkor csak egy bitet állítunk be a processzus m p jen d in g bittérképében. A legfon­
tosabb teszt (19910. sor) segítségével megkülönbözteti azokat a processzusokat,
amelyek elkaphatják a szignálokat azoktól, amelyek nem kaphatják el. Azoknak a
szignáloknak a kivételével, amelyeket a rendszerszolgáltatásoknak küldendő üze­
netté konvertáltak, m inden egyéb szempontot kiiktattunk eddig, és ha a procesz-
szus nem kapja el a szignált, akkor le kell állítanunk.
Először az elkapható szignálok feldolgozását nézzük át (19911-19950. sor). A
kernelnek küldendő üzenet egyes részei a PM processzustáblájának néhány részle­
tét tartalmazzák. H a a szignállal megcélzott processzust korábban felfüggesztettük
4.48. ábra. Üzenetek a riasztásnál. A legfontosabbak: (I) A felhasználó hívja az alarm-of.
a sigsuspend-del, akkor a felfüggesztés idején elm entett szignálmaszk kerül az üze­
(3) A PM megkéri a rendszertaszkot az időzítő beállítására. (6) Az óra szól
netbe, egyébként az aktuális szignálmaszk (19914. sor). Az üzenetben elküldött
a PM-nek, hogy lejárt az idő. (7) PM kéri a szignál küldését a felhasználóhoz.
többi adat néhány cím a processzus címteréből: az aktuális verem m utató, a szig­
(9) A kezelő befejeződik a sigreturn meghívásával (részletek lásd a szöveg)
nálkezelő címe, a sigreturn könyvtári eljárás címe, amelyet a szignálkezelő befeje­
ződésekor kell meghívni.
486 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 487

m ert a verem ellenőrzése csak alkalmanként és csak szoftveresen történhet. Ez


a tűréshatár jelenleg valószínűleg túlzott, m ert pontosan tudjuk, hogy mennyi
hely kell a verem ben a szignálnak, és mennyi többlethely kell a szignálkezelőnek,
Processzor regiszterei amely feltételezhetően egy viszonylag egyszerű függvény. Lehetséges, hogy né­
(64 bájt)
hány processzus szükségtelenül fejeződik be, m ert az adjust sikertelen. Ez bizto­
san jobb, m intha a processzus időnként rejtélyesen hibázna, de talán valamikor a
jövőben ezeket az ellenőrzéseket precízebben is beállíthatjuk.
Maszk H a a veremben van elegendő hely a struktúrának, akkor két további állapotjelzőt
Sigcontext
struktúra vizsgálunk. Az SA_NODEFER bit jelzi, hogy a szignál feldolgozása közben blokkol­
Állapotbitek ni kell-e a többi ugyanilyen típusú szignált. Az SA_RESETHAND jelzi, hogy a szig­
nálkezelőt alapállapotba kell-e állítani a szignál vételekor. (Ez a régi signal hívás
pontos szimulálására szolgál. Bár ezt a „lehetőséget” gyakran a régi hívás hibájának
Mutató a sigcontext-re tekintették, a régi tulajdonságok támogatása az ilyen hibák támogatását is megkö­
Sigframe
veteli.) Ezután a sys_sigsend (19940. sor) kernelhívás segítségével értesítik a kernelt,
struktúra
Visszatérési cím hogy tegye a sigframe-t a verembe. Végül a szignál várakozását jelző bitet nullázzuk,
majd az unpause eljárással befejezzük az összes olyan rendszerhívást, amely a pro­
Keretmutató cesszust felfüggesztette, ha volt egyáltalán ilyen. Amikor a processzus legközelebb
Mutató a sigcontext-re végrehajtásra kerül, akkor a szignálkezelő eljárás fog lefutni. Amennyiben vala­
miért az összes eddigi említett vizsgálat sikertelen, a PM összeomlik (19949. sor).
Kód (lebegőpontos) Az előbbiekben kivételként em lített rendszerszolgáltatásokhoz tartozó üze­
netekké konvertált szignálok a 19951. sorban vannak vizsgálva, és a hatásukra
A szignál száma meghívódik a sys_kill kernelhívás. Ennek hatására a rendszertaszk értesítő üzene­
A sigreturn címe
tet küld a szignált fogadó processzusnak. Emlékezzünk arra, hogy a többi értesí­
téssel ellentétben a rendszertaszk által küldött értesítés szokásos tartalm án kívül
származásáról is hordoz információt, valamint egy időbélyeget is tartalmaz. Ezek
4.49. ábra. A szignálkezelő végrehajtásának előkészítése során a verembe tett sigcontext és m ellett átadja a szignálok bittérképét is, amelyek segítségével a processzus meg­
sigframe adatszerkezetek. A processzor regiszterei a környezetváltáskor felhasznált tudhatja a függőben lévő szignálok adatait. Amennyiben a sys_kill sikertelen, akkor
veremkeret másolatai a PM összeomlik. Siker esetén a sigjproc tér vissza (19954. sor). Amennyiben a
19951. sor ellenőrzése sikertelen, a futtatás átugrik a doterminate címkéhez.
Ezután helyet foglalunk a processzus vermében; a verembe rakott struktúrát a Most nézzük meg a doterminate-tel címkézett kódot, amely leállítja a procesz-
4.49. ábra mutatja. Mivel a processzustáblában a megfelelő struktúrák megváltoz­ szust (19957. sor). A címke és a goto a legkönnyebb módja annak, hogy az adjust
nak, a szignálkezelő végrehajtása alatt a sigcontext részt is a verembe tesszük a mos­ esetleges sikertelenségét kezeljük. Itt olyan szignálokat dolgozunk fel, amelyeket
tani állapot elmentése érdekében, így ezt később vissza tudjuk állítani. A sigframe valamilyen okból nem tudtak vagy nem volt szabad fogadni. Lehetséges, hogy a
részben van a visszatérési cím és az adatok a sigreturn-hoz, amelyekkel vissza lehet szignál egy mellőzendő szignál volt, ekkor a sig_proc visszatér. Egyébként a pro­
állítani a processzus állapotát, amikor a szignálkezelő befejeződött. A visszatérési cesszust le kell állítani. A kérdés csak az, hogy a processzus m em óriaképére szük­
címet és a keret címét jelenleg még nem használja a M INIX 3, azért vannak, hogy ség van-e a hibakereséshez? Végezetül a processzus úgy fejeződik be, m intha a
működjön a nyomkövető, ha valaki a szignálkezelő eljárást akarja vizsgálni. pm_exit függvényt hívták volna meg (19967. sor).
A struktúra, amelyet a processzus vermébe rakunk, eléggé nagy. A 19923. és a A check_sig eljárással (19973. sor) ellenőrzi a PM, hogy a szignál elküldhető-e. A
19924. sorban levő kód foglalja le a helyet a veremben, ezt követi az adjust meg­
hívása, hogy ellenőrizzük, van-e elég hely a veremben. H a nincs elég hely, akkor a kill(0, sig);
C-ben ritkán használt goto utasítással a doterminate címkére ugrunk, és leállítjuk a
processzust (19926-19927. sor). a hívó csoportjába tartozó m inden processzusnak (azaz amelyeket ugyanarról a
Probléma m erülhet fel az adjust meghívásánál. A brk implementációjánál már term inálról indítottak) elküldi a m egadott szignált. A kerneltől származó szig­
láthattuk, hogy az adjust hibakóddal tér vissza, ha a verem SA F E T Y BYTES bájt- nálok és a reboot rendszerhívás több processzusra is hatással lehet. A fenti okok
nyira megközelíti az adatszegmenst. Azért kell ilyen tűréshatárról gondoskodni, m iatt a check_sig végignézi egy ciklussal (19996-20026. sor) a processzustáblát,
488 4. MEMÓRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 489

hogy megtalálja azokat a processzusokat, amelyeknek el kell küldeni a szignált. felhasználja az időzítők könyvtárban include/timers.h deklarált függvényeket. A
A ciklusban számos feltételt vizsgálunk, ha mind teljesül, akkor a sig_proc eljárással pm_settimer a tmrs_settimer-1, a pm _expirejim er a tmrs_expire-1, míg a pm_cancel_
elküldjük a szignált a processzusnak (20023. sor). timer a tmrs_clrtimers-t hívja meg. M indannyian a láncolt listák kezelését végzik,
Ahogy m ár többször láttuk, a check_pending eljárást (20036. sor) a forráskódban igény szerint: mozgás a láncolt listában, beszúrás, törlés. A rendszertaszkot csak
sok helyről meghívjuk. A dojigm ask, a do_sigretum vagy a do_sigsuspend eljárás ál­ az időzítő várakozási sor első elem ének beszúrásakor és törlésekor kell meghívni
tal kezelt processzus m pjigpending bittérképének bitjeit (dojigm ask, dojigretum , azért, hogy módosítsa a kernelszintű időzítő várakozási sort. Ilyenkor a pm _XX X_
dojigpending) vizsgálja meg sorban, hogy egy eddig blokkolt szignál blokkolatlan timer függvények a sys_setalarm kernelhívást használják a kernelszintű segítség
lett-e. H a talál egy várakozó és blokkolatlan szignált, akkor azt a sigj>roc-cal elkül­ igénybevételére.
di. Mivel minden szignál kezelésénél végrehajtódik a sigjetum , az összes várakozó,
nem blokkolt szignált el tudjuk küldeni.
Az unpause eljárás (20065. sor) az olyan processzusoknak küldött szignálok­ 4.8.7. A többi rendszerhívás implementációja
kal foglalkozik, amelyeket pause, wait, read, write vagy sigsuspend hívás m iatt fel­
függesztettek. A P M processzustáblája alapján vizsgálja a pause-t, a wait-ct és a A processzuskezelő a time.c-ben található három idővel kapcsolatos rendszerhívá­
sigsuspend-et, és ha nem talált ezek m iatt felfüggesztett processzust, akkor a fájl- sa: time, stime, times. Ezeket foglaltuk össze a 4.50. ábrán.
rendszerhez fordul, és az a saját dojinpause eljárásával megvizsgálja, hogy van-e A valós idejű órát a kernelen belüli időzítőtaszk kezeli, amely nem vált üzene­
várakozás írás vagy olvasás miatt. A művelet m inden esetben ugyanaz: egy hiba­ teket mással, csak a rendszertaszkkal. így a valós időt csak a rendszertaszkon ke­
kódot küld válaszként a várakozó processzusnak, és beállít egy bitet, amitől a p ro­ resztül tudjuk beállítani vagy lekérdezni. Ezt a feladatot a d o jim e (20320. sor) és
cesszus végrehajtása folytatódhat, és feldolgozhatja a szignált. a d o jtim e (20341. sor) látja el. A valós idő az 1970. január elseje óta eltelt, m á­
Az utolsó eljárás a fájlban a dump_core (20093. sor), amely a processzus m e­ sodpercben m ért időt jelenti.
m óriaképét írja fájlba. A fájl fejléce tartalmazza a szegmensek m éretét, valamint A processzusok naplózási információit a kernel kezeli külön-külön. Minden
a processzus állapotát és a processzustáblából a processzusra vonatkozó inform á­ óraütésre megváltoztatja egyes processzusok könyvelt idejét. A kernel nem tud
ciók másolatát. A fejléc után a szegmensek mem óriaképe következik. Egy hiba­ a szülő-gyermek viszonyról, így a processzuskezelőre hárul a gyermekprocesszu­
kereső program értelmezni tudja ezeket az információkat, és segítséget nyújthat a sok idejének összegzése. Amikor egy gyermek kilép, akkor az ideje hozzáadódik
programozónak a hibát okozó utasítás meghatározásában. a szülő könyvelt idejéhez a processzustábla PM által kezelt részében. A d o jim e s
A fájlba írás forráskódja egyszerű. Az előző alfejezetben em lített problém a itt a sys_times kernelhívással lekéri a szülő könyvelt idejét a rendszertaszktól, majd
is fellép, de más formában. H a meggyőződünk arról, hogy a kiírt veremszegmens visszaadja a válaszüzenetben a gyermek által eddig felhasznált rendszer- és fel­
megfelelő m éretű, a 20120. sorban meghívjuk az adjust eljárást, ami a biztonsági használói időt.
határ m iatt sikertelen lehet. A dump_core nem ellenőrzi az eredményt, m inden­ A getset.c fájl csak egy eljárást tartalmaz, a do_getset-et (20415. sor), amely a
képpen kiírja a m em óriaképet, de rossz lehet a fájlban a verem állapota. PM hét fennm aradó, POSIX által előírt rendszerhívását kezeli. Ezeket a 4.51.
ábrán soroltuk fel. Olyan egyszerűek, hogy nem kell mindegyikhez külön eljárás.
A getuid és a getgid egyaránt visszaadja a valódi és az effektív felhasználói és cso­
Az időzítőket tám ogató függvények portazonosítót.
Az azonosítók beállítása egy kicsit bonyolultabb, mint kiolvasásuk. Ellenőrizni
A M INIX 3 processzuskezelője kezeli az olyan felhasználói processzusok ál­ kell, hogy a hívó processzus jogosult-e az azonosítók beállítására. H a az ellenőrzés
tal létrehozott riasztási kérelmeket, amelyek számára nem engedélyezett a köz­ sikeres, akkor a fájlrendszerrel tudatjuk az új azonosítót, m ert a fájlok elérési joga
vetlen kapcsolat a kernellel vagy a rendszertaszkkal. Ez az interfész elrejti az is ettől függ. A setsid egy új viszonyt hoz létre; ezt nem tehetik meg az olyan pro­
időzítőtaszknál beállított riasztási időzítés minden részletét. Csak a rendszerpro­ cesszusok, amelyek m ár csoportvezetők. Ezt a 20463. sorban ellenőrizzük. A mun-
cesszusok állíthatnak be időzítést a kernelnél. Az ehhez szükséges tám ogatás a
timers.c (20200. sor) fájlban található. Hívás Feladat
A processzuskezelő a riasztási kérelm eket listába rendezi, és megkéri a rend­ time Lekéri a valós idejű időt és az ütemezés idejét
szertaszkot, hogy értesítse, amikor egy-egy riasztási idő elérkezett. Amikor riasz­ stime Beállítja a valós idejű órát
tás érkezik a kerneltől, a PM továbbadja ezt a célprocesszusnak. times Lekéri a processzusok elkönyvelt idejét
H árom időzítőket tám ogató függvény van. A pm _setjim ers beállít egy időzítőt,
és hozzáadja a PM időzítőlistájához, a pm _expirejim er ellenőrzi a lejárt időzítő­ 4.50. ábra. A három idővel foglalkozó rendszerhívás
ket, a pm _canceljim er eltávolítja az időzítőt a PM időzítőlistájából. M indhárom
490 4. MEMŐRIAGAZDÁLKODÁS 4.8. A MINIX 3 PROCESSZUSKEZELŐJÉNEK IMPLEMENTÁCIÓJA 491

Rendszerhívás Leírás d o je b o o t elküldi a K ILL szignált m inden processzusnak, és szól a fájrendszernek,


getuid Visszaadja a valódi és a tényleges felhasználói azonosítót hogy készüljön fel az újraindításra. Csak miután a fájlrendszernek sikerült szink­
getgid Visszaadja a valódi és a tényleges csoportazonosítót ronizálnia, azután lesz értesítve a kernel a sys abort hívással (20667. sor). Mivel
getpid Visszaadja a processzus és szülője azonosítóját újraindítás lehet egy rendszerösszeomlás eredménye, de a rendszergazda is uta­
setuid Beállítja a hívó valódi és tényleges felhasználói azonosítóját síthatja a rendszert leállásra, a kernelnek tudnia kell, hogy melyikről van szó.
setgid Beállítja a hívó valódi és tényleges csoportazonosítóját A do_getsetpriority tám ogatja a híres „udvarias” Unix-lehetőséget, amely segítsé­
setsid Létrehoz egy új feladatcsoportot, az azonosítót adja vissza gével egy felhasználó csökkentheti egy processzus prioritását, hogy jó szomszédja
getpgrp A processzuscsoport azonosítóját adja vissza legyen a többi processzusnak (valószínűleg azok is sajátjai). A M INIX 3-ban ennél
többről van szó: a rendszerkom ponensek közötti relatív prioritás finomhangolá­
4.51. ábra. A servers/pm/getset.c rendszerhívásai sára használják. Egy hálózati vagy lemezmeghajtó, amely gyors adatfolyamokat
kezel, nagyobb prioritást kaphat, mint a lassú adatfolyamokat kezelő meghajtók,
kát a fájlrendszer fejezi be azzal, hogy vezérlőterminál nélküli viszonyvezetővé például a billentyűzet. Egy ciklusba ragadt, nagy prioritású processzus prioritását,
teszi a processzust. amely ezáltal más processzusokat akadályoz, viszont érdem es ideiglenesen csök­
Az eddig említett rendszerhívásokkal ellentétben, a mise. c-ben definiált rend­ kenteni. A prioritás változtatása a második fejezetben leírtak szerint, a processzus
szerhívások a POSIX szabványok szerint nem szükségesek. Ezekre a felhasználói alacsony vagy magas prioritású várakozási sorban történő ütemezésével valósul
szintű eszközmeghajtóknak és a M INIX 3 szervereinek a kernellel történő kom­ meg. Amikor ezt a kernelben lévő ütem ező kezdeményezi, akkor nincs szükség a
munikációjához van szükség; erre a monolitikus operációs rendszerekben nincs fel­ PM bevonására, ezzel szemben a felhasználói processzusoknak rendszerhívásokat
tétlenül szükség. A 4.52. ábra felsorolja ezeket a rendszerhívásokat és feladatukat. kell használniuk. A PM szintjén csak az üzenetből kell kiolvasni az értéket, illetve
Az első kettőt a PM teljes egészében kezeli. A do allocmem kiolvassa a kérést új üzenetet kell generálni az új értékkel. A s y s jiic e kernelhívás elküldi az új érté­
a beérkezett üzenetből, átalakítja m emóriaszeletté, és meghívja az a llocjnem ket a rendszertaszknak.
függvényt. Ezt használja például a memóriameghajtó, amikor m em óriát foglal a A misc.c utolsó függvénye a do_svrtctl. Jelenleg a csere engedélyezése vagy tiltá­
RAM-lemeznek. A d o jreem em hasonló, csak a fre e jn e m függvényt hívja meg. sa a feladata. A többi függvény, amelyeket ez a hívás valaha kiszolgált, valószínű­
A következő hívásoknak m ár segítségül kell hívniuk a rendszer más részeit is. leg a reinkarnációs szerverben lesz megvalósítva.
Úgy gondolhatunk rájuk, mint interfészekre a rendszertaszk felé. A do_getsysinfo Az utolsónak megvizsgált rendszerhívás a trace.c-ben kezelt ptrace. A fájl meg­
az üzenetben átadott kéréstől függően több dolgot is tehet. Meghívhatja a rend­ található a mellékelt C D-ROM -on és a M INIX 3 weboldalán is. A ptrace-t a hi­
szertaszkot, hogy lekérje a kernelről szóló kinfo struktúrában (az include/minix/ bakereső program ok használják. Ennek a rendszerhívásnak a 4.53. ábrán látható
type.h-bán van definiálva) tárolt információkat. A rra is használhatjuk, hogy meg­ tizenegy parancsot adhatjuk át param éterként. A PM-ben a d o jra ce ezek közül
adja a processzustábla PM-hez tartozó részének címét, vagy lemásolja az egész négyet dolgoz fel: T OK, T RESUME, T_EXIT, T STEP. A nyomkövetés enge­
processzustáblát egy másik processzusnak. A legutolsó művelet a sys_datacopy délyezését és befejezését befolyásoló kéréseket itt kezelik. A többi parancsot a
(20582. sor) hívással zárul. A do_getprocnr egyedül is képes a PID segítségével sysjrace könyvtári eljárással átadják a rendszertaszknak, amely a processzustáb-
megtalálni a megfelelő sort a processzustábla hozzá tartozó részében, vagy segít­
ségül hívja a rendszertaszkot, amennyiben név alapján kell keresnie. Parancs Leírás
A következő két hívás ugyan nem szükséges a POSIX szerint, de ettől függetle­ T STOP Megállítja a processzust
nül valamilyen form ában jó eséllyel a legtöbb Unix-rendszerben megtalálhatók. A T OK Engedélyezi, hogy a szülő nyomon követhesse a processzust
T GETINS Értéket ad vissza a kódrészből
Rendszerhívás Leírás T GETDATA Értéket ad vissza az adatrészből
do_allocmem Lefoglal egy memóriarészt T GETUSER Értéket ad vissza a processzustáblából
do_freemem Felszabadít egy memóriaterületet T SETINS Beállít egy értéket a kódrészben
do_getsysinfo Lekéri a PM-mel kapcsolatos információkat a kerneltől T SETDATA Beállít egy értéket az adatrészben
do_getprocnr Visszaadja a processzustáblában a sorszámot PID vagy név alapján T SETUSER Beállít egy értéket a processzustáblában
do_reboot Minden processzust leállít, értesíti az FS-t és a kernelt T RESUME Folytatja a végrehajtást
dogetsetpriority Beállítja vagy lekérdezi a rendszerprioritást T EXIT Kilépés
do_svrctl Egy processzusból szervert csinál t _ step Beállítja a nyomkövetési bitet

4.52. ábra. Speciális MINIX3-rendszerhívások a servers/pm/misc.c-öen 4.53. ábra. A servers/pm/trace.c nyomkövető parancsai
492 4.9. ÖSSZEFOGLALÁS 493
4. MEMÓRIAGAZDÁLKODÁS

la kernelhez tartozó részéhez is hozzáférhet. A nyomkövetéshez két segédeljá­ Az allowed eljárás ellenőrzi, hogy a m egadott elérés engedélyezett-e a fájlra.
rás található. A find_proc megkeresi a processzustáblában a vizsgált processzust. Például a d o jx e c -n e k tudnia kell, hogy a fájl végrehajtható-e.
A stop_proc pedig, amikor erre jelzést kap, leállítja a nyomkövetett processzust. A n o jy s eljárást sohasem szabad meghívni, azt az esetet kezeli, amikor a felhasz­
náló egy illegális rendszerhívás-azonosítóval hívja meg a PM-et.
A panic eljárást akkor hívja meg a PM, ha egy olyan hiba történik, amelyből
nem tud kilábalni. Jelenti a hibát a kernelnek, amely erre leállítja a M INIX 3-at.
4.8.8. A memóriakezelés segédeljárásai
A utility.c következő eljárása a telljs, amely összeállít egy üzenetet, és elküldi a
A fejezetet két fájl rövid ismertetésével zárjuk, amelyek a processzuskezelő szá­ fájlrendszernek, ha azt értesíteni kell a PM által feldolgozott eseményekről.
m ára biztosítanak segédfüggvényeket. Ezek az alloc.c és a utility.c. Mivel a fájlok A find jja ra m függvényt a figyelőprogramtól átvett param éterek értelmezésére
belső részleteiről itt nem beszélünk, de a CD m ellékleten és a M INIX 3 webolda- használják. Jelenleg arra szolgál, hogy a M INIX 3 betöltése előtti m emóriahasz­
lán term észetesen megtalálhatók. nálatot kiderítse, de más információk kiderítésére is lehetne használni.
Az alloc.c fájl az, ahol a rendszer nyilvántartja, hogy melyek a szabad, illetve a A fájlban található következő két függvény a sys_getproc könyvtári függvényhez
foglalt memóriarészek. H árom belépési pontja van: biztosít interfészt. Ez a függvény meghívja a rendszertaszkot a kernel procesz-
szustáblájából származó információk kinyerésére. A sys_getproc más szempontból
1. a llo cjn em - lefoglal egy megadott m éretű memóriablokkot; egy az indude/minix/syslib.h fájlban definiált makró, amely param étereket ad át a
2. fre e jn e m - visszaad egy memóriablokkot, ami többé már nem kell; sys_getinfo kernelhívásnak. A g e tjn e m jn a p a processzus m em óriatérképét kéri
3. m e m jn it - a PM indulásakor inicializálja a szabadlistát. le. A g e tjta c k j> tr lekéri a veremtáblát. Az itt felsorolt függvények mindegyikének
szüksége van a processzusszámra, amely a sorszámot jelenti processzustáblában,
Ahogy azt m ár korábban is említettük, az allo cjn em a kezdőcím szerint rende­ nem a PID-et. A utility.c utolsó függvénye a proc J ro m j i d , amely megadja ezt a
zett lyuklistában first fit algoritmussal keres. H a egy olyan lyukat talál, amely na­ támogatást, a PID alapján visszaadja a processzussorszámot.
gyobb a m egadott méretnél, akkor szétvágja, és a m aradékot meghagyja a szabad­
listában, csak a m egadott mennyiségű mem óriát foglalja le. H a az egész lyuk kell,
akkor a d e ljlo t eljárással kiveszi a listából.
A fre e jn e m ellenőrzi, hogy a felszabadított terület összeolvasztható-e a szom­ 4.9. Összefoglalás
szédos lyukakkal. H a igen, akkor a merge eljárás segítségével összefogja a lyukakat
és módosítja a listát. Ebben a fejezetben általánosan és a M INIX 3 esetében is megvizsgáltuk a
A m em j n i t felépíti a kezdeti szabadlistát, amely az egész elérhető mem óriát memóriakezelést. Láthattuk, hogy a legegyszerűbb rendszerek nem használnak la­
tartalmazza. pozást vagy cserét. H a egy program betöltődik a memóriába, akkor a befejeződé­
Az utoljára megvizsgált fájl a utility.c, amely a PM különböző részein használt kü­ séig ott is marad. A beágyazott rendszerek leggyakrabban így működnek, jó esély-
lönféle eljárásokat tartalmazza. lyel ROM -ban lévő kóddal. Néhány operációs rendszer egyszerre csak egy progra­
A g e tjr e e j)id üres PID -et keres a gyermekprocesszusok számára. Igyekszik mot enged futni a m emóriában, míg mások a m ultiprogramozást is támogatják.
elkerülni a számításba vehető problém ákat. A maximális PID -érték 30000. Hasz­ A következő továbblépés a csere. H a egy rendszer ezt használja, akkor több
nálhattunk volna PID J - be férő maximális P ID -értéket is, de a régi, kisebb típuso­ processzust tud futtatni, mint amennyi a mem óriában elfér. Azokat a processzuso­
kat használó programokkal kapcsolatos problém ák elkerülése végett választottuk kat, amelyeknek nem jut hely, kitesszük a lemezre. A szabad területeket a m em ó­
a 30000-es értéket. M iután egy hosszú életű processzusnak például a 20-as PID- riában és a lemezen bittérképpel vagy szabadlistával tartjuk nyilván.
értéket adtuk, 30000 új processzust tudunk indítani és leállítani a PID-számláló A fejlettebb számítógépekben gyakran valamilyen virtuális m em óriát használ­
egyszerű növelésével, a maximális érték elérése után 0-val kell újrakezdeni, egész nak. A legegyszerűbb esetben mindegyik processzus címtere lapoknak nevezett,
20-ig lehet számlálni. Egy még használt PID újra kiosztása tragédiát okozna (te­ egyenlő m éretű blokkokra oszlik, amelyeket a memória bármelyik lapkeretébe el­
gyük fel, hogy valaki a 20-as processzuson szeretne szignált küldeni). Egy változó helyezhetünk. Több lapcserélési algoritmust ajánlottunk, a két legismertebb a m á­
tartalm azza az utoljára kiosztott PID -értéket, és amennyiben meghalad egy m a­ sodik lehetőség (SC) és az öregítő. A lapozásos rendszer jó működéséhez nem elég
ximális értéket, egy új indítás következik PID 2-vel (mivel az init PID-je mindig az algoritmus megválasztása, figyelni kell a munkahalmaz meghatározására, a m e­
1), az egész processzustáblát végigkeresi, hogy megbizonyosodjon arról, hogy a móriafoglalási elvekre és a lapm éretre is.
kiadandó PID nem használt. Amennyiben használt, az eljárást addig ismételgeti, A szegmentálás segíti a változó m éretű adatszerkezetek kezelését, és egyszerű­
amíg nem talál szabad PID-et. síti a szerkesztést, valamint a kód és az adatok megosztását a program ok között.
Ezenkívül a különböző szegmenseknek eltérő védelmi szintjük lehet. N éha a szeg­
494 4. MEMÓRIAGAZDÁLKODÁS FELADATOK 495

m entálást és a lapozást kombinálják, hogy kétdimenziós virtuális m em óriát hozza­ 7. A 4.9. ábrán a virtuális cím lapmezője 4 bites, a fizikai cím lapmezője 3 bites.
nak létre. Az Intel Pentium a lapozást és a szegmentálást is támogatja. Általában m egengedhető-e, hogy a virtuális lapbitek száma kisebb, egyenlő
A M INIX 3 memóriakezelése nagyon egyszerű: akkor foglalunk memóriát, vagy nagyobb legyen, mint a fizikai lapbitek száma? Magyarázzuk meg vála­
amikor egy processzus fork vagy exec rendszerhívást hajt végre. A lefoglalt m e­ szunkat.
mória m érete a processzus futása során nem változik. Az Intel processzorokon 8. Az Intel 8086-os processzor nem tám ogatja a virtuális memóriát, ennek el­
kétféle mem óriam odellt használ a M INIX 3. A kisebb processzusoknál a kód és lenére néhány cég kiadott az eredeti 8086-osra épülő rendszereket, amelyek
az adatok ugyanabban a szegmensben vannak. A nagyobb processzusok szeparált tudták a lapozást. Hogyan m űködhettek ezek? (Tanács: gondoljunk az MMU
kód- (vagy utasítás-) és adatrészt használnak, az ilyen processzusok egymás között logikai helyére.)
megoszthatják kódszegmensüket, így a fork-nál csak az adatoknak és a veremnek 9. H a egy utasítás végrehajtása 1 ns-ig tart, egy laphiba további wsec-ot ad hozzá,
kell helyet foglalni. Ugyanez a helyzet az exec-nél is, ha az elindított processzus akkor adjunk meg egy form ulát az utasítások tényleges végrehajtási idejének
m ár fut a gépen. kiszámítására, ha minden &-adik utasításnál következik be laphiba.
Az üres m em ória karbantartása lyuklistával és first fit algoritmussal történik. 10. Egy gépnek 32 bites cím tere és 8 KB-os lapjai vannak. A laptábla teljesen
Annak ellenére, hogy ezzel is a processzuskezelő foglalkozik, mégis a legtöbb hardveres, bejegyzésenként egy 32 bites szóval. Amikor egy processzus elin­
dolga a processzusok kezelésével kapcsolatos rendszerhívásokkal van. Számos dul, akkor a laptáblája a memóriából a regiszterekbe másolódik; egy szó m á­
rendszerhívás tám ogat POSIX-szignálokat, és mivel a legtöbb szignál alapértel­ solása 100 ns-ig tart. H a egy processzus egy tized másodpercig fut (beleértve
mezett tevékenysége a processzus befejezése, ezt is a PM-nek kell megtennie. Sok a laptábla betöltésének idejét), akkor a processzor idejének hány százalékát
rendszerhívás nem kapcsolódik közvetlenül a memóriakezeléshez, de a fájlrend­ fordítjuk a laptábla betöltésére?
szerhez még kevésbé, így mivel a PM kisebb, az a legkényelmesebb, ha ezeket is 11. Egy gép 32 bites címeket és kétszintű laptáblát használ. A virtuális címeket há­
idesoroljuk. rom részre osztjuk: egy 9 bites mező a felső szintű laptáblához, egy 11 bites mező
a másodlagos laptáblához és az eltolás. Mekkora a lapméret, és hány lapra oszlik
a címtér?
12. Az alábbiakban egy 512 bájtos lapokat használó gép rövid assembly nyelvű
Feladatok program ja látható. A program az 1020-as címen kezdődik, a verem m utató
8192 (a verem a nullás cím felé terjeszkedik). Adjuk meg a processzus laphi­
1. Egy számítógépnek négy processzus tárolására elegendő memóriája van. vatkozási sorozatát. M inden utasítás 4 bájtos (egy szó), és a sorozat egyaránt
Ezek a processzusok az idő felében I/O-ra várakoznak. M ekkora része marad tartalm azza az utasítás- és az adathivatkozásokat.
kihasználatlan a processzoridőnek? Töltse a 6144-es szót a nullás regiszterbe.
2. Tekintsünk egy cserélő rendszert, amely kezdőcím szerint rendezve a követ­ Tegye a nullás regisztert a verembe.
kező lyukakat tartalmazza: 10 KB, 4 KB, 20 KB, 18 KB, 7 KB, 9 KB, 12 KB és Hívja meg az 5120-as címen levő eljárást. (A visszatérési cím a verembe kerül.)
15 KB. Melyik lyukat választja ki a következő kérésekre a first fit? Adjuk meg Vonja ki 16-ot a veremmutatóból.
a választ best fit, next fit és worst fit esetén is. Hasonlítsa össze az aktuális param étert a 4 konstanssal.
(a) 12 KB Ugorjon az 5152-es címre, ha egyenlők.
(b) 10 KB 13. Tegyük fel, hogy egy 32 bites virtuális cím az a, b, c, d mezőkre oszlik. Az el­
(c) 9 KB ső három mezőt a háromszintű laptáblához használjuk, az utolsó mező az eltolás.
3. Egy számítógép 1 GB RAM-mal rendelkezik; ez 64 KB-os egységekben foglal­ Függ-e a lapok száma mind a négy mező m éretétől? Ha nem, akkor melyeké­
ható. M ekkora az üres m em óriát nyomon követő bittérkép m érete KB-ban? től függ?
4. Most vegyük figyelembe az előző kérdésnél a lyuklistát is. Mennyi memóriára 14. Egy számítógép, amelynek processzusai 1024 lapos cím teret használnak, a
lenne szükség a legjobb és a legrosszabb esetben? Tegyük fel, hogy az operá­ m em óriában tartja a laptábláját. A laptáblából egy szót 500 ns alatt lehet ki­
ciós rendszer az alsó 512 KB m em óriát használja. olvasni. E többletköltség csökkentésére a gép TLB-t alkalmaz, amely 32 da­
5. Mi a különbség a fizikai és a virtuális címek között? rab virtuális lap-fizikai lapkeret párt tartalmaz, és a lekérdezése 100 ns-ig tart.
6. A 4.8. ábrán látható laptábla alapján adjuk meg az alábbi virtuális címek fizikai M ekkora találati arány szükséges ahhoz, hogy az átlagos többletterhelést 200
párját. ns-ra csökkentsük?
(a) 20 15. A VAX-gépek TLB-je nem tartalm az R bitet. M iért? Ez a hiány csak a korra
(b) 4100 jellemző (1980), vagy volt mögötte más ok is?
(c) 8300
496 4. MEMŐRIAGAZDÁLKODÁS FELADATOK 497

16. Egy gép 48 bites virtuális és 32 bites fizikai címeket használ, a lapm éret 8 KB. 26. Az egyik első időosztásos gépnek, a P D P -l-n ek 4 KB m em óriája volt 18 bites
Hány bejegyzés szükséges a laptáblában? szavakból. Egyszerre csak egy processzus lehetett a memóriában. Amikor az
17. Egy 64 bites virtuális cím terű RISC CPU 8 GB RAM -ot használ invertált lap­ ütem ező úgy döntött, hogy egy másik processzust kezd el futtatni, akkor a m e­
táblával és 8 KB lapméretekkel. Mi a TLB minimális m érete? móriában levő processzust kiírta egy mágnesdobra. A dob palástján 4 KB adat
18. Egy számítógépnek négy lapkerete van. A lapok betöltésének és utolsó eléré­ fért el 18 bites szavakból. A dob írása vagy olvasása tetszőleges szónál kezdőd­
sének idejét, valamint az R és M bitek értékét az alábbi táblázatból olvashatjuk hetett. Vajon m iért ilyenre szerkesztették a dobot?
ki (az idők órajelciklusban adottak). 27. Egy beágyazott számítógépben m inden processzusnak 4 KB-os lapokra osztott
64 KB-os címtere van. Egy processzus kódszegmensének m érete 32 768 bájt,
Lap Betöltés ideje Utolsó hivatkozás R M az adatok m érete 16 386 bájt, a verem é 15 870 bájt. Belefér-e ez a processzus
0 126 279 0 0 címterébe? H a a lapm éret 512 bájt lenne, akkor beleférne? Emlékezzünk arra,
1 230 260 1 0 hogy egy lap nem tartalm azhat két különböző szegmenst.
2 120 272 1 1 28. Megfigyelték, hogy két laphiba között végrehajtott utasítások száma egyene­
3 160 280 1 1 sen arányos a processzusnak lefoglalt lapkeretek számával. H a a lefoglalt m e­
m óriát megkétszerezzük, akkor a két laphiba közti átlagos idő is duplázódik.
(a) Melyik lapot cseréli ki az N R U algoritmus? Tegyük fel, hogy egy utasítás végrehajtása 1 jxs-ig tart, laphiba esetén pedig
(b) Melyik lapot cseréli ki a FIFO algoritmus? 2001 jus-ig (azaz 2 p.s egy laphiba kezelése). H a egy processzus 60 másodpercig
(c) Melyik lapot cseréli ki az LRU algoritmus? fut, miközben 15 000 laphibát okoz, akkor kétszer annyi lapkeret birtokában
(d) Melyik lapot cseréli ki a második lehetőség algoritmus? mennyi ideig futna?
19. H a FIFO lapcserélési algoritmust használunk négy lapkerettel és nyolc lappal, 29. A Frugal Com puter Company operációs rendszerének tervezői úgy gondolták,
akkor hány laphiba történik a 0172327103 hivatkozási sorozat feldolgozásánál, hogy csökkentik az új operációs rendszerükhöz szükséges háttértár mennyi­
ha a lapkeretek kezdetben üresek? Mi a helyzet az LR U esetén? ségét. A főtervező azt javasolta, hogy a program kódot ne írják ki a lemezre a
20. Egy kis számítógépnek nyolc lapkerete van, mindegyik egy lapot tartalmaz. A cserénél, hanem mindig közvetlenül a programfájlból olvassák be. Van ezzel a
lapkeretek az alábbi virtuális lapokat tartalm azzák:^, C, G, H, B, L , N , D é s F megközelítéssel valami probléma?
ebben a sorrendben. A betöltési idejük: 18,23,5,7, 32,19,3 és 8. A referencia­ 30. Mi a különbség a külső és a belső töredezettség között? Melyik fordul elő a
bitjeik: 1, 0, 1, 1, 0, 1,1 és 0; a m ódosított bitjeik: 1, 1,1, 0, 0, 0, 1 és 1. Milyen lapozásos rendszerekben? Melyik fordul elő a tiszta szegmentálást alkalmazó
sorrendben vizsgálja a lapokat a második lehetőség algoritmus, és melyiket vá­ rendszerekben?
lasztja? 31. H a egyszerre használunk szegmentálást és lapozást, mint például a Pentiumban,
21. Van-e olyan eset, amikor az „óra” és a második lehetőség algoritmus más lapot akkor először a szegmensleírót, majd a laptáblát kell megnézni. Működhet-e a
választ ki lapcserére? H a igen, akkor mikor? TLB hasonló m ódon kétszintű kereséssel?
22. Tegyük fel, hogy egy számítógép PFF lapcserélési algoritmust használ, és van 32. M iért szükséges a M INIX 3 m emóriakezeléséhez a chmem segédprogram?
elegendő m emória az összes processzus mem óriában tartására laphiba nélkül. 33. A 4.44. ábrán látható a M INIX 3 első négy kom ponensének mem óriahaszná­
Mi történik? lata. Mi lesz a cs értéke a következő rs után beöltött komponens esetén?
23. Egy kisszámítógépnek négy lapkerete van. Az első óraütem ben az R bitek ér­ 34. Az IBM-kompatibilis számítógépek 640 KB és 1 MB között tárolják a ROM-
téke 0111 (a nullás lap 0, a többi lap 1). A következő pillanatokban ezek az és I/O-memóriarészeket; a felhasználói processzusok nem használhatják ezt.
értékek rendre 1011, 1010, 1101, 0010, 1010, 1100 és 0001. H a az öregítő al­ M iután a M INIX 3 felügyelőprogramja áthelyezi magát 640 KB alá, a használ­
goritmust használjuk egy 8 bites számlálóval, akkor adjuk meg a négy laphoz ható hely tovább zsugorodik. A 4.44. ábrán mennyi m em ória áll a processzus
tartozó számláló értékét az utolsó órajel után. rendelkezésére a felügyelőprogram és a foglalt rész között, amennyiben az be­
24. Mennyi ideig tart egy 64 KB-os program betöltése a lemezről, ha a lemez töltési felügyelőprogram 52 256 bájtot foglalt le?
átlagos elérési ideje 30 ms, forgásideje 20 ms, és egy sávon 32 KB adat fér el? 35. Az előző számít-e, ha a betöltési felügyelőprogram pontosan annyi memóriát
A lapok véletlenszerűen szétszórtak a lemezen. használ, amennyit leírtunk, vagy ezt az egységet memóriaszeletekre kerekítjük?
(a) 2 KB-os lapm éretnél? 36. A 4.7.5. alfejezetben láttuk, hogy az exec rendszerhívás a megfelelő lyuk keresé­
(b) 4 KB-os lapm éretnél? sét az előző processzus m emóriájának felszabadítása előtt végzi. Ez a módszer
(c) 64 KB-os lapm éretnél? nem az optimális megoldást adja. írjuk át az algoritmust, hogy jobb legyen.
25. Az előző feladat eredményeit látva miért olyan kicsik a lapok? Nevezze meg a 37. A 4.8.4. alfejezetben m egm utattuk, hogy a lyukakat a kód- és adatszegmens
64 KB-os lapm éret két hátrányát a 4 KB-os lapm érethez viszonyítva. számára jobb külön megkeresni. Implem entáljuk ezt az ötletet.
498 4. MEMŐRIAGAZDÁLKODÁS

38. Tervezzük újra az adjust eljárást, hogy elkerüljük a szignált kapó processzus fe­
lesleges m egszüntetését a túl szigorú veremteszt miatt.
39. M INIX 3-ban egy processzus aktuális memóriafoglalását az alábbi paranccsal
5. Fájlrendszerek
tudjuk lekérni:

chmem +0 a.out

ennek azonban az a mellékhatása, hogy átírja a fájlt, megváltoztatva az idő


adatait. Módosítsuk úgy a chmem parancsot egy új showmem parancsba, hogy
csak egyszerűen kiírja a szükséges adatokra.

M inden számítógépes alkalmazás esetén szükség van információ tárolására és


visszakeresésére. M inden program futása közben az információ egy részét tudja
tárolni a programhoz tartozó m em óriaterületen. Azonban ennek a tárolásnak a
virtuális tár m érete határt szab. Néhány alkalmazás esetén ez a kapacitás elegen­
dő, más esetekben - mint például repülőjáratok helyfoglalási rendszere, banki al­
kalmazás vagy vállalati nyilvántartás esetén - m ár túl kicsi.
A másik problém a a belső tárolás esetén, hogy a processzus befejeződésekor
az információ elvész. Sok alkalmazás esetén (például adatbázisoknál) az inform á­
ciót meg kell őrizni hetekig, hónapokig vagy akár örökre. Elfogadhatatlan, hogy
a processzus befejeződésekor elvesszen. Továbbá nem veszhet el akkor sem, ha a
számítógép összeomlik.
A harmadik m egoldandó problém a az, hogy gyakran biztosítani kell, hogy több
processzus egy időben hozzáférhessen ugyanazon információhoz. H a egy telefon­
tudakozó adatait a processzushoz tartozó mem óriában tárolnánk, akkor csak ez a
processzus férhetne hozzá. Ez a problém a úgy oldható meg, hogy az információ
tárolását m inden processzustól függetlenné tesszük.
Hosszú távú információtárolás esetén tehát három alapvető követelményt kell
kielégíteni:

1. Biztosítani kell igen nagyméretű információ tárolását.


2. Az információ életben maradjon az azt használó processzus befejeződésekor.
3. Több processzus egy időben hozzáférhessen az információhoz.

Az em lített problém ák szokásos megoldása az, hogy az információt mágnesleme­


zen vagy más külső tárolón tároljuk. Az ilyen tárolás egységét nevezzük fájlnak.
Processzusok a fájlokat olvashatják és szükség esetén új adatot írhatnak. Az infor­
máció fájlban való tárolásának tartósnak kell lennie, vagyis nem befolyásolhatja
processzusok indítása és befejeződése. Fájl csak akkor tűnhet el, ha a tulajdonosa
azt félreérthetetlenül kitörli.
A fájlokat az operációs rendszer kezeli. Az operációs rendszerek tervezésének
fontos témái közé tartozik a fájlok szerkezete, elnevezése, hozzáférése, használa-
500 5. FÁJLRENDSZEREK 5.1. FÁJLOK 501

ta, védelme és megvalósítása. Egészében véve, az operációs rendszer azon része, tűk a fájlnevek képzését is örökölte. Minden új változat javításokat adott a rend­
amely a fájlokkal foglalkozik, a fájlrendszer, és ez a fejezet témája. szerhez, de az általunk vizsgált tulajdonságok többnyire azonosak az MS-DOS és
A felhasználó nézőpontjából a fájlrendszerrel kapcsolatban a legfontosabb az, a „klasszikus” Windows-változatokkal. A Windows NT, Windows 2000 és Windows
hogy miként jelenik meg számára, azaz mi a fájlok tartalma, hogyan lehet fájlo­ XP is támogatja az MS-DOS-fájlrendszert, azonban ezeknek a rendszereknek saját
kat elnevezni, védeni, milyen műveletek végezhetők fájlokkal, és így tovább. Azok fájlrendszerük is van (NTFS), amelynek eltérő tulajdonságai vannak (mint például
a részletek, amelyek arra vonatkoznak, hogy vajon láncolt listán vagy bittérképen Unicode fájlnevek). Ez a fájlrendszer a későbbi verziókban további változásokon
történik-e a szabad tárhelyek nyilvántartása, vagy hogy hány szektor van egy logi­ m ent keresztül. Ebben a fejezetben a korábbi rendszerekre Windows 98 néven hi­
kai blokkban, kevéssé érdekes a felhasználó számára, ugyanakkor nagyon fontosak vatkozunk. Jelezni fogjuk, ha valamely tulajdonság nem alkalmazható az MS-DOS
a fájlrendszer tervezői számára. Ezért a fejezetet több részre osztottuk. Az első két vagy a Windows 95 esetén. Hasonlóan, ha újabb rendszerre hivatkozunk, akkor az
rész a fájlok és a könyvtárak felhasználói felületével foglalkozik. Ezután vizsgáljuk vagy az NTFS, vagy a Windows XP fájlrendszere, és az olyan esetekben, amikor egy
részletesen a fájlrendszerek megvalósítását, majd a biztonsági és védelmi mecha­ tulajdonság eltér a Windows NT vagy a Windows 2000 rendszerekben, akkor azt
nizmusokkal foglalkozunk, végül a M INIX 3 fájlrendszerének a leírását adjuk meg. jelezzük. H a csak annyit mondunk, hogy Windows, akkor az összes, Windows 95
utáni Windows-fájlrendszert értjük alatta.
Sok operációs rendszer tám ogatja a két részből álló fájlnevek használatát, ahol
a két részt a pont karakter választja el, mint prog.c. A pont után álló részt kiter­
5.1. Fájlok jesztésnek nevezzük, és általában a fájl tartalm ára utal. Az M S-DOS-rendszerben
például a fájlnév első része legfeljebb 8 karakterből állhat, a kiterjesztés pedig leg­
Ebben az alfejezetben a felhasználó nézőpontjából vizsgáljuk a fájlokat, tehát azt, feljebb 3 karaktert tartalm azhat. Unixban a kiterjesztés, ha van, akármilyen hosz-
hogy m iként használhatók, milyen tulajdonságaik vannak. szú lehet, és több kiterjesztés is megengedett, példáulprog.c.bz2, ahol a .bz2 kiter­
jesztés arra utal, hogy a prog.c fájlt bzip2 algoritmussal töm örítették. Az 5.1. ábra
néhány gyakran használt kiterjesztést és azok jelentését tartalmazza.
Néhány rendszerben (például a Unix-ban) a kiterjesztés csak konvenció, és
5.1.1. Fájlnevek
használatának nincs következménye. A file.íxt nevű fájl bizonyára valamilyen szö­
A fájl egy absztrakciós mechanizmus, amely lehetővé teszi az információ lemezen veges adatot tartalmaz, de ez a név csak a tulajdonost emlékezteti és nem mond
történő tárolását és későbbi visszaolvasását. Ezt olyan m ódon kell biztosítania, semmit a számítógép (operációs rendszer) számára. Ugyanakkor a C fordítóprog­
hogy a felhasználót megkímélje azoktól a részletektől, hogy hol és hogyan tárolják ram megkövetelheti, hogy a fordítandó program ot tartalm azó fájl nevének .c ki-
az információt, és hogy a mágneslemez-tároló ténylegesen hogyan is működik. terjesztése legyen, m áskülönben visszautasítja a fordítást.
Valószínűleg a legfontosabb jellemzője m inden absztrakciós mechanizmusnak
az a mód, ahogyan az objektum okat elnevezi és kezeli. Ezért a fájlrendszerek vizs­ Kiterjesztés Jelentés
gálatát a fájlok elnevezésének tanulmányozásával kezdjük. Amikor egy processzus file.bak Biztonsági másolat
létrehoz egy fájlt, nevet ad neki. H a a processzus befejeződik, a létrehozott fájl to­ file.c C nyelvű forráskód
vábbra is létezik, és minden további processzus az adott névvel férhet hozzá. file.gif CompuServe Graphical Interchange Formát (GIF) kép
A fájlok elnevezésére vonatkozó pontos szabályok eltérők az egyes operációs file.html WWW HyperText Markup Language dokumentum
rendszerekben, de mindegyik lehetővé teszi 1-8 karakterből álló azonosító hasz­ file.iso ISO CD képfájl (CD-re íráshoz)
nálatát érvényes fájlnévként. Tehát az andrea, bruce és cathy lehetséges fájlnevek. file.jpg JPEG szabvány szerint kódolt képállomány
Gyakran számjegyek és speciális karakterek is megengedettek, így a 2, fontos! és file.mp3 MPEG 3-as audioformátum szerint kódolt zene
a 2.14. ábra szintén érvényes fájlnevek. Több fájlrendszer esetén a név hossza 255 file.mpg MPEG szabvány szerint kódolt videoállomány
karakter is lehet. file.o Tárgykód (lefordított, de nem összeszerkesztett)
Néhány fájlrendszer különbséget tesz kis- és nagybetű között, míg mások esetén file.pdf PDF (Protable Document Formát) dokumentum
a kis- és nagybetűk egyenértékűek. A Unix (és m inden változata) az első, az MS- file.ps PostScript állomány
DOS a második kategóriába tartozik. Unix-rendszerben a következő fájlnevek file.tex TEX kiadványszerkesztőre írt dokumentum
mind különbözők: maria, Maria, M ARIA, M S-DOS-rendszerben pedig ugyanazt file.txt Közönséges szöveges állomány
a fájlt azonosítják. file.zip Tömörített állomány
A Windows ezen szélsőséges esetek közé esik. A Windows 95 és Windows 98 fájl-
rendszere az MS-DOS fájlrendszerén alapszik, ezért annak sok tulajdonságát, köz­ 5.1. ábra. Tipikus fájlkiterjesztések
502 5. FÁJLRENDSZEREK 5.1. FÁJLOK 503

Az ilyen jellegű konvenciók különösen hasznosak lehetnek akkor, ha ugyanaz 1 bájt 1 rekord
a program különböző fájlokat képes feldolgozni. A C fordítónak például, adha­ k '
tunk egy listát, amelynek elem eit lefordítja és összeszerkeszti, ahol a lista elemei
lehetnek C forrásnyelvű állományok (például foo.c) vagy assembly állományok
(például bar.s), vagy tárgykódok (például other.o) is. A kiterjesztés ilyenkor alap­
vető, m ert ez m ondja meg a fordítónak, hogy mely fájlok a C, melyek az assembly,
illetve a tárgykódfájlok.
Ezzel szemben a Windows nagyon is érzékeny a kiterjesztésre, és jelentést ren­
del hozzájuk. A felhasználó (vagy processzus) regisztrálhatja az operációs rend­
szerben a kiterjesztéseket, és megadhatja, hogy melyikhez milyen program tarto­
zik. Amikor a felhasználó duplán kattint egy fájl nevére, akkor a kiterjesztéshez
regisztrált program elindul, param éterként a fájl nevét véve. Például egyfile.doc
nevű fájlra duplán kattintva a Microsoft Word program indul, és betölti szerkesz­
tésre afile.doc fájlt.
Vannak, akik furcsának találhatják, hogy a Microsoft alapértelm ezés szerint né­ (a) (b) (c)

hány gyakori kiterjesztést láthatatlanná tesz, m ert ezek olyan fontosak. Szerencsé­
re a Windows legtöbb ilyen, „alapértelmezés szerint rossz” beállítását a felkészült 5.2. ábra. Három lehetséges fájlszerkezet, (a) Bájtsorozat, (b) Rekordsorozat, (c) Fa
felhasználó, aki tudja, hol keresse őket, módosíthatja.
m inden rekord egy rögzített pozícióban kulcsmezőt tartalmaz. A fa rekordjai oly
m ódon rendezettek, hogy gyorsan m egkereshető legyen egy adott kulcsú rekord.
5.1.2. Fájlszerkezet Az alapvető művelet itt nem a „következő” rekord elérése, bár ez is lehetséges,
hanem adott kulcsú elem elérése. Az 5.2.(c) ábrán látható zoo fájl esetén például
A fájlok többféle m ódon strukturálhatok. A három általános lehetőséget az 5.2. kérhetjük a rendszertől azt a rekordot, amelynek kulcsa pony, nem törődve azzal,
ábra szemlélteti. Az 5.2.(a) ábrán látható fájlt strukturálatlan bájtsorozat alkotja. hol van a fájlban ez a rekord. Továbbá új rekordokkal bővíthetjük a fájlt. Ekkor
Valójában az operációs rendszer nem tudja és nem is törődik azzal, hogy mi van az operációs rendszer, és nem a felhasználó dönti el, hogy hova kerüljön az új re­
a fájlban. Amit lát, az csupán egy bájtsorozat. M inden jelentést felhasználói prog­ kord. Ez a fájltípus nyilvánvalóan teljesen különböző a Unix és a Windows 98 által
ram rendel a fájlhoz. A Unix-és a W INDOW S 98 is ezt a megközelítést használja. használt bájtsorozat-felfogástól, de az adatfeldolgozásra használt a nagyszámító­
Akkor a legnagyobb a flexibilitás, ha az operációs rendszer bájtsorozatnak te­ gépek még ma is használják.
kinti a fájlt. A felhasználói program ok bárm it tárolhatnak a fájlban, és bármely
alkalmas m ódon elnevezhetik azt. Az operációs rendszer nem ad segítséget, de
nem is korlátoz. Ez utóbbi nagyon fontos lehet, ha a felhasználó nem megszokott 5.1.3. Fájltípusok
dolgokat akar művelni.
Az első módosítás az egyszerű fájlszerkezethez képest az 5.2.(b) ábrán látható. Sok operációs rendszer különböző típusú fájlok kezelését támogatja. A Unix és
Ebben a modellben a fájl rögzített hosszúságú rekordok sorozata, és minden re­ a Windows például közönséges (reguláris) fájlokat és könyvtárakat is m egen­
kordnak meghatározott belső szerkezete van. Ekkor az az elv érvényesül, hogy min­ ged. A Windows XP m etaadatfájlokat is alkalmaz; ezekkel később foglalkozunk.
den olvasási művelet egy teljes rekordot ad, és minden írási művelet egy teljes re­ A Unix karakterspecifikus és blokkspecifikus fájlokat is kezel. Közönséges fájlok
kordot ír felül vagy hozzáad a fájlhoz. Evekkel ezelőtt, amikor 80 oszlopos lyukkár­ azok, amelyek a felhasználók által kezelt információkat tárolják. Az 5.2. ábrán
tyát használtak, sok operációs rendszer fájlrendszere 80 karakter hosszú rekordok minden fájl közönséges fájl. A könyvtárak rendszerfájlok, amelyek a fájlrendszer
alkotta fájlokra épült. Ezek a rendszerek szintén tám ogatták a 132 karakteres re­ szerkezetének megvalósítását teszik lehetővé. A könyvtárakat később fogjuk tár­
kordokat, ami a sornyomtatóknak felelt meg (akkortájt a nyomtatók nagy, 132 osz­ gyalni. A karakterspecifikus fájlok bem enet/kim enet megvalósításához kapcso­
lopos láncos sornyomtatók voltak). A programok 80 karakter egységben olvastak lódnak, és az olyan soros I/O-eszközöket modellezik, mint a terminálok, nyomta­
be adatokat, és 132 karakter egységben írtak ki, jóllehet az utolsó 52 lehetett szóköz tók és hálózatok. A blokkspecifikus fájlok a mágneslemezegységeket modellezik.
is. Manapság nincs olyan általános célú rendszer, amely ezt a rendszert használná. Ebben a fejezetben elsősorban közönséges fájlokkal foglalkozunk.
A harmadik típusú fájlszerkezetet az 5.2.(c) ábra mutatja. Ebben a szervezés­ A közönséges fájlok vagy ASCII, vagy bináris fájlok. Az ASCII fájlok szöveg­
ben a fájl rekordokból felépülő fa, a rekordok hossza nem feltétlenül azonos, és sorokat tartalmaznak. Néhány rendszerben m inden sort a kocsi vissza jel zár. Más
504 5. FÁJLRENDSZEREK 5.1. FÁJLOK 505

rendszerekben a sorvégejelet használják elválasztójelként. Néha mindkét jelet kell van: fej, szöveg, adat, áthelyezési bitek, szimbólumtábla. A fejrész az ún. mágikus
használni (például a Windowsban). Természetesen nem kell, hogy m inden sor azo­ számmal kezdődik, amely a végrehajtható fájlokat azonosítja (megvédve attól, hogy
nos hosszúságú legyen. nem szándékoltan végrehajtsunk egy nem végrehajtható fájlt). Ezt követi a külön­
Az ASCII fájlok nagy előnye, hogy tartalm uk m egjeleníthető úgy, ahogy van, böző részek hossza, a belépési pont és a jelzőbitek. A fejrész után következik a prog­
kinyomtatható és szerkeszthető közönséges szövegszerkesztővel. Továbbá, ha sok ram szöveg- és adatrésze. Ezek a részek betöltődnek a m emóriába, és áthelyezési
program használ ASCII fájlt bem enetként és kim enetként, akkor az egyik prog­ bitek alapján áthelyeződnek. A szimbólumtábla hibakeresésre használatos.
ram kim enetét a másik bem enetéhez lehet kapcsolni, például a parancsértelm ező­ A második példánk bináris fájlra egy archív állomány, szintén Unix-rendszer-
ben adatcső használatával. (A processzusok összecsövezése nem egyszerű dolog, ben. Ez könyvtári eljárások (modulok) lefordított, de össze nem szerkesztett gyűj­
de az információnak standard konvenció szerinti interpretálása, mint az ASCII, teményéből áll. Minden modulállomány a fejrésszel kezdődik, amely tartalmazza
sokat segít.) a modul nevét, a létrehozás dátum át, a tulajdonost, a védelmi kódot és a m éretet.
Más fájlok binárisak, ami csak azt jelenti, hogy nem szöveges (ASCII) fájlok. Az Ugyanúgy, mint a végrehajtható állományokban, a modulfej itt is tele van bináris
ilyen fájlok nyomtatásának eredménye érthetetlen, látszólag tele van hulladékkal. számokkal. Nyomtatásuk zagyvaságot eredményezne.
A bináris fájloknak általában van valamilyen belső struktúrájuk, amelyet a rájuk Minden operációs rendszernek fel kell ismernie egy fájltípust, a rendszerben
alkalmazott program ok ismernek. végrehajtható fájl típusát, de néhány rendszer ezenkívül más típust is felismer.
Például az 5.3.(a) ábrán egy korábbi Unix-rendszerbeli egyszerű, végrehajtható A régi TOPS-20-rendszer (a DECsystem 20 operációs rendszere) odáig elment,
bináris fájlt látunk. Bár technikailag a fájl nem más, mint bájtsorozat, az operációs hogy megvizsgálta m inden végrehajtandó fájl létrehozási idejét. Ezután megke­
rendszer csak akkor tudja végrehajtatni, ha a fájl megfelelő formájú. Ennek öt része reste a forrásfájlt, és összehasonlította annak utolsó módosítási idejével. H a a for­
rás fiatalabb volt, mint a bináris, akkor autom atikusan lefordította a programot.
Unix-fogalmakkal ez azt jelentette, hogy a make be volt építve a parancsértelm e­
zőbe. Ebben a rendszerben a kiterjesztés kötelező volt, így a rendszer meg tudta
Modulnév
állapítani, hogy a bináris melyik forrásprogram ból keletkezett.
A szigorúan típusolt fájlok esetén problém át okozhat, ha a felhasználó olyat
tesz, amire a rendszer tervezői nem készültek fel. Tekintsünk egy olyan rendszert,
Dátum amelyben a kim enet fájltípusa dat (adatfájl). H a egy felhasználó olyan formázó
program ot ír, amely .c fájlokat (C forrásprogram ) konvertál (például standard be­
Tulajdonos
kezdéseket produkál), a művelet eredm ényét kimenetfájlba írja, akkor ennek tí­
Védelem pusa dat lesz. H a a felhasználó a C fordítónak adja bem enetként, akkor a rendszer
visszautasítja, m ert kiterjesztése nem megfelelő. Megkísérelve a p.dat állomány
Méret átm ásolását a p.c névre, ismét visszautasít (m ert védi a felhasználót a hibáktól).
Amíg az ilyen felhasználóbarát rendszer segítheti a kezdőt, hátráltatja a tapasz­
talt felhasználót, m ert sok erőfeszítést igényel tőle, hogy kijátssza a rendszert.

5.1.4. Fájlelérés
A korai operációs rendszerek csak egyféle fájlelérést biztosítottak: a szekvenciális
elérést. Ezekben a rendszerekben m inden processzus a m egadott sorrendben ol­
vashatta a bájtokat vagy rekordokat az elsőtől kezdve, de nem tudott átlépni egy­
ségeket és a sorrendtől eltérően olvasni. A szekvenciális fájlok elejére lehet állni,
így akárhányszor újraolvashatók. A szekvenciális fájlok akkor alkalmazhatók jól,
ha a tároló médium mágnesszalag, és nem mágneslemez.
Amikor a mágneslemez-tárolók használatba jöttek, lehetővé vált a fájlok bájt­
jainak vagy rekordjainak nem sorrendben történő olvasása is, vagy a kulcs, nem
(a) (b)
pedig pozíció szerinti olvasás. Az olyan fájlt, amelynek bájtjai vagy rekordjai tét-
S.3. ábra. (a) Végrehajtható fájl. (b) Archív fájl
506 5. FÁJLRENDSZEREK 5.1. FÁJLOK 507

szőleges sorrendben olvashatók, közvetlen elérésű fájlnak hívjuk. Sok alkalmazás Mező Értelmezés
igényel ilyen fájlokat. Védelem Ki érheti el a fájlt és milyen módon
A közvetlen elérésű fájlok alapvetők sok alkalmazásnál, mint például az adat­ Jelszó Jelszó, amelyet az eléréshez meg kell adni
bázisoknál. H a egy utas jelentkezik, hogy helyet akar foglalni egy adott járatra, Létrehozó A fájl létrehozójának azonosítója
akkor a helyfoglaló program nak el kell érnie a járat adatait tartalm azó rekordot Tulajdonos Az aktuális tulajdonos azonosítója
anélkül, hogy előbb végigolvasná több ezer járat rekordjait. Csak olvasható jelző 0, ha írás és olvasás megengedett, 1, ha csak olvasható
Két módszer használatos annak meghatározására, hol kezdődjön az olvasás. Rejtettségi jelző 0 a normál eset, 1, ha listázásban nem megjelenítendő
Az első esetén m inden read olvasó műveletben meg kell adni az olvasandó rekord Rendszerjelző 0 normál fájl, 1 rendszerfájl esetén
pozícióját. A másik módszer egy speciális műveletet, a seek-et használja a kezdő Archív jelző 0, ha archiválva volt, 1, ha archiválásra kijelölt
pozíció beállítására, ezt követően a fájl az aktuális pozíciótól kezdődően szekven­ ASCII/bináris jelző 0, ha ASCII, 1, ha bináris a fájl
ciálisán olvasható. Közvetlen elérés jelző 0, ha csak szekvenciális, 1, ha közvetlen elérésű a fájl
Néhány nagygépes rendszerben a fájl létrehozásakor meg kell adni, hogy a fájl Ideiglenességjelző 0, ha normál fájl, 1, ha törölni kell a processzus befejeződésekor
szekvenciális vagy közvetlen elérésű legyen. Ez lehetővé teszi, hogy a rendszer Zároltságjelző 0, ha nem zárolt, 1, ha zárolt a fájl
különböző tárolási módszert használjon a két esetben. A m odem operációs rend­ Rekord hossza A bájtok száma egy rekordban
szerek nem tesznek ilyen különbséget, minden fájl automatikusan közvetlen elérésű. Kulcs pozíciója A kulcs pozíciója a rekordban
Kulcs hossza A kulcsmező hossza bájtokban
Létesítési idő A fájl létrehozásának dátuma és időpontja
5.1.5. Fájlattribútumok Utolsó hozzáférés ideje Az utolsó hozzáférés dátuma és időpontja
Utolsó módosítás ideje Az utolsó módosítás dátuma és időpontja
M inden fájlnak van neve és adattartalm a. Ezenfelül m inden operációs rendszer Aktuális méret A bájtok száma a fájlban
más információkat is rendel a fájlokhoz, mint például a létrehozás dátum a és a Maximális méret A lehetséges maximális fájlméret bájtban
fájl m érete. Ezeket a többletadatokat nevezzük a fájl attribútumainak, de van­
nak akik metaadatnak hívják. Az attribútum ok listája erősen változik rendszerről 5.4. ábra. Néhány lehetséges fájlattribútum
rendszerre. Az 5.4. ábra táblázatában felsoroltunk néhány lehetséges attribútu­
mot. Nincs olyan rendszer, amelyben mindegyik szerepelne, de valamennyi meg­ hogy a fájl maximálisan mekkora lehet, m ert ennek megfelelően foglal előre tár­
található a rendszerek valamelyikében. helyet számára. A m odern operációs rendszerek azonban m ár elég okosak ahhoz,
Az első négy attribútum azt szabályozza, hogy ki és hogyan érheti el a fájlt. hogy enélkül is megoldják a feladatot.
M inden séma lehetséges, néhányat később tanulmányozunk. Néhány rendszerben
jelszó szükséges a fájl eléréséhez, amelynek a fájl attribútum ának kell lennie.
A jelzőbitek vagy rövid mezők, amelyek specifikus tulajdonságokat szabá­ 5.1.6. Fájlműveletek
lyoznak vagy engedélyeznek. A rejtett fájlok például nem jelennek meg az ösz-
szes fájl listázásakor. Az archív jelző azt jelenti, hogy a fájlt archiválni kell. Az A fájlok azért vannak, hogy információt tároljunk bennük, amit később vissza­
archiválóprogram törli a bitet, az operációs rendszer pedig 1-re állítja, valahány­ kereshetünk. A különböző rendszerek különböző m űveleteket biztosítanak táro­
szor a fájl módosul. Az ideiglenességjelző annak megjelölésére szolgál, hogy a fájlt lásra és visszakeresésre. Alább összefoglaljuk a fájlokkal kapcsolatos leggyakoribb
létrehozó processzus befejeződésekor a fájlt törölni kell. rendszerhívásokat.
A rekord hossza, a kulcs pozíciója és a kulcs m érete csak azoknál a fájloknál
használatos, amelyeknél lehetséges kulcs szerinti keresés. Ezek az információk a 1. LÉTESÍTÉS (create). A datot nem tartalmazó, üres fájl létrehozása. A rend­
kereséshez szükségesek. szerhívás célja, hogy jelezze a fájl keletkezését, és beállítsa a fájl bizonyos
A különböző időattribútum ok annak nyomon követésére szolgálnak, hogy a attribútum ait.
fájlt mikor létesítették, mikor volt az utolsó hozzáférés, illetve az utolsó módosí­ 2. TÖRLÉS (delete). H a a fájlra nincs szükség a továbbiakban, törölni kell,
tás. Ezek az információk sokféle célra használhatók. Például az a forrásfájl, amely hogy felszabaduljon az általa elfoglalt lemezterület. Minden rendszer bizto­
módosult a hozzá tartozó tárgykód létrehozása után, újrafordítást igényel. Ehhez sítja ezt a műveletet.
ezek a mezők szolgáltatják a szükséges információt. 3. MEGNYITÁS (open). A fájlt használni kívánó processzusnak a használat
Az aktuális m éret megmondja, hogy a fájl jelenleg mekkora. Néhány régebbi megkezdése előtt meg kell nyitnia a fájlt. Az open műveletnek az a célja,
nagygépes operációs rendszer megköveteli, hogy a fájl létrehozásakor megadjuk,
508 5. FÁJLRENDSZEREK 5.2. KÖNYVTÁRAK 509

hogy a rendszer beolvassa a fájl attribútum ait a m em óriába és néhány, a fájl­


hoz tartozó lemezeimet a további fájlműveletek gyorsítása végett.
5.2. Könyvtárak
4. LEZÁRÁS (ciose). H a a fájlt feldolgozó műveletek befejeződtek, akkor az A fájlok nyilvántartására az operációs rendszerek rendszerint könyvtárakat vagy
attribútum aira és a lemezcímekre a továbbiakban nincs szükség, tehát a fájl m appákat használnak, amelyek sok rendszerben maguk is fájlok. Ebben az alfeje­
lezárható, és ezzel belső m em óriaterület szabadítható fel. Sok rendszer az­ zetben a könyvtárakat tárgyaljuk, szervezésüket, tulajdonságaikat és a rajtuk vé­
zal ösztönzi a fájlok lezárását, hogy korlátozza a processzus által egy időben gezhető műveleteket.
nyitva tartható fájlok számát. A lemezre írás blokkokban történik, és a fájl
lezárása kikényszeríti az utolsó blokk kiírását akkor is, ha az még nincs tele.
5. OLVASÁS (read). A fájlból adatokat olvashatunk be a memóriába. A beolva­ 5.2.1. Egyszerű könyvtárszerkezet
sott bájtok általában az aktuális pozíciótól kezdődően olvasódnak be. A read
művelet kezdeményezőjének meg kell adnia a beolvasandó bájtok számát, M inden könyvtár tipikusan egy bejegyzést tartalm az m inden fájlhoz. Egy lehető­
és hogy az adatok a m em óriában hova kerüljenek. séget m utat az 5.5.(a) ábra, ahol minden bejegyzés tartalm azza a fájl nevét, att­
6. ÍRÁS (write). A fájlba írt adatok általában szintén az aktuális pozíciótól íród­ ribútum ait és azon lem ezterület címét, ahol a fájlt tárolják. Egy másik lehetőség
nak ki. H a az aktuális pozíció a fájl végén van, akkor a kiírt bájtokkal növek­ látható az 5.5.(b) ábrán. Itt m inden könyvtári bejegyzés a fájl nevét és azon adat-
szik a fájl m érete. H a az aktuális pozíció belső, akkor felülírás történik, és a szerkezet címét tartalmazza, ahol a fájl attribútum ai és lemezcímei tárolódnak.
felülírt adatok m indörökre elvesznek. M indkét lehetőség általánosan használt.
7. HOZZÁTOLDÁS (append). Ez a művelet az írás korlátozott változata; írni A fájl megnyitásakor a rendszer addig keres a könyvtárban, amíg a megnyitan­
csak a fájl végére lehet. Azok a rendszerek, amelyek csak kevés számú fájl­ dó fájl nevét meg nem találja. Ezután kiolvassa a fájl attribútum ait és a lemezcí­
műveletet tartalmaznak, általában nem rendelkeznek append művelettel. m eket vagy közvetlenül a könyvtári bejegyzésből, vagy az általa m utatott címről,
Sok rendszerben egy művelet többféle m ódon is megvalósítható, és ezekben és eltárolja ezeket az adatokat a memóriában. így minden további fájlművelet a
a rendszerekben általában van append is. mem óriában találja a szükséges információkat.
8. POZICIONÁLÁS (seek). Közvetlen elérésű fájlok esetén szükség van az A könyvtárak száma rendszerről rendszerre változik. A legegyszerűbben terve­
írás és olvasás helyének megadására. Az egyik általános megoldás erre a zett rendszerben csak egyetlen könyvtár van, amely az összes felhasználó minden
seek rendszerhívás, amely a fájl aktuális pozícióját m egadott címre állítja át. fájlját tartalmazza, mint azt az 5.6.(a) ábra mutatja. A korai személyi számítógé­
A seek művelet végrehajtása után az olvasás, illetve az írás a beállított pozí­ peken az egykönyvtáras rendszer általános volt, részben azért, m ert csak egy fel­
ciótól történik. használó volt.
9. ATTRIBÚTUMLEKÉRDEZÉS (get attribútum). A processzusoknak felada­ Az egykönyvtáras rendszereknél több felhasználó esetén az a problém a ke­
tuk elvégzéséhez gyakran szükségük van arra, hogy m egtudják a fájl attribú­ letkezik, hogy különböző felhasználók ugyanazt a fájlnevet alkalmazhatják saját
tumait. Például a Unix make parancsa arra való, hogy nagy szoftverfejlesz­ fájljaik elnevezésére. Például ha az A felhasználó egy mailbox nevű fájlt létesít,
tések forrásait kezelje. A make parancs végrehajtásakor először megvizsgál­ majd később a B felhasználó is létesít egy mailbox nevű fájlt, akkor a fí fájlja felül­
ja az összes forrás- és tárgykódfájl módosítási idejét, és megállapítja, hogy írja A fájlját. Következésképpen ezt a módszert nem használják többfelhasználós
minimálisan hány fordítás szükséges ahhoz, hogy minden aktualizált legyen.
Ennek elvégzéséhez le kell kérdeznie a fájlok attribútumait, nevezetesen a
módosítási időt. games i attribútumok
i
10. ATTRIBÚTUMBEÁLLÍTÁS (set attribútum). Bizonyos attribútum okat a fel­ i attribútumok
mail
használó is beállíthat és m ódosíthat a fájl létrehozása után. Ez a rendszer-
news ! attribútumok
hívás ezt a célt szolgálja. Nyilvánvaló példa erre a védelmi mód. A legtöbb
jelzőattribútum is ebbe a kategóriába tartozik. work ! attribútumok
11. ÁTNEVEZES (rename). Gyakran előfordul, hogy a felhasználó meg akarja
változtatni egy m ár létező fájl nevét. Ez a rendszerhívás ezt a célt szolgálja.
Az átnevezés persze megoldható oly m ódon is, hogy először a fájlt átmásol­
juk az új névre, majd a régit töröljük. tartalmazó adatszerkezet
12. ZÁROLÁS (lock). A fájl vagy annak egy részének zárolása megakadályoz­
za, hogy egyidejűleg több processzus is hozzáférjen. Például egy repülőgé­ 5.5. ábra. (a) Attribútumok a könyvtári bejegyzésben, (b) Attribútumok más helyen
pes helyfoglaló rendszerben az adatbázis zárolása lehetetlenné teszi, hogy
ugyanazt azt ülőhelyet több utasnak is kiadják.
5T0 5. FÁJLRENDSZEREK 5.2. KÖNYVTÁRAK 511

- Gyökérkönyvtár 5.2.2. Hierarchikus könyvtárszerkezet


A kétszintű hierarchia megszünteti a felhasználók közötti fájlnévkonfliktust. Egy
A A B C másik problém a az, hogy a sok fájlt használó felhasználók kisebb csoportokba
akarják csoportosítani a fájljaikat. Például egy professzor külön csoportba akarja
rendezni az előadásjegyzeteit az éppen készülő könyvének fejezeteitől. Általános
hierarchiára van tehát szükség (vagyis könyvtárak alkotta fára). Ezzel a megköze­
lítéssel m inden felhasználó annyi könyvtárat létesíthet, amennyire szüksége van,
(a)
így a fájlok term észetes m ódon csoportosíthatók. Ezt a megközelítést m utatja az
5.6.(c) ábra. Itt az A, B és C könyvtárakat tartalm azza a gyökérkönyvtár, m ind­
egyik különböző felhasználóhoz tartozik, kettő közülük alkönyvtárakat hozott lét­
re munkáinak tárolására.
Tetszőleges számú alkönyvtár létrehozásának lehetősége nagy hatású eszközt
nyújt az állományok szervezésére. Ennek köszönhetően majdnem m inden mo­
dem PC vagy fájlszerver fájlrendszere ilyen m ódon szerveződik.
□ Könyvtár
Azonban, mint m ár korábban is jeleztük, a történelem gyakran ismétli önmagát
új technológiák alkalmazásával. A digitális fényképezőgépeknek valahol tárolniuk
O FáJ‘ kell a képeket, szokásosan flash memóriakártyán. A legelső digitális fényképező­
gépek egyetlen könyvtárban tárolták a képeket DSC0001.JPG, DSC0002.JPG stb.
neveken. Nem sok idő telt el, és a fényképezőgépek gyártói olyan fájlrendszereket
készítettek, mint amit az 5.6.(b) ábra mutat. A fényképezőgép-tulajdonosok nem
értették, hogyan lehet többszörös könyvtárakat használni, vagy ha meg is értették,
5.6. ábra. Három fájlrendszerterv. (a) Egyetlen közös könyvtár, (b) Felhasználónként valószínűleg nem látnák hasznát. Végső soron mindez (beágyazott) szoftver, és
egy könyvtár, (c) Tetszőleges számú fa felhasználónként. A betűk könyvtárakat vagy semmibe sem kerül a gyártónak. Lehetnek a jövőben digitális fényképezőgépek
fájltulajdonosokatjelölnek teljes hierarchiájú fájlrendszerrel, többszörös felhasználónévvel, 255 karakteres
fájlnevekkel?
rendszerekben, de használható kis beágyazott rendszerekben, mint például a
PDA-k (personal digital assistant) vagy mobiltelefonok.
A konfliktus, amely abból ered, hogy különböző felhasználó ugyanazt a fájlne­ 5.2.3. Útvonal megadása
vet alkalmazza, úgy oldható fel, hogy minden felhasználó külön saját könyvtárat
kap. Ezáltal nem keletkezik ütközés, ha két felhasználó ugyanazt a fájlnevet alkal­ H a a fájlrendszer szervezése könyvtárak fáiból áll, akkor szükség van olyan m ód­
mazza, és nem gond, hogy ugyanaz a név több könyvtárban is előfordul. Ez a ter­ szerre, amely lehetővé teszi fájlnevek megadását. Két különböző módszer hasz­
vezés az 5.6.(b) ábrán látható szerkezetet eredményezi. Ez a módszer használható nálatos. Az első módszer esetén a fájl nevét abszolút (teljes) útvonallal adjuk
lenne például többfelhasználós rendszerben, vagy olyan személyi számítógépek meg, amely a gyökérkönyvtártól indulva a fájlig vezet. Például a /usr/ast/mailbox
alkotta egyszerű hálózatban, amelyek közös hálózati fájlszervert használnak. útvonal azt jelenti, hogy a gyökérkönyvtár tartalmazza a usr könyvtárat, amelynek
Ez a módszer feltételezi, hogy amikor egy felhasználó meg akar nyitni egy alkönyvtára az ast könyvtár, és ebben található a mailbox fájl. Az abszolút útvo­
fájlt, akkor az operációs rendszer tudja, hogy ki a felhasználó, és ennek megfele­ nal mindig a gyökérkönyvtárral kezdődik, és egyértelműen azonosítja a fájlt. Unix
lő könyvtárban keressen. Tehát az egyszintű könyvtárrendszerrel ellentétben itt esetén az útvonal elem eit elválasztó jel a /. Windows esetén pedig a \. Tehát az út­
szükség van valamilyen bejelentkeztető eljárásra, amellyel a felhasználó megadja vonalat a két rendszerben az alábbiak szerint kell írni:
a nevét és jelszavát.
E módszer legegyszerűbb megvalósítása esetén m inden felhasználó kizárólag a Windows \usr\ast\mailbox
saját könyvtárában lévő fájlokat érheti el. Unix /usr/ast/mailbox
512 5. FÁJLRENDSZEREK 5.2. KÖNYVTÁRAK 513

Mindegy, milyen jel az elválasztó, az útvonal akkor és csak akkor abszolút, ha az H a egy program úgy akar elérni egy m egadott fájlt, hogy az elérés ne függjön
elválasztójellel kezdődik. attól, mi az aktuális könyvtár, akkor mindig abszolút útvonalmegadást kell hasz­
A másik módszer a fájl megnevezésére a relatív útvonal. Ez a módszer a nálnia. Például a helyesírás-ellenőrző programnak szüksége van a /usr/lib/dictionary
munkakönyvtár (vagy más néven aktuális könyvtár) fogalmára épül. A felhasználó fájlra az ellenőrzés elvégzéséhez. Ekkor a program csak abszolút fájlnévvel hivat­
kijelölhet egy könyvtárat, amely az aktuális munkakönyvtár lesz, és ezután minden kozhat rá, m ert nem tudni, hogy akkor mi lesz az aktuális könyvtár, amikor végre­
olyan útvonal, amely nem a gyökérkönyvtárral kezdődik, az aktuális könyvtárhoz hajtják. Az abszolút útvonalmegadás mindig működik, függetlenül attól, hogy ép­
relatív m ódon értelmeződik. Például ha az aktuális könyvtár a /usr/ast, akkor az a pen mi az aktuális könyvtár.
fájl, amelynek abszolút útvonalmegadása /usr/ast/mailbox, egyszerűen megadható Természetesen ha a helyesírás-ellenőrző program sok fájlt használ a /usr/lib
a mailbox relatív útvonallal. Más szóval, az alábbi két Unix-parancs hatása meg­ könyvtárból, akkor eljárhat úgy is, hogy előbb az aktuális könyvtárat a megfelelő
egyezik, ha az aktuális könyvtár a /usr/ast: rendszerhívással /usr/lib-re állítja, majd csak a dictionary relatív útvonalmegadást
használja. Az aktuális könyvtár explicit megváltoztatása, ismerve a könyvtár ab­
cp /usr/ast/mailbox /usr/ast/mailbox.bak szolút nevét a könyvtárfában, lehetővé teszi relatív nevek használatát.
cp mailbox mailbox.bak A legtöbb rendszerben m inden processzusnak saját munkakönyvtára van, tehát
amikor a processzus befejeződik, akkor nem befolyásolja más processzusok m ű­
A relatív forma gyakran kényelmesebb, de ugyanazt jelenti, mint az abszolút forma. ködését, és nem m arad vissza változás a fájlrendszerben. Ily m ódon mindig telje­
sen biztonságos megváltoztatni az aktuális könyvtárat, ha az kényelmessé teszi a
/ munkát. Másrészről, ha egy könyvtári eljárás megváltoztatja az aktuális könyvtárat,
és a befejeződése előtt nem állítja vissza az eredeti állapotot, akkor a program
további működése bizonytalanná válik, m ert az a feltételezése, hogy hol van, ér­
vénytelenné válik. Éppen ezért a könyvtári eljárások ritkán változtatják meg az ak­
tuális könyvtárat, vagy ha mégis megteszik, akkor gondoskodnak arról, hogy befe­
jeződés előtt visszaállítsák az eredeti állapotot. A legtöbb operációs rendszerben,
amelynek könyvtárszerkezete hierarchikus, m inden könyvtárban van két speciális
könyvtári bejegyzés, ezek a . és .., kiejtésük általában pont és pontpont. A pont az
aktuális könyvtárra való hivatkozás, a pontpont pedig az aktuális könyvtár ősére
hivatkozik. Ezek használatára tekintsük az 5.7. ábrán látható fát. Tegyük fel, hogy
egy processzus aktuális könyvtára a /usr/ast. Ekkor használhatja a .. hivatkozást a
fában felfelé haladáshoz. Például a

cp ../lib/dictionary.

parancs átm ásolhatja a /usr/lib/dictionary fájlt a saját könyvtárába. Az első argu­


m entum arra utasít, hogy menjünk eggyel feljebb a fában, majd lefelé a lib könyv­
tárba, és onnan vegyük a dictionary fájlt.
A második argumentum csupán az aktuális könyvtárat nevezi meg. H a a cp pa­
dict
rancs második argumentuma egy könyvtár (itt a pont), akkor oda bemásolja az
összes fájlt, amelyet az első argumentumban megadtunk. Nyilvánvalóan term észe­
tesebb lenne a másolást elvégezni a

cp /usr/lib/dictionary.

paranccsal. Itt a pont használata megkímélt a dictionary szó kétszeri leírásától.


5.7. ábra. Egy Unix könyvtári fa
Mindazonáltal a

cp /usr/lib/dictionary dictionary
514 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 515

és a rendszerből. H a több könyvtárban is előfordul, akkor csak a megnevezett út­


vonal törlődik, a többi megmarad. Unixban a fájltörlés (korábban tárgyaltuk)
cp /usr/lib/dictionary /usr/ast/dictionary valójában lekapcsolást jelent.

parancs egyaránt helyesen működik. A felsorolt műveletek a legfontosabbak, de léteznek egyebek is, például a védelmi
információ kezelését végző rendszerhívások.

5.2.4. Könyvtári műveletek


A könyvtárakat kezelő m egengedett m űveleteket tekintve nagyobb az eltérés ez 5.3. Fájlrendszerek megvalósítása
egyes rendszerekben, mint az a fájlműveletek esetén tapasztalható. A lehetséges
műveletek és azok hatásainak szemléltetésére tekintsük az alábbi m intát (a Unix- Most már itt az idő, hogy áttérjünk a felhasználói szempontról a megvalósítás
rendszerből). szempontjainak tárgyalására. A felhasználókat az érdekli, hogyan lehet fájlokat
elnevezni, milyen m űveleteket végezhetünk velük, hogyan néz ki a könyvtári fa és
1. LÉTESÍTÉS (create). Új könyvtárat létesít. A létrehozott könyvtár üres, kivé­ hasonló felületi kérdések. Az implementálókat az érdekli, hogyan lehet fájlokat
ve a pont és pontpont könyvtárakat, amelyeket a rendszer (vagy néhány eset­ és könyvtárakat tárolni, lem ezterületeket kezelni, hogyan lehet elérni azt, hogy az
ben az mkdir parancs) autom atikusan létesít. egész hatékonyan és megbízhatóan működjön. A következőkben ezeket a terüle­
2. TÖRLÉS (delete). A megnevezett könyvtárat törli. Csak üres könyvtár töröl­ teket vizsgáljuk, hogy lássuk az előnyöket és a hátrányokat.
hető. Egy könyvtár akkor és csak akkor üres, ha csak a pont és pontpont al­
könyvtárakat tartalmazza, és ezek nem törölhetők.
3. MEGNYITÁS (opendir). A művelet végrehajtása után a könyvtár olvasható 5.3.1. Fájlrendszerszerkezet
lesz. Például egy könyvtár összes fájljának listázását végző program először
megnyitja a könyvtárat, majd kiolvassa a benne található összes fájl nevét. Mi­ A fájlrendszereket általában m ágneslemeztárolókon tárolják. A lemeztárolók
előtt olvasni kezdenénk egy könyvtárat, előbb meg kell nyitnunk, hasonlóan a szerkezetét a 2. fejezetben áttekintettük, amikor a M INIX 3 betöltését vizsgáltuk.
fájlok olvasásához. Röviden felidézzük az ott elhangzottakat. A legtöbb lemez partíciókra van oszt­
4. LEZÁRÁS (closedir). M iután a könyvtárat olvastuk, le kell zárni, hogy felsza­ va, és minden partíció független fájlrendszert tartalmaz. A lemez 0. szektora, az
badítsuk a megnyitáskor lefoglalt memóriát. MBR (Master Boot Record - elsődleges indítórekord) a számítógép elindítására
5. OLVASÁS (readdir). Ez a rendszerhívás a megnyitott könyvtár egy bejegy­ használatos. Az M RB végén található a partíciós tábla. Ez a táblázat tartalmazza
zését adja eredményül. Korábban lehetséges volt könyvtár olvasása a read m inden partíció kezdetének és végének a címét. Egy partíciót ki lehet jelölni aktív
fájlművelettel, ennek azonban az volt a hátránya, hogy a program ozónak is­ partícióként. A számítógép indításakor a BIOS betölti és végrehajtja az MBR-ben
m ernie kellett a könyvtárak belső szerkezetét. Ezzel ellentétben a readdir m ű­ lévő kódot. Az M BR program először megkeresi az aktív partíciót, majd beolvas­
velet mindig egy könyvtári bejegyzést ad szabványos formában, függetlenül a sa és végrehajtja az aktív partíció első blokkját, amelyet indítóblokknak nevezünk.
könyvtár tényleges szerkezetétől. Az indítóblokk program ja tölti be az adott partícióban lévő operációs rendszert.
6. ÁTNEVEZÉS (rename). A könyvtárak több tekintetben hasonlítanak a fájlok­ Az egységesség kedvéért m inden partíció tartalm az indítóblokkot, akkor is, ha az
ra, így ugyanúgy átnevezhetők, mint a fájlok. adott partíció nem tartalm az indítható operációs rendszert. Mivel a későbbiek
7. KAPCSOLÁS (link). A kapcsolás olyan technika, amely lehetővé teszi, hogy során a partíció tartalm azhat indítható operációs rendszert, ezért az indítóblokk
ugyanazok a fájlok több könyvtárban is előforduljanak. A művelethez meg fenntartása m indenképpen jó ötlet.
kell adni egy létező fájlnevet és egy útvonalat. A rendszerhívás hatása az lesz, A fent leírtaknak teljesülni kell az operációs rendszertől függetlenül minden
hogy kapcsolás jön létre a létező fájl és a m egadott útvonal között. Ily módon olyan hardverplatformra, amelyen a BIOS képes több operációs rendszer betöl­
ugyanazok a fájlok több könyvtárban is megjelenhetnek. Az ilyen kapcsolást, tésére. A terminológia függhet az alkalmazott operációs rendszertől. Például az
amely növeli az i-csomópont számlálóját (ez számon tartja, hogy hány könyv­ elsődleges indítórekord elnevezése lehet IPL (Initial Program Loader - kezdő
tári bejegyzés tartalm azza a fájlt), néha merev kapcsolásnak is nevezik. programbetöltő), Volume Boot Code - kötetbetöltő kód vagy egyszerűen mas­
8. LEKAPCSOLÁS (unlink). A művelet egy könyvtári bejegyzést töröl. H a a tör­ terboot (elsődleges betöltő). Néhány operációs rendszer nem követeli meg, hogy
lendő csak egy könyvtárban fordul elő (a normális eset), akkor törlődik a fájl­ aktív partíciót jelöljünk ki, hanem egy menüt kínál fel, amelyből kiválaszthatjuk,
hogy melyik partícióról akarunk indítani, és a várakozási idő letelte után az alap­
516 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 517

értelm ezett választás érvényesül. Az MBR-nek a BIOS által történt betöltése után eddig mondtunk, az nemcsak elektromágneses lem eztárolókra igaz. Olyan eszkö­
a folytatás eltérő lehet. Például az operációs rendszert betöltő program a partíció zök, mint a digitális fényképezőgépek, PDA-k, amelyek tartós tárolót alkalmaznak
egynél több blokkját is elfoglalhatja. A BlOS-nak csak az a feladata, hogy az első (például flash), általában rendelkeznek olyan résszel, amely szimulálja a mágnes­
blokkot betöltse, de ez a blokk aztán további blokkokat tölthet be, az operációs lemezt.
rendszer megvalósításának megfelelően. A rendszer készítője adhat egy szokvá­ A lemezpartíciók, attól eltekintve, hogy indítóblokkal kezdődnek a fájlrend­
nyos MBR-t, de ennek működnie kell standard partíciós táblával, ha több operá­ szertől függően, nagyon eltérő szerkezetűek lehetnek. A Unix típusú fájlrendsze­
ciós rendszert is használunk. rek az 5.8. ábrán látható elem eket tartalm azhatják. Az első a szuperblokk. Ez tar­
PC-kompatibilis rendszerekben csak négy elsődleges partíció lehet, m ert csak talmazza a fájlrendszer valamennyi fontos param éterét, és beolvasódik a m em ó­
négyelemű tömb számára van hely az elsődleges indítórekord és az első 512 bájtos riába a gép indításakor vagy a fájlrendszer első hozzáférésekor.
szektor vége között. Néhány operációs rendszer lehetővé teszi, hogy a partíciós A következő a fájlrendszer szabad blokkjairól adhat információt. Ezt követheti
táblában megjelöljük a partíciót, mint kiterjesztett partíciót, amikor is egy m uta­ az i-csomópontok leírása; ez olyan adatszerkezetek tömbje, amely m inden fájlhoz
tót tartalm az a logikai partíciók láncolt listájára. Ez lehetővé teszi, hogy akárhány egy bejegyzést tartalm az, megadva a fájl m inden szükséges adatát, és hogy hol ta­
további partíciót hozzunk létre. A BIOS nem tudja az operációs rendszert indítani lálhatók a fájl blokkjai. Ezt követheti a gyökérkönyvtár, amely a fájlrendszer fájá­
logikai partícióról, ezért elsődleges partícióról kell indítani, ami aztán kezelni tud­ nak gyökere. A partíció további része tartalm azza a könyvtárakat és fájlokat.
ja a logikai partíciókat.
A kiterjesztett partíció egy alternatíváját használja a M INIX 3, amely lehetővé
teszi, hogy egy partíció alpartíciós táblát tartalmazzon. E nnek az az előnye, hogy 5.3.2. Fájlok megvalósítása
ugyanaz a kód, amely az elsődleges partíciókat kezeli, kezelheti az alpartíciókat is,
m ert ezeknek ugyanaz a szerkezete. Az alpartíciók potenciális felhasználási m ód­ A legfontosabb kérdés a fájlok tárolásának megvalósításánál valószínűleg annak
ja, hogy különböző partíció lehet a gyökér, lapozó, a binárisok és a felhasználói nyilvántartása, hogy mely lemezblokkok mely fájlokhoz tartoznak. A különböző
fájlok számára. így ha problém a lép fel egy partícióval, az nem terjed át más par­ operációs rendszerek eltérő m ódszereket használnak. Ebben a részben néhány
tíciókra, és az operációs rendszer új változata egyszerűen telepíthető lesz néhány, ilyen módszert vizsgálunk.
de nem az összes alpartíció átírásával.
Nem m inden lemezes tárolót lehet partíciókra osztani. Hajlékonylemez-tárolók
általában az első szektorban tartalm azzák az indítóblokkot. A BIOS beolvassa a Folytonos helyfoglalás
lemezről az első szektort, megvizsgálja a mágikus számot, hogy ellenőrizze, vég­
rehajtható kódot tartalmaz-e. Ezzel elkerüli egy formázatlan vagy tönkrem ent A legegyszerűbb helyfoglalási séma szerint m inden fájl tárolására összefüggő
lemez első szektorának végrehajtását. Az elsődleges indítóblokknak és az indító­ blokkok alkotta lem ezterületet használnak. Tehát egy 50 K m éretű fájl 50 egymást
blokknak ugyanaz a mágikus száma, tehát a kód lehet akármelyik. Továbbá, amit követő lemezblokkban foglal helyet, ha a blokkm éret 1 K. Ennek a sémának két
lényeges előnye van. Először is egyszerű megvalósítani, mivel annak nyilvántartá­
----------------------------- Teljes lemez -------------------------------- ► sa, hogy a fájl hol van tárolva a lemezen, csupán két számot igényel, nevezetesen
az első blokk címét és a blokkok számát. Az első blokk címének ism eretében bár­
mely blokk címe egyszerű összeadással kiszámítható.
Másodszor, az olvasás hatékonysága kiváló, mivel a lemezről egyetlen m űvelet­
tel beolvasható a teljes fájl. Csak egy pozicionálást kell végrehajtani (az első blokk
címére). Ezt követően nincs szükség további pozicionálásra, nincs forgási késlelte­
tés, tehát az adatátvitel a lemez teljes átviteli sebességével történhet. így a folyto­
nos helyfoglalást egyszerű megvalósítani és nagyon hatékony.
Sajnos a folytonos helyfoglalásnak van egy súlyos hátránya is: idővel a lemez tö­
redezetté válik, fájlokat és lyukakat tartalmaz. Kezdetben a töredezettség nem okoz
problémát, mivel az új fájlokat a lemez végére, a korábbiak után lehet kiírni. Végül
azonban a lemez megtelik, és szükségessé válik a tömörítés, ami megengedhetetle­
nül költséges, vagy a lyukakat kell újrahasznosítani. Az újrahasznosítás a lyukakat
tartalmazó kétirányú lista kezelését igényli. Azonban amikor egy új fájlt létesítünk,
5.8. ábra. Lehetséges fájlrendszerszerkezet tudnunk kell a végső m éretét, hogy megfelelő lyukat válasszunk a tárolására.
518 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 519

Amint azt m ár em lítettük az 1. fejezetben, a történelem ismételheti önm agát az blokkot ír, illetve olvas. Mivel minden blokkban néhány bájtot elfoglal a követke­
informatikában, am int a technológia új generációja jelentkezik. A folytonos hely- ző blokkra m utató pointer, ezért egy teljes blokkméretnyi olvasás megköveteli két
foglalást ténylegesen használták évekkel ezelőtt lemezes fájlrendszerek megvalósí­ blokkbeli adat összevonását, ami extraköltséget eredményez a másolás miatt.
tására egyszerűsége és hatékonysága m iatt (a felhasználóbarátság akkor nem szá­
m ított). Aztán elvetették a módszert, m ert fájl létrehozásakor tudni kellett a m é­
retét, ami kellem etlen volt. A C D -R O M , DVD és más, csak írható optikai eszköz Láncolt listás helyfoglalás memóriabeli táblázattal
kifejlesztésének hatására hirtelen ismét jó ötletnek bizonyult a folytonos helyfog­
lalás. Az ilyen tárolók esetén a folytonos helyfoglalás megfelelő, és valóban széles A láncolt listás helyfoglalás mindkét hátránya kiküszöbölhető, ha a m utatót ki­
körben használják is. Ezeknél minden fájl m érete előre ismert, és nem változik a vesszük minden blokkból, és egy táblázatban (index) összegyűjtve a memóriában
CD-ROM -fájlrendszer újbóli felhasználásáig. Tehát fontos, hogy tanulmányozzuk tároljuk. Az 5.10. ábra azt mutatja, hogyan néz ki ekkor a táblázat az 5.9. ábrán
a régi rendszereket és elképzeléseket, amelyek fogalmilag tiszták és egyszerűek, adott fájlokra. Mindkét ábrán két fájl látható. A z A fájl a 4, 7, 2,10 és 12 blokkokat
m ert meglepő m ódon alkalmazhatóvá válhatnak jövőbeli rendszerekben. használja ebben a sorrendben, míg a B fájl a 6, 3,11 és 14 blokkokat használja, szin­
tén ebben a sorrendben. Az 5.10. ábrán látható indextáblát használva, a 4. blokkal
indulva és a láncolást követve sorrendben a többi blokk is elérhető. Hasonlóan a
Láncolt listás helyfoglalás 6. blokkal indulva a B fájl blokkjai elérhetők. M indkét lánc a -1 speciális mutató
értékkel végződik, amely nem lehet valódi blokk címe. Az ilyen táblázat neve FAT
A második módszer fájlok tárolására az, amikor a lefoglalt lem ezterületet lemez­ (File Allocation Table - fájlhelyfoglalási táblázat).
blokkok láncolt listájával adjuk meg, mint az az 5.9. ábrán látható. M inden blokk­ Ezt a szervezést használva a teljes blokkméret rendelkezésre áll adat tárolására.
ban az első szó a következő blokkra m utató pointert tartalmazza. A blokk fenn­ Továbbá a közvetlen elérés is sokkal egyszerűbb. Bár most is a láncolást kell kö­
m aradó része adatot tárol. vetni ahhoz, hogy egy adott fájlpozíció lemezeimét megkapjuk, de az egész lánc a
Ellentétben a folytonos helyfoglalással, itt a lemez minden blokkja felhasznál­ mem óriában van, így nem kell lemezhez fordulni. M int az előző módszernél, itt is
ható. Nem veszítünk töredezettség miatt (kivéve az utolsó blokk belső töredezett­ elegendő m inden könyvtári bejegyzésnél csak az első blokk címét tárolni, a töb­
ségét). Továbbá m inden könyvtári bejegyzésnél elegendő csak az első blokk címét bi ebből elérhető, függetlenül a fájl nagyságától. Az elsődleges hátránya ennek a
tárolni. A többi a pointereket követve az elsőtől elérhető. m ódszernek az, hogy a teljes táblázatnak a m em óriában kell lennie a működéshez.
Másrészről, jóllehet a szekvenciális olvasás magától értetődő, a közvetlen elérés
rendkívül lassú lesz. Az n-edik blokk eléréséhez az operációs rendszernek be kell Fizikai blokk
olvasnia az azt megelőző ti - 1-ediket. Világos, hogy ilyen sok olvasás bántóan las­ 0
sú lesz. Az is igaz, hogy az adatblokk m érete m ár nem lesz kettőhatvány, m ert a 1
m utató tárolása elvesz néhány bájtot. Bár nem végzetesen, de az ilyen m éret csök­ 10
2
kenti a hatékonyságot, m ert a program ok többsége kettőhatvány m éretű adat-
3 11
4 Az A fájl itt kezdődik
A fájl
5
6 A S fájl itt kezdődik
7
8

Fizikai blokk 4 7 2 10 12 9
10 12
B fájl 11 14
12 -1
13
14
15 Szabad blokk
Fizikai blokk 6 3 11 14

5.9. ábra. Fájl tárolása blokkok láncolt listájában 5.10. ábra. Láncolt listás helyfoglalás fájlhelyfoglalási táblázat használatával a memóriában
520 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 521

Egy 20 GB kapacitású lemez 1 KB m éretű blokkokkal 20 millió elem ű táblázatot kapacitásával. H a a lemez n blokkból áll, akkor a táblázatnak n eleme van. A táb­
igényel. Minden elem legalább 3 bájt méretű, de gyorsabb elérés miatt 4 bájt is le­ lázat m érete lineárisan nő a lemez méretével. Ezzel szemben az i-csomópontos
het. Tehát a táblázat 60 MB vagy 80 MB helyet igényel a főtárban, attól függően, sémánál a szükséges m emória m érete lineárisan arányos az egyidejűleg nyitva le­
hogy tárra vagy sebességre optimalizálunk. Elképzelhető a táblázatnak lapozható hető fájlok számával. Nem számít, hogy a lemez 1 GB, 10 GB vagy 100 GB kapa­
m em óriába helyezése, de ekkor számolni kell a lapozási forgalom növekedésével. citású.
Az MS-DOS és a Windows 98 kizárólag FAT fájlrendszert használ, amit a későbbi Az a problém a az i-csomóponttal, hogy mindegyik rögzített számú lemezeimet
Windows-verziók is támogatnak. tartalmaz. Mit lehet tenni, ha a fájl m érete túlhaladja ezt? Az egyik megoldás
az, hogy az utolsó cím nem adatblokk címe lesz, hanem egy indirekt blokk címe,
amely további lemezblokkcímeket tartalmaz. Ez az ötlet tovább folytatható, két­
l-csomópont szeresen indirekt, háromszorosan indirekt blokkok alkalmazásáig. Ezt m utatja az
5.11. ábra.
Az utolsó helyfoglalási módszer, amelyet tárgyalunk, az ún. i-csomópont (index-
csomó vagy i-csomó) módszere. Ennél minden fájlhoz tartozik egy kis táblázat, az
i-csomópont, amelyben a fájl attribútum ait és a fájlhoz tartozó blokkok lemezei­ 5.3.3. Könyvtárak megvalósítása
m ét tároljuk. Ezt m utatja az 5.11. ábra.
Az i-csomópont ism eretében a fájl m inden blokkja elérhető. A nagy előnye en­ Tudjuk, hogy m ielőtt egy fájlból olvasnánk, azt meg kell nyitni. Amikor egy fájl
nek a módszernek a m em óriatáblázatot használó láncolt listással szemben, hogy megnyitásra kerül, az operációs rendszer a felhasználó által m egadott fájlnév alap­
csak az i-csomópontnak kell a m em óriában lennie, ha a fájl meg van nyitva. H a ján megkeresi a hozzá tartozó könyvtári bejegyzés helyét. Először term észetesen
minden i-csomópont n bájtos, és legfeljebb k fájl lehet egyidejűleg nyitva, akkor a gyökérkönyvtárat kell megtalálni. A gyökérkönyvtár lehet a partíció kezdetéhez
csak kn bájt szükséges az i-csomópontok mem óriában tárolásához - csak ennyi képest rögzített helyen. Alternatív m egoldásként a helye m eghatározható más in­
m em óriát kell előre lefoglalni. formációkból, például a klasszikus Unix-fájlrendszerben a szuperblokk tartalm az
Ennek a töm bnek a m érete messze kisebb, mint az előző módszernél szükséges információt az adatszerkezet m éretéről, ami megelőzi az adatterületet. A szu­
táblázat m érete. Az ok egyszerű. A láncolt listás táblázat m érete arányos a lemez perblokkban m egtalálható az i-csomópontok helye. Az első i-csomópont m utat a
gyökérkönyvtárra, amely a Unix-fájlrendszer létesítésekor keletkezett. Windows
XP esetén az indítószektor (amely lényegesen nagyobb, mint egy közönséges
l-csomópont szektor) tartalm azza az MFT-t (Master File Table - mesterfájltáblázat), amely
alapján m egtalálhatjuk a fájlrendszer többi részének helyét. M iután megtaláltuk a
gyökérkönyvtárat, a könyvtárfa bejárásával megtalálhatjuk a keresett bejegyzést.
A könyvtári bejegyzés tartalm azza azokat az információkat, amelyek szükségesek
a fájl számára foglalt lemezblokkok megkereséséhez. Rendszertől függően ez vagy
a fájl által elfoglalt teljes lem ezterület címe (folytonos helyfoglalás esetén), vagy
az első blokk címe (m indkét láncolt listás módszernél), vagy az i-csomópont szá­
ma. Mindegyik esetben a könyvtári rendszer fő feladata, hogy a szöveges fájlnév­
hez hozzárendelje azt az információt, amely az adatok eléréséhez kell.
Ehhez szorosan kapcsolódik az attribútum ok tárolásának kérdése. Minden
fájlrendszer kezel olyan attribútum okat, mint a fájl tulajdonosa, létrehozási dá­
tum, amit valahol tárolni kell. Az egyik nyilvánvaló lehetőség szerint magában a
könyvtári bejegyzésben. A legegyszerűbb formában a könyvtár fix m éretű bejegy­
zést tartalm az minden egyes fájlhoz, amely tartalmazza a fájl nevét (fix hosszban),
az attribútum okat és egy vagy több (valami felső korlátig) lemezeimet, amelyek a
blokkok helyét adják meg. Ez látható az 5.5.(a) ábrán.
Azok a rendszerek, amelyek i-csomópontot alkalmaznak, tárolhatják az attribú­
tumokat m agában az i-csomópontban, nem pedig a könyvtári bejegyzésben. Ezt
m utatja az 5.5.(b) ábra. Ekkor egy könyvtári bejegyzés rövidebb lehet, csak a fájl­
5.11. ábra. l-csomópont három indirektblokk-szinttel nevet és az i-csomópont számát tartalmazza.
522 5. F Á JL R E N D S Z E R E K 5.3. F Á JL R E N D S Z E R E K M E G V A LÓ SÍT Á SA 523

Megosztott fájlok olyan rendszerekben is, ahol az attribútum okat a könyvtári bejegyzés tartalmazza.
Kis gondolkodás meggyőzhet arról, hogy bonyolult lenne szinkronizálni többszö­
Az 1. fejezetben röviden megemlítettük a fájlok kapcsolását (link), amely lehető­ rös könyvtári bejegyzések attribútum ait. A fájl minden módosítása az erre a fájlra
vé teszi, hogy több, együtt dolgozó felhasználó megosszon fájlokat. Az 5.12. ábra hivatkozó összes bejegyzés módosítását vonná maga után. De a szimbolikus kap­
m utatja ismét az 5.6.(c) ábrán látható fájlrendszert, ahol most a C felhasználó egy csolást megvalósító extra könyvtári bejegyzés nem tartalm az a hivatkozott fájlra
fájlja a B felhasználó könyvtárában is megtalálható. vonatkozó attribútum ot. A szimbolikus kapcsolás hátránya, hogy ha töröljük a
Unixban, ahol a fájlattribútum okat i-csomópont tárolja, a megosztás könnyen fájlt, vagy csak átnevezzük, akkor a hivatkozás érvényét veszti.
megvalósítható; akárhány könyvtári bejegyzés m utathat ugyanarra az i-csomó-
pontra. Az i-csomópontban van egy mező, amelynek értéke eggyel növekszik min­
den olyan alkalommal, amikor új kapcsolat létesül rá, illetve eggyel csökken, ha Windows 98-könyvtárak
kapcsolatot törlünk. Csak akkor törlődik ténylegesen maga az i-csomópont és az
adat, amikor ez a számláló nulla lesz. A Windows 95 eredeti fájlrendszere azonos volt az MS-DOS rendszerével, de m á­
Az ilyenfajta kapcsolást merev kapcsolásnak (hard link) nevezik. Nem min­ sodik kiadása m ár tám ogatta a hosszabb fájlneveket és nagyobb fájlokat. E rre a
dig lehetséges azonban a fájlokat merev kapcsolással megosztani. A legfontosabb rendszerre a Windows 98 elnevezéssel hivatkozunk, jóllehet megtalálható bizo­
korlátozást az jelenti, hogy a könyvtárak és i-csomópontok egy adott fájlrendszer nyos Windows 95 rendszerben is. A Windows 98-ban kétféle könyvtári bejegyzés
(partíció) adatszerkezetéhez tartoznak, tehát egy fájlrendszer könyvtára nem m u­ létezik. Az elsőt, amelyet az 5.13. ábra mutat, alapbejegyzésnek nevezzük.
tathat egy másik fájlrendszer i-csomópontjára. Továbbá minden fájlnak csak egy Az alapbejegyzés tartalm azza m indazokat az információkat, amelyeket a Win­
tulajdonosa és jogosultsága lehet. H a a megosztott fájl tulajdonosa törli a fájlhoz dows korábbi változatai, és még néhány egyebet. Az N T mezővel kezdődő 10 bájt
tartozó könyvtári bejegyzését, a másik felhasználó fennakad, m ert a jogosultságok a régebbi Windows 95-ben nem volt használatos, szerencsére (vagy a későbbi vál­
miatt nem törölheti a saját könyvtárából. tozatok ism eretében inkább szándékosan). A legfontosabb javítás az, hogy a kez­
Fájlok megosztásának alternatív megoldása az, amikor egy új típusú fájlt létesí­ dő blokk címe 16 helyett 32 biten adható meg. Ez 216 blokkról 232blokkra növelte
tünk, amely egy másik fájl elérési útvonalát tartalmazza. Ez a megoldás működik a fájlrendszer maximális méretét.
különböző fájlrendszerek között is. Valójában ha van olyan lehetőség, amellyel Ez a séma csak az MS-DOS (és CP/M) régi típusú, 8 + 3 karakteres fájlneveit
meg lehet adni hálózati címet is, akkor ezzel a módszerrel másik számítógépen lé­ támogatja. Hogyan kezeli a hosszabb fájlneveket? A hosszabb fájlnevek kezelése,
vő fájlra is lehet hivatkozni. Ezt a megoldást szimbolikus kapcsolásnak (symbolic fenntartva a régi rendszerrel való kompatibilitást, további könyvtári bejegyzések­
link) nevezik a Unix-rendszerekben, rövidútnak (shortcut) a Windowsban és ál­ kel oldható meg. Az 5.14. ábra egy lehetséges megoldást m utat olyan könyvtári be­
név (alias) az Apple Mac OS-rendszerben. Szimbolikus kapcsolás használható jegyzésre, amely 13 karaktert tartalm az hosszú fájlnevek számára. Hosszú nevek
számára a rendszer autom atikusan generál rövidített formát, amit az 5.13. ábrán
m utatott könyvtári bejegyzés Alapnév és a Kit. mezőin helyez el. Hosszú nevekhez
annyi könyvtári bejegyzést használ, amennyi szükséges, az alapbejegyzés előtt he­
lyezi el fordított sorrendben. M inden hosszú bejegyzés Attribútum mezője a OxOF
értéket tartalmazza, ami nem érvényes érték a régebbi (MS-DOS és Windows 95)
rendszerekben, tehát ha egy régebbi rendszer olvassa (például egy hajlékonyleme­
zen), akkor figyelmen kívül hagyja. A Sorozat mező egy bitje m ondja meg, hogy
melyik az utolsó bejegyzés.

Bájtok 8 3 1 1 1 4 2 2 4 2 4
Létrehozás Utolsó írás
N Utolsó
Alapnév Kit. dátuma/ dátuma/ Fájlméret
T elérés
ideje ideje

/ Sec/ t
A kezdőblokk
t
A kezdőblokk
felső 16 bitje alsó 16 bitje

5.12. ábra. Megosztott fájlt tartalmazó fájlrendszer 5.13. ábra. A Windows 98 alap könyvtári bejegyzése
524 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 525

10 1 1 1 12 A /usr/ast
Bájtok A/usr könyvtár A 132. blokk könyvtár A 406. blokk
5 karakter 0 6 karakter 0 2 karakter i-csomópont a /usr könyvtár i-csomópont a /usr/ast könyvtár
Gyökérkönyvtár száma 6 blokkja száma 26 blokkja
6 26
\ / 1 • •
Sorozat Attribútumok 1 1 •• 6 ••
Ellenőrzőösszeg 4 bin 19 dick 64 grants
7 dev 30 érik 92 books
5.14. ábra. Hosszú fájlnév (részlet) a Windows 98-ban
14 lib 51 jim 60 mbox

Ez elég bonyolultnak látszik, és valóban az: fenntartani a visszafelé kom pati­ 9 etc 26 ast 81 minix
bilitást, hogy a régebbi rendszer működhessen, miközben további új funkciókat 6 usr 45 bal 17 src
kell biztosítani az új számára. A tiszta megoldás hívei nem m ennének bele ilyen 8 tmp A 26. i-csomó­
bonyodalmakba, de ők valószínűleg nem is gazdagodnak meg új operációs rend­ A 6. i-csomópontban A /usr/ast pontban van,
A usr keresése van, hogy a /usr könyvtár hogy a /usr/ast A /usr/ast/mbox
szerek eladásából. a 6. i-csomó- a 132. blokkban i-csomópont a 406. blokkban fájl i-csomópont
pontot adja található száma 26 található száma 60

Unix-könyvtárak 5.16. ábra. A /usr/ast/mbox keresésének lépései

A tradicionális Unix-könyvtárszerkezet különösen egyszerű, mint az 5.15. ábrán Az i-csomópontból megállapítja a /usr könyvtár helyét a lemezen, ahol megke­
látható. M inden bejegyzés csak a fájlnevet és a hozzá tartozó i-csomópont sorszá­ resi az útvonal második elemét, az ast. Az así-hez tartozó könyvtári bejegyzésben
mát tartalmazza. Minden információt, mint a típus, m éret, tulajdonos és a lemez­ megtalálja a /usr/ast könyvtár i-csomópontjának számát. Ezt az i-csomópontot ki­
blokkok címei, az i-csomópont tartalmaz. Néhány Unix-rendszerben más az elren­ olvasva megtudja magának a könyvtárnak a helyét a lemezen, amelyben m egkere­
dezés, de minden esetben végső soron a bejegyzés csak a nevet, mint szöveget és az si az mbox-hoz tartozó bejegyzést. Ennek i-csomópontját ezután beolvassa a me­
i-csomópont sorszámát tartalmazza. móriába, és ott is tartja mindaddig, amíg a fájlt le nem zárják. A keresési eljárást
A fájl megnyitásakor a megadott név alapján a rendszernek meg kell keresnie a illusztrálja az 5.16. ábra.
fájlhoz tartozó lemezblokkokat. Nézzük meg, hogyan keres a rendszer a /usr/ast/ A relatív útvonal keresése teljesen hasonló, csak a keresés nem a gyökérkönyv­
mailbox útvonal esetén. Példánkban a Unixot vettük alapul, de alapvetően hasonló tártól indul, hanem az aktuálistól. Tudjuk, hogy m inden könyvtár tartalmazza a
algoritmust használ m inden hierarchikus könyvtári rendszer. Először a rendszer . és .. bejegyzéseket, amelyek a létesítéskor keletkeznek. A . bejegyzés tartalmazza
a gyökérkönyvtárat keresi meg. Az i-csomópontok egyszerű töm böt alkotnak, az aktuális könyvtár i-csomópontjának számát, a .. bejegyzés pedig az őskönyv­
amelynek helyét a szuperblokkban találjuk. A tömb első eleme a gyökérkönyvtár tár i-csomópontjának számát. Tehát a ../dick/prog.c bejegyzés keresése az aktuális
i-csomópontja. könyvtárban a .. keresésével kezdődik, az őskönyvtár i-csomópontjának ism ereté­
A fájlrendszer megkeresi az útvonal első, usr eleméhez tartozó bejegyzést a gyö­ ben keresi a dick könyvtárat és aztán abban a prog.c fájlt. Nincs szükség speciális
kérkönyvtárban, hogy megtudja annak i-csomópont számát. Az i-csomópont eléré­ mechanizmusra az ilyen esetek kezeléséhez. Ami a könyvtári rendszert illeti, a ne­
se a lemezen egyszerű, m ert minden i-csomópont lemezcíme kiszámítható a sorszá­ vek itt is egyszerű ASCII szövegek, mint más esetekben.
mából, ugyanis az i-csomópontokat a lemezen rögzített helyen folytonosan tárolják.

Bájtok 2 14 NTFS-könyvtárak

Fájlnév A Microsoft alapértelm ezett fájlrendszere az NTFS (New Technology File System
- új technológiájú fájlrendszer). Nincs lehetőségünk az NTFS részletes leírására,
csak röviden áttekintjük a rendszert érintő problém ákat és megoldási módjait.
Az i-csomópont Az egyik problém a a hosszú fájlnevek és útvonalak. Az NTFS megenged hosszú
száma
fájlneveket (255 karakterig) és útvonalakat (32 767 karakterig). Mivel a régebbi
5.15. ábra. Unix 117 könyvtári bejegyzés Windows-rendszerek nem tudják olvasni az NTFS-t, így a visszafelé kompatibili­
526 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 527

tás m iatt nincs szükség bonyolult könyvtári szerkezetre, és a fájlneveket tartalm a­ adattöm örítő képességgel is rendelkezik. Mindezen tulajdonságok leírása és a
zó mezők változó hosszúságúak. Egy másodlagos 8 + 3 karakteres név biztosítja, megvalósítás tárgyalása nem fér bele e könyv kereteibe. Alaposabb tárgyalását
hogy a régebbi rendszerek olvasni tudják a hálózatban megosztott NTFS-fájlokat. lásd (Tanenbaum, 2001), vagy elérhető a világhálón.
Az NTFS a Unicode használatával biztosítja a többszörös karakterkészlet alkal­
mazását fájlnevek képzésére. A Unicode 16 biten tárolja a karaktereket, ami ele­
gendően nagyméretű jelkészletet ad különböző nyelvek számára (például japán). 5.3.4. Lemezterület-kezelés
Azonban a többszörös nyelv megengedése az eltérő karakterkészlet mellett továb­
bi problém át okoz. Még a latin alapú nyelvek esetén is gond van. Például spanyol­ A fájlokat rendszerint mágneslemezen tárolják, ezért a rendszer tervezői számára
ban rendezés esetén néhány karakterkom bináció egyetlen betűnek számít. A eh a fő szempont a lem ezterület kezelése, n bájtból álló fájl tárolására két általános
vagy 11 betűkkel kezdődő szavakat megelőzik a ez, illetve Íz betűkkel kezdődők. stratégia használatos: n bájt hosszú, folytonosan lefoglalt lemezterület, illetve nem
A kisbetű-nagybetű leképezés még bonyolultabb. H a az alapértelm ezés szerint a feltétlenül összefüggő blokkokból álló lemezterület. Az összefüggés hasonló, mint
fájlnevekben meg is különböztetjük a kis- és nagybetűket, szükség lehet ezt figyel­ a szegmentált, illetve lapozott m em óriát kezelő rendszerek esetén.
men kívül hagyó keresésre. Latin alapú nyelvek esetén ez nyilvánvaló, legalábbis Az összefüggő helyfoglalás esetén, amint azt m ár láttuk, az a nyilvánvaló prob­
a felhasználók anyanyelvét tekintve. Általánosan, ha csak egyetlen nyelvet hasz­ léma, hogy a fájl növekedésekor valószínűleg a lemezen más helyre kell átmásolni
nálunk, akkor a felhasználók valószínűleg értik a szabályt. Azonban a Unicode a fájlt. Ugyanez a problém a a szegmensekkel, csakhogy a memóriamező átm ásolá­
lehetővé teszi nyelvek vegyes használatát, görög, orosz és japán nyelvű fájlnevek sa viszonylag gyors művelet a lemezen való másoláshoz képest. Éppen ezért majd­
egyaránt előfordulhatnak egy nemzetközi szervezet által használt könyvtárban. Az nem m inden fájlrendszer azonos m éretű darabokra tördelve tárolja a fájlokat,
NTFS azt a megoldást használja, hogy minden fájl tartalm az egy attribútum ot a mely darabok nem feltétlenül szomszédosak a lemezen.
fájlnév kisbetű-nagybetű konverziójára.
Sok problém át az NTFS több attribútum bevezetésével old meg. Unixban min­
den fájl egy bájtsorozat. NTFS-ben a fájl attribútum ok gyűjteménye, ahol minden Blokkméret
attribútum egy bájtsorozat. Az NTFS alap adatszerkezete az MFT (Master File
Table - mesterfájltáblázat), amely 16 attribútum ot tartalm azhat, mindegyik 1 KB H a eldöntöttük, hogy azonos m éretű blokkokban tároljuk a fájlokat, azonnal fel­
maximális m éretű lehet. H a ez nem elég, akkor egy M FT attribútum ban megad­ vetődik a kérdés, hogy m ekkora legyen a blokk m érete. Tekintve a lemezek szer­
hatunk egy m utatót, amely olyan fájlra m utat, amely az attribútum folytatását tar­ vezését, nyilvánvalóan helyfoglalási egység lehetne a szektor, a sáv és a cilinder.
talmazza. Ezt nem rezidens attribútumnak hívják. Az M FT maga is egy fájl, amely Lapozást alkalmazó rendszerekben a lapm éret a fő vitatéma. Azonban egy nagy­
a fájlrendszerben m inden fájl és könyvtár számára tartalm az egy bejegyzést. Mivel m éretű helyfoglalási egység, mint a cilinder választása, azt jelentené, hogy min­
az M FT nagyon nagyra is nőhet, NTFS-fájlrendszer létesítésekor a partíció kb. den, akár 1 bájt hosszú fájl számára egy teljes cilindert lefoglalnánk. Másrészről,
12,5%-a lefoglalódik az M FT növelése számára. Ezért töredezettség nélkül növe­ kicsi blokkméret esetén m inden fájl sok blokkból állna. Kis blokkból álló fájl olva­
kedhet, legalábbis amíg el nem fogy a lefoglalt terület. H a elfogy, akkor egy újabb, sása lassú, m ert rendszerint m inden blokk olvasása egy pozicionálást és egy kör-
nagyobb terület foglalódik le számára. így amikor az M FT töredezetté válik, ak­ befordulást igényel.
kor kevés számú nagyméretű töredékből áll. Példaként tekintsünk egy olyan lemezt, amelyben egy sáv kapacitása 131 072
Mi a helyzet az NTFS-ben az adatokkal? Az adat csupán egyfajta attribútum . bájt, a körülfordulási idő 8,33 ms, az átlagos pozicionálási idő pedig 10 ms. Ekkor
Valójában egy NTFS-fájl egynél több adatsort is tartalm azhat. Ez a tulajdonság k bájt m éretű blokk beolvasásának ideje ezred másodpercben
eredetileg azt szolgálta, hogy Windows-szerverek Apple M acintosh-klienseknek
is nyújthassanak fájlmegosztást. Az eredeti Macintosh operációs rendszerben 10 + 4,165 + (/c/131072) x 8,33
(a Mac OS 9-től) a fájlok két adatsort tartalmaztak: erőforrássort és adatsort.
A többszörös adatsornak más felhasználása is van, például nagyméretű grafikus ami a pozicionálási idő, a rotációs késleltetés és az átviteli idő összegeként adódik.
állomány esetén egy kisméretű, szimbolizáló kép rendelhető hozzá. M inden adat­ Az 5.17. ábrán látható folytonos görbe az adatátviteli arányt ábrázolja a blokkmé­
sor maximálisan 264 bájt m éretű lehet. A másik véglet az, hogy az NTFS kisméretű, ret függvényében.
néhány százbájtos fájlokat magában az attribútum fejben tud tárolni. Ezt közvetlen A tárolási hatékonyság kiszámításához meg kell becsülni az átlagos fájlméretet.
fájlnak nevezik (M ullender és Tanenbaum, 1984). Korábbi vizsgálatok azt m utatták, hogy Unixban az átlagos fájlm éret 1 KB (M ul­
Csak érintettünk néhány olyan kérdést, amellyel az NTFS-t megelőző egysze­ lender és Tanenbaum, 1984). Egy 2005-ben végzett felmérés szerint a könyv egyik
rűbb rendszerek nem foglalkoztak. Az NTFS kifinomult védelmi, titkosítási és szerzőjének munkahelyén, ahol 1000 felhasználó több mint 1 millió Unix-fájlt
használt, a médián m éret 2475 bájt, ami azt jelenti, hogy a fájlok fele kisebb, fele
528 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 529

pedig nagyobb, mint 2475. Mellékesen, a médián jobb mérték, mint az átlag, m ert A görbék azonban azt mutatják, hogy a tárkihasználás és az átviteli hatékonyság
nagyon kevés fájl is jelentősen m ódosíthatja az átlagot, de a m ediánt nem. Néhány szükségszerűen ellentétesek. Kisméretű blokk esetén rossz az átviteli hatékony­
100 MB-os hardverkézikönyv vagy bem utatóvideó nagymértékben torzíthatja az ság, de jó a tárkihasználás. Kompromisszumot kell találni a blokkm éret megál­
átlagot, de a m ediánt nem. lapításánál. A 4 KB jó választás lehet, azonban néhány operációs rendszer már
Vogels (Vogels, 1999) vizsgálatai a Cornell Egyetemen azt mutatják, hogy a régen rögzítette a blokkm éretet, amikor a fájlm éretek még mások voltak. Unix
Windows NT fájlhasználata jelentősen különbözik a Unix-fájlhasználattól. Megfi­ esetén az 1 KB az általánosan alkalmazott. MS-DOS esetén bármely 512 és 32 KB
gyelte, hogy az N T fájlhasználata bonyolultabb a Unixnál. A következőket írja: közötti kettőhatvány lehet, de a lemez kapacitásának függvénye, és ennek nincs
köze a fenti érveléshez (minden partícióban a blokkok maximális száma 216, ami
A m ikor néhány karaktert begépelünk a jegyzettömb szövegszerkesztőben, aztán el­ nagy blokkm éretet követel nagy lemezeknél).
mentjük egy fájlba, akkor ez 26 rendszerhívást eredményez, amelyből 3 hibás meg­
nyitás, 1 fájl felülírás és 4 további megnyitás és lezárás művelet lesz.
A szabad blokkok nyilvántartása
Ennek ellenére azt az eredményt kapta, hogy a (használattal súlyozott) médián
fájlm éret csak olvasásra 1 KB, csak írásra 2,3 KB és írás-olvasásra 4,2 KB. Azt M iután megválasztottuk a blokkméretet, a következő megoldandó dolog, hogy a
a tényt figyelembe véve, hogy a Cornell széles körű tudományos számításokat is szabad blokkokat hogyan tartsuk nyilván. Két módszert használnak széles körben,
végez, továbbá a mérési módszer eltérő, a 2 KB körüli médián konzisztens ered­ amit az 5.18. ábra szemléltet. Az első módszer szerint a szabad blokkokat blokkok
ménynek tekinthető. láncolt listájában tárolják, minden blokk annyi szabad blokk címét tartalmazza,
H a azzal az egyszerűsítő feltétellel élünk, hogy m inden fájl m érete 2 KB, az 5.17. amennyi csak elfér benne. 1 KB blokkmérettel számolva, és feltéve, hogy 32 bit elég
ábrán látható szaggatott görbét kapjuk a lemez tárkihasználási hatékonyságára. egy blokkcím tárolására, egy blokkban 255 blokkcím lesz. (Megjegyzendő, hogy egy
A két görbe a következőképpen értelmezhető. A blokkelérési idő gyakorlati­ elemet a láncolás megvalósítására használunk.) így egy 256 GB kapacitású lemez
lag a pozicionálási és forgási idő függvénye, így tekintettel arra, hogy 14 ms idő
kell egy blokk eléréséhez, minél több adatot mozgatunk, annál jobb. Tehát az Szabad lemezblokkok: 16,17,18
adatátviteli arány növekszik a blokkm éret növelésével (amíg az átvitel olyan nagy
nem lesz, amikor m ár az átviteli idő dominál). Kis blokkoknál, amelyek m érete 42 230 86 1001101101101100
r
kettőhatvány, és 2 KB-os fájl esetén nincs veszteség. 2 KB-os fájl és 4 KB vagy 136 162 234 0110110111110111
nagyobb blokk esetén azonban lem ezterületet vesztünk. A valóságban kevés fájl 210 612 897 1010110110110110
m érete lesz pontosan többszöröse a blokkméretnek, tehát mindig lesz veszteség az
97 342 422 0110110110111011
utolsó blokkban.
41 214 140 1110111011101111

63 160 223 1101101010001111

21 664 223 0000111011010111

48 216 160 1011101101101111


262 320 126 1100100011101111
, ,

310 180 142 0111011101110111

516 J 482 J 141 1101111101110111

Egy 1 KB-os lemezblokk Bittérkép


256 db 32 bites lemezblokk-
Blokkméret (bájt) címet tartalmazhat

5.17. ábra. A folytonos görbe (bal oldali skála) a lemez adatátviteli sebessége. A szaggatott (a) (b)
görbe (jobb oldali skála) a lemezterület-kihasználási hatékonyság. Minden fájl
mérete 2 KB 5.18. ábra. (a) Szabad blokkok láncolt listában, (b) Bittérkép
530 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 531

szabad listája legfeljebb 1 052 689 blokkból áll, ami elég az összes 2X lemezblokk azt a 3. fejezetben láttuk, a merevlemez hibás blokkjait általában maga a vezérlő
számára. Gyakran szabad blokkokat használnak a szabad lista tárolására. kezeli, helyettesíti ezeket erre a célra fenntartott tartalékkal. Ezeken a lemezeken
A másik technika bittérképet használ a szabad blokkok nyilvántartására. Ekkor m inden sáv legalább egy szektorral nagyobb, mint kellene, így legalább egy hibás
egy n blokkot tartalmazó lemez szabad blokkjainak kezelése n bitet igényel. A sza­ hely kihagyható két szektor közötti hézagként. Továbbá cilinderenként van né­
bad blokkokat 1, a lefoglaltakat 0 jelöli (vagy fordítva). így egy 256 GB kapacitású hány tartalék szektor, így a vezérlő autom atikusan áthelyezheti a hibás blokkot,
lemezen 228 1 KB-os blokk van, így bittérképe 228 bitet igényel, ami 32 768 blokk. ha úgy találja, hogy a szokásosnál többször kell ismételten olvasni vagy írni. Tehát
Nem meglepő, hogy a bittérkép tárigénye kisebb, mivel blokkonként csak 1 bitet a felhasználónak általában nem kell foglalkoznia a hibás blokkok kezelésével.
igényel, ellentétben a láncolt lista 32 bites igényével. Csak akkor lesz kisebb a tár­ Mindazonáltal, ha egy m odern IDE- vagy SCSI-lemeznél hiba lép fel, akkor az
igény láncolt lista esetén, ha a lemez majdnem tele van (tehát kevés szabad blokk végzetes, m ert kifogynak a tartalék szektorok. Az SCSI-lemez jelzi a felfedezett
van). Másrészről, ha sok szabad blokk van, akkor egyet kölcsönvehetünk a listaelem hibát (recovered error), amikor áthelyez egy blokkot. H a ezek az üzenetek gyako­
számára, tehát nem vesztünk lemezterületet. rivá válnak, akkor a felhasználó tudhatja, hogy itt az idő új lemezt vásárolni.
A szabad listás módszer esetén csak egy listaelem blokkját kell a mem óriában A régebbi lemezeknél van egy egyszerű szoftvermegoldás a hibás blokkok keze­
tartani. Fájl létesítésekor ebben a blokkban lévő blokkcímeket használhatjuk az új lésére. A felhasználónak vagy a fájlrendszernek gondosan össze kell gyűjtenie az
fájl számára. H a ez kifogy, akkor beolvassuk a m em óriába a lista következő ele­ összes hibás blokkot egy fájlba. Ezáltal ezek az adatok törlődnek a szabad listából,
mét. Hasonlóan fájl törlésekor a fájl blokkjait hozzáadjuk a mem óriában lévő lis­ így azok a jövőben nem használhatók adatok tárolására. Amíg ezt a hibásblokk-
taelemhez, ha ez megtelik, akkor a listaelemet kiírjuk a lemezre. fájlt nem olvassuk és írjuk, nem lesz gond. Vigyázni kell azonban, amikor mentést
készítünk, hogy ezt a fájlt ne olvassuk, és ne próbáljuk menteni.

5.3.5. Fájlrendszerek megbízhatósága


Mentések
A fájlrendszer meghibásodása gyakran nagyobb bajt jelent, mint magának a szá­
mítógépnek a meghibásodása. H a a számítógép meghibásodik, például tűz, vil­ A legtöbb em ber nem gondol arra, hogy megéri időt és fáradságot szentelni a
lámlás miatt, vagy egy csésze kávé borul a billentyűzetre, az bosszantó, de általában fájlok mentésére, mindaddig, amíg hirtelen tönkre nem megy a lemeze. A válla­
minimális ráfordítással kicserélhető a meghibásodott alkatrész. Az olcsó személyi latok azonban (általában) tisztában vannak adataik értékével, ezért rendszerint
számítógépek helyett akár új gép is vásárolható néhány óra alatt, csak el kell menni legalább naponta készítenek mentést, szokásosan mágnesszalagra. A m odern sza­
egy kereskedőhöz (kivéve az egyetemeken, ahol a megrendeléshez három bizottság, lagok néhány tíz, vagy akár néhány száz gigabájt kapacitásúak, és fillérekbe kerül
öt aláírás és 90 nap kell). egy gigabájt. Azonban a mentés nem olyan triviális, mint ahogy elsőre gondol­
H a a számítógép fájlrendszere végérvényesen elromlik, akár hardver-, akár nánk, ezért foglalkozunk néhány vonatkozásával.
szoftverokok miatt, vagy ha patkányok szétrágják a szalagos m entéseket, az in­ A szalagra m entés általában az alábbi két problém át hivatott megoldani:
formáció helyreállítása bonyolult, időigényes és sokszor lehetetlen. Azon szemé­
lyek számára, akiknek programjai, dokumentumai, vásárlói adatai, adózási tételei, 1. Helyreállítás katasztrófa esetén.
adatbázisai, piaci tervei vagy más adatai m indörökre elvesznek, a következmények 2. Helyreállítás hibázás esetén.
katasztrofálisak lehetnek. Jóllehet a fájlrendszer nem adhat védelmet az eszközök
fizikai meghibásodásával szemben, de segítheti az információ védelmét. Ebben a Az első esetben lemezösszeomlás, tűzeset, árvíz vagy más természeti csapás után
részben a fájlrendszer néhány védelmi kérdésével foglalkozunk. kell újraindítani a számítógépet. A gyakorlatban ilyen eset ritkán fordul elő, ezért
A hajlékonylemezek általában kifogástalanok, amikor kikerülnek a gyárból, van, hogy sokan nem törődnek mentéssel. Az ilyen em berek hasonló okokból nem
de használat közben keletkezhetnek hibás blokkok. Érdem es megjegyezni, hogy biztosítják házukat tűzesetre.
ez manapság inkább igaz, mint akkor volt, amikor széles körben használatosak A második eset akkor következik be, amikor a felhasználó véletlenül töröl fájlo­
voltak. Hálózatok és nagy kapacitású hordozható eszközök, mint az írható CD-k, kat, amikre később szüksége lehet. Az ilyen esetek olyan gyakoriak, hogy a Windows
elterjedésével a hajlékonylemezeket ritkábban használjuk. A hűtőventilátorok törlés esetén speciális könyvtárba, a Lomtárba helyezi, és nem törli ténylegesen a
szele, a szennyezett levegő keresztülmegy az eszközmeghajtón, így a ritkán hasz­ fájlt, ahonnan később kihalászható és helyreállítható lesz. A mentés továbbviszi ezt
nálatos meghajtó olyan szennyezett lehet, hogy tönkreteszi a hajlékonylemezt. A az elvet, és lehetővé teszi törölt fájlok visszaállítását napokkal vagy hetekkel később.
gyakran használt meghajtó kisebb eséllyel károsítja a lemezt. M entés készítése hosszú időt és nagy helyet vesz igénybe, ezért fontos, hogy
A merevlemezek kezdettől fogva tartalm azhatnak hibás blokkokat; ennek az hatékonyan és kényelmesen végezzük. Ezek az okok indokolják a következő té­
az oka, hogy túlságosan költséges lenne a minden hibától mentes gyártás. Amint nyezők figyelembevételét. Először, a teljes fájlrendszert mentsük, vagy csak egy
532 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 533

részét? Sok telepítésnél a végrehajtható (bináris) fájlok elhelyezése korlátozott a 100% valószínűséggel m egírható hibamentesen, ami valószínűleg nem m ondható
fájlrendszerfában. Ezeket nem szükséges m enteni, ha mind helyreállítható a gyár­ el más hasznos programról.
tó által adott CD-ROM -ról. Hasonlóan, a legtöbb rendszerben van egy könyvtár Érdem es azonban néhány megjegyzést fűzni a fizikai mentéshez. Például nem
az ideiglenes fájloknak. Ezeket sem szükséges m enteni. Unixban a speciális fájlo­ érdem es m enteni a nem használt blokkokat. H a a m entést végző program hozzá­
kat (I/O-eszközök) a Idevl könyvtár tartalmazza. Ezeket nemcsak nem szükséges férhet a szabad blokkokat tároló adatszerkezethez, akkor a m entés kihagyhatja
menteni, de veszélyes is, m ert fennakadhat a mentés, amikor ezeket olvasni akar­ azokat. Ha azonban nem mentjük a szabad blokkokat, akkor m inden blokkhoz ki
ja. Röviden: általában nem a teljes fájlrendszert mentjük, hanem csak m eghatáro­ kell írni a sorszámát is, hiszen most m ár nem teljesül, hogy a &-adik blokk a &-adik
zott könyvtárakat és azok tartalm át. lesz a m entési szalagon.
Másodszor, nem érdem es m enteni azokat a fájlokat, amelyek az utolsó m entés A második gond a hibás blokkok mentése. H a minden hibás blokkot áthelyez
óta nem változtak. Ez az ötlet vezet az inkrementális mentés módszeréhez. A az eszközvezérlő, mint azt az 5.4.4. alfejezetben leírtuk, akkor a fizikai mentés
legegyszerűbb formájában az inkrementális mentés azt jelenti, hogy periodikusan, helyesen működik. Ellenkező esetben, ha a hibás blokkok láthatók az operációs
hetente vagy havonta teljes m entést végzünk, és naponta csak azokat a fájlokat rendszer számára, és kezeli ezeket valamilyen térképpel, akkor alapvető, hogy a
mentjük, amelyek megváltoztak az utolsó teljes m entés óta. Még jobb, ha csak m entést végző program is hozzáférjen ehhez az információhoz, hogy elkerülhesse
azokat mentjük, amelyek az utolsó mentésük óta megváltoztak. Ez a módszer mi­ a hibás blokkok olvasását, ami lemezolvasási hibák sokaságát eredményezné.
nimalizálja a m entési időt, de a helyreállítás bonyolultabb, m ert először az utol­ A fizikai m entés fő előnye, hogy egyszerű és nagyon gyors (alapvetően a le­
só teljes mentést kell visszaállítani, aztán az inkrementális m entéseket fordított mez átviteli sebességével futhat). A fő hátránya, hogy nem képes kihagyni kije­
időrendi sorrendben, a legrégebbit először. A helyreállítás megkönnyítése végett lölt könyvtárakat, nem tud inkrementálisan menteni, és nem lehet egyedi fájlokat
gyakran használnak kifinomultabb inkrementális m entési sémákat. helyreállítani. Ezen okok m iatt a legtöbb rendszer logikai m entést alkalmaz.
Harm adszor, mivel óriási adattöm eget kell általában menteni, ezért m ielőtt sza­ A logikai mentés egy vagy több kijelölt könyvtárban lévő m inden olyan fájlt és
lagra írnánk, érdem es tömöríteni. Azonban sok töm örítő algoritmus esetén egyet­ könyvtárat m ent rekurzívan, amely egy megadott időpont óta változott (vagyis az
len hibás szalaghely hibát eredményez, aminek az lehet a hatása, hogy egy teljes utolsó inkrementális m entés vagy teljes m entés óta). Logikai m entés esetén tehát
fájl, vagy akár az egész szalag olvashatatlan lesz. Tehát alaposan meg kell fontolni, a szalag gondosan kiválasztott fájlokat és könyvtárakat tartalmaz, amelyek alapján
hogy alkalmazzunk-e tömörítést. szükség esetén egyszerűen helyre lehet állítani egyedi fájlokat és könyvtárakat.
Negyedszer, bonyolult m enteni egy aktív fájlrendszert. H a a m entés közben Ahhoz, hogy egyedi fájl helyesen helyreállítható legyen, a fájlútvonalat megadó
fájlok keletkeznek, törlődnek vagy módosulnak, akkor a m entés inkonzisztens m inden információt m enteni kell. Tehát a logikai m entés első lépése a könyvtári fa
lehet. A m entés azonban több óráig is eltarthat, ezért nem elfogadható, hogy a szerkezetének elemzése. Nyilvánvalóan m inden megváltozott fájlt és könyvtárat
mentés idejére inaktívvá tegyük a rendszert. Ezért kifejlesztettek olyan algoritmu­ m enteni akarunk. De a helyes helyreállításhoz m inden olyan, akár nem módosult
sokat, amelyek gyors pillanatfelvételt készítenek a fájlrendszer állapotáról, a kri­ könyvtárat is m enteni kell, amely egy módosult fájlhoz vagy könyvtárhoz vezető
tikus adatszerkezetek m ásolatát elkészítve, ami után blokkok másolásával és nem úton található. Ez azt jelenti, hogy nemcsak az adatot kell m enteni (fájlnevet és
helyben módosításával lehet a fájlokat és könyvtárakat módosítani (Hutchinson, i-csomópontra m utató pointert), hanem a könyvtár m inden attribútum át is, hogy
1999). így a fájlrendszert gyakorlatilag befagyasztják a pillanatfelvétel állapotá­ az eredeti jogosultságokat helyre tudjuk állítani. Először a könyvtárakat és azok
ban, amely ezután kényelmesen m enthető lesz. attribútum ait kell szalagra írni, majd a megváltozott fájlokat (az attribútumaikkal
Végezetül, mentés készítése egy szervezet számára sok, nem technikai problé­ együtt). Ez lehetővé teszi, hogy a könyvtárakat és fájlokat egy másik számítógép
ma megoldását igényli. A világ legjobb biztonsági rendszere is haszontalan, ha a fájlrendszerében helyreállítsuk. Ezzel a módszerrel a m entési és helyreállító prog­
rendszergazda őrizetlenül hagyja a m entési szalagokat, amikor kimegy a szobá­ rammal teljes fájlrendszereket át tudunk vinni egyik számítógépről a másikra.
jából a nyom tatott anyagokért. Egy kém nek elegendő besurranni és zsebre rak­ A másik ok, hogy m ódosult fájl útjába eső nem módosult könyvtárakat is le­
ni a kisméretű kazettát és vidáman távozni. Viszlát biztonság! H asonlóan a napi mentsünk, az, hogy ezáltal inkrementálisan helyre tudjunk állítani egyedi fájlo­
m entés mit sem ér, ha tűz esetén elégnek a m entések is. Ezért a m entéseket más­ kat (egy esetleges véletlen törlés után). Tegyük fel, hogy vasárnap este végzünk
hol kell tárolni, ami újabb biztonsági kockázatot jelent. Ezeknek és más prakti­ teljes m entést és hétfőn este inkrementálisat. Kedden törlődik a /usr/jhs/proj/nr3
kus szervezési problém áknak az alaposabb tanulmányozása céljából javasoljuk könyvtár és m inden alkönyvtára, valamint az ezekben lévő fájlok. Szerdán reggel
Nem eth és társai könyvét (Nem eth et al., 2001). A következőkben csak a m enté­ egy felhasználó kéri a /usr/jhslprojlnr3/planslsummary fájl helyreállítását. Azonban
sek technikai részével foglalkozunk. a summary fájlt nem lehet helyreállítani, m ert nincs könyvtár, ahová tehetnénk.
Kétféle stratégia szerint lehet lem eztárolót szalagra m enteni: fizikai vagy lo­ Előbb az nr3/ és a plansl könyvtárakat kell helyreállítani. Ezek tulajdonosait, m ód­
gikai mentés. Fizikai mentés esetén a 0. blokktól kezdve sorban minden blokkot jait és dátum ait csak akkor tudjuk megállapítani, ha ezeket is elm entettük a sza­
kiírunk a szalagra, egészen az utolsóig. Egy ilyen program annyira egyszerű, hogy lagra, annak ellenére, hogy nem változtak az utolsó teljes m entés óta.
534 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 535

Fájlrendszer mentési szalagról történő helyreállítása egyszerű. Azzal kell kez­ Blokksorszám Blokksorszám
deni, hogy létrehozunk egy üres fájlrendszert a lemezen. Ezután a legutolsó teljes 0 1 2 3 4 5 6 7 8 9 1011 12131415 foglalt 0 1 2 3 4 5 6 7 8 9 1011 12131415
m entést állítjuk helyre. Mivel a szalagon előbb vannak a könyvtárak, ezért a hely­ 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 blokkok 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0
reállítás során előbb létrejönnek a szükséges könyvtárak, létrehozva a fájlrendszer Szabad
vázszerkezetét. Majd maguk a fájlok állítódnak helyre. Ezt az eljárást kell ismétel­ 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1
blokkok
ni az első inkrementális mentéssel, majd a másodikkal, és így tovább. (a) (b)
A logikai m entés egyszerű ugyan, de szükség van néhány trükkös fogásra is. Az
egyik a következő. Mivel a szabad blokkok listája nem fájlban tárolódik, így nem 0 1 2 3 4 5 6 7 8 9 101112131415 0 1 2 3 4 5 6 7 8 9 1011 12131415
Foglalt
mentődik, és ezért az összes helyreállítás után a semmiből kell felépíteni. Ez min­ 1 10 10 1 1 1 1 0 0 1 1 10 0 blokkok 1 1 0 1 0 2 1 1 10 0 1 1 1 0 0
dig megtehető, m ert a szabad blokkok halmaza kom plem entere a fájlok által el­
Szabad
foglalt blokkok halmazának. 0 0 1 0 2 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
blokkok
Ami a kapcsolásokat illeti, ha egy fájl két vagy több könyvtárhoz van kapcsolva,
(C) (d)
akkor fontos, hogy a fájlt csak egyszer állítsuk helyre, és m inden rám utató könyv­
tári bejegyzés is helyre legyen állítva.
A következő probléma, hogy a Unix-fájlokban lehet lyuk. Legálisan m egtehet­ 5.19. ábra. Fájlrendszerállapotok, (a) Konzisztens, (b) Hiányzó blokk, (c) Duplikált szabad blokk,
jük, hogy megnyitunk egy fájlt, írunk bele néhány bájtot, aztán tetszőleges pozíció­ (d) Duplikált adatblokk
ra pozicionálás után kiírunk még néhány bájtot. A közbülső blokkok nem részei
a fájlnak, ezért nem lehet m enteni, illetve helyreállítani ezeket. M emóriaképek blokkonként, amelyeknek kezdeti értéke 0. Az első számláló azt mutatja, hány
(core dump) gyakran tartalm aznak nagy lyukakat az adatszegmens és a verem kö­ fájlban fordul elő a blokk, a másik számláló pedig azt, hányszor fordul elő a blokk
zött. H a nem helyesen kezeljük az ilyen fájlokat, akkor előfordulhat, hogy a hely­ a szabad listában (vagy a szabad blokkok bittérképén).
reállítás 0-val tölti ki a lyuk területét, tehát akkora m éretű lesz, mint a virtuális A program ezután végigolvassa az összes i-csomópontot. Az i-csomópont alap­
m em ória (azaz 232 vagy 264 bájt). ján sorra tudja venni az összes blokkot, amely a fájlhoz tartozik. Minden blokk
Végül a speciális fájlokat, adatcsöveket és hasonlókat sose mentsük, függetlenül esetén növeli eggyel az első táblázatban az adott blokk számlálóját. A program ez­
attól, hogy milyen könyvtárban vannak (helyük nem kötött a Idev könyvtárhoz). után a szabad listát vagy a bittérképet vizsgálja, hogy megtalálja az összes blokkot,
Fájlrendszerek m entéséről bővebben lásd (Chervenak, 1998; Zwicky, 1991). amely szabadnak van jelölve. Minden előforduláskor a második táblázat megfele­
lő elem ét növeli eggyel.
H a a fájlrendszer konzisztens, akkor m inden blokk számlálója vagy az első, vagy
Fájlrendszerek konzisztenciája a második táblázatban 1. Ezt illusztrálja az 5.19.(a) ábra. Azonban összeomlás kö­
vetkeztében a táblázatok az 5.19.(b) ábrán látható eltérést m utathatják, ahol is a
Egy másik terület, ahol a megbízhatóság jelentkezik, az a fájlrendszerek konzisz­ 2. blokk mindkét számlálója 0. Ezt mint hiányzó blokkot jelzi a program. Ugyan
tenciája. Sok rendszer úgy dolgozik, hogy blokkot olvas, feldolgozza, később pedig a hiányzó blokkok nem veszélyesek, de tárvesztést okoznak és csökkentik a lemez
kiírja. H a a rendszer olyan állapotban omlik össze, amikor nem m inden módosult kapacitását. A hiányzó blokkok kijavítása nyilvánvaló: egyszerűen hozzá kell venni
blokk került kiírásra, a fájlrendszer inkonzisztens állapotba kerül. Ez a probléma a szabad blokkok listájához.
különösen kritikus, ha olyan blokk m aradt kiíratlan, amely i-csomópontot, könyv­ Egy másik lehetséges esetet m utat az 5.19.(c) ábra. Itt azt látjuk, hogy a 4. blokk
tári bejegyzéseket vagy szabadlista-elemeket tartalm azott. kétszer fordul elő a szabad listában. (Duplikáció csak szabad listás rendszerben for­
Az inkonzisztencia problém ájának kezelésére a legtöbb számítógép rendelkezik dulhat elő, bittérképnél nem.) A megoldás ebben az esetben is egyszerű, újra fel kell
olyan segédprogrammal, amely ellenőrzi a fájlrendszer konzisztenciáját. Ilyen a építeni a szabad listát.
Unixban az fsck, a Windowsban a chkdsk (vagy scandisk a korábbi változatokban). A legrosszabb, ami előfordulhat, hogy egy blokk két vagy több fájlban is előfor­
Ez a program futtatható minden rendszerbetöltéskor, különösen összeomlás után. dul, mint az 5. blokk az 5.19.(d) ábrán. H a valamelyik fájlból, de csak az egyikből
Az alábbiakban leírjuk, hogyan működik azfsck. A chkdsk működése ettől eltérő, törölnénk a blokkot, akkor ez azt eredményezné, hogy egyszerre lenne szabad és
m ert más fájlrendszerekre alkalmazható, de az általános elv, amely a rendszer re­ foglalt. H a m indkettőből törölnénk, akkor pedig kétszer szerepelne a szabad lis­
dundanciáját használja ki, itt is érvényes. Ezek a fájlrendszer-ellenőrzők az egyes tában.
fájlrendszereket (lemezpartíciókat) egymástól függetlenül ellenőrzik. Az elfogadható megoldás az, hogy egy új blokkot foglalunk, átmásoljuk bele
Kétféle konzisztencia-ellenőrzés lehet: blokk és fájl. A blokk-konzisztencia az 5. blokk tartalm át, és beillesztjük az egyik fájlba. Ezzel a fájlok inform ációtar­
ellenőrzésére a program két táblázatot épít fel, mindegyik egy számlálót tartalmaz talm a nem változik, habár m ajdnem biztosan torzul, de legalább a fájlrendszert
536 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 537

konzisztenssé tettük. A hibát jelezni kell, hogy a felhasználó vizsgálja meg a káro­ Az előző bekezdések azzal foglalkoztak, hogyan lehet védeni a felhasználót a
sodást. rendszer összeomlása ellenében. Néhány fájlrendszer azzal is törődik, hogy védje
A blokk-konzisztencia mellett az ellenőrző program a könyvtári rendszert is a felhasználót önmaga ellen. H a a felhasználó az
ellenőrzi. Ekkor is számlálókat használ, de most fájlonként és nem blokkonként.
A gyökérkönyvtártól indulva rekurzívan járja be a fát, és megvizsgál minden rm *.o
könyvtárat. Minden könyvtár m inden fájlja esetén növeli a hozzá tartozó szám­
lálót. Emlékeztetünk, hogy merev kapcsolás m iatt egy fájl esetleg több könyvtár­ parancsot szándékozott begépelni, hogy törölje a fordító által készített tárgykód­
ban is előfordulhat. Szimbolikus kapcsolás nem számít, ezért ebben az esetben fájlokat, de helyette az
nem kell növelni a hivatkozásszámláló értékét sem.
Ezt elvégezve egy olyan i-csomópont szerint indexelt listát kapunk, amely meg­ rm*.o
adja, hogy a fájl hány könyvtárnak eleme. Ezt összeveti magában az i-csomópont-
ban tárolt kapcsolatszámlálóval. Konzisztens fájlrendszerben a két érték minden sikeredett (szóköz van a * után), akkor a parancs kitörli az összes fájlt az aktuális
i-csomópontra megegyezik. Azonban kétféle hiba is előfordulhat: az i-csomópont- könyvtárból, és aztán szól, hogy nem találja a .o nevű fájlt. Néhány rendszer törlés
ban tárolt kapcsolatszámláló több, avagy kevesebb lehet. esetén csak azt teszi, hogy egy bitet beállít a könyvtárban vagy az i-csomópontban,
H a az i-csomópontban tárolt kapcsolatszámláló nagyobb, mint a könyvtári be­ jelezve, hogy a fájl töröltté vált. Addig azonban nem szabadítja fel a lefoglalt blok­
jegyzések száma, akkor a kapcsolatszámláló még így is nagyobb lenne nullánál, ha kokat, amíg azokra ténylegesen nincs szükség. így ha a felhasználó időben észre­
az összes fájlt törölnénk, vagyis az i-csomópont nem törlődne. Ez a hiba nem ve­ veszi az elkövetett hibát, akkor egy speciális programmal visszanyerheti a törölt
szélyes, de tárhelyveszteséget okoz, m ert lesz olyan fájl, amely egyetlen könyvtár­ fájlokat. Windowsban a törölt fájlok egy speciális, ún. újrahasznosító (recycle bin)
ban sem szerepel. A hiba úgy javítható, hogy az i-csomópont számlálóját a helyes könyvtárba kerülnek, ahonnan később szükség esetén visszanyerhetők. Nyilván­
értékre állítjuk. valóan nem szabadul fel lemezhely ebből a könyvtárból, amíg a törlés ténylegesen
A másik hiba potenciálisan katasztrofális. H a két könyvtári bejegyzés ugyanah­ meg nem történik.
hoz a fájlhoz van kapcsolva, de az i-csomópont azt mondja, hogy csak egy van, ak­ Az ilyen mechanizmusok azonban nem biztonságosak. Egy biztonságos rend­
kor akármelyik bejegyzést törölve az i-csomópont számlálója nullává válna. Ekkor szer valójában felülírná a törölt blokkot 0-val vagy véletlen bitekkel, így egy másik
a rendszer megjelöli mint használaton kívülit, és felszabadítja az általa foglalt ösz- felhasználó m ár nem tudná helyreállítani a törölt fájl adatait. Sok felhasználó nem
szes blokkot. Az eredm ény az lesz, hogy az egyik könyvtári bejegyzés olyan i-cso- törődik azzal, hogy az adat meddig m arad meg. Gyakran előfordul, hogy titkos
m ópontot tartalmaz, amely használaton kívülivé vált, és a blokkjait ham arosan vagy érzékeny adat visszaállítható törölt lemezről (Garfinkel és Shelat, 2003).
más fájlok fogják használni. Ismét az a javítási megoldás, hogy a számlálóértéket
az i-csomópontban a könyvtári bejegyzések tényleges számára állítjuk be.
Ez a két művelet, tehát a blokk- és a könyvtári ellenőrzés hatékonysági okok 5.3.6. Fájlrendszer hatékonysága
m iatt gyakran egybe van integrálva (vagyis az i-csomópontokat csak egyszer kell
végigjárni). Más, heurisztikus ellenőrzések is lehetségesek. Például a könyvtárak­ A lemez elérése sokkal lassúbb, mint a memória elérése. Egy memóriabeli szó kiol­
nak m eghatározott formájuk van, i-csomópont számmal és ASCII névvel. H a egy vasása tíz nanomásodpercig tarthat. Egy blokk beolvasása 10 MB/s átviteli sebességű
i-csomópont száma nagyobb, mint az i-csomópontok darabszáma a lemezen, ak­ mágneslemezről 32 bites szavanként negyvenszer lassabb, de ehhez még hozzájön
kor a könyvtár biztosan sérült. 5-10 ezred másodperc, ami a sávra pozicionálás ideje, és a várakozás, amíg a kívánt
Továbbá m inden i-csomópontnak van jogosultsági módja, ami lehet ugyan le­ szektor az olvasófej alá fordul. H a csak egy szóra van szükség, akkor a memóriaelérés
gális, de mégis furcsa, mint példul a 0007, ami azt jelenti, hogy a felhasználó és nagyságrendben milliószor gyorsabb a lemez elérésénél. Az elérési idő ilyen m érté­
csoportja nem érheti el, de mindenki más olvashatja, írhatja és végrehajthatja. kű különbsége miatt sok fájlrendszert a hatékonyságot növelő optimalizálással ter­
Hasznos lehet legalább jelezni azokat a fájlokat, amelyeknél a kívülállóknak több veznek. Ebben az alfejezetben három ilyen módszert vizsgálunk meg.
joga van, mint a tulajdonosnak. Az olyan könyvtár, amelynek sok - mondjuk 1000-
nél több - bejegyzése van, szintén gyanús. A felhasználói könyvtárban találhatók
olyan fájlok, amelyek tulajdonosa szuperfelhasználó, és SETU ID bitje be van ál­ Gyorsítótár
lítva, potenciális biztonsági problém át jelenthetnek, hiszen egy ilyen fájlt végre­
hajtva egy normál felhasználó is szuperfelhasználói jogokat szerezhet. Kis erőfe­ A leggyakrabban alkalmazott technika a lemezhez fordulások csökkentésére a
szítéssel igen terjedelmes lista gyűjthető össze a legális, de gyanús dolgokról, am e­ blokkgyorsítótár, vagy más néven puffergyorsítótár. (Angolul cache, ami a fran­
lyeket célszerű jelenteni. cia cacher szóból származik, és jelentése rejteni.) Ebben a szövegösszefüggésben a
538 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 539

gyorsítótár olyan lemezblokkok kollekciója, amelyek logikailag a lemezhez tartoz­ Továbbá, bizonyos blokkokra - mint az i-csomópont blokkok - rövid időtartam
nak, de a hatékonyság növelése érdekében a mem óriában tartjuk őket. alatt ritkán hivatkoznak kétszer egymás után. Ezek a megfontolások egy módosí­
A gyorsítótár kezelésére különböző algoritmusok vannak, de az általános az, tott LRU-sémához vezetnek, amely két tényezőt vesz figyelembe:
hogy olvasási igény esetén előbb ellenőrzik, hogy a kért blokk a gyorsítótárban
van-e. Ha igen, akkor lemezhez fordulás nélkül kielégíthető az igény. H a a kért 1. Valószínű-e, hogy a blokkra ham arosan ismét szükség lesz?
blokk nincs a gyorsítótárban, akkor először beolvasódik a lemezről a gyorsító­ 2. Fontos-e a blokk a fájlrendszer konzisztenciája szempontjából?
tárba, majd a kért helyre másolódik. Az erre a blokkra vonatkozó m inden további
kérés kielégíthető a gyorsítótárból. A blokkok mindkét kérdés szerint kategóriákba csoportosíthatók, úgymint i-cso­
A gyorsítótár működését szemlélteti az 5.20. ábra. Mivel sok (gyakran több m ópont blokk, indirekt blokk, könyvtári blokk, teli adatblokk, csonka adatblokk.
ezer) blokk van a gyorsítótárban, ezért szükséges olyan módszer, amely gyorsan Azok a blokkok, amelyekre ham arosan nem lesz ismét szükség, az LRU-lánc ele­
meg tudja határozni, hogy egy adott blokk bent van-e. Szokásosan hasítótáblás jére és nem a végére mennek, így a puffereik gyorsan újra felhasználásra kerülnek.
(hash table) módszert alkalmaznak. Az ütközésfeloldást láncolással végzik, azaz Azok a blokkok, amelyekre ham arosan ismét szükség lehet, mint például a csonka
az azonos hasítófüggvény-értékű blokkok egy láncolt listában szerepelnek. adatblokkok, hisz ezekbe írni fogunk, a lánc végére kerülnek és sokáig ott is m a­
H a a gyorsítótárba történő beolvasáskor az m ár tele van, akkor előbb ki kell írni radnak.
a lemezre valamelyik bent lévő blokkot, hogy legyen hely az új blokk számára. Ez A második kérdés független az elsőtől. H a egy blokk fontos a fájlrendszer kon­
a szituáció nagyon hasonlít a lapozásra, és a 4. fejezetben megismert szokásos la- zisztenciája szempontjából (alapvetően m inden blokk ilyen, kivéve az adatblokko­
pozási algoritmusok mindegyike - mint például a FIFO, a második lehetőség és az kat), és módosult, akkor azonnal kiírandó a lemezre - függetlenül attól, hogy az
LR U - alkalmazható itt is. Kellemes különbség a lapozás és a gyorsítótár-kezelés LRU-lista melyik végén volt. H a a kritikus blokkokat gyakran kiírjuk, akkor nagy­
között az, hogy a gyorsítótárbeli hivatkozások viszonylag ritkák, így az összes blok­ ban csökkentjük annak valószínűségét, hogy összeomláskor a fájlrendszer tönkre­
kot pontos LR U -sorrendben tarthatjuk a láncolt listában. megy. Bár a felhasználó nem örül, ha rendszerösszeomlás m iatt elvész egy fájlja,
Az 5.20. ábrán láthatjuk, hogy az ütközésfeloldáshoz használt láncon kívül az de valószínűleg még boldogtalanabb lenne, ha a teljes fájlrendszert elvesztenék.
összes blokk egy kétirányú láncban van a használatuk szerinti sorrendben, a leg­ A fájlrendszer integritásának m egtartása fontos, de em ellett nem kívánatos az
utoljára használt az első, az utoljára használt pedig az utolsó a láncban. H a egy adatblokkokat sem sokáig a gyorsítótárban tartani kiírás nélkül. Tekintsük azt a
blokkra hivatkozás történik, akkor ki lehet venni a láncból és a sor végére lehet helyzetet, amikor valaki személyi számítógépén könyvet ír szövegszerkesztővel.
tenni. Ilyen m ódon pontos LRU -sorrendben tarthatók a blokkok. Még ha periodikusan mentést is végez az író, akkor is előfordulhat, hogy a teljes
Sajnos van egy csapda. Olyan helyzettel van dolgunk, hogy lehetséges pontos dokum entum a gyorsítótárban m arad anélkül, hogy a lemezre valaha is kiírásra
LRU, mégis kiderül, hogy az LR U nem kívánatos. A problém át a korábbi szakasz­ kerülne. A rendszer összeomlása esetén a fájlrendszer nem sérülne, de az egész
ban tárgyalt rendszerösszeomlás és fájlrendszer-konzisztencia okozza. Az a hely­ napi munka elveszne.
zet, amikor egy kritikus blokk - például i-csomópontot tartalm azó blokk - a gyor­ Ez a helyzet nem fordulhat elő nagyon gyakran, hacsak nem vagyunk peches
sítótárban van és módosult, de nem lett kiírva a lemezre, miközben a rendszer ösz- felhasználók. A rendszerek két megközelítést használnak a probléma megoldá­
szeomlott, a fájlrendszer inkonzisztens állapotát eredményezi. H a az i-csomópont sára. A Unix biztosít egy syne nevű rendszerhívást, amely kikényszeríti az összes
blokkját az LRU-lánc végére rakjuk, akkor könnyen előfordulhat, hogy sokára ér m ódosult blokk azonnali kiírását a lemezre. Az operációs rendszer indításakor el­
a lánc elejére, és így nem kerül kiírásra. indul egy program, a neve általában update, amely a háttérben ül, és 30 m ásodper­
cenként syne hívásokat kezdeményez, egyébként alszik. Ennek az a hatása, hogy
összeomlás miatt legfeljebb 30 másodpercnyi munka veszhet el.
A Windows azt csinálja, hogy minden olyan blokkot azonnal kiír a lemezre,
amelybe írás történt. Az olyan gyorsítótárat, amely minden módosult blokkot
azonnal kiír, írásáteresztő gyorsítótárnak nevezik. Ezek sokkal több lemezes I/O-
m űveletet igényelnek, mint a nem írásáteresztő gyorsítótárak. A különbség a Unix
és az MS-DOS módszere között jól látható, amikor egy program 1 KB méretű
blokkot teleír, karakterenként végezve az írást. A Unix-rendszer összegyűjti a ka­
raktereket a gyorsítótárban, és 30 másodpercenként, vagy akkor, amikor a blokk
kikerül a gyorsítótárból, kiírja a lemezre. A Windows minden egyes karakter írása­
kor lemezhez fordul. Természetesen a legtöbb program használ belső puffért, így
5.20. ábra. Gyorsítótár-adatszerkezet
540 5. FÁJLRENDSZEREK 5.3. FÁJLRENDSZEREK MEGVALÓSÍTÁSA 541

rendszerint nem karakterenként, hanem soronként vagy még nagyobb egységek­ nyű az egymáshoz lehető legközelebbi blokkok lefoglalása. Szabad lista esetén,
ben végez write rendszerhívást. amelynek csak egy része van a memóriában, sokkal nehezebb egymáshoz közeli
A gyorsítótár-stratégiák különbségének az a következménye, hogy ha Unix ese­ blokkokat lefoglalni.
tén egy (hajlékony-) lemezt csak úgy kiveszünk, mielőtt sync-et végrehajtottunk Azonban még szabad lista esetén is lehetséges bizonyos blokkcsoportosítás.
volna, majdnem mindig adatvesztés lesz, és gyakran a fájlrendszer is megsérül. A trükk az, hogy a lem eztárat nem blokkegységben foglaljuk le, hanem egymást
Windows esetén nincs ilyen probléma. Azért választottak a két rendszerben kü­ követő blokkokban. H a egy szektor 512 bájtos, akkor a rendszer 1 KB m éretű blok­
lönböző stratégiát, m ert a Unixot olyan környezetben fejlesztették ki, ahol a le­ kot (2 szektor) használhat, de a helyfoglalási egység 2 blokk (4 szektor) lehet. Ez
mezek nem voltak cserélhetők, míg a Windows tipikusan hajlékonylemez-világban nem egyenértékű azzal, amikor a blokkm éret 2 KB, mivel a gyorsítótár most is
született. Ahogy a merevlemezek általánossá váltak, a Unix megközelítése lett a 1 KB-os blokkokkal dogozik, és az átvitel is 1 KB m éretű blokkban történik. De
norm a a jobb hatékonyság miatt, és ma m ár a Windows is ezt használja. szekvenciálisán olvasva egy fájlt, feltéve, hogy a rendszer egyébként tétlen, a po­
zicionálások száma a felére csökken, ami tekintélyes hatékonyságnövekedés. Egy
változat erre a tém ára az, amikor figyelembe vesszük a rotációs pozicionálást.
Blokk előreolvasása Blokkok lefoglalásakor a rendszer a fájlban egymást követő blokkokat azonos
cilinderen igyekszik elhelyezni.
A másik technika a fájlrendszer hatékonyságának növelésére az, hogy m egpróbál­ Egy másik szűk keresztm etszetet jelent az i-csomópontot alkalmazó rendsze­
juk a blokkokat a gyorsítótárba tölteni, még mielőtt kellenének, ezzel növelve a reknél az, hogy még kism éretű fájl olvasása is két lemezhez fordulást igényel:
találati arányt. Kiváltképpen, mivel sok fájlt szekvenciálisán olvasunk. Amikor a egyet az i-csomópont, egyet pedig az adatblokk eléréséhez. Egy i-csomópont szo­
fájlrendszertől egy fájl A:-adik blokkját kérjük, akkor az szolgáltatja ezt a blokkot, kásos elhelyezését m utatja az 5.21.(a) ábra. Itt m inden i-csomópont a lemez elején
de szolgai m ódon ellenőrzi, hogy a k + 1-edik blokk benn van-e a gyorsítótárban. található, így az i-csomópont és a blokkjai közötti távolság körülbelül a cilinderek
H a nincs, akkor beütem ezi a beolvasását abban a reményben, hogy ha szükség lesz számának felével egyenlő, ami hosszú pozicionálást eredményez.
rá, akkor a gyorsítótárban legyen, vagy legalábbis úton. Könnyen növelhetjük a hatékonyságot, ha az i-csomópontokat nem a lemez ele­
Természetesen ez az előreolvasási stratégia csak szekvenciálisán olvasott fájlok jére tesszük, hanem a közepére, így felére csökkenthetjük az átlagos pozicionálási
esetén hasznos. Direkt elérésű fájlok esetén az előreolvasás nem segít. Valójában időt. Egy másik ötlet szerint, amelyet az 5.21.(b) ábra m utat, a lemezegységen a
kárt okoz azzal, hogy leköti a lemez átviteli kapacitását azzal, hogy haszontalan cilindereket csoportokba osztják, m inden csoportnak saját i-csomóponti blokk­
blokkokat olvas be és esetleg hasznosakat töröl a gyorsítótárból (és azzal is lekö­ jai és szabad listája van (McKusick et al., 1984). Új fájl létrehozásakor bármely
ti az átvitelt, hogy a m ódosult blokkokat kiírja, hogy mindehhez így csináljon he­ i-csomópont választható, de a rendszer arra törekszik, hogy a blokkokat ugyanab­
lyet). Az előreolvasás hasznosságának eldöntéséhez a fájlrendszer nyilvántarthatja ban a csoportban foglalja le, ahol az i-csomópont van. H a ez nem lehetséges, ak­
minden nyitva lévő fájlhoz annak elérési sémáját. Például egy bit jelezheti, hogy a kor egy közeli csoportot választ.
fájl szekvenciális, avagy direkt elérésű m ódban van-e. Kezdetben a kétségek miatt
szekvenciális m ódra állítódik be. Azonban mihelyt egy pozicionálás végrehajtódik, Az i-csomópontok A lemez cilindercsoportokra
a lemez elején van osztva, mindegyik csoport
ez a bit törlődik. H a később ismét szekvenciális olvasás történik, akkor a bit ismét saját i-csomópontokkal
helyezkednek el
beállítódik. Ilyen módon a fájlrendszer megbecsülheti, hogy érdem es-e az előreol-
vasást alkalmazni. Nem katasztrófa, ha időnként rossznak bizonyul a becsült stra­
tégia, hisz ez csak egy kis veszteséget okoz az átviteli sávszélességben.
-Cilindercsoport

A lemezfej m ozgásának csökkentése

A fájlrendszerek hatékonysága nemcsak a gyorsítótár és előreolvasás alkalma­


zásával növelhető. Egy másik fontos technika arra szolgál, hogy csökkentsük a
lemezegység fejének mozgását azáltal, hogy azokat a blokkokat, amelyeket való­
színűleg egymás után igényelnek, egymáshoz közel helyezzük el, lehetőleg azonos (a)
cilinderen. Amikor egy kimenetfájlt írunk, akkor a fájlrendszernek az igény sze­
rinti sorrendben egymás után kell a blokkokat lefoglalnia. H a a szabad blokkokat 5.21. ábra. (a) Az i-csomópontok a lemez elején vannak, (b) A lemezcilinder csoportokba van
szervezve, csoportonként saját i-csomópontokkal és blokkokkal
bittérképen tartjuk nyilván, amely teljesen a mem óriában van, akkor eléggé köny-
542 5. FÁJLRENDSZEREK 5.4. BIZTONSÁG 543

5.3.7. Naplózott fájlrendszer számából, mint a Unix esetén. A megoldás az, hogy az i-csomópontok sorszámá­
val indexelt táblázatot alkalmaznak. Az i indexű elem tartalmazza az i sorszámú
A technológia fejlődése nyomást gyakorol a jelenlegi fájlrendszerekre. Különösen i-csomópont lemezeimét. A táblázatot lemezen tárolják, de ez is gyorsítótáron ke­
az, hogy a processzorok egyre gyorsabbak lesznek, a lemezek egyre nagyobbak és resztül működik, így a legtöbbet használt részei m ajdnem mindig a memóriában
olcsóbbak (de nem sokkal gyorsabbak), és a mem óriák m érete exponenciálisan vannak a hatékonyság növelése érdekében.
növekszik. Az a param éter, amely nem javul ugrásszerűen, a lemezek pozicionálá­ Összefoglalva az eddig m ondottakat, kezdetben m inden kiírandó a m em óriapuf­
si ideje. Ezen tényezők kombinációja azt eredményezi, hogy sok rendszerben szűk ferben van, és periodikusan m inden pufferezett kiírandót kiírunk a lemezre egy
keresztmetszet alakul ki a teljesítményt tekintve. A Berkeley Egyetemen kutatást szegmensben a napló végére. Fájl megnyitásakor most az i-csomópontok címtáb­
végeztek ezen problém ák enyhítése érdekében, megtervezve egy teljesen új fájl- lázatában kell megkeresni az i-csomópont címét, majd azt elérve megtaláljuk a
rendszert, az LFS-t (Log-structured File System - naplózott fájlrendszer). Ebben blokkok címeit. M inden blokk maga is valamelyik szegmensben van a naplóban.
a részben röviden bemutatjuk, hogyan működik az LFS. Teljesebb leírását lásd H a a lemez végtelen kapacitású lenne, akkor készen is lennénk. Azonban a va­
(Rosenblum és Ousterhout, 1991). lódi lemezek végesek, így végül a napló elfoglalja a teljes lemezt, és innentől nem
Az LFS tervezését vezérlő elv az volt, hogy a processzorok egyre gyorsabbak, a tudnánk több új szegmenst kiírni a naplóba. Szerencsére sok létező szegmensben
RAM m érete egyre nagyobb és a lemezgyorsítótár gyorsan növekszik. Ennek kö­ lehetnek olyan blokkok, amelyek a továbbiakban nem kellenek, például amikor
vetkeztében lehetővé vált, hogy az összes olvasási igény nagyon jelentős részét a felülírunk egy fájlt, akkor annak i-csomópontja új blokkokra mutat, de a régiek
gyorsítótárból, lemezhez fordulás nélkül lehet kielégíteni. Ebből az észrevételből még foglalják a helyet korábban kiírt szegmensekben.
következik, hogy a jövőben a lemezhez fordulások nagy része írási művelet lesz. M indkét problém a m egoldására az LFS takarítófonalat üzemeltet, amely tö ­
Tehát nem eredményez teljesítményjavulást az előreolvasási mechanizmus, amit möríti a naplót annak cirkuláris bejárásával. A m unkát a napló első szegmensével
néhány rendszerben alkalmaznak, amikor is blokkokat beolvasnak a gyorsítótárba, kezdi, megvizsgálja az összefoglalót, hogy milyen i-csomópontok és fájlok vannak
még mielőtt azokra igény lenne. benne. Ezután ellenőrzi az i-csomópontok cím táblázatában, hogy az i-csomópon­
A helyzet még rosszabb, ugyanis a legtöbb fájlrendszerben az írások nagy része tok aktuálisak-e, az adatblokkok használatban vannak-e. Átlépi azokat, amelyek
kis szeletekben történik. A kicsi írások különösen nem hatékonyak, mivel 50 ezred nem aktuálisak. Azokat az i-csomópontokat és adatblokkokat, amelyek aktuáli­
másodperc átvitelt tipikusan 10 ms-os pozicionálás és 4 ms-os forgási késedelem sak, beolvassa a memóriába, hogy aztán kiíródjanak a következő szegmensben. Az
előz meg. Ezekkel a param éterekkel a lemez hatékonysága 1%-ra esik vissza. így feldolgozott szegmenst megjelöli, hogy szabaddá vált, így a napló újra felhasz­
Hogy lássuk, hogy a kicsi írások honnan származnak, tekintsük egy új fájl létesí­ nálhatja. Ily m ódon a takarító végigjárja a naplót, eltávolítva a régi szegmenseket
tését Unix-rendszerben. A művelet végrehajtásához lemezre kell írni a könyvtár a végéről, és m em óriába tölt m inden élő adatot, amely kiírásra kerül a következő
i-csomópontját, a könyvtári blokkot, a fájl i-csomópontját és a fájlt magát. Ezek szegmensben. Következésképpen a lemez egy nagy cirkuláris puffer lesz. A rend­
az írások ugyan clhalaszthatóak, de ez komoly konzisztenciaproblémákat eredm é­ szer írást végző fonala az elejéhez illeszt új szegmenseket, takarítófonala pedig a
nyezne, ha a tényleges kiírás előtt összeomlana a rendszer. Éppen ezért az i-cso- végéről távolítja el a régieket.
m ópontok kiírását általában azonnal elvégzik. A könyvelés nem triviális, ugyanis amikor a takarító egy fájlblokkot visszaír egy
Ezen érvek m iatt az LFS tervezői elhatározták, hogy a Unix-fájlrendszer új új szegmensbe, akkor meg kell keresni a fájl i-csomópontját (valahol ott van a nap­
megvalósítását készítik el oly módon, hogy elérjék a lemez sávszélességének teljes lóban), azt aktualizálni kell, majd kiírni a következő szegmensben. Az i-csomópon­
kihasználását, még akkor is, ha a terhelés nagyrészt véletlenszerű, kicsi írásokból tok címtáblázatát is m ódosítani kell, hogy az új címet tartalmazza. Mindazonáltal
áll. Az alapötlet az, hogy az egész lemezt egy naplóvá szervezik. Periodikusan és az adminisztráció elvégezhető, és a teljesítményeredmények azt mutatják, hogy
speciális igény esetén a m em óriapufferben található összes függőben lévő írást ez a bonyolultság megéri. Az idézett cikk szerint a m érések azt mutatják, hogy az
összegyűjtik egy szegmensbe, és azt egyben kiírják a napló végére. Ekkor egy szeg­ LFS egy nagyságrenddel felülmúlja a Unixot kicsi írások esetén, miközben teljesít­
mens vegyesen tartalm azhat i-csomópontot, könyvtári blokkot és adatblokkot is. ménye ugyanolyan jó vagy jobb olvasásnál és nagyméretű írásnál.
M inden szegmens elején található egy összefoglaló rész, amely megadja, hogy mi
van a szegmensben. H a a szegmens átlagos m érete kb. 1 MB lesz, akkor a lemez
majdnem teljes sávszélessége kihasználható.
Ebben a tervben továbbra is vannak i-csomópontok, és ezek szerkezete meg­ 5.4. Biztonság
egyezik a Unixban használttal, de most az i-csomópontok a naplóban szétszórtan
vannak, nem pedig a lemezen rögzített helyen. Azonban az i-csomópont elérése A fájlrendszerek gyakran tartalmaznak olyan információt, amelyek nagy értéket
után a blokkok elérése a szokásos m ódon megy. Természetesen az i-csomópont képviselnek a felhasználói számára. Ezért minden fájlrendszerrel szemben fő köve­
elérése most sokkal nehezebb, mivel címe nem számítható ki az i-csomópont sor­ telmény ezen információk megvédése a jogosulatlan felhasználástól. A következő
544 5. FÁJLRENDSZEREK 5.4. BIZTONSÁG 545

alfejezetben a biztonság és a védelem különböző kérdéseivel foglalkozunk. A kér­ információs rendszer nem ér sokat. Az integritás általában sokkal fontosabb, mint
dések egyaránt érintik az időosztásos rendszereket és a személyi számítógépek háló­ a biztonság.
zatait, amelyek lokális hálózaton keresztül megosztott kiszolgálóhoz kapcsolódnak. A harm adik cél a rendelkezésre állás, ami azt jelenti, hogy senki se zavarhassa
meg a rendszert úgy, hogy használhatatlan legyen. Az ilyen szolgáltatásmegtaga-
dás-tám adások gyakorisága növekszik. Például egy internetszolgáltatást nyújtó
5.4.1. Biztonsági környezet számítógép lebénítható, ha kérések özönét küldjük rá, mivel csupán a kérések
vizsgálata és elutasítása felemészti a CPU idejét. H a mondjuk 100 ju,s kell egy web-
A „biztonság” és „védelem” kifejezéseket gyakran felcserélhetően használják. oldalkérés beolvasásához, akkor bárki, aki képes 10000 kérést generálni m ásod­
Célszerű azonban a két fogalom között különbséget tenni. Az egyik az az általá­ percenként, blokkolhatja a gépet. Elfogadható modellek és technológiák vannak
nos problém akör, amely annak biztosítását jelenti, hogy jogosulatlan személy ne a biztonság és az integritás biztosítására, de a szolgáltatásmegtagadás-támadások
olvashassa és módosíthassa a fájlokat, ami egyrészt technikai, szervezési, jogi és kivédése sokkal nehezebb.
politikai problém ákat jelent; másrészt olyan specifikus operációsrendszer-m echa­ A biztonság egy másik aspektusa a magánélet: megvédeni a személyeket attól,
nizmusokat, amelyek a biztonságot szolgálják. A félreértés elkerülése végett mi hogy a róluk készült adatokkal visszaéljenek. Ez azonnal jogi és morális problém á­
a biztonság kifejezést használjuk az általános problém ára és a védelmi mecha­ kat vet fel. Vezethet-e valamely állami szervezet dossziét mindenkiről abból a cél­
nizmus kifejezést a specifikus operációsrendszer-mechanizmus számára, amely a ból, hogy elfogja a csalókat, akár társadalombiztosítási, akár adócsalásról legyen
számítógépes információ védelmét szolgálja. Azonban a határ közöttük nincs jól szó? M egengedhető-e, hogy a rendőrség a szervezett bűnözés elleni harc érdeké­
definiálva. Először a biztonság kérdésével foglalkozunk, hogy lássuk a probléma ben bárkinek bármilyen adatát átnézze? Milyen jogaik lehetnek a munkaadóknak
term észetét, majd a védelmi mechanizmust és a biztonság elérését lehetővé tevő és a biztosítóknak? Mi történik, ha ezek a jogok ütköznek a személyiségi jogokkal?
modelleket tanulmányozzuk. Ezek rendkívül fontos problémák, de tárgyalásuk meghaladja e könyv kereteit.
A biztonságnak több oldala van. A három legfontosabb a fenyegetés (veszé­
lyek), a behatolás és a véletlen adatvesztés.
Behatolás

Fenyegetés A legtöbb em ber nagyon rendes és jogkövető, miért aggódunk a biztonság miatt?
M ert van néhány ember, aki nem olyan rendes és bajt akar okozni (esetlegesen
Biztonsági szempontból a számítógépes rendszereknek három általános célja van, saját hasznára). A biztonsági irodalom ban az olyan embert, aki olyan helyeken
az ezekhez tartozó veszélyekkel, amit az 5.22. ábra mutat. Az első a bizalmas jár, ahol semmi keresnivalója nincs, behatolónak, néha ellenségnek nevezik. A be­
adatkezelés, amely azt jelenti, hogy titkos adatok titkosak maradnak. Még ponto­ hatolók kétféleképpen dolgoznak. A passzív behatoló csak el akar olvasni olyan
sabban, ha bizonyos adatok tulajdonosa úgy dönt, hogy ezek az adatok csak meg­ fájlokat, amelyekre nincs jogosultsága. Az aktív behatolók sokkal kártékonyab­
határozott em berek számára legyenek elérhetők, mások számára pedig nem, ak­ bak, ők jogosulatlan változtatásokat akarnak végezni. Egy behatolás ellen védett
kor a rendszernek biztosítania kell, hogy az adatok nem jogosult személyekhez ne rendszer tervezésénél figyelembe kell venni, hogy milyen behatolás ellen akarunk
jussanak el. A nyilvánvaló minimum az, hogy a tulajdonos meg tudja adni, hogy ki védekezni. A következő kategóriákat lehet megkülönböztetni:
mit láthat, és a rendszer érvényesíteni tudja ezeket a specifikációkat.
A második cél az adatintegritás, ami azt jelenti, hogy jogosulatlan felhasználó 1. Képzetlen felhasználó alkalmi kíváncsiskodása. Sok em bernek van otthon
ne legyen képes adatm ódosításra a tulajdonos beleegyezése nélkül. Az adatm ódo­ számítógépe, amely fájlkiszolgálóhoz kapcsolódik, és emberi tulajdonság,
sítás itt nemcsak változtatást jelent, hanem törlést és hamis adatok hozzáadását is. hogy néhányuk elolvassa mások elektronikus leveleit, más fájljait, ha nincse­
H a egy rendszer nem tudja garantálni, hogy a benne elhelyezett adatok változatla­ nek ebben korlátozva. A legtöbb Unix-rendszer például alapértelmezés sze­
nok m aradnak mindaddig, amíg a tulajdonos nem akar változtatni, akkor az mint rint mindenki által olvasható jogosultságot állít be az újonnan létesített fáj­
lokra.
Célok Veszélyek 2. Szaglászás bennfentes által. Hallgatók, rendszerprogramozók, operátorok és
Bizalmas adatkezelés Expozíció más technikai személyek gyakran tekintik személyes kihívásnak, hogy helyi
Adatintegritás Adathamisítás számítógépek biztonsági rendszerét feltörjék. Ok sokszor magasan képzet­
Rendelkezésre állás Szolgáltatásmegtagadás tek, és hajlandók sok időt fordítani efféle tevékenységre.
3. H atározott pénzszerzési szándék. Előfordul, hogy banki alkalmazásban lévő
5.22. ábra. Biztonsági célok és veszélyek programozó lopási céllal akar betörni a banki rendszerbe. A séma változatos,
546 5. FÁJLRENDSZEREK 5.4. BIZTONSÁG 547

célja lehet megváltoztatni a szoftvert úgy, hogy csonkítás helyett kerekítést amelyeket vírus vagy más malware fertőzött meg. Az ilyen rosszindulatú program
végezzen a kam aton, így m egtartsa a váltópénz törtrészét, vagy megcsapoljon által megfertőzött számítógép „szolgává” válik, az állapotáról jelentéseket küld
évek óta nem használt számlákat, vagy zsaroljon („Fizess, vagy tönkreteszem valahol az interneten található gazdájának. A gazdagép ezután a szolga által be­
a bank adatbázisát!”). gyűjtött és elküldött címlista alapján terjeszti a levélszemetet. A haszonszerzést
4. Kereskedelmi vagy katonai kémkedés. A kémkedés versenytárs vagy idegen célzó malware egy másik fajtája a kulcsgyűjtő. A kulcsgyűjtő a m egfertőzött szá­
ország komoly és jól megalapozott lopási szándéka, amely arra irányul, hogy m ítógépen m inden billentyűleütést tárol. Nem túl bonyolult olyan program ot írni,
programot, gyártási titkot, szabadalmat, technológiát, áram körtervet, piaci amely kiszűri az olyan információt, mint a felhasználónév és jelszó páros vagy hi-
stratégiát vagy más hasonló dolgot eltulajdonítson. A kémkedés gyakran al­ telkártya-számlaszám. Ezeket aztán elküldi a gazdának, aki felhasználhatja, vagy
kalmaz lehallgatást, vagy akár olyan antennát, amelyet a számítógép felé irá­ eladhatja bűnözőknek.
nyítanak, hogy felfogják a gép által kibocsátott elektromágneses hullámokat. A vírushoz hasonló a féreg. Amíg a vírus más program okhoz kapcsolódik, és
csak akkor aktív, ha a gazdaprogramját végrehajtjuk, addig a féreg önálló prog­
Világosan kell látni, hogy nagy különbség van a katonai titkok ellopása és aközött, ram. A féreg úgy terjed, hogy a hálózaton továbbküldi saját m ásolatait más szá­
amikor hallgatók mókás üzeneteket illesztenek a számítógép rendszerébe. A kifej­ mítógépekre. A W indows-rendszereknek általában van egy indítókönyvtáruk min­
tendő erőfeszítés nagysága nyilvánvalóan függ attól, hogy ki az ellenség, aki elle­ den felhasználó számára; az ebben a könyvtárban lévő valamennyi program auto­
nében védekezni kell. matikusan elindítódik a bejelentkezéskor. A féregnek csak azt kell tennie, hogy
berakja magát a távoli számítógép indítókönyvtárába. Más módszer (amit még
nehezebb felfedezni) is van arra, hogy a távoli gép végrehajtsa a fájlrendszerébe
Rosszindulatú programok másolt programot. A féreg hatása ugyanaz lehet, mint a vírusé. Valójában nem
egyszerű megkülönböztetni a vírust a féregtől, néhány malware mindkét módszert
A biztonsági ártalom egy másik kategóriájába tartoznak a kártékony programok, használja a terjedésre.
vagy más néven malware. Bizonyos értelem ben a rosszindulatú program készí­ A malware egy másik csoportjába tartozik a trójai faló. Ez olyan program,
tője is behatoló, aki gyakran igen felkészült. Az a különbség a hagyományos be­ amely kétségtelenül hasznos tevékenységet végez, lehet játék vagy állítólagos se­
hatoló és a malware között, hogy az előbbi egy személy, aki maga akar betörni a gédprogram „javított” változata. Azonban amikor a trójai falovat végrehajtják, ak­
rendszerbe, hogy kárt okozzon, addig az utóbbi egy program, amelyet ilyen ember kor más tevékenységet is végez, indíthat férget vagy vírust, vagy más rosszindulatú
írt, és aztán elterjesztett a világban. Néhány malware-t csak azért írtak, hogy kárt dolgot tehet. A trójai faló hatása körm önfont és rejtett. Ellentétben a féreggel és
okozzon, másokat sokkal speciálisabb céllal készítenek. Ez egyre nagyobb prob­ a vírussal, a trójai falovat a felhasználó saját elhatározásából tölti le, és amikorra
léma és igen kiterjedt irodalma van (Aycock és Barker, 2005; Cerf, 2005; Ledin, kiderül, hogy mi is valójában, törlik a letöltési helyről.
2005; M cHugh és Deek, 2005; Treese, 2004; és Weiss, 2005). Egy másik biztonsági problém a volt annak idején a m unkatársak m egbízhatat­
A malware legismertebb változata a vírusvírus, alapvetően egy program kód­ lanságából származó logikai bomba. Ez az eszköz egy kis kódrészlet, amelyet a
részlet, amely más programhoz kötődve reprodukálni tudja magát, a biológiai ví­ vállalat egy programozó alkalmazottja készít, és titokban beilleszt a készített ope­
rus analógiájára. A vírus a reprodukciója mellett m ást is csinálhat. Például üzene­ rációs rendszerbe. Amíg a programozó naponta „eteti” a kívánt jelszóval, addig
tet vagy képet jeleníthet meg a képernyőn, lejátszhat zenét, vagy más veszélytelen nem történik semmi. H a azonban a program ozót előzetes figyelmeztetés nélkül
dolgot is csinálhat. Sajnos m ódosíthat, törölhet vagy ellophat fájlokat (elektroni­ elbocsátják, vagy nem kapja meg a beígért juttatást, a következő napon, amikor a
kus levélben elküldve azt valahová). rendszer nem kapja meg a jelszót, működésbe lép a bomba.
A vírus futása alatt használhatatlanná is teheti a számítógépet. Ezt DOS- (De- A m űködés hatása lehet lemeztörlés, fájlok véletlenszerű törlése, kulcsfontos­
nial Of Service - szolgáltatásmegtagadás) tám adásnak nevezik. A szokásos cél ságú program okon végrehajtott nehezen kideríthető változtatás vagy fontos fájlok
az erőforrások vad elfogyasztása, mint a CPU vagy a lemez kitöltése szeméttel. titkosítása. Az utóbbi esetben a vállalat választhat, vagy hívja a rendőrséget (ami
A vírusok (és más malware-ek, amelyeket majd tárgyalunk) DDOS- (Distributed több hónappal későbbi ítéletet eredményez, vagy még azt sem), vagy enged a zsa­
Denial O f Service - osztott szolgáltatásmegtagadás) tám adásra is felhasználha­ rolásnak, és csillagászati összegért újra alkalmazza a volt programozót mint kon­
tók. Ekkor a vírus közvetlenül a megfertőzés után nem csinál semmit. Egy meg­ zultánst, hogy a hibát kijavítsa (és reménykedhet, hogy közben nem ültet el újabb
határozott időpontban azonban a vírus sok ezer példánya szerte a világban mind logikai bombát).
egyszerre elkezdi ugyanazt a weblapot vagy más hálózati szolgáltatást kérni, ezzel A malware egy másik változata a kémprogram. Kémprogram ot általában web­
túlterheli a szolgáltató számítógépét és a hálózatot. hely meglátogatásával kaphatunk. A legegyszerűbb formája a süti. A süti egy kis­
A malware-t gyakran haszonszerzés céljából készítik. A legtöbb (ha nem az m éretű fájl, amelyet a webszolgáltató és a webböngésző kicserél. Ennek legális
összes) levélszemetet (spam) olyan hálózatba kapcsolt számítógépek terjesztik, célja van. A süti olyan információt tartalmaz, amely lehetővé teszi a használója
548 5. FÁJLRENDSZEREK 5.4. BIZTONSÁG 549

azonosítását. Ez olyan, mint amikor kapunk egy jegyet, ha leadjuk kerékpárun­ tűnhet, mint a leleményes behatolók elleni védekezés, de a gyakorlatban az előbbi
kat javításra. Am ikor visszatérünk a műhelybe, a jegy egyik felét összeillesztik a több kárt okoz, mint az utóbbi.
kerékpáréval (és a számlával). A webkapcsolat nem tartós, például amikor érdek­
lődést m utatunk egy könyv megvásárlására egy internetes könyvesboltban, akkor
a bolt szolgáltatója megkéri a webböngészőt, hogy fogadjon el egy sütit. Amikor 5.4.2. Általános biztonság elleni támadások
befejezzük a böngészést és egy másik könyvet is megjelöltünk vásárlásra, akkor
olyan oldalra kattintunk, ahol a vásárlást befejezzük. Ekkor a webkiszolgáló visz- A biztonsági hézagok kiderítése nem egyszerű dolog. Egy rendszer biztonságának
szakéri a böngészőtől az eltárolt sütit. Az ebben tárolt információkból össze tudja ellenőrzésére szokásos módszer egy tigriscsapatként vagy behatoló csapatként is­
állítani a megvásárolandó könyvek listáját. m ert szakértői csapat megbízása azzal, hogy kíséreljen meg betörni a rendszerbe.
Normálisan az ilyen célra használt sütik élettartam a ham ar lejár. A süti nagyon H ebbard és társai (H ebbard et al., 1980) is ezt próbálták végzett hallgatók segít­
hasznos technika, az e-kereskedelem erre épül. Azonban van olyan weboldal, ségével. Évek során ezek a behatoló csapatok számos olyan területet fedeztek fel,
amely nem ilyen jóindulatúan használja. Például hirdetések gyakran reklám oz­ ahol a rendszerek valószínűleg gyengék. Alábbiakban felsorolunk néhány nagyon
nak olyan vállalkozást, amely nem az információ szolgáltatója. A hirdetők ezért gyakori betörési kísérletet, amelyek sokszor sikeresek. Operációs rendszer terve­
a privilégiumért fizetnek a weboldal tulajdonosának. H a egy kerékpáralkatrészt zésekor legyünk óvatosak, hogy rendszerünk ellenálljon az ilyen támadásoknak.
hirdető oldal sütit helyez el, majd később egy ruházati cikkeket árusító helyre láto­
gatunk, akkor ugyanaz a hirdető cég ezen az oldalon is adhat reklámot, és begyűjt- 1. Igényeljünk mem órialapot, lem ezterületet, szalagterületet, és csak olvassuk
het olyan sütit, amelyet m áshonnan kaptunk. H irtelen olyan reklám ot láthatunk, el tartalm ukat. Sok rendszer nem törli a tartalm at, mielőtt a felhasználó szá­
amely olyan ruhákat reklámoz, amelyeket speciálisan kerékpározók használnak. m ára lefoglalja, így az tele lehet hasznos információval, amit az előző felhasz­
A hirdetők sok információt begyűjthetnek ilyen m ódon az érdeklődési körünkről, náló írt a területre.
ezért nem kell sok m indent közölni magunkról. 2. Próbálkozzunk illegális rendszerhívással, vagy legális hívással, illegális
Ami rosszabb, weboldalak sokféleképpen letölthetnek végrehajtható kódot param éterekkel, vagy legális hívással és legális, de értelm etlen param éterrel.
számítógépünkre. A legtöbb böngésző elfogad olyan bővítményeket, amelyekkel Sok rendszert össze lehet így zavarni.
a böngésző képességei kiterjeszthetők, például új típusú fájl megjelenítése a kép­ 3. Bejelentkezés közben nyomjunk d é l , r u b o u t vagy b r e a k billentyűt. Néhány
ernyőn. A felhasználók gyakran elfogadják a bővítményt anélkül, hogy tudnák, rendszerben a jelszót ellenőrző program megszakad, és a bejelentkezést sike­
mit csinál. Vagy például a felhasználó szívesen elfogad olyan bővítményt, amely resnek tekinti.
táncoló cica kurzort ad. Elég egy hiba a böngészőben, hogy távolról nemkívánatos 4. Próbáljuk meg m ódosítani a felhasználói területén lévő komplex operációs­
program ot telepítsenek a gépünkre, esetleg olyan oldalra csábítva, amely kihasz­ rendszer-adatszerkezeteket. Bizonyos (különösen nagygépes) rendszerekben
nálhatja sebezhetőségünket. M inden esetben, amikor idegen program ot fogadunk egy fájl megnyitásakor a program nagy adatszerkezeteket épít fel, amelyben
el, önként vagy sem, fennáll a veszély, hogy ártalmas számunkra. ott van a fájl neve és más param éterek, és ezt átadja a rendszernek. A fájl írá­
sa és olvasása során a rendszer néha módosítja ezeket az adatszerkezeteket.
Bizonyos mezők megváltoztatása tönkreteheti a rendszer biztonságát.
Véletlen adatvesztés 5. Próbáljuk meg becsapni a felhasználókat azzal, hogy program unk a „login:”
szöveget írja a képernyőre, bejelentkezési képernyőt szimulálva. Sok felhasz­
A kártékony behatolók fenyegetése m ellett értékes adatokat véletlenül is elveszít­ náló megpróbál bejelentkezni, begépeli az azonosítóját és jelszavát, amit az­
hetünk. A véletlen adatvesztés néhány általános esete: tán a program eltárol gonosz m estere számára.
6. Keressünk kézikönyvekben „Ne tedd JV-et!” formájú szöveget. Próbáljuk ki
1. Természeti csapás: árvíz, földrengés, háború, zavargás, vagy ha rágcsálók az X tevékenység lehetséges variációit.
megrágják a szalagokat, lemezeket. 7. Győzzünk meg egy rendszerprogram ozót, hogy módosítsa a rendszert úgy,
2. Hardver- vagy szoftverhibák: hibás processzorműködés, olvashatatlan lemez hogy az ugorja át a biztonsági ellenőrzést a mi azonosítónkkal bejelentkező
vagy szalag, telekommunikációs hiba, programhiba. felhasználó esetén. Ez a tám adás csapóajtó néven ismert.
3. Em beri tévedés: hibás adatbevitel, nem megfelelő szalag vagy lemez behelye­ 8. H a semmi nem megy, akkor próbálkozzunk a számítóközpont titkárnőjének
zése, hibás program indítása, vagy valami más tévedés. megvesztegetésével. A titkárnő valószínűleg könnyen hozzáférhet csodálatos
információkhoz és rendszerint alulfizetett. Ne becsüljük le az emberi ténye­
A legtöbb ezek közül kezelhető megfelelő mentéssel, lehetőleg az eredeti adatok­ zők okozta problémákat.
tól távol tárolva. Az adatok védelme a véletlen adatvesztés ellen egyszerűbbnek
550 5. FÁJLRENDSZEREK 5.4. BIZTONSÁG 551

Ezek és más támadási kísérletek megtalálhatók Linde könyvében (Linde, 1975). Jelszavak
Bőséges irodalma van a biztonságnak és a biztonság ellenőrzésének, különösen a
világhálón. A Windows-rendszerekre vonatkozó friss m unkát lásd (Johanson és A legszélesebb körben használatos azonosítás jelszó megadását követeli a felhasz­
Riley, 2005). nálótól. A jelszavak védelmét egyszerű m egérteni és megvalósítani. A Unixban a
következőképpen működik: a bejelentkeztető (login) program bekéri a felhasz­
náló azonosítóját és jelszavát. A jelszót azonnal titkosítja. A login program ezután
a jelszófájlban, amely felhasználónként egy ASCTI szövegsort tartalmaz, m egke­
5.4.3. Tervezési elvek a biztonság érdekében
resi a felhasználó azonosítóját tartalm azó sort, és összehasonlítja az ott titkosítva
Saltzer és Schroeder (Saltzer és Schroeder, 1975) kim utatott több általános elvet, tárolt jelszót a begépelt és titkosított jelszóval. H a egyezést talál, akkor a belépést
amelyek útm utatóként használhatók biztonságos rendszerek tervezéséhez. Az engedélyezi, egyébként visszautasítja.
alábbiakban ötleteik rövid felsorolását adjuk (a M ULTICS-rendszer alapján). A jelszavas azonosítást könnyű becsapni. Gyakran olvasható, hogy középisko­
Először is a rendszer terve legyen nyilvános. Annak feltételezése, hogy a beha­ lások vagy akár általános iskolások megbízható otthoni gépüket használva beha­
toló nem ismeri a rendszer m űködését, csak a tervezők becsapására jó. toltak szigorúan titkos rendszerbe, amely valamely óriás cég vagy állami intéz­
Másodszor, az legyen az alapértelmezés, hogy nincs hozzáférés. A legitim hoz­ mény tulajdona. A behatolás látszólag valamennyi esetben a felhasználó azonosí­
záférés visszautasításából származó hibák sokkal gyorsabban jelezhetők, mint tójának és jelszavának megsejtése miatt történt.
azok, amelyekben jogosulatlan hozzáférés megengedett. H abár több friss kutatás is folyt ezen a területen (többek között Klein, 1990),
Harmadszor, ellenőrizni kell az aktuális jogosultságokat. A rendszer ne csinálja a jelszavas biztonságról a klasszikus mű M orris és Thom pson Unixra vonatkozó
azt, hogy ellenőrzi a jogosultságokat, megállapítja, hogy a hozzáférés megenge­ m unkája (M orris és Thompson, 1979) m aradt. Összegyűjtötték a gyakori jelszava­
dett, aztán ezt az információt eldugja valahova. Sok rendszer csak akkor ellenőrzi kat: utónevek, családnevek, utcanevek, városnevek, közepes m éretű szótár szavai
a jogosultságokat, amikor a fájlt megnyitja, később m ár nem. Ez azt jelenti, hogy (visszafelé is), autórendszám ok és rövid véletlen szövegek. Ezután ismert jelszó­
a felhasználó, aki megnyit egy fájlt, majd hetekig megnyitva tartja, folyamatosan titkosítási algoritmussal titkosították ezeket a szavakat, és elkezdték ellenőrizni,
rendelkezik a hozzáféréssel, akkor is, ha a fájl tulajdonosa közben m ár régen meg­ hogy melyek fordulnak elő a listájukban. Azt tapasztalták, hogy több mint 86 szá­
változtatta a jogosultságokat. zalékuk előfordul.
Negyedszer, a processzusoknak a lehető legkisebb jogosultságuk legyen. Egy H a minden jelszó 7 karakterből állna, akkor a 95 nyom tatható karaktert fel­
szövegszerkesztő, amelynek csak az általa szerkesztett fájlhoz van hozzáférése használva a keresési tér m érete 957, ami körülbelül 7 x 1013. H a m ásodpercenként
(amit az indításakor meg kell adni), akkor sem tud nagy kárt okozni, ha tartalm az 1000 jelszót tudnánk titkosítani, akkor 2000 év kellene a teljes lista felépítéséhez.
trójai falovat. Ez az elv kifinomult védelmi mechanizmust követel. Ebben a feje­ Továbbá a lista 20 millió mágnesszalagot töltene meg. H a legalább azt követel­
zetben később tárgyalni fogunk ilyen mechanizmusokat. nénk meg, hogy m inden jelszó tartalmazzon legalább egy kisbetűt, egy nagybetűt,
Ötödször, a védelmi mechanizmus egyszerű, egységes legyen, és az operációs egy speciális karaktert és legalább 7 vagy 8 hosszú legyen, m ár az is jelentős javu­
rendszer legalsó rétege valósítsa meg. Egy létező, nem megbízható rendszert biz­ lást eredményezne a szabadon választható jelszavakhoz képest.
tonságossá tenni szinte lehetetlen. A biztonság, ugyanúgy, mint a helyesség, nem Jóllehet nem várható el a felhasználótól, hogy alkalmas jelszót válasszon, mégis
hozzáadható tulajdonság. M orris és Thom pson bem utatott egy technikát, amelynek alkalmazása majdnem
Hatodszor, a választott séma pszichológiailag elfogadható legyen. H a a felhasz­ lehetetlenné tenné az általuk próbált tám adásokat (előre elkészített titkosított jel­
náló úgy érzi, hogy fájljainak védelme túl sok m unkát igényel, akkor inkább nem szavak listája). Az volt az ötletük, hogy m inden jelszóhoz adjunk hozzá egy n bites
törődik vele. Ennek ellenére hangosan panaszkodik, ha valami nincs rendben. véletlen számot. A jelszó változásával maga a véletlen szám is változna. A véletlen
Ekkor az „Ez az Ön hibája” válasz általában nem elfogadható. számot is titkosítottan kell tárolni a jelszófájlban. Pontosabban titkosításkor a vé­
letlen számot hozzá kell adni a jelszóhoz, és az így kapott szót kell titkosítani és
tárolni a jelszófájlban.
5.4.4. Felhasználó azonosítása Vizsgáljuk meg, hogy milyen következményekkel jár ez a behatolóra nézve.
A behatoló a gyakori jelszavakat titkosított formában összegyűjti egy listába ren­
Sok védelmi séma azon a feltételezésen alapszik, hogy a rendszer ismeri minden dezetten, hogy a keresést gyorsítsa, és a listát eg y /fájlb an tárolja. H a a behatoló
felhasználója kilétét. Azt a feladatot, amely belépéskor a felhasználó kilétének úgy sejti, hogy Marilyn jó jelszó lehet, akkor most m ár nem elég csak a Marilyn szót
azonosítását jelenti, felhasználóazonosításnak nevezzük. A legtöbb azonosítási titkosítva felvennie a listába, hanem fel kell vennie a MarilynOOOO, MarilynOOOl,
módszer olyan dolog azonosságának a megállapításán alapszik, amit a felhasználó Marilyn0002, és így tovább, szavakat is. Ami azt jelenti, hogy mind a 2" elemet el
tud, vagy amivel rendelkezik, vagy amivel azonos. kell helyeznie az/fájlb an . Ez a technika 2"-szeresére növeli a fájl m éretét. A Unix
552 5. FÁJLRENDSZEREK 5.4. BIZTONSÁG 553

ezt a módszert használja, ahol n = 12. Ezt a technikát a jelszófájl sózásának is hív­ Fizikai azonosítás
ják. Néhány Unix magát a jelszófájlt olvashatatlanná teszi, és biztosít egy progra­
mot, amellyel kérésre keresni lehet benne, de késleltetéssel, hogy a tám adót las­ Teljesen különböző azonosítási megközelítés az, amikor azt ellenőrzik, hogy a fel­
sítsa. használónál van-e egy adott tárgy, például egy műanyag kártya, amelyen mágneses
H abár ez a módszer védelmet nyújt az olyan behatolókkal szemben, akik előre csík van. A kártyát beillesztik a terminálba, amely ellenőrzi, hogy kié a kártya. Ez a
gyártott titkosított jelszavakkal operálnak, de keveset tesz az olyan felhasználók módszer kom binálható jelszóval, így a felhasználó csak akkor tud bejelentkezni, ha
védelmében, akiknek az azonosítója Dávid és a jelszava is Dávid. Az egyik lehet­ (1) megvan a kártyája, ha (2) tudja a jelszót. A banki pénzkiadó autom aták gyak­
séges mód arra, hogy rávegyük a felhasználót jobb jelszó választására, hogy a szá­ ran így működnek.
mítógép adjon tanácsokat. Vannak számítógépek, amelyek jelszóként használha­ Ismét más a nehezen ham isítható biom etriai tulajdonságok m érésén alapuló
tó, véletlenszerű, könnyen kiejthető, de értelm etlen szavakat generálnak, úgymint azonosítási rendszer. Például a term inálba épített ujjlenyomat- vagy hanglenyo-
fotally, garbungy vagy bipitty (célszerű persze nagybetűt és speciális karaktert is mat-felismerő azonosíthatja a felhasználót. (Az eljárás gyorsítható, ha a felhasz­
bevenni). nálónak meg kell adnia az azonosítóját is, így nem kell az adatbázisban keresni,
Más gépek megkövetelik, hogy a felhasználó rendszeresen változtassa jelszavát, csak összehasonlítani.) A közvetlen vizuális felismerés még nem megoldott, de
ezzel is csökkentve a jelszó ellopása okozta kárt. Ennek legszélsőségesebb esete eljöhet annak is az ideje.
az egyszer használatos jelszó. Ekkor a felhasználó kap egy jelszavakat tartalm azó További technika az aláírás-elemzés. A felhasználó a term inálhoz kötött speciá­
listát. M inden bejelentkezéskor a listából a következő jelszót kell használnia. így lis tollal aláírja a nevét, amelyet a gép összevet a gépben tárolt változattal. Még
ha a behatoló felfedez egy jelszót, azzal nem megy semmire, m ert a következő al­ jobb módszert kapunk, ha nem az aláírásokat hasonlítjuk, hanem a gép az írás
kalommal másikat kell alkalmaznia. Javasolni kell persze a felhasználónak, hogy közben végzett tollmozgásokat hasonlítja. Egy jó utánzó le tudja másolni az alá­
ne veszítse el ezt a listát. írást, de nem ismeri a tollvonások sorrendjét.
Az m ajdnem kim aradt, hogy mialatt a jelszót gépeljük, a begépelt karakterek Az ujjhossz szerinti azonosítás meglepően praktikus. Ekkor minden terminálhoz
nem látszódhatnak a képernyőn, megvédve bennünket a term inál közelében les- tartozik egy olyan eszköz, mint amit az 5.23. ábra mutat. A felhasználó bedugja a
kelődő szemek elől. Kevésbé nyilvánvaló, hogy jelszót sohasem tárolhatunk - még kezét ebbe az eszközbe, az leméri az ujjak hosszát, és összeveti az adatbázisával.
titkosítottan sem - a számítógépen. Továbbá még a számítóközpont munkatársai Sorolhatnánk továbbá a bonyolult példákat, de a következő két lehetőség ér­
sem tárolhatják jelszavak titkosított példányait. Bárhol is tárolunk jelszavakat tit­ dekes szempontokat világít meg. Macskák és más állatok úgy jelölik ki territóriu-
kosított formában, az bajok forrása lehet.
A jelszavas azonosítás elképzelésének egyik változata az, amikor m inden új
felhasználótól bekérünk egy hosszú kérdés-felelet listát, amelyet titkosítottan tá­
rol a számítógép. A kérdéseket úgy kell megválasztani, hogy a felhasználónak ne
kelljen leírnia. Tipikus kérdések a következők lehetnek:

1. Ki M argit nővére?
2. Milyen utcában volt az általános iskolája?
3. Mit tanított Weöres tanár úr?

Bejelentkezéskor a rendszer véletlenszerűen választ egy kérdést a listából, és el­


lenőrzi a választ.
Egy másik változat az ún. kihívás-válasz. Ekkor a felhasználó választ egy algo­
ritmust, amikor megkapja az azonosítóját, példáulx 2. Bejelentkezéskor a rendszer
megjelenít egy argumentumot, például 7, amire a felhasználónak a 49 értéket kell
begépelnie. Az algoritmus különböző lehet reggel és este, a hét különböző nap­
jain, különböző term inálokról történő bejelentkezéskor, és így tovább.

5.23. ábra. Ujjhosszat mérő berendezés


554 5. FÁJLRENDSZEREK 5.5. VÉDELMI MECHANIZMUSOK 555

mukat, hogy a határát körbevizelik. A macskák kétségtelenül felismerik egymást a


vizeletükről. Képzeljük el, hogy valaki előáll egy kis eszközzel, amely vizeletet tud
5.5. Védelmi mechanizmusok
elemezni. Ez holtbiztos azonosítást tenne lehetővé. M inden term inált fel kellene Az előző alfejezetekben több potenciális biztonsági problém át tanulmányoztunk,
szerelni egy ilyen eszközzel és egy diszkrét felirattal: „Bejelentkezéshez legyen szí­ ezek egy része technikai, mások nem. A következő részekben azokra az operációs
ves ide mintát adni.” Ez teljesen feltörhetetlen rendszer lenne, de a felhasználók­ rendszerben használt részletes technikai módszerekre koncentrálunk, amelyekkel
kal valószínűleg nehezen lehetne elfogadtatni. fájlok és más erőforrások védhetők meg. M inden ilyen technika világosan különb­
Hasonló m ondható el arról a rendszerről is, amely egy rajzszegből és egy kis séget tesz az eljárásmód (mely adatok kik ellen védelmezendők) és a m echaniz­
spektrográfból állna. A felhasználónak bejelentkezéskor a hüvelykujját bele kelle­ mus között (hogyan valósítja meg a rendszer a védelmet). Az eljárásmód és a me­
ne nyomnia a rajzszegbe, hogy vérm intát vegyenek, amit a spektrográf elemezne. chanizmus elválasztásáról írt Sandhu (Sandhu, 1993). Nálunk a hangsúly a m echa­
Itt az a probléma, hogy m inden azonosítási m ódszernek a felhasználói közösség nizmuson van, és nem az eljárásmódon.
számára pszichológiailag elfogadhatónak kell lennie. Az ujjhossz m érése valószí­ Néhány rendszerben a védelmet egy program, az ún. referenciamonitor végzi.
nűleg nem ütközne problém ába, de még az a kevésbé tolakodó megoldás, mint az Valahányszor hozzáférést kezdeményeznek egy potenciálisan védelmezett erőfor­
ujjlenyomat számítógépes tárolása is, sok em ber számára elfogadhatatlan lehet. ráshoz, a rendszer megkéri a referenciam onitort, hogy ellenőrizze a jogosultságot.
A referenciam onitor táblázatokban keresve hozza meg a döntést. A továbbiakban
leírjuk azt a környezetet, amelyben a referenciam onitor működik.
Ellenintézkedések

A számítógépeket üzembe helyezők, akik komolyan veszik a biztonságot - néhá- 5.5.1. Védelmi tartományok
nyuk csak m iután m ár előfordult behatolás és jelentős károkat okozott -, gyakran
tesznek lépéseket a jogosulatlan belépés megnehezítése érdekében. Például min­ M inden számítógépes rendszer sok olyan objektum ot tartalmaz, amelyek védel­
den felhasználó csak m eghatározott terminálról, a hét m eghatározott napjain és met igényelnek. Ezek lehetnek hardver- (többek között processzorok, m em ória­
m eghatározott időben jelentkezhet be. szegmensek, lemezmeghajtók, nyomtatók), illetve szoftverobjektumok (többek
Telefonvonalon keresztül való bejelentkezés az alábbiak szerint működhet. között processzusok, fájlok, adatbázisok, szemaforok).
Bárki bejelentkezhet telefonvonalon, de a bejelentkezés után a rendszer azonnal M inden objektum nak egyedi neve van a rendszerben, amellyel hivatkozni lehet,
bontja a vonalat, és az előre megegyezett számon visszahívja a felhasználót. Ez és mindegyikhez tartozik egy véges sok műveletből álló halmaz, amelyeket a pro­
az intézkedés azt jelenti, hogy a behatoló nem próbálkozhat akármilyen telefon­ cesszusok az objektum on végrehajthatnak. Például a read és a write művelet fájlo­
számról, csak a felhasználó (otthoni) számáról tudna betörni. M inden esetben, kon működik, az up és down pedig szemaforokra vonatkozik.
akár van visszahívás, akár nincs, a rendszer legalább 10 m ásodpercet tölt a jelszó Nyilvánvaló, hogy szükség van olyan módszerre, amellyel megtiltható, hogy
ellenőrzésével, és ezt az időtartam ot m inden sikertelen próbálkozás után emel­ egy processzus hozzáférjen olyan objektumokhoz, amelyek elérésére nincs jogo­
nie kell, hogy csökkentse a behatoló próbálkozási lehetőségeit. H árom sikertelen sultsága. Továbbá az ilyen mechanizmusnak biztosítania kell, hogy igény esetén a
próbálkozás után a vonalat meg kell szakítani, és értesíteni kell a biztonsági szak­ processzusok által végezhető m űveleteket a legális műveletek egy részhalmazára
embert. korlátozzuk. Például egy A processzus jogosult olvasni az F fájlt, de nem jogosult
M inden bejelentkezést rögzíteni kell. Amikor egy felhasználó bejelentkezik, a írni.
rendszernek közölni kell azt, hogy m ikor és honnan jelentkezett be legutóbb, így A különböző védelmi mechanizmusok tárgyalásához hasznos bevezetni a tarto ­
az esetleges behatolást észreveheti. mány (domain) fogalmát. A tartomány (objektum, jogok) párosok halmaza. M in­
A következő m egteendő lépés csapda felállítása a behatoló elfogására. Az egy­
szerű séma a következő: speciális felhasználói azonosító egyszerű jelszóval (mint Tartományl Tartomány2 Tartomány3
a guest azonosító, guest jelszóval). Amikor bárki bejelentkezik ezen a néven, a
rendszer biztonsági specialistáját azonnal értesíteni kell. Az operációs rendszer­
ben a könnyen m egtalálható, a behatolók akció közbeni elfogására tervezett hibák Fájl3[R] f \Fájl6[RWX]
Fájl4[RWX] ( Nyomtatói [W ] )
is lehetnek csapdák. Alapm unka Stoll cikke (Stoll, 1989), amely leírja egy egyetem Fájl5[RW] V J Rajzgép2[W]^
számítógépébe betörő, katonai titkokat kereső kém elfogását.

5.24. ábra. Három védelmi tartomány


556 5. FÁJLRENDSZEREK 5.5. VÉDELMI MECHANIZMUSOK 557

den pár tartalm az egy objektum ot és egy rajta végezhető műveleteket tartalm azó Targy
halmazt. A jogok ebben az összefüggésben művelet-végrehajtási jogosultságot je ­ Nyom- Rajz- Tartó- Tartó- Tarto-
lentenek. Fájll Fájl2 Fájl3 Fájl4 Fájl5 Fájl6 tatól gép2 mányi mány2 mány3
Az 5.24. ábra három tartom ányt mutat, feltüntetve az objektum okat és a jo­
Olvasás
gokat: [Read, Write, eXecute] (Olvasás, írás, Végrehajtás). Vegyük észre, hogy 1 Olvasás
írás
Enter

a Printerl (Nyom tatói) objektum egyszerre két tartom ánynak is eleme. Bár ez a
példa nem mutatja, de lehetséges, hogy ugyanaz az objektum több különböző tar­ -ra Olvasás
E Olvasás
tomány eleme legyen, mindegyikben különböző jogokkal. 2 2 Olvasás írás, Vég­
írás
írás
m rehajtás
M inden processzus m inden egyes időpillanatban m eghatározott védelmi tarto­
Olvasás
mányban fut. Más szóval, m eghatározott objektum okat érhet el, és m inden objek­
3 írás, Vég­ írás írás
tum ra m eghatározott jogokkal rendelkezik. A processzusok futás közben átvált­ rehajtás
hatnak egyik tartom ányról egy másikra. A tartományváltoztatás szabályai erősen
rendszerfüggők.
A védelmi tartom ány fogalmának konkrétabb kifejtése végett tekintsük a Unix- 5.26. ábra. Védelmi mátrix, ahol a tartományok is objektumok
rendszert. Minden Unix-processzus tartom ányát egyértelműen m eghatározza a
hozzá tartozó uid (felhasználóazonosító) és gid (csoportazonosító). M inden adott Olyan program futtatása, amely SETU ID vagy SETG ID beállítású, szintén tarto ­
(uid, gid) párra egyértelműen m eghatározható mindazon objektum ok halmaza mányváltást jelent, m ert jogosultságai megváltoznak.
(fájlok, beleértve az I/O-eszközöket is, amelyeket speciális fájlok reprezentálnak), Fontos kérdés, hogy miként tudja a rendszer nyilvántartani, hogy mely objek­
amelyeket a processzus elérhet, és az is, hogy az objektum elérhető-e írásra, olva­ tum ok milyen tartom ányban vannak. Fogalmi szinten elképzelhetünk egy hatal­
sásra és végrehajtásra. Bármely két processzus ugyanazon (uid, gid) értékkel pon­ mas mátrixot, amelynek sorai a tartom ányok és oszlopai az objektumok. A mátrix
tosan ugyanazon objektum okat érheti el. Különböző (uid, gid) párral rendelkező adott eleme tartalmazza azokat a jogokat, amelyekkel a tartom ányban az objek­
processzusok által elérhető fájlok halmaza különböző lesz, bár a legtöbb esetben tum rendelkezik. Az 5.24. ábrán adott tartom ányok mátrixos ábrázolását m utatja
jelentős átfedés van. az 5.25. ábra. H a adott egy ilyen mátrix és az aktuális tartom ány sorszáma, akkor a
Továbbá m inden Unix-processzus két részből áll: a felhasználói és a kernelrészből. rendszer el tudja dönteni, hogy egy adott objektum elérése megengedett-e.
Amikor egy processzus rendszerhívást végez, akkor a felhasználói részről átvált a A tartományváltás szintén beilleszthető a mátrixmodellbe, m ert vegyük észre,
kernelrészre. A kernelrész más objektumokhoz férhet hozzá, mint a felhasználói hogy a tartom ány is tekinthető objektumnak, amelyen az enter (belépés) művelet
rész. A kernelrész hozzáférhet például a fizikai m em ória minden lapjához, a teljes értelm ezett. Az 5.26. ábra csak abban különbözik az 5.25. ábrával adott mátrix­
lem ezterülethez és m inden más védett erőforráshoz. Tehát a rendszerhívások tar­ tól, hogy itt feltüntettük a három tartom ányobjektum ot is. Az 1. tartománybeli
tományváltást eredményeznek. processzusok átválthatnak a 2. tartományba, de ha m ár ott vannak, nem m ehet­
Amikor egy processzus exec m űveletet hajt végre egy fájlon, aminek SETUID nek vissza. Ez a szituáció modellezi a Unix SETU ID-program ok végrehajtását is.
vagy SETGID bitje be van állítva, új tényleges uid vagy gid értékre tesz szert. Példánkban más tartományváltoztatás nem megengedett.

Tárgy
Fáj 11 Fáj 12 Fájl3 Fájl4 Fáj 15 Fájló Nyomtatói Rajzgép2 5.5.2. Hozzáférést vezérlő listák
Olvasás A gyakorlatban alig fordul elő, hogy az 5.26. ábrán bem utatott védelmi mátrixot
Olvasás
írás ténylegesen tárolnák, mivel az nagy és ritka. A legtöbb tartom ánynak az objektu­
Olvasás
mok többségéhez egyáltalán nincs elérési joga, tehát nagyon nagy, majdnem üres
írás, Vég­ Olvasás írás mátrix tárolása tárterület-pazarlást jelentene. Két praktikus módszer kínálkozik:
Olvasás
rehajtás írás tároljuk a mátrix sorait vagy oszlopait úgy, hogy csak a nem üres elemet tároljuk
Olvasás ténylegesen. Ebben a szakaszban az oszlop szerinti tárolást vizsgáljuk, a követke­
írás. Vég­ írás írás zőben pedig a sor szerintit.
rehajtás Az első technika abból áll, hogy m inden objektumhoz hozzárendelünk egy (ren­
dezett) listát; ez azokat a tartom ányokat tartalmazza, amelyek az adott objektu­
5.25. ábra. Védelmi mátrix m ot elérhetik (az elérési móddal együtt). Az ilyen listát hozzáférést vezérlő listá-
558 5. FÁJLRENDSZEREK 5.5. VÉDELMI MECHANIZMUSOK 559

Fájl Hozzáférést vezérlő lista


Password tana, sysadm: RW
Pigeon_data bili, pigfan: RW.tana, pigfan: RW;...
Felhasználói
szint 5.28. ábra. Két hozzáférést vezérlő lista

repelhetnek HVL-ben. A csoportok szemantikájának két változata lehet. Egyes


rendszerekben m inden processzusnak van felhasználói azonosítója (U ID ) és cso­
portazonosítója (GID). Ilyen rendszerekben egy HVL-elem a következőképpen
Kernel- nézhet ki:
szint
UID1, GID1: jog 1; UID2, GID2: jog2;...

Ilyen feltételek mellett egy objektum ra vonatkozó hozzáférési kérés esetén ellen­
5.27. ábra. Hozzáférést vezérlő lista használata őrzik a hívó U ID -jét és GID -jét. H a szerepelnek a HVL-listában, akkor az ott fel­
sorolt jogokat megkapja. H a a (U ID , G ID ) pár nem szerepel a listában, akkor a
nak hívják, rövidítve HVL, és az 5.27. ábra szemlélteti. Ezen három tartom ányt hozzáférést megtagadják.
látunk, A , B és C, és három fájlt, F I, F2 és F3. Az egyszerűség kedvéért feltéte­ A csoportok ilyen m ódon való használata ténylegesen a szerep fogalmának a
lezzük, hogy a három tartom ány egy-egy felhasználóhoz tartozik; ezek A , B és C. bevezetését eredményezi. Tekintsünk egy rendszert, amelyben Tana rendszer-ad-
A biztonsági irodalom ban a felhasználókat gyakran alanyoknak vagy megbízónak minisztrátor, és így szerepel a sysadm csoportban. Továbbá képzeljük el, hogy a
nevezik, hogy megkülönböztessék azoktól a dolgoktól, amelyeknek tulajdonosai; vállalat klubokat m űködtet alkalmazottai számára, és Tana tagja a galambászok
vagyis az objektumoktól, mint például a fájlok. klubjának. A klubtagok a pigfan csoportba tartoznak, és hozzáférhetnek a galam­
Minden fájlhoz tartozik egy HVL. Az F I fájl listájában két elem van (pontos- bok adatait tartalm azó adatbázishoz. A H V L egy része az 5.28. ábrán látható ké­
vesszővel elválasztva). Az első elem azt mondja, hogy m inden processzus, amely­ pet m utathat.
nek tulajdonosa az A felhasználó, olvashatja és írhatja a fájlt. A második szerint H a Tana hozzáférést kezdeményez valamelyik fájlhoz, akkor a kimenetel attól
m inden processzus, amelynek tulajdonosa a B felhasználó, olvashatja a fájlt. Ezen függ, hogy melyik csoportba van éppen bejelentkezve. Bejelentkezéskor a rend­
felhasználók m inden más hozzáférése és m inden más felhasználó akármilyen hoz­ szer m egkérdezheti, hogy melyik csoportba kíván belépni, vagy két különböző
záférése tiltott. Megjegyzendő, hogy a jogosultságokat a felhasználó adja meg, felhasználói azonosító/jelszó lehet a m egkülönböztetésre. A sémának az a célja,
nem a processzus. A védelmi rendszer szerint m inden A tulajdonában lévő pro­ hogy Tana ne férhessen hozzá a password fájlhoz, ha galambászsapka van rajta.
cesszus olvashatja és írhatja az F I fájlt. Nem számít, hány van, egy vagy akár 1000. Ezt csak akkor teheti meg, ha adm inisztrátorként jelentkezett be.
A felhasználó, és nem a processzus azonosítója számít. Bizonyos esetekben a felhasználó hozzáférhet adott fájlhoz, függetlenül at­
Az F2 fájl listájában három elem van: A , B és C mindegyike olvashatja, és a B tól, hogy melyik csoportba jelentkezett be. Ezek az esetek a helyettesítőjel be­
ezenfelül írhatja is. Más hozzáférés nem megengedett. Az F3 fájl nyilvánvalóan vezetésével kezelhetők, amelynek jelentése: mindenki. Például az alábbi elem a
végrehajtható program, B és C mindegyike olvashatja és végrehajthatja, B pedig password fájl esetén azt jelenti, hogy Tana hozzáférhet, függetlenül attól, hogy
írhatja is. melyik csoportba van bejelentkezve.
Ez a példa a HV L által megvalósítható védelmi mechanizmus legalapvetőbb
formáját mutatja. A gyakorlatban sokszor jóval kifinomultabb rendszereket alkal­ tana, *: RW
maznak. Kezdésként mi csak három jogosultságot vettünk: olvasás, írás és végre­
hajtás. Lehetnek más pótlólagos jogok is. Ezek egy része generikus, vagyis m inden Egy másik lehetőség az, hogy a felhasználó megkapja a jogot, ha van olyan
objektum ra érvényes, más részük objektumspecifikus. A generikusra példa a tör- csoport, amelyre a jog biztosítva van, és a felhasználó tagja ennek a csoportnak.
lés- és a másolásjog. Ezek minden objektum ra alkalmazhatók, típusuktól függetle­ Ebben az esetben a több csoportba is tartozó felhasználónak nem kell megadnia,
nül. Objektumspecifikus jog például üzenet hozzáadása a levelesládához, könyvtá­ hogy melyik csoportba jelentkezik be. Mindegyik m inden időpontban érvényes.
ri objektum tartalm ának ábécé szerinti rendezése. Ennek a hátránya, hogy kisebb zártságot biztosít: Tana szerkesztheti a password
Mindeddig a vizsgált HVL-elem ek csak felhasználókhoz tartoztak. Sok rend­ fájlt a galambásztalálkozó során.
szer alkalmazza a felhasználói csoport fogalmát. A csoportoknak van neve és sze-
560 5. FÁJLRENDSZEREK 5.5. VÉDELMI MECHANIZMUSOK 561

A csoportok és a helyettesítőjel együtt biztosítják fájlok hozzáférésének szelek­


tív blokkolását. Például a

virgil, *: (nőne); *, *: RW Felhasználói


szint
Virgil kivételével mindenkinek olvasási és írási jogot ad a fájlra. Ez azért működik,
m ert a bejegyzést balról jobbra szekvenciálisán értelmezik, és az első illeszkedő
tagot alkalmazzák, a továbbiakat nem is vizsgálják. Virgil esetén az első tag illesz­
kedik, és a talált jog, most a (nőne) alkalmazódik. A keresés itt befejeződik. Azt,
hogy a továbbiak szerint mindenki jogot kapna, nem is vizsgáljuk. >Kernel­
Egy másik módszer az lehet, hogy a H V L elemei nem (U ID , G ID ) párokat tar­ szint
talmaznak, hanem vagy UID, vagy G ID elemeket. Például a pigeon._d.ata fájlhoz
az alábbi elem tartozna:

debbie: RW; phil: RW; pigfan: RW 5.29. ábra. Képességek használata esetén minden processzusnak van képességi listája

ami azt jelenti, hogy Debbie, Phil és a pigfan csoport m inden tagja olvashatja és rát, ún. cím kézetarchitektúrát igényel, ahol m inden m emóriabeli szónak van egy
írhatja a fájlt. extra bitje (címke), amely megmondja, hogy az képességet tartalmaz-e. A címke
Előfordul, hogy egy felhasználó vagy csoport rendelkezik bizonyos jogokkal bit nem használatos az aritmetikai, összehasonlító és egyéb közönséges művele­
egy fájlhoz, de később a fájl tulajdonosa vissza akarja vonni a jogot. Hozzáférést tekben, és nem m ódosítható, csak kernel m ódban futó program (vagyis az ope­
vezérlő listák esetén viszonylag egyszerű a jog visszavonása. Nem kell mást tenni, rációs rendszer) által. Ténylegesen építettek címkézett architektúrájú gépeket,
mint szövegszerkesztővel átírni a megfelelő HVL-elem et. Azonban ha a fájl meg­ amelyek igen jól m űködnek (Feustal, 1972). Az IBM AS/400 gép az egyik népsze­
nyitott állapotban volt a módosításkor, akkor a megváltozott jogok csak a követ­ rű példa erre.
kező megnyitáskor érvényesülnek. M inden megnyitott fájl esetén azok a jogok A második módszer az, amikor a C-listát az operációs rendszer területén tá­
érvényesek, amelyekkel a megnyitáskor rendelkezett, még akkor is, ha azután a rolják, és a processzusok csak a pozíciójukkal hivatkozhatnak a képességre. Egy
felhasználó egyáltalán nem jogosult a fájl elérésére. processzus mondhatja, hogy „kérem 1 KB beolvasását a 2. képesség által m utatott
fájlból”. Ez a címzési mód hasonló a Unix által használt fájlleíróhoz. A Hydra-
(Wulf et al., 1974) rendszer így m űködött.
5.5.3. Képességi listák A harmadik módszer szerint a C-listát a felhasználó területén tárolják, de titko­
sítva, így a felhasználó nem ronthatja el. Ez a módszer különösen alkalmas elosz­
Az 5.26. ábrán látható védelmi mátrix felszeletelésének másik módja a soronkénti sze­ tott rendszerekben, és a következőképpen működik. Amikor a kliensprocesszus
letelés. Ennél a módszernél minden processzushoz tartozik egy lista, amely azokat az kérést küld a távoli kiszolgálónak, például egy fájlszervernek, hogy hozzon létre
objektumokat és a megfelelő hozzáférési jogokat tartalmazza, amelyeket a processzus számára egy objektumot, a kiszolgáló létrehozza az objektumot, és generál egy
elérhet, más szóval az adott processzus tartományát. Ezt képességi listának vagy nagy véletlen számot, az ellenőrző mezőt. A kiszolgáló fájl táblázatában lefogla-
C-listának nevezik, és az egyes elemeket a listán képességeknek hívják (Dennis és Van lódik egy cella az objektum számára, ahol tárolja az ellenőrző mező értékét, a le­
Horn, 1966; Fabry, 1974). Három processzus képességi listája látható az 5.29. ábrán. mezblokkok címét és még egyebeket. Unix-terminológiát használva, az ellenőrző
Minden képesség a tulajdonosnak valamilyen jogot biztosít valamely objektumra. mező értékét a fájl i-csomópontjában tárolja a kiszolgáló. Ezt nem küldi vissza a
Az 5.29. ábra szerint például az A processzus tulajdonosa olvasási joggal rendelke­ felhasználónak, és sohasem adja ki a hálózatra. Ezután a kiszolgáló a felhasználó
zik az F I és F2 fájlokra. Egy képesség általában egy fájl (vagy még általánosabban számára az 5.30. ábrán látható formájú képességet hoz létre. A felhasználóhoz
egy objektum) azonosítóját és a hozzá rendelt jogok bittérképét tartalmazza. Unix- visszaküldött képesség tartalmazza a kiszolgáló azonosítóját, az objektum azono­
rendszerekben a fájlazonosító valószínűleg az i-csomópont sorszáma lenne. A ké­ sítóját (a kiszolgáló táblázatbeli indexét, alapvetően az i-csomópont sorszámát)
pességi listák maguk is objektumok, ezért más képességi listák hivatkozhatnak rá­ és a jogosultságok bittérképét. Frissen létrehozott objektum minden jogosultsági
juk, ezzel lehetővé válik résztartományok megosztása. bitje 1-re van állítva. Az utolsó mező tartalm a egy olyan/egyértelm ű függvény ér­
Teljesen nyilvánvaló, hogy a képességi listákat meg kell védeni a felhasználóktól. téke az objektum, jogok és az ellenőrző mező argum entum okra alkalmazva, amely
A védelemre három módszer ismert. Az első módszer speciális hardverarchitektú-
562 5. FÁJLRENDSZEREK 5.5. VÉDELMI MECHANIZMUSOK 563

sőbb egy közvetett objektum képességét kapja a rendszer, a felhasználó felfedez­


Szerver Objektum Jogok f(Objektum, Jogok, Ellenőrzés) heti, hogy a közvetett objektum most null objektum ra m utat.)
Az Am oeba séma esetén egyszerű a visszavonás. Csak annyit kell tenni, hogy
megváltoztatjuk az objektum ban az ellenőrző mező értékét. Egy csapásra minden
5.30. ábra. Titkosítással védett képesség képességet érvényteleníthetünk. Azonban egyik séma sem teszi lehetővé a szelek­
tív visszavonást, például csak John jogosultságait, de senki másét nem. Ez a prob­
függvény kriptográfiailag biztos. Korábban tárgyaltuk az ilyen tulajdonságú függ­ léma valamennyi képességi rendszerben fennáll.
vényeket. Egy másik problém a annak biztosítása, hogy egy képesség jogos tulajdonosa ne
Am ikor a felhasználó objektum elérést kezdeményez, a kérés részeként elküldi tudja 1000 példányban továbbadni azt barátainak. Kernel által kezelt képességek
a képességet a kiszolgálónak. A kiszolgáló kiolvassa ebből az objektum táblabeli esetén, mint a Hydra-rendszerben ez megoldható, de a megoldás nem működik
indexét, így találja meg az objektumot. Ezután kiszámítja az /(objektum , jogok, el­ osztott rendszerekben, mint az Amoeba.
lenőrző) értéket, az első két argum entum ot a kérésben találja, a harm adikat pedig M ásrészt a képességekkel nagyon elegánsan megoldható mobil kódok szepa­
a saját táblázatában. H a ez az érték megegyezik a képességben lévő negyedik pa­ rálása. Külső program indításakor olyan képességi listát kap, amely csak azokat
ram éterrel, akkor az igényt engedélyezi, egyébként elutasítja. H a egy felhasználó a képességeket tartalmazza, amelyeket a számítógép tulajdonosa adni akar, mint
megpróbálja felhasználni más felhasználó objektum át, akkor nem tudja helyesen például írási jog a képernyőre, olvasási és írási jog csak a program számára létre­
előállítani a negyedik mező értékét, m ert nem tudja az ellenőrző értéket, így a ké­ hozott könyvtárra. Amikor egy mobil kód processzusa elindul csak ezekkel a kor­
rését elutasítják. látozott képességekkel, akkor nem tud más rendszererőforrásokat igénybe venni,
A felhasználó kérhet a kiszolgálótól gyengébb képességet is, például csak olva­ és így ténylegesen korlátozva van a könyvtárára, anélkül hogy a kódot módosítani
sási jogot. A kiszolgáló először ellenőrzi, hogy a képesség érvényes-e. A ztán kiszá­ kellene, vagy interpreterrel kellene végrehajtani. Program futtatása a lehető leg­
mítja az / (objektum, újjo g o k , ellenőrző) értéket, és tárolja a negyedik mezőben. kevesebb jogosultsággal - ez a legkevesebb privilégium elveként ismert és haté­
Vegyük észre, hogy az ellenőrző érték ugyanaz, m ert más fontos képességek ettől kony irányelv biztonságos rendszerek megvalósításakor.
függnek. Röviden összefoglalva, a HVL és a képességek módszer bizonyos értelem ben
Ezt az új képességet küldi vissza a kiszolgáló a processzusnak. A felhasználó egymás ellentétjei. A képességek nagyon hatékonyak, m ert ha egy processzus azt
odaadhatja ezt egy barátjának, egyszerűen elküldi neki levélben. H a a barát a jo- mondja, hogy „nyisd meg a 3. képesség által m utatott fájlt”, akkor semmilyen el­
gosultság-bitvektorban átállít 1-re olyan bitet, amely 0 volt, akkor a kiszolgáló ezt lenőrzést nem kell végezni. H V L esetén (lehet, hogy hosszú) keresést kell vég­
ki tudja deríteni, m ert az/függvény értéke nem fog egyezni. Mivel a barát nem rehajtani a listában. H a csoportokat nem alkalmaznak, akkor egy mindenki által
ismeri az ellenőrző értéket, ezért nem tud előállítani olyan képességet, amely olvasható fájlhoz fel kell venni a listába az összes felhasználót. A képességek le­
megfelelne a megváltoztatott biteknek. Ezt a módszert az Am oeba-rendszerben hetővé teszik egy processzus elszeparálását, de a HV L nem. Másrészről a HVL
fejlesztették ki, és intenzíven használták (Tanenbaum, 1990). lehetővé teszi jogok szelektív visszavonását, de a képességek nem. Végül ha egy
A specifikus objektumfüggő jogok mellett, mint az olvasás, végrehajtás a objektum ot törlünk, de a képességet nem, vagy ha a képességet töröljük, de az ob­
(kernel által és kriptográfiailag is védett) joga, vannak generikus jogok is, amelyek jektum ot nem, akkor problém a keletkezik. A H V L esetén nincs ilyen probléma.
m inden objektum ra alkalmazhatók. Példák generikus jogokra:

1. Képesség másolása: új képesség létrehozása az adott objektumhoz. 5.5.4. Rejtett csatornák


2. Objektum másolása: objektum másolatának létrehozása új képességgel.
3. Képesség törlése: képesség törlése a C-listából, de az objektum nem változik. Még hozzáférést vezérlő lista és képességi lista alkalmazása esetén is lehetnek ré­
4. Objektum törlése: objektum végleges eltávolítása a képességgel együtt. sek a biztonsági rendszerben. Ebben a részben azt vizsgáljuk, hogyan szivároghat
ki információ a rendszerből még akkor is, ha szigorúan bebizonyították, hogy m a­
Érdem es megjegyezni a képességi rendszerekkel kapcsolatban, hogy hozzáféré­ tematikailag lehetetlen a szivárgás. Az ötlet Lam psontól (Lampson, 1973) szár­
si jog visszavonása meglehetősen bonyolult kernel módban. A rendszer számára mazik.
nagyon nehéz megkeresni egy objektum képességeit a C-listákban, m ert azok a Lampson eredeti modelljét egyetlen időosztásos rendszerre fogalmazta meg, de
lemezen szétszórtan helyezkednek el. Az egyik lehetséges megközelítés az, hogy az ötlet adaptálható lokális hálózatokra és más, többfelhasználós rendszerekre is.
a képességek nem az objektum ra m utatnak, hanem egy közvetett objektumra. A legegyszerűbb formájában három processzus fut ugyanazon a védett gépen.
Mivel az a mutató, amely a közvetett objektumról a tényleges objektum ra mutat, Az első processzus, a kliens m unkára fogja a második processzust, a szervert.
megszüntethető, ezáltal a rendszer érvénytelenítheti a képességet. (Amikor ké­ A kliens és a szerver nem bízik teljesen egymásban. Például a szerver feladata az,
564 5. F Á JL R E N D S Z E R E K 5.5. V É D E L M I M E C H A N IZ M U S O K 565

Kliens Szerver Együttműködő Körbefogott szerver

L J L J L

Kernel
Rejtett

se—Ö o o o o o o o
csatorna

(a)

Idő — ►
5.31. ábra. (a) A kliens, szerverés az együttműködő processzusok, (b) A körbefogott szerver
rejtett csatornákon keresztül mégis tud adatokatjuttatni az együttműködőnek 5.32. ábra. Rejtett csatorna megvalósítása fájlzárolással

hogy segítse a klienst adóbevallás kitöltésében. A kliens aggódik, hogy a szerver ti­ hogy nincs olyan védelmi modell, amely m egvédhetne az ilyen problémáktól, ha a
tokban eltárolja pénzügyi adatait, titkos listát készít arról, hogy ki menyit keresett, rendszer a védelmi tartom ány elvén alapszik.
amit később elad. A szerver pedig attól tart, hogy a kliens ellopja az adóbevallást A CPU-terhelés modulálása nem az egyetlen lehetőség rejtett csatorna meg­
kezelő programot. valósítására. A lapozási arány szintén modulálható (gyakori lapozás 1-et jelent,
A harmadik processzus az együttműködő, amelyik konspirál a szerverrel, hogy ritkán lapozás 0-t). Ténylegesen a rendszer minden időzített teljesítmény csök­
az tényleg ellopja a kliens bizalmas adatait. A szerver és az együttműködő tu­ kentési módszere rejtett csatorna lehet. H a az operációs rendszer biztosít valami­
lajdonosa tipikusan ugyanaz a felhasználó. Ezt a három processzust m utatja az lyen mechanizmust fájlok zárolására, akkor a szerver valamely fájlt zárolva 1-et
5.31. ábra. Ennek a gyakorlatnak az a célja, hogy olyan rendszert tervezzünk, tud küldeni, a zárolást felszabadítva pedig 0-t. Néhány rendszerben megengedett,
amely lehetetlenné teszi, hogy a szerver jogosulatlanul átadja az együttműködő­ hogy egy processzus olyan fájl zároltsági állapotát is le tudja kérdezni, amelyhez
nek azokat az adatokat, amelyeket legitim módon kapott a klienstől. Lampson ezt egyébként nincs hozzáférése. Ezt a rejtett csatornát szemlélteti az 5.32. ábra, ahol
bezárás (confinement) problémának nevezi. egy fájlt zárolnak és elengednek valamely rögzített időtartam ra, amelyet ismer a
A rendszer tervezése szempontjából az a cél, hogy körbevegyük vagy bezárjuk a szerver és az együttműködő is. Ebben a példában az 11010100 titkos bitsorozatot
szervert úgy, hogy ne tudjon átadni információt az együttműködőnek. A védelmi továbbítja a szerver.
mátrix sémát használva könnyen garantálni tudjuk, hogy a szerver ne tudjon kom­ A dott S fájl zárolása és elengedése nem különösebben zajos csatorna, de na­
munikálni az együttműködővel úgy, hogy az ír olyan fájlba, amelyet az együttmű­ gyon pontos időzítést igényel, hacsak nem nagyon alacsony a bitarány. A megbíz­
ködő elolvashat. Valószínűleg azt is tudjuk biztosítani, hogy a szerver és az együtt­ hatóság és a hatékonyság még tovább növelhető nyugtázó protokoll használatával.
működő a rendszertaszkok közötti kommunikációs mechanizmusát felhasználva Ez a protokoll két további, F I és F2 fájlt használ, amelyeket a szerver, illetve a
se tudjon kommunikálni. közrem űködő zárol, hogy szinkronizálja a két processzust. M iután a szerver zárol­
Sajnos létrehozhatók körm önfontabb kommunikációs csatornák is. Például a ja az S fájlt, az F I fájl zároltságát ellentétesre változtatja, ezzel jelzi, hogy egy bitet
szerver bitsorozattal a következő m ódon tud információt cserélni: 1-es bit küldése küldött. Közvetlenül azután, hogy az együttműködő elolvasta a bitet, F2 fájl zá­
végett olyan keményen dolgozik, ahogy csak tud egy adott időtartamig; 0-s bit kül­ roltságát ellentétesre változtatja, ezzel jelzi a szervernek, hogy készen áll újabb bit
dése végett pedig ugyanennyi ideig alszik. fogadására, és várakozik addig, amíg az F I zároltsága ellentétesre változik, tehát
Az együttműködő m egpróbálhatja úgy kideríteni, hogy mit küld a szerver, hogy újabb bitet olvashat. Mivel ebben a sémában időzítés nem szerepel, ezért a proto­
körültekintően figyeli a válaszidőket. Á ltalában kisebb lesz a válaszidő, ha a szer­ koll teljesen megbízható még leterhelt rendszerben is, és gyorsaságát a processzu­
ver 0-t küld, és nagyobb (keményen dolgozik), ha 1-et küld. Ez a kommunikációs sok prioritása határozza meg. A sávszélesség növelésére használhatunk akár két
lehetőség rejtett csatornaként ismert, és az 5.31.(b) ábra illusztrálja. fájlt, avagy bájtszéles csatornát nyolc jelzőfájllal, S 0 , ..., S7.
Természetesen a rejtett csatorna zajos, sok idegen információt is tartalm azhat, Dedikált eszköz (szalagegység, plotter stb.) lefoglalása és felszabadítása szintén
de m egbízhatóan is lehet kommunikálni zajos csatornákon hibajavító kódot hasz­ használható üzenetküldésre. A szerver lefoglalja az eszközt 1-es bit küldése vé­
nálva (úgymint Hamming-kód vagy még kifinomultabb módszerek). Hibajavító gett, és felszabadítja, ha 0-s bitet akar küldeni. Unixban a szerver létrehozhat egy
kód használata csökkenti a rejtett csatorna amúgy is szűk sávszélességét, de még fájlt 1-es bit jelzése végett, és törölheti 0-s bit jelzése érdekében; az együttműködő
így is tekintélyes mennyiségű információ áram oltatható ki. Teljesen nyilvánvaló, az access rendszerhívást használhatja a fájl létezésének kiderítésére. Ez a módszer
566 5. F Á JL R E N D S Z E R E K 5.6. A M IN IX 3 F Á JL R E N D S Z E R E 567

akkor is működik, ha az együttműködőnek nincs hozzáférési joga a fájlhoz. Sajnos kát, a fájlleírókat, a fájlokhoz való hozzáférés letiltását, valamint a speciális fájlokat
sok más rejtett csatorna is lehetséges. (és adatcsöveket). Ezek megismerése után egy egyszerű példán keresztül bem utat­
Lampson egy másik módszert is említ a szerverprocesszus tulajdonosa számá­ juk, hogyan lehet a darabokat összeilleszteni; nyomon követjük, mi is történik való­
ra történő információ kiszivárogtatására. Tegyük fel, hogy a szerverprocesszus fel jában, amikor egy felhasználói processzus a read rendszerhívást hajtja végre.
van jogosítva arra, hogy számlázás végett megmondja a kliensnek, mennyi m unkát
végzett számára. H a a számla tényleges értéke mondjuk 100 dollár, és a kliens be­
vétele, amelyet ki akar szivárogtatni, 53 ezer dollár, akkor a szerverszámla érték­ 5.6.1. Üzenetek
ként 100,53 dollár adatot közölhet a tulajdonosnak.
Az összes rejtett csatorna kiderítése rendkívül nehéz feladat. A gyakorlatban A fájlrendszer 39 végrehajtást kérő üzenettípust fogad el. Kettő kivételével ezek
nagyon keveset lehet tenni. Nem vonzó az olyan javaslat, amely véletlenszerű la- mindegyike M INIX 3-rendszerhívás. A két kivétel olyan üzenetet jelent, amelyeket
pozási hibát előállító processzust m űködtetne, vagy más módon csökkentené a a M INIX 3 más részei állítanak elő. A rendszerhívás-üzenetek közül 31 felhasz­
rendszer teljesítményét, hogy csökkentse a rejtett csatorna sávszélességét. nálói processzus eredm ényeként keletkezik. H at rendszerhívás-üzenet olyan rend­
szerhívásokra szolgál, amelyeket először a memóriakezelő vizsgál; ez ezután meg­
hívja a fájlrendszert, hogy elvégeztesse azzal a munka egy részét. Két másik üzene­
tet szintén a fájlrendszer dolgoz fel. Az üzeneteket az 5.33. ábrán mutatjuk be.
5.6. A MINIX 3 fájlrendszere A fájlrendszer szerkezete alapvetően megegyezik a memóriakezelő, illetve az
összes beviteli-kiviteli (I/O) feladat szerkezetével. Tartalmaz egy főciklust, amely
M int bármely más fájlrendszernek, a M INIX 3 fájlrendszerének is el kell látnia arra vár, hogy valamilyen üzenet érkezzen. Az üzenet megérkezése után megálla­
m indazokat a feladatokat, amelyeket az előbbiekben tanulmányoztunk. Az állo­ pítja annak típusát, amelyet a későbbiekben abban a táblában való keresésre hasz­
mányok számára helyet kell lefoglalnia, illetve felszabadítania, nyomon kell követ­ nál, amely az összes típust kezelő fájlrendszer eljárásainak m utatóit tartalmazza.
nie a lemez blokkjait és a szabad területeket, biztosítania kell néhány módozatot Mindezek után meghívja a megfelelő eljárást, amely feladatának elvégzése után
az állományok jogosulatlan felhasználás elleni védelmére, és így tovább. E fejezet egy állapotértéket küld vissza. Ezt követően a fájlrendszer választ küld a hívónak,
további részében közelebbről is megvizsgáljuk a M INIX 3-at, hogy lássuk, hogyan visszamegy a ciklus elejére, és várja a következő üzenetet.
is éri el ezeket a célokat.
Jelen fejezet első részében, az általánosság kedvéért, folyamatosan a Unixra Felhasználói Inputparaméterek Válaszérték
utaltunk a M INIX 3 helyett, bár a kettő külső csatolófelülete gyakorlatilag meg­ üzenetek
egyezik. M ostantól a M INIX 3 belső felépítésére fektetjük a hangsúlyt. A Unix access Fájlnév, hozzáférés módja Állapot
belső felépítésével kapcsolatos információ a következő helyeken található meg: chdir Új munkakönyvtár neve Állapot
(Thompson, 1978; Bach, 1987; Lions, 1996; és Vahalia, 1996). chmod Fájlnév, új jogosultsági mód Állapot
A M INIX 3 fájlrendszere egy hatalmas C program, amely a felhasználói terüle­ chown Fájlnév, új tulajdonos, csoport Állapot
ten fut (lásd 2.29. ábra). A felhasználói processzusok a fájlok írásakor és olvasása­ chroot Új gyökérkönyvtár neve Állapot
kor üzeneteket küldenek a fájlrendszer számára. Ezáltal közlik, hogy mit is akar­ close Bezárandó fájl fájlleírója Állapot
nak elvégeztetni. A fájlrendszer elvégzi a feladatot, majd visszajelez. A fájlrend­ create Létrehozandó fájl neve, védelmi kódja Fájlleíró
szer valójában egy hálózati állománykiszolgáló, amely történetesen ugyanazon a dup Fájlleíró (DUP2 esetén 2 fájlleíró) Új fájlleíró
gépen fut, mint a hívó. fenti Fájlleíró, funkciókód, egyéb operandusz Kéréstől függ
Ennek a konstrukciónak van néhány fontos következménye. Egyrészt a fájl- fstat Fájlnév, átmeneti adattár Állapot
rendszert a M INIX 3 egyéb részeitől m ajdnem teljesen függetlenül lehet mó­ ioctl Fájlleíró, funkciókód, egyéb operandusz Állapot
dosítani, tesztelni és kísérletezni vele. Másrészt az egész állományrendszer egy­ link Fájlnév, amelyhez csatolunk; fájlnév, amelyet csatolunk Állapot
szerűen telepíthető m inden olyan számítógépre, amely rendelkezik C fordítóval, lseek Fájlleíró, eltolás, honnan Új fájlpozíció
ott lefordítható, és ezután úgy használható, mint egy különálló Unix-szerű távoli mkdir Fájlnév, jogosultsági mód Állapot
állománykiszolgáló. Mindössze az üzenetek küldését és fogadását illetően kell vál­ mknod Könyvtár vagy speciális fájl neve, jogosultsági mód, Állapot
toztatásokat eszközölnünk, mivel ez rendszerről rendszerre változik. cím
A következő részekben áttekintést adunk a fájlrendszer-felépítés számos kulcs-
területéről. Megvizsgáljuk az üzeneteket, a fájlrendszer szerkezetét, a bittér­ 5.33. ábra. A fájlrendszer üzenetei. A fájlnév paraméter mindig a nevet kijelölő mutatótjelenti.
képeket, az i-csomópontokat, a blokkgyorsítótárakat, a könyvtárakat és elérési uta- Az állapotjelentése mindig OK vagy HIBÁS
568 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 569

Felhasználói Inputparaméterek Válaszérték Indító- Szuperblokk


üzenetek blokk
mount Speciális fájl, felcsatolási pont, csak olvasható állapot Állapot l-csomópontok Egy lemezblokk
jelzője
open Megnyitandó fájl neve, írható/olvasható állapot Fájlleíró
jelzője
pipe Két fájlleírót kijelölő mutató (módosított) Állapot 7 \ Adat
l-csomópont Zóna­
read Fájlleíró, átmeneti adattár, bájtok száma Beolvasott bájtok sz. bittérkép bittérkép
rename Fájlnév, fájlnév Állapot
rmdir Fájlnév Állapot 5.34. ábra. Hajlékonylemez vagy kisméretű merevlemez partíciójának elrendezése
stat Fájlnév, állapot ideiglenes tára Állapot 64 i-csomóponttal és 1 KB-os blokkmérettel (tehát egymást követő két 512 bájtos
stime Pontos idő mutatója Állapot szektor alkot egy blokkot)
syne (semmi) Mindig OK
time Annak mutatója, ahová a pontos idő kerül Állapot 8192 1 KB-os blokkot tartalm azhat, tehát a fájlrendszer legfeljebb 8 MB-os lehet.
times Processzus és gyermekei idejének átmeneti tárának Állapot Még hajlékonylemez esetén is a 64 i-csomópont olyan kevés, hogy az ábrán m u­
mutatója
tatott négy helyett jóval több blokk kell. Praktikusabb nyolc blokkot lefoglalni az
umask Módsablon komplemense Mindig OK
i-csomópontoknak, de ekkor az ábra nem lenne ilyen szép. A m odern m erevleme­
umount Lecsatolandó speciális fájl neve Állapot
zeknél az i-csomópontok és a zónabittérkép m érete term észetesen jóval nagyobb,
unlink Lekapcsolandó fájl neve Állapot
m int egy blokk. Az 5.34. ábrán látható kom ponensek relatív m érete fájlrendsze­
utime Fájlnév, állományidők Mindig OK
renként eltérő lehet, és függ a méreteiktől, a fájlok m egengedett maximális számá­
write Fájlleíró, átmeneti adattár, bájtok száma Kiírt bájtok száma
tól, és így tovább. D e mindegyik komponens előfordul a m egadott sorrendben.
Memóriakezelő Inputparaméterek Válaszérték
üzenetek
M inden állományrendszer egy ún. indítóblokkal kezdődik, amely egy végrehajt­
exec
ható kódot tartalmaz. M érete mindig 1024 bájt (két szektor), annak ellenére, hogy
Processzusazonosító (pid) Állapot
exit
a M INIX 3 máshol nagyobb blokkm éretet használ. A számítógép bekapcsolása
Processzusazonosító (pid) Állapot
fork
után a hardver az indítóegységről a m em óriába olvassa az indítóblokkot, odaugrik,
Előd processzusazonosítója, utód Állapot
processzusazonosítója és elkezdi végrehajtani annak programkódját. Az indítóblokk programkódja m a­
setgid Processzusazonosító, valódi és effektív Állapot gának az operációs rendszernek a betöltését kezdi el. A rendszer elindulása után
csoportazonosító (gid) az indítóblokkra többé nincs szükség. Nem m inden lemezmeghajtó használható
setsid Processzusazonosító Állapot indítóegységként, azonban az egységesség fenntartása érdekében minden blokk­
setuid Processzusazonosító, valódi és effektív Állapot eszköz rendelkezik az indítóblokk program kódja számára fenntartott blokkal. Ez
felhasználóazonosító (uid) a stratégia a legrosszabb esetben egy blokk elpazarlásához vezet. Azt megelőzen­
Egyéb üzenetek Inputparaméterek Válaszérték dő, hogy a hardver egy nem indítható egységet próbáljon meg elindítani, egy ún.
revive Újraélesztendő processzus (Nincs válasz) mágikus szám kerül az indítóblokk m eghatározott helyére. Ez akkor (és csakis ak­
unpause Ellenőrizendő processzus (Lásd a szövegben) kor) történik meg, amikor a végrehajtó kódot az eszközre írjuk. Eszközről történő
indítás során a hardver (valójában a BIOS program kód) egyáltalán nem kísérli
5.33. ábra. Folytatás meg a betöltést olyan egységről, amelyen nincs jelen a mágikus szám. Ez biztosítja,
hogy értelm etlen adat még véletlenül se működhessen indítóprogramként.
A szuperblokk tartalm azza a fájlrendszer felépítésére vonatkozó információt.
5.6.2. A fájlrendszer felépítése Az indítóblokkhoz hasonlóan, a szuperblokk is mindig 1024 bájtos, függetlenül at­
tól a fájlrendszer blokkm éretétől. Ezt szemlélteti az 5.35. ábra.
A M INIX 3 fájlrendszere önálló logikai egység i-csomópontokkal, könyvtárakkal A szuperblokk fő feladata a fájlrendszer különböző részei m éretének számon­
és adatblokkokkal. Bármely blokkeszközön, például hajlékonylemezen vagy m e­ tartása. A blokkm éret és az i-csomópontok számának ism eretében könnyű kiszá­
revlemez partícióján tárolható. A fájlrendszer felépítése m inden esetben ugyan­ mítani az i-csomópont bittérképének m éretét és az i-csomópontok blokkjainak
az. Az 5.34. ábra egy hajlékonylemez, vagy kisméretű merevlemez partíciójának számát. 1 KB m éretű blokkot véve például alapul, a bittérkép minden blokkja
szerkezetét m utatja 64 i-csomóponttal és 1 KB m éretű blokkokkal, így legfeljebb 1024 bájtot (8192 bitet) tartalmaz, így legfeljebb 8192 i-csomópont állapotát ké-
570 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 571

zóna és a blokk első közelítésben megegyezik. Amíg ezen fejezet egy későbbi ré­
Az i-csomópontok száma szében vissza nem térünk a tárfoglalás részleteire, a „zóna” „blokk”-kal való he­
(Nem használatos) lyettesítése nyugodtan megtehető.
Az i-csomópontok bittérképblokkjainak száma Megemlítjük, hogy a blokkok zónánkénti száma nincs a szuperblokkban tárol­
A zóna bittérképblokkjainak száma va, mivel erre az információra soha nincsen szükségünk. Mindössze a blokk/zóna
Első adatzóna_____________________________ hányados 2-es alapú logaritmusát kell ismernünk, amelyet a zóna blokk, illet­
Log2(blokk/zóna) ve blokk —> zóna áttéréseknél a biteltolás mérőszám aként használunk. H a pél­
A lemezen Helykitóltés______________________________ dául egy zóna 8 blokkból áll, akkor - mivel log2 8 = 3 - a 128. blokkot tartalmazó
és a 16. zóna megtalálásához a 128-at kell 3 bittel jobbra eltolnunk.
memóriában Maximális fájlméret A zónabittérkép csupán az adatzónákat foglalja m agában (tehát a bittérképek­
hez és i-csomópontokhoz felhasznált blokkok nincsenek benne). Az első adat­
A zónák száma zóna az 1-es számú zónához van hozzárendelve. Hasonlóan az i-csomópont bit­
Mágikus szám térképhez a zónabittérkép 0. bitje sem használatos, ami azt eredményezi, hogy
Helykitöltés______________________________________ a zónabittérkép első blokkja csupán 8191 zónát tud tárolni, míg a rá következő
Blokkméret (bájtokban) blokkok mindegyike 8192-t. H a megvizsgáljuk a bittérképeket egy frissen form á­
FS alverziószám zott lemezen, azt vesszük észre, hogy mind az i-csomópont bittérképen, mind a
zónabittérképen két bit is 1-re van állítva. Az egyik a nem létező 0. i-csomópontra,
l-csomópont pointer a felcsatolt gyökérkönyvtárra illetve zónára, a másik a fájlrendszer lemezen történő létrehozásakor megjelenő
gyökérkönyvtárra utal.
Pointer a felcsatolt i-csomópontra A szuperblokkban tárolt információ redundáns, m ert a rendszernek egyszer
l-csomópontok/blokk ilyen, másszor olyan form ában van rá szüksége. Mivel a szuperblokk számára
Eszközszám 1 KB hely van fenntartva, érdem es ezen információt az összes olyan formában ki­
A memóriában
van, de nincs Csak olvasható jelző___________________________ számolni és elraktározni, amire később szükség lehet; ez ugyanis sokkal kifizető­
a lemezen Eredeti vagy bájtcserélt jelző____________________ dőbb, mint a végrehajtás folyamán újra és újra kiszámolni azt. A lemez első adat­
FS verziószám_________________________________ zónájának zónaazonosító száma kiszámolható lenne például a blokk vagy a zóna
Direkt zónák/i-csomópont______________________ méretéből, illetve az i-csomópontok vagy zónák számából is, de sokkal gyorsabb,
Indirekt zónák/indirekt blokk___________________ ha ezt a számot a szuperblokkban tároljuk. A szuperblokk fennm aradó részét úgy­
Az első szabad bit az i-csomópontok bittérképében is elpazaroljuk, tehát egy további szavának felhasználása semmibe nem kerül.
Az első szabad bit a zónák bittérképében A M INIX 3 betöltésekor a gyökéreszköz szuperblokkja beíródik a memória
egy táblájába. Ehhez hasonlóan további fájlrendszerek szuperblokkjai is a memó­
riába kerülnek azok felcsatolásakor. A szuperblokktábla lemezen jelen nem lévő
5.35. ábra. A MINIX 3 szuperblokkja mezőkből áll. Ezekben találhatók azok a jelzők, amelyek lehetővé teszik, hogy
egy adott eszköz pusztán olvasható legyen vagy a szabványtól eltérő bájtsorrend-
pes nyilvántartani. (Valójában az első blokk csak 8191 i-csomópontot képes ke­ megállapodást kövessen, illetve azok a mezők, amelyek oly m ódon gyorsítják a
zelni, mivel nincs nulladik i-csomópont, annak ellenére, hogy ez is kap egy bitet hozzáférést, hogy kijelölik a bittérképek azon pontjait, amelyektől lefelé az összes
a bittérképen.) 10 000 i-csomóponthoz a bittérkép 2 blokkjára van szükség. Mivel bit használtként van feltüntetve. A szuperblokktábla tartalm az továbbá egy olyan
az i-csomópontok egyenként 64 bájtot foglalnak el, egy 1 KB m éretű blokk legfel­ mezőt is, amely annak az eszköznek az azonosítóját tárolja, ahonnan szuperblokk
jebb 16 i-csomópontot tartalm azhat. Ahhoz, hogy 64 felhasználható i-csomópont érkezett.
mindegyikét számon tarthassuk, 4 darab 1 KB-os lemezblokk szükséges. M ielőtt egy lemez M INIX 3-fájlrendszerként ténylegesen használható len­
A zónák és a blokkok közötti különbséget a továbbiakban még részletesen tár­ ne, létre kell rajta hozni az 5.34. ábrának megfelelő felépítést. A fájlrendszer
gyaljuk. Jelen pillanatban elegendő ezekről annyit elmondanunk, hogy a lem eztá­ létrehozására az mkfs program szolgál. Ezt a program ot vagy egy paranccsal lehet
rolás számára 1, 2, 4, 8 vagy általánosan 2" blokkos egységek (zónák) foglalhatók működésbe hozni, például az
le. A zónabittérkép a szabad tárolókapacitást blokkok helyett zónákban tartja
nyilván. A zónák és a blokkok m érete a M INIX 3 által használatos szabványos mkfs/dev/fdl 1440
hajlékonylemezek mindegyikénél ugyanaz (1 KB), vagyis ezeken az eszközökön a
5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 573
572

parancs az 1-es meghajtóban lévő hajlékonylemezen létrehoz egy 1440 blokkból állományhoz tartozó lemezblokkok ugyanazon a cilinderen helyezkedjenek el
álló üres fájlrendszert, vagy megadható egy olyan, előre elkészített prototípusfájl, azért, hogy az állomány folyamatos olvasásakor a rendszer teljesítménye javulhas­
amely azokat a könyvtárakat és fájlokat sorolja fel, amelyeknek az új fájlrend­ son. Ez több blokk egyidejű lefoglalásának lehetővé tételével érhető el. H a pél­
szerben feltétlenül jelen kell lenniük. Az em lített parancs beír továbbá a szuper­ dául a blokkméret 1 KB és a zónam éret 4 KB - a zónabittérkép a zónákat tartja
blokkba egy mágikus számot is, amellyel az új fájlrendszert érvényes M INIX 3fájl- nyilván, és nem a blokkokat - egy 20 MB-os lemez 5 K darab 4 KB m éretű zóná­
rendszerként tünteti fel. A M INIX 3-fájlrendszere folyamatosan fejlődött, néhány ból áll, amelyhez a hozzá tartozó zónabittérképben 5 K bit társul.
jellemzője (például az i-csomópontok m érete) a korábbi változatokban a jelenle­ A fájlrendszerek többsége blokkokkal dolgozik. A lemezátvitelek mindig blok­
gitől eltérő volt. A mágikus szám azonosítja a fájlrendszert létrehozó m kfs prog­ kokkal történnek, és az ideiglenes gyorsítótár is az egyedi blokkokkal dolgozik. A
ram verzióját, így a különböző változatok közötti eltérések áthidalhatók. Nem rendszernek csak néhány része, amelyek a tényleges lemezcímeket tartják számon
M INIX 3 formátum ú fájlrendszer, mint például egy MS-DOS-lemez, felcsatolását (például zónabittérkép és i-csomópontok), ismeri a zónákat.
a mount rendszerhívás, amely sok más dolog mellett a mágikus számot is ellenőrzi A M INIX 3-fájlrendszer fejlesztése során néhány, tervezéssel kapcsolatos, dön­
a szuperblokkban, megtagadja. tést is meg kellett hozni. Amikor 1985-ben a M INIX-et kigondolták, a lemezka­
pacitások még kicsik voltak, és úgy gondolták, hogy sok felhasználónak csak haj­
lékonylemezei lesznek. Ezért döntöttek úgy, hogy a V I fájlrendszerben a lemez­
5.6.3. A bittérképek címeket 16 bitesre korlátozzák - elsődlegesen azért, hogy nagy részüket közvetett
blokkokban tárolhassák. 16 bites zónaazonosítóval és 1 KB m éretű zónákkal leg­
A M INIX 3 két bittérkép használatával tartja számon, hogy mely i-csomópontok feljebb 64 KB zóna címezhető meg, ami a lemez tárolókapacitását 64 M B-ban
és zónák szabadok. Egy állomány eltávolításakor rendkívül egyszerű m eghatároz­ korlátozza. Abban az időben ez óriási tárolási kapacitást jelentett, és úgy tervez­
ni, hogy a bittérkép melyik blokkja tartalm azza a felszabadítandó i-csomópont bit­ ték, hogy a lemezek növekedésével, a blokkok m éretének megváltoztatása nélkül,
jét, majd a szokásos, gyorsítótár használatán alapuló eljárást követve azt m egta­ egyszerűen 2 KB vagy 4 KB m éretű zónákra térnek majd át. A 16 bit hosszúságú
lálni. A megfelelő blokk kikeresése után a felszabadítandó i-csomópont bitjét 0-ra zónaazonosítók egyszerűen tették lehetővé az i-csomópontok m éretének 32 báj­
állítjuk. A zónákat hasonló módszerrel távolítjuk el a zónabittérképből. ton való tartását is.
Az állomány létrehozása előtt a fájlrendszernek az első szabad i-csomópont Mivel a M INIX folyamatosan fejlődött, és egyre általánosabbá váltak a nagyobb
megkeresése végett a bittérképek blokkjait egyesével végig kell néznie. Ennek lemezek, nyilvánvalóan változtatásra volt szükség. Mivel sok állomány m érete
m egtörténte után a fájlrendszer ezt az i-csomópontot az új állomány számára lefog­ 1 KB-nál kisebb, a blokkm éret növelése a lemez sávszélességének pazarlásához,
lalja. Valójában a szuperblokk m em óriában lévő m ásolata egy olyan mezőt is tar­ m ajdnem üres blokkok olvasásához és írásához, illetve ezeknek az ideiglenes gyor­
talmaz, amely az első szabad i-csomópontra m utat, így amíg ezt az i-csomópontot sítótárban való tárolásán keresztül az értékes központi m em ória pazarlásához ve­
fel nem használtuk, nincs szükség keresésre. Felhasználása után azonban e mező zetne. M egnövelhették volna a zónam éretet, ami nagyobb lem ezterület elpazarlá-
értékét fel kell frissítenünk, hogy az a következő új, üres i-csomópontra (amely­ sát eredményezi. A kisebb lemezek későbbi hatékony kezelhetősége szintén kívá­
ről gyakran kiderül, hogy a rá következő vagy egy, az eredetihez közel lévő) m u­ natos volt. Egy másik ésszerű megoldás az lett volna, ha a nagy és kis eszközökön
tasson. Ehhez hasonlóan, egy i-csomópont felszabadításakor ellenőrizzük, vajon eltérőnek választják a zónaméretet.
a szabad i-csomópont nem azelőtt az i-csomópont előtt áll-e, amelyet a mutató Végül is a lemezmutatók m éretének 32 bitesre való növelése m ellett döntöttek.
jelen pillanatban tartalmaz, és szükség esetén felfrissítjük a m utató értékét. H a a Ez a M INIX V2 fájlrendszer számára lehetővé teszi az 1 KB m éretű blokkokból
lemezen m inden i-csomópont foglalt, a kereső eljárás 0 értékkel tér vissza. Ez az és zónákból felépített, akár 4 terabájtos, 4 KB m éretű blokkok és zónák (ami ma
oka annak, hogy a 0. i-csomópont nem használatos (így ugyanis jelezni tudja, ha az alapértelm ezett érték) esetén 16 TB kapacitású eszközök kezelését is. Azon­
a keresés eredm énytelen volt). (Amikor az m kfs parancs létrehoz egy új fájlrend­ ban más szempontok korlátozhatják a m éretet (például 32 bites pointerek esetén
szert, kinullázza a 0. i-csomópontot, és a bittérkép legelső bitjét 1-re állítja, amivel 4 GB a maximális kapacitás). A lem ezpointerek m éretének növelésével növelő-
eléri, hogy a fájlrendszer soha nem fogja megpróbálni ennek az i-csomópontnak dik az i-csomópont m érete. Ez nem szükségképpen rossz, m ert azt eredményezi,
a lefoglalását.) Mindaz, amit az előbbiekben az i-csomópont bittérképről elm ond­ hogy a M INIX V2 (és ma m ár a V3) i-csomópontja kompatibilis lesz a standard
tunk, a zónabittérképre is érvényes; ha szabad helyre van szükségünk, logikailag Unix i-csomópontjával, helyet adva három értéknek, így több indirekt és kétsze­
az első üres zónát keressük. A bittérképen való folyamatos keresést kiküszöbö­ resen indirekt zóna lehet, valamint hely a későbbi kiterjesztésre háromszoros
lendő m egtartunk azonban egy olyan m utatót is, amely az első szabad zóna helyét indirekt zónákra. A zónák azonban egy további váratlan problém át is eredm é­
tartalmazza. nyeztek. Ezt legjobban egy egyszerű példán keresztül - ismét csak 4 KB nagyságú
Ezen ismeretek birtokában most m ár el tudjuk magyarázni a zónák és blokkok zónákat és 1 KB m éretű blokkokat alapul véve - m utathatjuk be. Tételezzük fel,
közötti különbséget is. A zónák mögött az az elv húzódik meg, hogy az ugyanazon hogy állományunk 1 KB hosszúságú, ami azt jelenti, hogy egy zóna van számára
574 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 575

lefoglalva. Az 1 KB és 4 KB közötti blokkok (a korábbi használat eredm ényekép­ 16 bit


pen) értelm etlen adatokat tartalmaznak, de semmilyen hibát nem okoznak, mert
az állomány hossza az i-csomópontban egyértelműen 1 KB-nak van definiálva. Mód , Fájltípus és rwx bitek
Az értelm etlen adatot tartalm azó blokkok valójában nem kerülnek beolvasásra Kapcsolatok száma A fájl könyvtári bejegyzései
a blokkgyorsítótárba, mivel az olvasás blokkonként és nem zónánként történik. Uid A fájl tulajdonosának azonosítója
Az állomány vége utáni olvasások mindig egy 0 értékű számlálóval és zéró adattal Gid A tulajdonos csoportja
térnek vissza.
- Fájlméret A fájl bájtjainak száma
Valaki ezután megkeresi a 32768-as helyet, és beír oda egy bájtot. Az állomány
m érete ezzel 32769-re változik. Az 1 KB-os adatolvasási kísérletekkel kiegészített
- Az utolsó elérési idő
keresések a későbbiekben lehetővé teszik a blokk korábbi tartalm ának olvasását,
ami alapvető biztonsági hiányosság. Az 1970. jan. 1. óta eltelt idő
- Az utolsó módosítás ideje
A problém a megoldása az, hogy az állomány vége utáni írás esetén ellenőriz­ másodpercben
zük, nem következik-e be az előbb bem utatott helyzet, illetve ténylegesen kinul­ Az utolsó állapotváltozás
lázzuk a korábban utolsóként nyilvántartott zóna összes, eddig még le nem foglalt ideje
blokkját. Annak ellenére, hogy az itt vázolt helyzet csak ritkán fordul elő, azt a
- 0. zóna
programkódnak tudnia kell kezelni, ami a rendszert egy kicsit bonyolultabbá teszi.

- I.zóna
<
5.6.4. Az i-csomópontok - 2. zóna

A M INIX 3 i-csomópontjának felépítését az 5.36. ábra mutatja. Ez m ajdnem tel­


- 3. zóna
jesen megegyezik a Unix i-csomópontjának felépítésével. A lemez zónamutatói
32 bites mutatók, és mindössze 9 darab van belőlük: 7 közvetlen és 2 közvetett. A fájl első hét zónájának zónaszámai
~ 4. zóna
A M INIX 3 i-csomópontok 64 bájtot foglalnak el, akárcsak a szabvány Unix i-cso­
m ópontok és egy 10. m utatónak (ez a triplán közvetett m utató) is van hely, bár
- 5. zóna
a fájlrendszer szabványváltozata ennek használatát nem támogatja. A M INIX 3
i-csomópontjának elérése, módosítási ideje és az i-csomópont tartalm ának utol­
- 6. zóna
só változtatásához tartozó idők szabványosak, akárcsak a Unixban. Ezek közül az
utolsó szinte m inden állományművelet során, az állomány olvasását kivéve, felfris­
- Indirekt zóna
sítésre kerül. 8 zónánál kisebb fájlok esetén
Egy állomány megnyitásakor az állományhoz tartozó i-csomópont kikeresése nem használatos
- Kétszeresen indirekt zóna
után a mem óriában lévő inode i-csomópont táblába töltődik és az állomány lezá­
rásáig ott marad. Az inode i-csomópont táblának van néhány, lemezen meg nem
- Nem használatos (Felhasználható háromszorosan
található további mezője is, úgymint az i-csomópont eszköze és azonosítója, am e­ indirekt zóna esetén)
lyek ism eretében a fájlrendszer pontosan tudja, hová kell írnia, ha az i-csomópont
tartalm ában változás következik be az alatt az idő alatt, míg a memóriában van.
Az inode i-csomópont táblában minden i-csomóponthoz tartozik egy számláló is. 5.36. ábra. A M INIX3 i-csomópontja
H a ugyanazt az állományt többször nyitjuk meg, i-csomópontjának csak egyetlen
másolata tárolódik a memóriában, de a számláló értéke m inden megnyitásnál egy- kező kiosztás esetén a 7 KB-ig terjedő állományok nem igényelnek közvetett blok­
gyel nő és minden bezárásnál eggyel csökken. Az i-csomópont csak akkor kerül ki kokat. 7 KB-os m éret felett azonban, az 5.10. ábrán vázoltnak megfelelően - annyi
a táblából, amikor a számláló értéke nullára csökken. H a a mem óriában töltött idő különbséggel, hogy csak a szimplán és a duplán közvetett blokk használatos - köz­
alatt az i-csomópont tartalm a megváltozott, kikerüléskor a lemezen újraíródik. vetett zónákra is szükség van. 1 KB blokk-, illetve zónam éret és 32 bites zónaazo­
Az állomány i-csomópontjának fő feladata az, hogy megadja az állomány adat­ nosító mellett a szimplán közvetett blokknak 256 eleme van, ami negyed megabájt
blokkjainak helyét. Az első 7 zóna helye magában az i-csomópontban van. Ez azt tárolókapacitást jelent. A duplán közvetett blokk 256 szimplán közvetett blokkot
jelenti, hogy a szabványos, tehát 1 KB m éretű zónákkal, illetve blokkokkal rendel- tud kijelölni. Ezáltal legfeljebb 64 MB-nyi terület válik elérhetővé. 4 KB-os biok-
576 5. FÁJLRENDSZEREK sa, a m in ix 3 fá jlr e n d s z e r e 577

kokkal a kétszeresen indirekt címzés 1024 x 1024 érhető el, ami több mint egymil­
lió 4 KB-os blokkot jelent, így a maximális fájlm éret 4 GB lehet. A gyakorlatban a
32 bites fájlpozíció m iatt a maximális fájlméret 232 - 1 bájt. Ezekből a számokból
az következik, hogy ha 4 KB-os lemezblokkot alkalmaz a M INIX 3, akkor nincs
szükség háromszorosan indirekt blokkokra; a maximális fájlm éretet a pointer m é­
rete korlátozza le, nem pedig a blokkok nyilvántartásának képessége.
Az i-csomópont tartalm azza még az üzemm ódra vonatkozó információt, amely
az állomány típusát (egyszerű állomány, könyvtár, speciális blokk- vagy karak­
terállomány, illetve adatcső) adja meg, ezenkívül közli az állomány védettségét
és a SETUID, illetve a SETGID bitek értékét. Az i-csomópont link mezője tartja
számon, hány könyvtárelem m utat az illető i-csomópontra. Ennek ism eretében a
fájlrendszer pontosan tudja, mikor szabadítsa fel az állomány helyét. Ezt a mezőt
azonban nem szabad összekevernünk azzal a számlálóval (amely pusztán a m e­ sa után azonban a 0. láncból átm eneti adattárak kerülnek eltávolításra, és újabb
móriában lévő inode i-csomópont táblán van jelen, de a lemezen nem), amely azt láncok épülnek fel.
mutatja, hogy egy adott állomány jelen pillanatban hányszor áll megnyitás alatt, Amikor a fájlrendszernek szüksége van egy blokkra, meghívja a get_block nevű
például különböző processzusok által. eljárást, amely kiszámítja az illető blokk tördelési kódját, és megkeresi a megfe­
Utolsó megjegyzésként megemlítjük, hogy az 5.36. ábrán látható szerkezet spe­ lelő láncot. A get_block eljárást az eszközszámmal és a blokkazonosítóval hívjuk. A
ciális célok elérésére m ódosulhat. Példa erre a M INIX 3 esetén az olyan i-csomó­ keresés során mindkét azonosítót összehasonlítjuk az átmeneti adattárakból felépí­
pont, amely karakterspeciális eszköz i-csomópontja. Ezek nem igényelnek zóna­ tett lánc megfelelő mezőivel. H a megtaláltuk a blokkot tároló átm eneti adattárat,
pointert, m ert nem hivatkoznak lemezen tárolt adatra. A fő- és mellékeszközszá- akkor a fejlécében lévő számláló értéke eggyel nő - jelezvén a blokk használatát
mot az 5.36. ábrán látható 0-adik zóna tartalmazza. Egy másik példa lehet, bár a - , és visszakapjuk az őt kijelölő m utató értékét. H a a blokkot nem találjuk meg a
M INIX 3 nem alkalmazza, hogy kism éretű közvetlen fájl adatát tároljuk magában tördelési listában, akkor felhasználhatjuk az LRU-lista legelső átmeneti adattárát;
az i-csomópontban. ez még biztosan használaton kívül van, és az általa tartalmazott blokk az átmeneti
adattár felszabadítása céljából kitörölhető.
M iután egy blokkot törlésre jelöltünk ki, átm eneti adattára fejlécében egy m á­
5.6.5. A blokkgyorsítótár sik jelző is ellenőrzésre kerül, hogy megtudjuk, változott-e a blokk tartalm a annak
beolvasása óta. H a igen, a változást lemezre írjuk. A szükséges blokkot ezen a
A M INIX 3, fájlrendszere jobb működése érdekében, blokkgyorsítótárat használ. ponton a lemezmeghajtónak küldött üzenettel olvastatjuk be. A fájlrendszer m ű­
A gyorsítótár átm eneti adattárak soraként kerül megvalósításra, ahol az adattárak ködése a blokk megérkezéséig szünetel, majd ezután folytatódik, és a hívó meg­
mindegyike m utatókat, számlálókat és jelzőket tartalm azó fejlécből, illetve egy le- kapja az illető blokk m utatóját.
mezblokknyi helyet tartalm azó törzsből áll. A pillanatnyilag használaton kívüli, Amikor azon eljárás, amelynek a blokkra szüksége volt, befejezte tevékenysé­
átm eneti adattárak egy kétszeresen láncolt listában vannak a legutóbb használa­ gét, a blokk felszabadítása céljából meghívja a put_block nevű eljárást. Egy blok­
tostól (M R U ) a legrégebben használatosig (LR U ) egymás után fűzve, ahogy azt kot rendszerint azonnal felhasználunk, majd kitörlünk. Mivel azonban az illető
az 5.37. ábra mutatja. blokk törlés előtti ismételt kérésére is van lehetőség, a put_block eljárás eggyel
Annak gyors eldöntéséhez, vajon egy blokk a gyorsítótárban van-e, vagy sem, csökkenti a használati számláló értékét, és csak akkor teszi vissza az átm eneti
az ún. hasítótábla használatos. Mindazok az átm eneti adattárak, amelyek olyan adattárat az LRU-listába, ha a számláló értéke nullára változott. Amíg a számláló
blokkot tartalmaznak, amelynek hasítókódja k, a hasítótábla &-adik eleme által ki­ értéke nullától különbözik, a blokk a tárban marad.
jelölt, egyszeresen láncolt listában vannak egymás után felfűzve. A hasítófüggvény A pu t block param étereinek egyike azt határozza meg, hogy milyen blokktípust
mindössze a blokkszám n alacsony helyi értékű bitjét olvassa ki, így a különböző (például i-csomópontok, könyvtár, adat) kell felszabadítani. A típustól függően
eszközökről származó blokkok azonos hasítóláncban jelennek meg. Bármely át­ két kulcsfontosságú döntést kell meghozni:
m eneti adattár ezen láncok valamelyikéhez tartozik. A M INIX 3 betöltése után a
fájlrendszer felépülésekor term észetesen az összes átm eneti adattár üres, tehát 1. Vajon a blokkot az LRU-lista elejére vagy végére kell-e tenni?
a hasítótábla 0. eleme által kijelölt egyszerű lánchoz tartozik. Ebben a pillanatban 2. Vajon azonnal lemezre kell-e a blokkot írni (ha tartalm a megváltozott), vagy
a hasítótábla összes többi eleme egy null m utatót tartalmaz. A rendszer elindulá­ sem?
578 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 579

Az LR U elvnek megfelelően majdnem m inden blokk a lista végére kerül. Kivételt 14 karakteresek lehetnek, csakúgy, mint a Unix V7 esetén. A lemezek kapacitásá­
képeznek a RAM-lemez blokkjai; mivel m ár a m em óriában vannak, ezért nem ér­ val együtt a fájlnevek hossza is nőtt. A M INIX 3 V3 fájlrendszere 64 bájtos könyv­
demes ezeket gyorsítótárba rakni. tári bejegyzéseket alkalmaz, 4 bájt az i-csomópont sorszámának, 60 bájt pedig a
Egy megváltozott blokk csak a következő két feltétel valamelyikének teljesülése fájlnév számára. Több mint 4 milliárd fájl lehet egy partícióban, ami gyakorlatilag
esetén íródik lemezre: végtelen lehetőség, és azt a programozót, aki 60-nál hosszabb fájlnevet akar írni,
vissza kell küldeni az iskolába.
1. Eléri az LRU-lánc elejét, és onnan el kell azt távolítani. Megjegyzendő, hogy az útvonalhossz nem korlátozott 60 karakterre, például a
2. Egy syne rendszerhívás kerül végrehajtásra.
lusrlastlcourse_materialJor_this_yearloperating_systemslexamination-l.ps
A syne rendszerhívás az LRU-láncot nem vizsgálja végig, csak indexével hivatko­
zik a gyorsítótárban lévő átm eneti adattárak tömbjében. H a egy átm eneti adattár érvényes, m ert minden tagja 60-nál kevesebb karakterből áll. A fix, jelen esetben
még nem törlődött, de tartalm a megváltozott, a syne rendszerhívás megtalálja azt, 64 bájt hosszú fájlnév példa a kompromisszumra, az egyszerűséget, gyorsaságot
és gondoskodik arról, hogy a lemezen lévő m ásolat felfrissítődjék. és a tárigényt tekintve. Más operációs rendszerek szokásosan halomba szervez­
Az ilyen eljárásmód gondolkodásra késztet. A M INIX egy korábbi változatánál ve tárolják a könyvtárakat, a halom ban lévő névre m utató fix m éretű fejléccel a
a szuperblokk m inden új fájlrendszer felcsatolásakor megváltozott, és azonnal a könyvtár végén. A M INIX 3 módszere nagyon egyszerű, és gyakorlatilag nem kell
lemezre íródott, hogy egy esetleges rendszerösszeomlás esetén csökkenjen a fájl- módosítani a V2 kódját. Nagyon gyors is, mind a névkeresést, mind az új beírást
rendszer sérülésének veszélye. A szuperblokk csak akkor módosul, ha a RAM- tekintve, m ert nem kell a halom kezelésével foglalkoznia. Ennek lemezterület-
lemez m éretét változtatni kell az induláskor, m ert a RAM-lemez m érete nagyobb, vesztés az ára, m ert a legtöbb fájlnév rövidebb 60 karakternél.
mint a RAM-eszköz. Azonban a szuperblokkot nem a szokásos m ódon írják és Szilárd meggyőződésünk, hogy a lem ezterület-m egtakarításra optimalizálni (és
olvassák, m ert a m érete mindig 1024 bájt, mint az indítóblokké, függetlenül a némi RAM -megtakarításra, m ert a könyvtárak időnként a memóriában vannak)
gyorsítótárral kezelt blokkok méretétől. Egy másik elhagyandó tapasztalat, hogy a rossz választás. A kód egyszerűsége és helyessége az elsődleges, a gyorsasága m á­
régebbi M INIX-rendszerekben az /include/minix/conf.h konfigurációs fájlban defi­ sodlagos. M odern lemezek esetén, amelyek kapacitása m eghaladja a 100 GB-ot,
niálható volt egy ROBUST makró, amely ha definiálták, akkor azt okozta, hogy az némi lem ezterület megtakarítása bonyolultabb és lassabb kód árán általában nem
i-csomópontok, könyvtárak, indirekt és bittérképblokkok azonnal kiíródtak a le­ jó ötlet. Sajnos, sok programozó olyan környezetben nő fel, ahol kisméretű a le­
mezre. Ezzel a fájlrendszer megbízhatóbb volt, de az ára a lassúbb m űködés volt. mez és még kisebb a RAM, és kezdettől fogva olyan oktatásban részesül, hogy
Kiderült, hogy a módszer nem hatékony. H a épp akkor következik be áramszünet, feloldja a kódbonyolultság, a gyorsaság és a tárigény közötti ellentmondást, a tár-
amikor a blokkok még nem voltak lemezre írva, komoly gondot okozhat annak el­ igény-minimalizálást előnyben részesítve. Ez az implicit feltételezés valóban felül­
döntése, hogy az elveszett információ i-csomópont vagy adatblokk volt-e. vizsgálatra szorul a jelenlegi tények fényében.
Itt jegyezzük meg, hogy egy blokk fejlécének azt a jelzőjét, amely a blokk tar­ Például a /usr/ast/mbox elérési út kikeresésekor a rendszer először a gyökér-
talm ának megváltozását mutatja, a fájlrendszer azon eljárása állítja be, amely az könyvtárban a usr-1 keresi meg, majd a /usr/-ben az ast-1, és végül a /usr/ast/-ben az
illető blokkot meghívta és használta. A get_block és put_block eljárások pusztán a mbox-ot. A tényleges kikeresés során az elérési útnak egyszerre csak egy összete­
láncolt listákon végeznek műveleteket, és nincs tudom ásuk arról, hogy a fájlrend­ vőjét keressük, amint azt az 5.16. ábra mutatja.
szer melyik eljárásának melyik blokkra van szüksége, és mi célból. Az egyetlen bonyodalom: mi történik, ha véletlenül egy felcsatolt fájlrendszerbe
ütközünk? A M INIX 3 és sok más Unix-alapú rendszer szokásos beállítása olyan,
hogy létezik a rendszer indításához és alapvető fenntartásához szükséges állo­
5.6.6. Könyvtárak és elérési utak mányokat tartalmazó kicsiny gyökérfájlrendszer, míg az állományok többsége - be­
leértve a felhasználói könyvtárakat is - a /usr/-hez felcsatolt külön eszközön van.
A fájlrendszer egy következő fontos alrendszere a könyvtárak és elérési utak ke­ Hogyan is történik valójában egy ilyen felcsatolás? Amikor a felhasználó begépeli a
zelése. Sok rendszerhívásnak, m int például az open eljárásnak is, az egyik para­
m étere fájlnév. Amire igazából szükség van, az az illető fájl i-csomópontja. A fájl- mount /dev/cOd 1p2 /usr
rendszer feladata tehát az, hogy a könyvtárfában kikeresse a fájlt, és megtalálja az
ehhez tartozó i-csomópontot. utasítást, az 1. merevlemez 2. partícióján található fájlrendszer a gyökérfájlrendszer
A M INIX korábbi verzióiban a könyvtár egy olyan fájl, amely 16 bájtot tartal­ /usr/ könyvtárához kapcsolódik hozzá. A fájlrendszereket összekapcsolásuk előtt
maz, 2 bájtot az i-csomópont és 16 bájtot a fájlnév számára. Ez azt eredményezte, és után az 5.38. ábra mutatja.
hogy a partíció legfeljebb 64 KB számú fájlt tartalm azhat, és a fájlnevek legfeljebb
580 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 581

A fájlrendszer Felcsatolatlan szuperblokk ism eretében a felcsatolt fájlrendszer gyökere i-csomópontjának meg­
gyökere fájlrendszer A felcsatolás után találásához egyszerűen a másik m utatót kell követnünk. Ezt kihasználva a fájl-
rendszer tovább folytatja a keresést, ami jelen esetben a merevlemez 2. partíciójá­

/lil5/
A J/bm V u sr
nak gyökérkönyvtárában az /ast/ könyvtár keresését jelenti.

5.6.7. Az állományleírók

Egy fájl megnyitása után a felhasználói processzus egy állományleírót kap vissza,
/ast/fl / \ /ast/f2 amelyet ezután a read, illetve write hívások használnak. A most következő részben

A
ezen állományleírók fájlrendszeren belüli kezelésével ismerkedünk meg.
/usr/bal /usr/ast A fájlrendszer, az operációs rendszer központi részéhez és a memóriakezelőhöz
hasonlóan, a processzustábla egy részét a saját cím területén tartja. Mezői közül
M három nak rendkívül fontos szerepe van. Az első kettő a gyökérkönyvtár, illetve
/ V /usr/ast/f2 a pillanatnyi munkakönyvtár i-csomópontját kijelölő m utató. Egy elérési út meg­
keresése - ahogy az például az 5.16. ábrán látható - attól függően, hogy az elérési
út abszolút vagy relatív-e, mindig a kettő közül valamelyik vizsgálatával kezdődik.
(a) (b) (c)
Ezen m utatókat a chroot és a chdir rendszerhívások folyamatosan frissítik, hogy
azok mindig az új gyökér-, illetve munkakönyvtárra mutassanak.
5.38. ábra. (a) A gyökérfájlrendszer, (b) Fájlrendszer felcsatolás előtt. A processzustábla harmadik érdekes mezője az állományleíró azonosítója által
(c) A (b) fájlrendszer /usr/-hez történő felcsatolása utáni állapot kijelölt tömb. Ez arra való, hogy egy állományleíró átadásakor megtalálhassuk a
megfelelő állományt. Első pillantásra úgy tűnhet, elégséges annyi, hogy a tömb
A felcsatolási művelet kulcsa a /usr/-hez tartozó i-csomópont m em óriában lé­ /c-adik eleme a k állományleíróhoz tartozó állomány i-csomópontjára mutasson,
vő másolatában a sikeres felcsatolás esetén egy jelzőbit 1-re állítása. Ez a jelző hiszen az állomány megnyitásakor annak i-csomópontja a m em óriába kerül, és az
m utatja, hogy az i-csomóponthoz ezután egy felcsatolt fájlrendszer tartozik. A állomány bezárásáig ott is marad. Vagyis az állomány biztosan elérhető.
mount hívás az újonnan felcsatolt fájlrendszer szuperblokkját a super_block nevű Sajnos ez az előbbi elképzelés nem helytálló, m ert a M INIX 3-ban (éppúgy,
szuperblokktáblába másolja, illetve beállít abban két m utatót. M indezeken túl, a mint a Unix esetén) az állományok rendkívül ravasz m ódokon lehetnek megoszt­
felcsatolt fájlrendszer gyökér i-csomópontját az inode táblába tölti. va. A problém át az jelenti, hogy m inden állomány rendelkezik egy olyan 32 bites
Az 5.35. ábráról leolvashatjuk, hogy a m em óriában lévő szuperblokkok két számmal, amely a következő beolvasandó vagy kiírandó bájtot jelöli ki. Ezt az ún.
olyan mezőt is tartalm aznak, amelyek az összekapcsolt fájlrendszerekkel kapcso­ pillanatnyi fájlpozíciót változtatja az lseek rendszerhívás. A problém a egyszerűen
latosak. Ezek közül az első, a felcsatolt fájlrendszer i-csomópontja, az újonnan fel­ megfogalmazható: hol tároljuk ezt a m utatót?
csatolt fájlrendszer gyökér i-csomópontjára m utat. A második, a felcsatolási i-cso- Az első lehetőség, hogy betesszük az i-csomópontba. H a két vagy több procesz-
mópont úgy kerül beállításra, hogy arra a helyre mutasson, ahová a fájlrendszert szus ugyanazt az állományt nyittatja meg, sajnálatos m ódon mindegyiknek a saját
felcsatoltuk, jelen esetben a /usr/ könyvtár i-csomópontjára. Ez a két m utató szol­ állománymutatóira van szüksége, mivel azt aligha engedhetjük meg, hogy az egyik
gál a bekapcsolt fájlrendszer gyökérhez kapcsolására, illetve tölti be a bekapcsolt processzus lseek hívása befolyásolja a másik processzus legközelebbi beolvasását.
fájlrendszer és a gyökér közötti „ragasztó” szerepét [amint azt az 5.38.(c). ábra Tehát a pillanatnyi állományvég nem kerülhet az i-csomópontba.
pontozott vonala jelöli]. Ez a kapcsolat teszi lehetővé egy felcsatolt fájlrendszer Mi lenne, ha azt a processzustáblába tennénk? M iért nem létezik egy második,
működését. az állományleíró tömbbel szinkronban lévő, az állományok pillanatnyi végét meg­
Amikor például a Iusr/ast/f2 elérési utat keressük, a fájlrendszer a /usr/-hez tar­ adó tömb? Ez a megközelítés szintén nem működik, azonban sokkal árnyaltabb
tozó i-csomópontban észrevesz egy jelzőt, amelynek állapotából tudja, hogy a okok miatt. A problém a alapvetően a fork rendszerhívás szemantikájával kapcso­
/usr/-hez felcsatolt fájlrendszer gyökerének i-csomópontjában kell tovább keres­ latos. Egy processzus elágazásakor mind a szülő-, mind a gyermekprocesszusnak
nie. A kérdés: hogyan fogja ezt a gyökérhez tartozó i-csomópontot megtalálni? ugyanazt az állománymutatót kell a pillanatnyilag megnyitás alatt álló állomá­
A válasz triviális. A rendszer mindaddig vizsgálja a m em óriában lévő szuper­ nyokhoz birtokolnia.
blokkokat, amíg meg nem találja azt, amelynek felcsatolási i-csomópont mezője Hogy a problém át jobban megérthessük, tekintsünk egy olyan parancsértel­
/usr/-re mutat. Ez éppen a /usr/-hez felcsatolt fájlrendszer szuperblokkja lesz. A mezőt, amelynek kim enetét egy állományba irányítottuk át. Am ikor a parancsér-
582 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 583

i-csomópont 5.6.8. Fájlzárolás


filp tábla tábla
A fájlrendszerkezelésnek van még egy olyan területe, amely szintén egy speciális
tábla jelenlétét kívánja meg. Ez a fájlokhoz való hozzáférés letiltása vagy zárolá­
sa. A M INIX 3 támogatja a POSIX szerinti processzusközi kommunikáció során
használatos ún. felügyeleti fájlzárolás technikáját. Ez teszi lehetővé egy adott
állomány tetszőleges részének, vagy akár több részének is hozzáférhetetlenként
való feltüntetését. Maga az operációs rendszer nem kényszeríti ki az állományhoz
való hozzáférés megszüntetését. Az egyes processzusoktól elvárjuk azonban, hogy
megfelelően viselkedjenek, és mielőtt bármi olyasmit tennének, ami egy másik
processzussal ütközne, vizsgálják meg, vajon számukra hozzáférhető-e az adott
állomány.
A zárolások számára kialakított különálló tábla létrehozásának okai az előző
részben tárgyalt filp tábla létrehozásának okaihoz hasonlók. Egy egyszerű procesz-
szus egyidejűleg több zárolást is aktiválhat, illetve egy állomány különböző részeit
egynél több processzus is zárolhatja (persze ezek a zárolások nem keresztezhetik
egymást). Ennek következtében sem a processzustábla, sem a filp tábla nem al­
telmező az első program ot elágaztatja, a szabványos kim enet fájlpozíciója 0. Ezt kalmas a zárolások számontartására. Az i-csomópont erre szintén nem megfelelő,
örökli a gyermekprocesszus, amely m ondjuk kiír 1 KB információt. A gyermek­ mivel egy állomány több zárolással is rendelkezhet.
processzus befejeződésekor a közös fájlpozíciónak 1024-nek kell lennie. A M INIX 3 a zárolások nyilvántartására tehát egy újabb táblát, az ún.file jo c k
Ezután a parancsértelm ező beolvassa a következő részt, és elindít egy másik táblát használja. A tábla m inden egyes rekeszében van hely a zárolás típusának
gyermekprocesszust. Lényeges, hogy ez a második gyermekprocesszus az 1 KB - ez jelzi, hogy a zárolás az adott állomány írására vagy olvasására vonatkozik-e -,
fájlpozíciót örökölje a parancsértelm ezőtől, vagyis azon a helyen kezdje meg az a zárolást életbe léptető processzus azonosítójának, a zárolt állomány i-csomó­
írást, ahol az első program azt befejezte. H a a parancsértelm ező a gyermekpro­ pontját kijelölő m utatónak és a zárolt terület első, illetve utolsó bájtjának az állo­
cesszusnak nem adná át a fájlpozíció-információt, a második program egyszerűen mány kezdetétől számított relatív helye számára.
felülírná az első program kim enetét ahelyett, hogy ahhoz a sajátját hozzáírná.
M indez azt mutatja, hogy a pillanatnyi fájlpozíció nem kerülhet a processzus­
táblába sem, m ert annak a processzusok között ténylegesen közösnek kell lennie. 5.6.9. Adatcsövek és speciális fájlok
A M INIX 3-ban ennek biztosítása érdekében a következő megoldás használatos:
létrehozunk egy olyan új, közös táblát - ez az ún.filp tábla - , amely az összes fájl­ Az adatcsövek és a speciális fájlok egy lényeges ponton különböznek a közönsé­
pozíciót tartalmazza. Használatát az 5.39. ábrán szemléltetjük. M iután a fájlpozí­ ges fájloktól. Amikor egy processzus lemezen lévő fájlba próbál írni vagy onnan
ciók ezáltal a processzusok között valóban megosztásra kerülnek, a fork rendszer- olvasni, a művelet majdnem biztosan nem tart tovább néhány tized másodpercnél.
hívás szemantikája helyesen kivitelezhető, és a parancsértelm ező is helyesen fog A legrosszabb esetben két vagy három lemezelérésre lesz szükség, többre nem.
működni. Amikor azonban az olvasás egy adatcsőből történik, teljesen más helyzettel kerü­
Bár az egyetlen olyan információ, amelyet a filp táblának tartalm aznia kell, a lünk szembe: ha az adatcső üres, az olvasónak mindaddig várakoznia kell, amíg
közös állományvég, az i-csomópont m utatójának itt történő feltüntetése megszo­ egy másik processzus valamilyen adatot nem tesz az adatcsőbe. Ez pedig akár
kott dolog. Ily m ódon ugyanis a processzustábla állományleíró tömbje mindössze néhány óráig is eltarthat. Ehhez hasonlóan, term inálról történő beolvasáskor is
egy filp elem et kijelölő m utatót tartalmaz. A filp elem tartalm azza továbbá az állo­ mindaddig várakoznia kell a processzusnak, amíg valaki be nem gépel valamit.
mány elérhetőségét (engedélyezési bitek), azokat a jelzőket, amelyek az állomány A fájlrendszer azon alapszabálya tehát, amely szerint egy adott kérés kiszolgálá­
esetleges speciális megnyitási módját tükrözik, és egy olyan számlálót, amely az sa annak befejezéséig tart, nem működik. Ezeket a kéréseket fel kell függesztenie,
adott állományt használó különböző processzusok számát tartja nyilván. Ezzel majd egy későbbi időpontban újra kell őket éleszteni. Amikor egy processzus
lehetővé válik, hogy a fájlrendszer pontosan tudja, mikor is fejeződik be az utol­ adatcsőből (vagy adatcsőbe) próbál meg olvasni (vagy írni), a fájlrendszer rögtön
só olyan processzus, amely a filp tábla ezen elemét használta. Ennek megtörténte ellenőrizheti az adatcső állapotát, hogy felmérje, befejezhető-e az adott művelet,
után pedig visszaigényelheti az adottá/p tábla rekeszt. vagy sem. H a igen, a fájlrendszer befejezi azt, ha nem, feljegyzi a rendszerhívás
584 5. FÁJLRENDSZEREK 5.6. A MINIX 3 FÁJLRENDSZERE 585

param étereit a processzustáblában. Ily m ódon a megfelelő időpontban ismét elin­ azonosító számot, a végrehajtandó műveletet, a hívó processzus azonosítóját és
díthatja majd a processzust. átm eneti tárterületének címét, illetve a továbbítandó bájtok számát tartalmazza.
Jegyezzük meg, hogy a fájlrendszernek a hívó felfüggesztéséhez semmit sem Ennek form átum a a 3.15. ábrán láthatóval egyezik meg, azzal az eltéréssel, hogy a
kell tennie. Mindössze a válasz küldését kell visszatartania, ezzel blokkolva a hí­ POSITIO N változót ebben az esetben nem használjuk.
vót, amely erre a visszajelzésre vár. Egy processzus felfüggesztése után a fájlrend­ Amennyiben a m eghajtó azonnal folytatni tudja m unkáját (például m ár begé­
szer tehát visszakerül a központi ciklusba, ahol a következő rendszerhívásig vára­ peltük a term inálon a bem enetet), saját belső átm eneti táraiból az adatokat a fel­
kozik. Mihelyt egy másik processzus az adatcső állapotában olyan változást idéz használóhoz másolja és üzenetet küld a fájlrendszernek, amelyben a munka elvég­
elő, amelynek következtében a felfüggesztett processzus befejezhetővé válik, a zéséről tesz jelentést. Ekkor a fájlrendszer egy válaszüzenetben értesíti a felhasz­
fájlrendszer beállítja a megfelelő jelzőt, és miután legközelebb visszakerül a köz­ nálót, és ezzel befejeződik a hívás. Jegyezzük meg, hogy a meghajtó nem másol
ponti ciklusba, kiolvassa a processzustáblából a felfüggesztett processzus param é­ adatokat a fájlrendszerbe. A blokkeszközökről származó adatok keresztülmennek
tereit, és végrehajtja a hívást. a blokkgyorsítótáron, de a különleges karakterállományból származók nem.
A term inálok és egyéb különleges karakterállom ányok esetén ettől egy kicsit H a azonban a m eghajtó nem képes azonnal folytatni a munkáját, az üzenetben
eltérő a helyzet. Bármely speciális állományhoz tartozó i-csomópont két azonosí­ szereplő param étereket feljegyzi belső tábláiba, és azonnal egy olyan értelm ű üze­
tót tartalmaz: ezek a fő, illetve a másodlagos eszközazonosító számok. A fő esz­ netet küld a fájlrendszernek, amely szerint a hívás nem fejezhető be. Ezen a pon­
közazonosító szám az illető eszköz típusát határozza meg (például RAM-lemez, ton a fájlrendszer ugyanolyan állapotba kerül, mint akkor, amikor azt észleli, hogy
hajlékonylemez, merevlemez, terminál). Ezt a számot a fájlrendszertábla, amely valamilyen processzus az üres adatcsőből próbál meg adatot olvasni. Feljegyzi az
tulajdonképpen az eszközt rendeli hozzá a megfelelő feladathoz (például I/O- adott processzus felfüggesztésének tényét, és várja a következő üzenetet.
m eghajtó), sorszámként használja. Valójában a fő eszközazonosító szám határoz­ M iután a m eghajtó elegendő adatra tett szert a hívás befejezéséhez, ezeket a
za meg, hogy melyik I/O-meghajtót kell meghívni. A másodlagos eszközazonosító még mindig blokkolás alatt álló felhasználó átm eneti adattárába továbbítja, majd
szám a m eghajtónak param éterként kerül átadásra, és azt jelöli ki, hogy tulajdon­ erről jelentést tesz a fájlrendszernek. Ekkor a fájlrendszernek mindössze annyit
képpen melyik eszközt is fogjuk használni, például a kettes számú term inált vagy kell tennie, hogy egy üzenet elküldésével megszüntesse a felhasználó blokkolását,
az egyes lemezmeghajtót. és megküldje annak a továbbított bájtok számát.
Néhány esetben, leginkább a termináleszközök esetében, a másodlagos esz­
közazonosító szám az adott feladat által kezelt eszközök csoportjáról is hordoz
némi információt. Az elsődleges M INIX 3-konzol, /dev/console, például egy (4, 0) 5.6.10. Egy példa: a read rendszerhívás
(fő, illetve másodlagos eszközazonosító számú) eszköz. A virtuális konzolokat a
m eghajtóprogram ugyanazon része kezeli. Ezek a /dev/ttycl (4, 1), /dev/ttyc2 (4, 2) Amint azt rövidesen látni fogjuk, a fájlrendszer forráskódjának nagy része a rend­
stb. eszközök. A soros egyirányú term inálok - például /dev/ttyOO és /dev/ttyOl - szerhívások megvalósítására fordítódik. Éppen ezért helyénvalónak érezzük, hogy
kezeléséhez egy másik alacsony szintű program szükséges. Ezen eszközökhöz a mostani áttekintésünket a legfontosabb rendszerhívás, a read töm ör jellemzésével
(4, 16), illetve (4, 17) eszközazonosító számokat rendelték. Ezekhez hasonlóan, zárjuk.
a hálózati term inálok is ál-term inálm eghajtókat használnak, vagyis ezekhez egy Amikor egy felhasználói program egy közönséges fájlból való beolvasás céljából
további alacsony szintű program szükségeltetik. A M INIX 3 ezekhez az eszközök­ végrehajtja az
höz, ttypO, ttypl stb. olyan eszközazonosító számokat rendel, m int például (4,128),
illetve (4, 129). Ezen áleszközök mindegyikéhez tartozik még egy további ptypO, n = read(fd, buffer, nbytes);
ptypl stb. eszköz is. Az ezekhez tartozó fő és másodlagos eszközazonosító szám­
párok a (4, 192), (4, 193) stb. számpárok. Ezeket a számokat azért választották az utasítást, akkor a read könyvtári eljárás kerül meghívásra három átadott param é­
itt leírt módon, hogy a m eghajtó processzus számára megkönnyítsék a különböző terrel. Az eljárás először létrehoz egy olyan üzenetet, amely a read rendszerhívás
eszközcsoportokhoz rendelt alacsony szintű függvények kiválasztását. A rra azon­ kódjával mint az üzenet típusával együtt tartalm azza ezt a három param étert is.
ban nincs mód, hogy egy M INIX 3-rendszer 192 darab vagy ennél több terminállal Ezután az üzenetet elküldi a fájlrendszernek és blokkol, várván a visszajelzést. Az
legyen felszerelve. üzenet megérkezése után a fájlrendszer az üzenet típusát táblái számára m utató­
Am ikor egy processzus speciális állományból olvas, a fájlrendszer először ki­ ként használva meghívja a beolvasást kezelő eljárást.
olvassa az állomány i-csomópontjából a fő és másodlagos eszközazonosító számot, Ezen eljárás az üzenetből kiolvassa az állományleírót, amelyet a későbbiekben a
majd a fő eszközazonosító számot a processzustábla indexeként használva hozzá­ beolvasandó állományhoz tartózófilp tábla elem nek és i-csomópontoknak a meg­
rendeli az eszközhöz a megfelelő processzust. M iután a processzus számát meg­ keresésére használ fel (lásd 5.39. ábra). Ezután a kért adat olyan m éretű részekre
találta, olyan üzenetet küld számára, amely param éterként a másodlagos eszköz­ osztódik, amelyek mindegyike elfér egy blokkban. H a például a fájlpozíció jelen­
586 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 587

lég 600 és 1 KB információt kértünk, a kért adat - 1 KB m éretű blokkokat feltéte­ 5.7.1. Definíciós állományok és globális adatszerkezetek
lezve - 2 darabra bomlik, 600-tól 1023-ig, illetve 1024-től 1623-ig.
A következő lépésben annak ellenőrzése történik meg egyenként, hogy a dara­ A fájlrendszerben használatos adatszerkezetek és táblák éppúgy a definíciós ál­
bok nincsenek-e véletlenül a gyorsítótárban. H a a darabok nincsenek ott, a fájl- lományokban vannak definiálva, mint az operációs rendszer központi részénél
rendszer megkeresi azt a legrégebben használt átm eneti adattárat, amely jelenleg (kernel) és a memóriakezelőnél. Az adatszerkezetek közül néhány az includel
sincs használatban, és lefoglalja, miközben egy üzenetben arra kéri a lemez eszköz- könyvtáraiban lévő ún. rendszer definíciós állományokban található. Az includel
kezelőt, hogy az illető tár tartalm át, ha az korábban megváltozott, írja lemezre. Az sys/stat.h definiálja például azt a formátum ot, amelyben a rendszerhívások más
eljárás ezek után a beolvasandó blokk megszerzésére utasítja az eszközkezelőt. program oknak az i-csomópontra vonatkozó információt átadják, míg a könyvtár­
M iután a blokk bekerült a gyorsítótárba, a fájlrendszer a rendszertaszkhoz küld bejegyzés szerkezete az include/sys/dir.h definíciós állományban kerül megadásra.
egy üzenetet, amelyben az adatnak a felhasználói ideiglenes tárterület megfelelő A POSIX-nak az em lített két állomány mindegyikére szüksége van. A fájlrend­
helyére történő bemásolását kéri (például a 600 és az 1023 között lévő bájtok az szert rendkívül sok, az include/minix/config.h globális konfigurációs állományban
átm eneti tár elejétől, míg az 1024 és az 1623 közötti bájtok ez után, az ideiglenes található definíció befolyásolja, ilyen például az N R B U F S , illetve az NR_BUF_
tár 424-es helyétől kezdődően íródnak be). A m ásolat elkészülte után a fájlrend­ HASH, amelyek a blokkgyorsítótár m éretét szabályozzák.
szer egy válaszüzenetben értesíti a felhasználót az átm ásolt bájtok számáról.
Ezen üzenet felhasználóhoz történő megérkezése után a read könyvtári függvény
kiolvassa belőle a válaszkódot, és azt függvényértékként visszaadja a hívónak. A fájlrendszer definíciós állományai
Történik azonban egy olyan lépés is, amely valójában nem része a read rendszer-
hívásnak. M iután a fájlrendszer az olvasást befejezte és a válaszüzenetet is el­ A fájlrendszer saját definíciós állományai a fájlrendszer src/fs/ elnevezésű for­
küldte - feltéve, hogy egyéb feltételek teljesülése mellett a következő beolvasás ráskönyvtárában találhatók. Közülük a M INIX 3 egyéb részeinek tanulmányozása
is blokkeszközről esedékes - , elindítja a következő blokk beolvasását. Mivel az során m ár sokat megismertünk. A fájlrendszer központi fs.h definíciós állománya
egymás utáni sorozatos állományolvasások eléggé gyakoriak, ésszerűnek tűnhet (20900. sor) nagyon hasonló az src/kemel/kemeih, illetve az src/pm/pm.h definíciós
az a feltevés, miszerint a soron következő beolvasási kérelem éppen az állomány állományhoz, és olyan egyéb definíciós állományokat tartalmaz, amelyek a fájl-
következő blokkjára irányul. Ez azt is valószínűsíti továbbá, hogy a későbbiekben rendszer többi állományának C forráskódja számára életbe vágóan fontosak. É pp­
a kívánt blokk szükség esetén m ár megtalálható lesz a gyorsítótárban. úgy, mint a M INIX 3 egyéb részeinél, a fájlrendszer központi definíciós állománya
tartalm azza a fájlrendszer saját const.h, type.h, proto.h és glo.h állományait. Vizs­
gáljuk meg most ezeket egy kicsit közelebbről.
A const.h (21000. sor) definiál néhány olyan állandót (táblaméretek, illetve -jel­
5.7. A MINIX 3 fájlrendszerének megvalósítása zők), amelyeket a fájlrendszer m inden része használ. A M INIX 3-nak azonban
m ár történelm e van. Egy korábbi változata teljesen más fájlrendszert használt, így
A M INIX 3 fájlrendszere meglehetősen nagy (több mint 100 oldalnyi C program), azon felhasználók számára, akik ezen régebbi változat által írott állományokat sze­
de azért eléggé átlátható. Rendszerhívások végrehajtására irányuló kérések érkez­ retnék használni, mind a régi VI, mind a jelenlegi V2 típusú fájlrendszer támogat.
nek, hajtódnak végre és válaszok kerülnek elküldésre. A következő részekben a A régebbi rendszerek tám ogatása nemcsak ezért fontos, hogy más M INIX-rend-
M INIX 3-at állományonként vizsgáljuk meg, kiemelve a legérdekesebb alkotóele­ szer fájljait elérhessük, hanem azért is, m ert ez lehetővé teszi fájlok cseréjét.
meket. A forráskód maga is rendkívül sok, az olvasót segítő megjegyzést tartalmaz. Más operációs rendszerek, például a Linux, most is tám ogat régebbi MINIX-
Amikor a M INIX 3 egyéb részeinek forráskódját m utattuk be, akkor általában fájlrendszert. (Talán ironikus, hogy a Linux még tám ogatja a régebbi MINIX-fájl-
az eljárások központi ciklusát vizsgáltuk meg először, és csak ezután kerültek sor­ rendszert, de a M INIX 3 m ár nem.) Van néhány segédprogram MS-DOS és Win­
ra a különböző üzenettípusokat kezelő rutinok. A fájlrendszer esetén másként dows számára a régebbi MINIX-fájlok elérésére. A fájlrendszer szuperblokkja tar­
járunk el: először a fontos alrendszereket tárgyaljuk (mint például a gyorsítótár talmaz egy ún. mágikus (vagy bűvös) számot, amelynek segítségével az operációs
vagy az i-csomópontok kezelése), és csak ezután térünk rá a központi ciklusra, rendszer felismeri a fájlrendszer típusát; ezeket a számokat a SUPER_MAGIC, il­
illetve az állományokon m űveleteket végző rendszerhívásokra. Ezt követően a letve a SUPER_V2 és SUPER V3 állandók határozzák meg. Van továbbá ezeknek
könyvtárakon műveleteket végző rendszerhívásokat, majd az ezen kategóriák egy _R E V végződésű változatuk azokra a V I és V2 verziókra, amelyek a mágikus
egyikébe sem besorolható rendszerhívásokat fogjuk megtárgyalni. Végül azt tár­ számot fordított sorrendben tárolják. Ezeket régebbi M INIX-rendszerek eltérő
gyaljuk, hogyan kezeli a rendszer az eszközspecifikus fájlokat. bájtsorrendű (kis-endián helyett nagy-endián) rendszerekre történő portolására
lehet használni, így ha egy hordozható lemezt egy más bájtsorrendű gépen írtak,
588 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 589

azt felismerheti. A M INIX 3.1.0 verziója definiálja a SUPER_V3_REV mágikus Ezzel eljutottunk azon állományokhoz, melyek a fájlrendszer által fenntartott
számot, bár ez nem szükséges, de valószínűleg ez a definíció a jövőben beépül. további táblákat definiálják. Az első, amit buf.h néven ismerünk (21600. sor),
A type.h definíciós állomány (21100. sor) definiálja a régi V I és az új V2 i-cso- határozza meg a blokkgyorsítótárat. Az itt megjelenő szerkezeteket az E X T E R N
m ópont szerkezetét olyan formában, ahogyan azok a lemezen m egtalálhatók. Az m akróutasítással hozzuk létre. A b u f tömb tartalm azza az átm eneti adattára­
i-csomópont szerkezete nem változott a V3 verzióban, tehát a V2 i-csomópont kat, amelyek mindegyike egy b adatrészből és egy mutatókkal, jelzőkkel, illetve
használatos a V3 fájlrendszerben is. A V2 i-csomópont kétszer nagyobb, mint számlálókkal teli fejlécből áll. Az adatrészt öt típus unión típusaként hozzuk létre
a régi V I i-csomópont, amelyet eredetileg a merevlemezzel nem rendelkező, (21618-21632. sor), m ert előfordulhat, hogy a későbbiekben kényelmesebb lesz rá
360 KB-os hajlékonylemezt használó rendszerek számára, a tömörség kívánalmát időnként karaktertöm bként, időnként könyvtárként stb. hivatkozni.
szem előtt tartva szerkesztettek meg. Az új változatban a Unix-rendszereknél A hármas számú átm eneti adattár adatrészének karaktertöm b formájában tö r­
használatos három időmező számára biztosítottak helyet. A V I i-csomópontban ténő hivatkozása során a buf[3].b.b__dat a form átum használata szükséges, m ert
mindössze egyetlen időmező kapott helyet, azonban a stat és az fstat rendszerhí­ a buf\3\.b hivatkozik magára a unión-ra, amiből a b__dat a mezőt választjuk ki.
vások ezt a tényt „elhomályosítva” egy olyan stat szerkezetet adnak vissza, amely Azzal együtt, hogy a fenti szintaktika helyes, rendkívül nehézkes is. Éppen ezért a
m indhárom mezőt m agában foglalja. M indkét fájlrendszer tám ogatásának kiala­ 21649. sorban létrehozunk egy b_data elnevezésű makróutasítást, amely lehetővé
kításánál felmerül azonban egy apró nehézség, amelyet a 21116. sor megjegyzése teszi, hogy a későbbiekben a buf[3].b_data form átum ot használhassuk. Jegyezzük
tesz nyilvánvalóvá. A régebbi M INIX-programok a g i d j típust 8 bitesnek várják, így meg, hogy a b__data (ez utal a unión egy m ezőjére) két aláhúzást tartalmaz, míg
a d2_gid-et u l ó j típusúként kell definiálni. a b_data (a makróutasítás) csak egyet. Ez azért van így, hogy a kettőt m egkülön­
A proto.h definíciós állomány (21200. sor) biztosítja a régi K&R és az újabb böztethessük egymástól. Az adott blokk más form átum ban való elérésére szolgáló
ANSI szabvány C fordítók számára egyaránt elérhető form ában a függvényproto­ további makróutasítások a 21650. és a 21655. sorok között kerülnek definiálásra.
típusokat. Ez egy hosszú, m indazonáltal eléggé érdektelen állomány. Egy dolgot Az átm eneti adattár hasítótábláját, b u f hash, a 21657. sorban hozzuk létre.
érdem es azonban megjegyeznünk: mivel nagyon sok, a fájlrendszer által kezelt hí­ Ennek minden egyes eleme egy átm eneti adattárakból felépülő láncra mutat. A
vás van, és mivel a fájlrendszer olyan szervezésű, amilyen, a különböző d o x x x el­ W R ITE JM M E D jelzi, ha a blokk tartalm ának megváltozása után nyomban le­
járások nagyszámú állományban vannak szétszórva. A proto.h az állományok sze­ mezre kell írni, és a ONE SH O T bit jelzi, hogy a blokkra valószínűleg nem lesz
rint szervezett, így kényelmes lehetőséget biztosít egy olyan állomány forráskódjá­ ham arosan szükség. Jelenleg egyik sem használatos, de lehetőséget ad a módosí­
nak a megtalálására, amely egy jól m eghatározott rendszerhívást kezel. tásra, ha valakinek briliáns ötlete tám ad a hatékonyság és megbízhatóság növelé­
Végezetül a glo.h definíciós állomány (21400. sor) definiálja a globális válto­ sére alkalmas gyorsítótár-kezelésre.
zókat. A beérkező, illetve a válaszüzenetek átm eneti tárolóhelye szintén itt ta­ Végezetül az utolsó sorban a H ASH _M ASK kerül definiálásra az include/minix/
lálható. Ezek a változók a fájlrendszer tetszőleges része által elérhetők, amit az config.h definíciós állományban beállított NR_BUF_HASH változó értékének
E X T E R N m akróutasítás m ár megismert trükkös használata tesz lehetővé. A tá­ megfelelően. Azt, hogy egy blokk átm eneti adattárának keresésekor a buf_hash
rolási hely lefoglalása, éppúgy, mint a M INIX 3 más részeinél, a table.c forráskód melyik eleménél kezdjük a keresést, a H ASH _M ASK blokkazonosítóval vett ES
lefordításakor történik meg. művelet eredménye határozza meg.
A processzustábla fájlrendszerbeli részét az fproc.h definíciós állomány (21500. A file.h állomány (21700. sor) tartalm azza a közbenső (E X T E R N által definiált)
sor) tartalmazza. A zjproc töm böt az E X T E R N makróutasítás segítségével hozzuk filp táblát, amelyet a pillanatnyi fájlpozíció és i-csomópont m utatójának tárolására
létre. Ez hordozza az üzemmód maszkot, a pillanatnyi gyökér- és munkakönyvtár használunk (lásd 5.39. ábra). Ez m eghatározza egyben azt is, hogy az illető állo­
i-csomópontját kijelölő m utatókat, az állományleíró tömböt, a felhasználói és cso­ mány olvasható-e, írható-e, vagy mindkét művelet elvégezhető-e rajta, illetve azt,
portazonosítót, valamint minden egyes processzus terminálazonosítóját. A pro­ hogy hány állományleíró m utat pillanatnyilag erre az elemre.
cesszus azonosítója és csoportazonosítója szintén itt található meg. A processzus A fájlzárolási tábla, file jo c k (E X T E R N által definiált), a lock.h definíciós állo­
azonosítója szerepel a processzuskezelőben található processzustáblában is. mányban (21800. sor) található meg. A tömb m éretét a const.h definíciós állomány­
Néhány további mező arra használatos, hogy a működésük alatt felfüggeszthető ban 8-ra beállított N R LO CKS változó határozza meg. H a egy M INIX 3-rendsze-
rendszerhívások (például üres adatcsőből történő olvasások) param étereit tárol­ ren többfelhasználós adatbázist szeretnénk létrehozni, ezt a számot kell megnö­
juk bennük. Az fp_suspended és az fp jevive d mezők valójában csak egy-egy bitet velnünk.
igényelnének, azonban majdnem minden fordító jobb végrehajtható kódot tud ké­ Az inode.h definíciós állományban (21900. sor) definiáljuk (az E X T E R N hasz­
szíteni, ha a mező egy teljes karaktert és nem csak egy bitet foglal el. A POSIX nálatával) az inode elnevezésű i-csomópont táblát. Ez tartalm azza a pillanatnyilag
szabvány által hívott FD C LO EXEC bitjei számára szintén rendelkezésre áll egy használatban lévő i-csomópontokat. Am int azt m ár az előzőkben megtárgyaltuk,
mező. Ezek azt hivatottak jelezni, hogy az adott állományt egy exec rendszerhívás egy állomány megnyitásakor annak i-csomópontja a m em óriába kerül, és az állo­
végrehajtása után azonnal be kell-e zárni. mány bezárásáig ott is marad. Az inode struktúra definíciója olyan információk-
590 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 591

ról gondoskodik, amelyek a mem óriában megvannak ugyan, de a lemezen lévő 5.7.2. A táblák kezelése
i-csomópontba nem íródnak be. Megemlítjük, hogy ennek mindössze egy válto­
zata létezik, és semmi sem változatfüggő benne. Amikor a lemezről beolvassuk A legfontosabb táblák mindegyikéhez - a blokkokhoz, az i-csomópontokhoz, a
az i-csomópontot, a V I, illetve V2/V3 fájlrendszerek közti különbségek kom pen­ szuperblokkokhoz stb. tartozó táblák mindegyikéhez - tartozik egy olyan állo­
zálódnak. A fájlrendszer többi részének egyáltalán nem szükséges a lemezen lévő mány, amely a táblát kezelő eljárásokat fogja össze. A fájlrendszer többi része erő­
fájlrendszer form átum át ismernie, legalábbis addig nem, amíg el nem jön a meg­ teljesen kihasználja ezeket az eljárásokat, amelyek a legfontosabb csatolófelületet
változott információ lemezre írásának ideje. alkotják a táblák és a fájlrendszer között. Éppen ezért célszerű a fájlrendszer for­
Ezen a ponton a mezők többségének elnevezése önm agáért beszél. Az i_seek ráskódjának tanulmányozását ezekkel az állományokkal kezdeni.
megérdemel azonban néhány megjegyzést. M ár korábban is említettük: amikor a
fájlrendszer észleli, hogy egy állomány folyamatos olvasás alatt áll, egy optimali­
zálás eredm ényeként még azelőtt megpróbál a blokkgyorsítótárba blokkokat be­ A blokkok kezelése
olvasni, hogy erre irányuló kérés történt volna. Közvetlen elérésű állományoknál
nincs előreolvasás; amikor egy lseek rendszerhívás történik az i_seek mező egyesre A blokkgyorsítótárat a cache.c állományban lévő eljárások kezelik. Ez az állomány
állítódik, hogy az előreolvasást megakadályozza. az 5.40. ábrán feltüntetett kilenc eljárást foglalja magában. Ezek közül az első, a
A param.h nevű állomány (22000. sor) hasonló a processzuskezelőben lévő get_block eljárás (22426. sor) az, amelynek használatával a fájlrendszer megkapja
ugyanilyen elnevezésű állományhoz. Param étereket tartalm azó üzenetm ezők szá­ az adatblokkokat. Amikor a fájlrendszer valamely eljárásának szüksége van egy fel­
m ára definiál neveket, így például a program kód hivatkozhat az m jn .m l_ p l he­ használói adatblokkra, könyvtárblokkra, szuperblokkra vagy bármely más blokkra,
lyett az m j n . buffer névvel - ami az .inni üzenet számára fenntartott átm eneti a get_block eljárást hívja meg, átadva annak az eszköz- és a blokkazonosító számot.
adattár egy mezőjét választja ki. A get_block eljárás, hívása után, először megvizsgálja a blokkgyorsítótárat, hogy a
A super.h (22100. sor) definíciós állományban találjuk a super_block nevű szu­ kívánt blokk nincs-e ott véletlenül. H a ott van, akkor visszaküldi a blokk mutatóját,
perblokktábla definícióját. A rendszer elindulása után ide töltődik be a gyökéresz- ha nem, be kell a blokkot olvasnia. A gyorsítótárban a blokkok az NR_BUF_HASH
köz szuperblokkja. További fájlrendszerek felcsatolásakor ezek szuperblokkjai által összefűzött láncok formájában vannak egymáshoz kapcsolva. Az NR_BUF_
szintén ide íródnak be. Éppúgy, mint a többi tábla esetén, a super_block szintén az H A SH az N R BUF változóval együtt, amely a blokkgyorsítótár m éretét határozza
E X T E R N m akróutasítás segítségével definiálódik. meg, állítható változó. M indkettő értékét az include/minbc/config.h definíciós állo­
mányban tudjuk szabályozni. Ennek a résznek a végén néhány m ondat erejéig majd
visszatérünk még a blokkgyorsítótár és a hasítótábla méretének optimális beállításá­
A fájlrendszer tárolóhely-foglalása ra. A FL4SH M A SK értéke N R BUF H A SH - 1. 256 hasítólánc esetén a maszk ér­
téke 255, így az összes különböző láncban szereplő blokkok azonosítója ugyanarra a
Az ebben a részben utolsóként tárgyalandó állomány nem definíciós állomány. 8 bitből álló karakterfüzérre végződik, azaz 00000000, 00000001,... vagy 11111111.
Mindazonáltal, ahogy azt a proccsszuskczelő vizsgálatakor már m egtettük, most is Az első lépés rendszerint az, hogy a blokk hasítóláncát keressük meg. Egyetlen
helyénvalónak tűnik a definíciós állományok áttekintése után azonnal megvizsgál­ speciális esetben azonban, amikor egy kevés adatot tartalm azó állományból épp
ni a table.c állományt, hiszen ennek lefordításához az összes definíciós állomány­ egy üres helyet olvasunk be, az előbb em lített keresés nem történik meg. Ez az oka
ra szükségünk van. A legtöbb, m ár em lített adatszerkezet - a blokkgyorsító, a filp
tábla, és így tovább -, éppúgy, mint a fájlrendszer globális változói és a processzus­ Eljárás neve Tevékenység
tábla fájlrendszerbeli része, az E X T E R N makróutasításon keresztül definiálódik. get_block Egy blokk írásra vagy olvasásra való elővétele
Am int azt a M INIX 3 más részeinél m ár láttuk, a tárolóhely lefoglalása valójá­ put_block A get_block által korábban elővett blokk visszaküldése
ban a table.c fordításakor történik meg. Ez az állomány azonban tartalm az még alloc_zone Új zóna foglalása (az állomány meghosszabbítása céljából)
két, kezdeti értékekkel feltöltött töm böt is. A call_yector az a központi ciklusban free_zone Egy zóna felszabadítása (az állomány törlésekor)
használt, mutatókból álló tömb, amely meghatározza, hogy melyik eljárás melyik rw_block Egy blokk lemez és gyorsítótár közötti átvitele
rendszerhívási számot kezeli. Hasonló táblával korábban a processzuskezelés so­ invalidate Valamely eszközhöz tartozó, a gyorsítótárban lévő összes blokk törlése
rán találkoztunk. flushall Egy eszköz megváltozott tartalmú blokkjainak kiírása
rw scattered Szétszórt adatok eszközről eszközre történő olvasása/írása
rmjru Egy blokk törlése az LRU-listából

5.40. ábra .A blokk-kezelés során használatos eljárások


592 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 593

a 22454. sorban szereplő vizsgálatnak. Máskülönben a forráskód következő két olyat, amit a közeljövőben valószínűleg nem használnak; amennyiben megjelölték,
sora, a blokk azonosítóján egy HASH_M ASK-ka\ vett ÉS m űveletet végrehajtva, akkor a sor elejére kerül, hogy gyorsan újrahasználhassák. Ezt a megoldást azonban
a bp m utató értékét azon lánc kezdőpontjára állítaná, amelyben a keresett blokk sohasem vagy csak nagyon ritkán használják. A RAM-lemezen kívüli csaknem vala­
m egtalálható lenne, ha az a gyorsítótárban helyezkedne el. A következő sorban mennyi blokk, amelyekre a közeljövőben szükség lehet, a sor végére kerül.
kezdődő ciklus ezt a láncot vizsgálja meg, hogy megnézze, valóban benne van-e a A blokk LRU-listában történt áthelyezése után egy újabb ellenőrzés történik,
blokk. H a megtalálja, és az éppen nincs használatban, eltávolítja az LRU-listából. hogy megtudjuk, vajon azonnal lemezre kell-e a blokkot írni. Az előző ellenőrzés­
H a a blokk m ár használatban van, akkor az egyébként sem lesz az LRU-listában. hez hasonlóan, a WRITE IMMED tesztelése is maradványa egy elhagyott gyakor­
A 22463. sorban kapja vissza a hívó a m egtalált blokkot kijelölő m utatót. latnak, jelenleg nincs megjelölve blokk azonnali kiírásra.
H a a blokk nincs a hasítóláncban, akkor nincs a gyorsítótárban sem, így az LRU- Az állomány m éretének növekedésekor az új adatok részére időről időre új
lista legrégebben használt blokkját vesszük elő. A kiválasztott átmeneti adattárat el­ zónákat kell lefoglalni. Ezt a feladatot az alloc_zone eljárás (22580. sor) végzi el
távolítjuk a hozzá tartozó hasítóláncból, hiszen az egy új blokkazonosítót fog kapni, azáltal, hogy egy szabad zónát talál a zónabittérképen. H a az állomány első zóná­
ami egyúttal azt is jelenti, hogy egy másik hasítólánchoz fog tartozni. Amennyiben járól van szó, nem kell a zónabittérképet végigkutatnia; elegendő a szuperblokk
tartalm a a legutóbbi változás óta nem íródott volna lemezre, az most a 22495. sor­ s_zsearch mezőjét megnéznie, amely mindig az adott eszköz első szabad zónájára
ban megtörténik. A flushall eljárás hívásával az összes többi megváltozott tartalmú mutat. Amennyiben nem az első zónáról van szó, az alloc_zone az állomány zónái­
blokk is kiíródik ugyanarra az eszközre. A pillanatnyilag használt blokkok azonban nak együtt tartása érdekében megkísérel egy olyan új zónát találni, amely közel
ilyenkor nem íródnak ki, mivel azok nem tartoznak az LRU-listához. Mindazonáltal, van az aktuális állomány utolsó létező zónájához. Ez úgy történik, hogy a zónabit­
nehezen fogunk blokkot használatban lévőnek találni, hiszen normális esetben egy térképen a keresés ezen utolsó zónától kiindulva kezdődik (22603. sor). A bittér­
adott blokk használat után a put_block eljárás hatására rögtön felszabadul. kép bitjének azonosítója és a zónaazonosító közötti leképezést a 22615. sor való­
Mihelyt rendelkezésünkre áll az átm eneti adattár, annak m inden mezőjét sítja meg oly módon, hogy az első adatzónához az első bitet rendeli hozzá.
(beleértve a b_dev nevűt is) az új param étereknek megfelelően felfrissítjük Az állomány törlésekor zónáinak vissza kell kerülniük a bittérképre. Ezért a
(22499-22504. sor). Ezután a kívánt blokk beolvasható a lemezről. Létezik azon­ free_zone eljárás (22621. sor) felelős, amely mindössze annyit tesz, hogy meghívja a
ban két olyan eset, amikor a blokkot nem szükségszerű beolvasnunk a lemezről. free_bit eljárást param éterként átadva annak a zónabittérképet és a bitazonosítót.
A get block eljárást az only search param éterrel hívjuk. Ez jelölheti, hogy előol­ A free_bit eljárás használatos a szabad i-csomópontok megadására is; term észete­
vasásról van-e szó. Az előolvasás során találunk egy megfelelő átm eneti adattárat, sen ekkor az i-csomópont bittérképet kell számára első param éterként átadni.
amelynek régi tartalm át szükség esetén lemezre írjuk, majd egy új blokkazonosí­ A gyorsítótár kezelése blokkok írását és olvasását kívánja meg. Az rw_block
tót rendelünk hozzá, de b_dev mezőjét a N O D E V változóra állítjuk, ezzel jelezve, (22641. sor) szolgál a lemez és a gyorsítótár közti egyszerű csatolófelületként.
hogy egyelőre még nincs a blokkban érvényes adat. Ennek használatával az rw_ Egyszerre egy blokkot olvas be vagy ír ki. Ehhez hasonlóan létezik az rw jnode,
scattered eljárás tárgyalásánál ismerkedünk majd meg. Az onlyjearch annak jelzé­ amely egy i-csomópontot olvas be vagy ír ki.
sére is felhasználható, hogy a fájlrendszernek egy blokkra csupán felülírás céljából Az állományban található következő eljárás az invalidate eljárás (22680. sor).
van szüksége. Ilyenkor időpazarlás lenne először a régi tartalm at beolvasni. Ezen Ezt egy fájlrendszer lecsatolásakor hívjuk meg például azért, hogy az éppen lecsa­
két eset bármelyikében felfrissítésre kerülnek ugyan a param éterek, de a tényle­ tolt fájlrendszerhez tartozó összes, gyorsítótárban lévő blokkot eltávolítsuk onnan.
ges lemezről olvasás elm arad (22507- 22513. sor). Az új blokk beolvasása után a H a ez nem történne meg, az eszköz újbóli használatakor (egy másik hajlékonyle­
get_block a blokk m utatóját visszaadja a hívójának. mezzel) a fájlrendszer az új blokkok helyett a régieket találná meg.
Tételezzük fel, hogy a fájlrendszernek átm enetileg egy könyvtárblokkra van Korábban említettük, hogy a flushall (22694. sor) eljárást, amely a legtöbb adat
szüksége, m ert abban egy állománynevet kell kikeresnie. A könyvtárblokk meg­ kiírásáért felelős, m inden alkalommal meghívja a get_block, amikor egy megvál­
szerzése céljából ilyenkor a get_block eljárást hívja meg. M iután kikereste az ál­ tozott blokkot eltávolít az LRU-listából. A syne rendszerhívás szintén hívja ezt az
lomány nevét, meghívja a put_block eljárást (22520. sor), hogy a blokk visszake­ eljárást egy adott eszközhöz tartozó összes, megváltozott információt tartalm a­
rüljön a gyorsítótárba, és az átm eneti adattár szabaddá váljék arra az esetre, ha a zó átm eneti adattár lemezre írásához. A syne periodikusan aktivizálódik a fris­
későbbiekban egy másik blokknak lenne rá szüksége. sítő dém on által, és m inden felcsatolt eszközre egyszer hívja a flushall eljárást.
A /put_block/ felelős azért, hogy az újonnan visszaadott blokk az LRU-listába ke­ A flushall eljárás a gyorsítótárat lineáris töm bként kezeli, tehát m inden módosult
rüljön, vagy ritkább esetekben lemezre íródjék. A 22544. sorban dől el, hogy a blokk puffért megtalál, még azokat is, amelyek jelenleg használatban vannak és nincse­
az LRU-lista elejére vagy végére kerül-e. A RAM-lemezeken lévő blokkok mindig a nek benne az LRU-listában. A gyorsítótár m inden pufferét megvizsgálja, és azo­
sor elejére kerülnek. A blokkgyorsítótár nem sokat tud segíteni a RAM-lemezeknek, kat, amelyek a kiürítendő eszközhöz tartoznak, a dirty pointertöm bbe teszi. Ez a
mivel ezek már eleve a memóriába tárolódnak, és I/O-műveletek nélkül is elérhe­ tömb globális, hogy ne a verem ben legyen tárolva. Azután átadja ezt a töm böt az
tők. A /ONE SHOT,i bit alapján dől el, hogy az adott blokkot megjelölték-e mint rw scattered eljárásnak.
594 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 595

A M INIX 3-ban a lemezre írások funkcióját kivették az eszközvezérlőből, és az hasítólánc számára van elegendő hely a m emóriában, az N R BUF H A SH válto­
rwjicattered eljárás (22711. sor) teljes fennhatósága alá helyezték. Ez az eljárás zó értékét általában úgy választjuk meg, hogy az a 2 következő olyan hatványa
megkap egy eszközazonosítót, egy olyan m utatót, amely az átm eneti adattárakat legyen, amely az N R BUFS változónál nagyobb. A szövegben 128 blokknak és
kijelölő m utatók töm bjére mutat, a tömb m éretét jelentő számot és egy olyan jel­ 128 hasítóláncnak megfelelő beállítások fordulnak elő. Az optimális m éret attól
zőt, amely azt mutatja, hogy írásról vagy olvasásról van-e szó. Első dolga a meg­ függ, hogyan használjuk a rendszert, hiszen ez határozza meg, mennyi inform á­
szerzett tömb elemeinek a blokkazonosító számok szerinti csoportosítása, amivel ciót is kell az átm eneti adattárakban tartanunk. A könyv C D -R O M mellékletében
azt éri el, hogy a tényleges írás vagy olvasás hatékony m ódon lesz majd végrehajt­ adott teljes M INIX 3-forráskód 1280 átm eneti adattár és 2048 hasítólánc értékre
ható. Ezután folytonos blokkok vektorát képezi, amelyet átad az eszközvezérlő­ van beállítva. A tapasztalatok azt mutatják, hogy az átm eneti adattárak számának
nek a d e v jo hívásával. Az eszközvezérlőnck nem kell további ütemezést végez­ nagyobbra állításával sem javul lényegesen a M INIX 3 újrafordítása során a rend­
nie. A m odern lemezegységek esetén valószínű, hogy azok elektronikája tovább szer teljesítménye, tehát ennyi elegendő a fordítás minden m enetében a bináris
optimalizálja a kérések sorrendjét, de ezt nem látja a M INIX 3. Az rwjscattered állományok tárolásához. Más jellegű munkáknál kevesebb átm eneti adattár hasz­
eljárást csak a flushall hívja a W RITING jelzővel az előbb em lített módon. Ezen nálata is kielégítő lehet, illetve többet használva belőlük a rendszer teljesítménye
a ponton a blokkazonosító számok eredete is egyszerűen m egérthető. Ezek olyan akár javulhat is.
átm eneti adattárak, amelyek korábban beolvasott blokkokból származó, azonban A CD-ROM -on található standard M INIX 3-rendszer pufferei több mint 5 MB
m ostanára m ár m egváltoztatott adatot tartalmaznak. Az egyetlen, az rw jcattered RAM-ot foglalnak el. Egy másodlagos bináris is van, az image jm a ll, amelyet úgy
eljárást olvasásra felkérő hívás a read.c állományban található rahead eljárástól fordítottak, hogy csak 128 puffért használjon, és így egy kicsit több mint 0,5 MB kell
származik. Itt mindössze annyit kell tudnunk, hogy az rwjcattered hívása előtt a a puffereknek. Ez a rendszer telepíthető csupán 8 MB RAM-mal rendelkező számí­
get_block eljárást hívjuk sorozatosan előolvasó módban, ily m ódon lefoglalva az tógépre. A standard verzió 16 MB-ot igényel. Egy kis ügyeskedéssel akár 4 MB vagy
átm eneti adattárak egy csoportját. Ezek az átm eneti tárak érvényes eszközszámok kisebb memóriával rendelkező gépre is telepíthető.
nélküli blokkazonosítókat tartalmaznak. Ez azonban semmilyen problém át nem
jelent, mivel az rwjcattered hívásakor egy eszközt kijelölő param étert is kap ope-
randusai között. Az i-csomópontok kezelése
Lényeges különbség van abban, ahogy egy eszköz meghajtója az rw jcattered
eljárástól érkező olvasási kérelem re (az ugyanonnan származó írási kérelemhez A blokkgyorsítótár nem az egyetlen olyan tábla, amelynek tám ogató eljárások­
viszonyítva) reagál. A néhány blokk kiírására irányuló kérelm et teljes mértékben ra van szüksége. Az i-csomópont tábla ugyanilyen. Eljárásainak, amelyeket az
ki kell szolgálni, míg a néhány blokk beolvasására irányuló kérelm et a különbö­ 5.41. ábrán soroltunk fel, nagy része m űködését tekintve a blokk-kezelés eljárásai­
ző meghajtók eltérően kezelhetik annak függvényében, hogy az adott meghajtó hoz hasonló.
szempontjából mi számít a leghatékonyabbnak. A rahead eljárás gyakran hívja A getjn o d e eljárás (22933. sor) a get_block eljáráshoz hasonló. H a a fájlrend­
olyan blokkokért is az rw jcattered eljárást, amelyekre valójában nincs is szüksége; szer valamely részének egy i-csomópontra van szüksége, annak megszerzése cél­
a legjobb stratégia tehát: annyi blokkot átadni, amennyit különösebb erőfeszítés jából a g etjn o d e eljárást hívja meg. Ez először végignézi az inode táblát, hogy ab­
nélkül csak lehet, de nem bocsátkozni az egész eszközre kiterjedő őrült keresésbe, ban jelen van-e m ár a keresett i-csomópont. H a igen, megnöveli az i-csomópont
ami jelentős keresési idővel társulhat. A hajlékonylemez meghajtója például egy használati számlálójának értékét, és visszaküldi az i-csomópontot kijelölő m uta­
sáv határánál befejezheti a keresést, és sok más meghajtó is csupán az egymást kö­ tót. Magát a keresést a forráskód 22945-22955. sorok közötti része tartalmazza.
vető blokkokat fogja beolvasni. A beolvasás befejezése után az rw jcattered eljárás H a az i-csomópont nincs a memóriában, akkor az rw jn o d e eljárás meghívásával
az átm eneti adattárak eszközazonosító mezőjének kitöltésével jelöli meg az éppen beolvasásra kerül.
beolvasott blokkokat. H a az adott i-csomópontot használó eljárás befejezte az i-csomóponton kijelölt
Az 5.40. ábra utolsó függvénye az r m jr u elnevezésű (22809. sor). Ez az eljárás műveletek elvégzését, a p u tjn o d e eljárás (22976. sor) meghívásával, amely egyben
az LRU-listából távolít el egy blokkot. Ezt csupán a szintén ebben az állományban az i count használati számláló értékét is csökkenti, visszaküldi az illető i-csomó­
található, get_block eljárás használja, ezért PUBLIC helyett PRIVÁTÉ típusúnak pontot. Amennyiben a számláló értéke zérus, ami azt jelenti, hogy a hozzá tartozó
definiáljuk. Ezzel egyúttal azt is sikerül elérnünk, hogy ezen eljárás az állományon állomány m ár nincs használatban, az i-csomópont a táblából is eltávolítható. Ha
kívüli eljárások számára rejtve maradjon. időközben tartalm a megváltozott, lemezre íródik.
M ielőtt a blokkgyorsítótárak tárgyalását befejeznénk, ejtsünk néhány szót ezek H a az i j i n k mező értéke zérus, vagyis semmilyen könyvtárelem nem m utat az
finomhangolásáról is. Az N R B U F H A S H változónak 2 valamelyik hatványának állományra, az állomány összes zónája felszabadítható. Érdem es megjegyezni,
kell lennie. Amennyiben értéke nagyobb, mint az N R B U F S változó, a hasítólán- hogy a használati számláló értékének és a kapcsolatok számának nullára csökke­
cok átlagos hossza egynél kisebb lesz. H a nagyszámú átm eneti adattár, illetve sok nése eltérő okokkal és következményekkel járó, két különböző esemény. H a az
596 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 597

Eljárás neve Tevékenység 1. Kiszámítja, hogy a kívánt i-csomópontot melyik blokk tartalmazza.
getjnode Egy i-csomópont memóriába töltése 2. A getjblock eljárást felhasználva beolvassa ezt a blokkot.
putjnode A továbbiakban már nem használandó i-csomópont visszaküldése 3. Kiolvassa abból az i-csomópontot, amelyet ezután az inode táblába másol.
allocjnode Új i-csomópont foglalása (új állomány részére) 4. A put_block eljárást felhasználva visszaküldi a blokkot.
wipejnode Egy i-csomópont néhány mezője tartalmának törlése
freejnode l-csomópont felszabadítása (állomány törlésekor) Az rw jn o d e eljárás működése valójában az itt vázoltnál egy kicsit bonyolultabb,
updatejimes l-csomópont időmezői tartalmának frissítése így annak néhány kiegészítő függvényre is szüksége van. Először is, mivel a pontos
rwjnode l-csomópont memória és lemez közötti átvitele idő lekérdezése kernelhívást igényel, abban az esetben, ha az i-csomópont időm e­
oldjcopy l-csomópont tartalmának V1 (lemezen használt) formátumúvá történő átalakítása zőinek m egváltoztatására van szükség, az i-csomópont mem óriában töltött ideje
newjcopy VI formátumban beolvasott i-csomópont tartalmának átalakítása alatt csak beállítjuk az i-csomópont i_update m ezőjének bitjeit. Amennyiben ezen
dupjnode Annak jelzése, hogy az adott i-csomópontot még más processzus is használja m ező értéke az i-csomópont lemezre írásának pillanatában nullától különböző,
meghívjuk az u pdatejim es függvényt.
5.41. ábra. Az i-csomópont kezelése során használatos eljárások Másodszor, a M INIX történeti fejlődése is gondot jelent: a lemezen lévő i-cso­
m ópontok régi, VI fájlrendszernek megfelelő szerkezete az új, V2 fájlrendszer­
i-csomópont egy adatcsövet jelent, m inden zónát fel kell szabadítani még akkor is, től teljesen eltérő. Az átalakításokat két függvény, az o ld jco p y (23168. sor) és a
ha a kapcsolatok száma esetleg nem nulla. Ez a helyzet például akkor következik new jcopy (23214. sor) végzi el. Az első a mem óriában lévő i-csomópont inform á­
be, amikor egy adatcsőből olvasó processzus felszabadítja az adatcsövet. Egyetlen ciót alakítja át a VI típusú fájlrendszer által megkívánt formátum úra. A második
processzus számára ugyanis nincs értelm e adatcsövet fenntartani. egy ugyanilyen átalakítást végez a V2 és V3 típusú fájlrendszer i-csomópontjai-
Új állomány létrehozásakor az allocjnode eljárással (23003. sor) új i-csomó­ ra. Mivel ezen függvények mindegyike csak ebben az állományban kerül hívásra,
pontot kell lefoglalni. A M INIX 3 az eszközök megnyitását csak olvasható állapot­ m indkettőjüket PRIVÁTÉ típusúként definiáljuk. Mind a két függvény oda és visz-
ban engedélyezi, ezért az eszköz írhatóságának biztosítása érdekében ellenőrizzük sza is elvégzi az átalakítást (lemezről m em óriába és m emóriából lemezre).
a szuperblokkot. Új állomány létrehozásakor bármely i-csomópont megfelel, el­ A M INIX régebbi változatait olyan rendszereken hívták életre, amelyek az
térően a zónáktól, ahol szem előtt tartjuk az ugyanahhoz az állományhoz tartozó Intel processzoroktól eltérő bájtsorrendet használnak, és várhatóan a jövőben is
zónák egymáshoz közel történő elhelyezését. Az i-csomópont bittérkép átvizsgálá­ alkalmazni fogják a M INIX 3-at ilyen gépeken. A saját lemezén minden rendszer
sához szükséges idő csökkentése céljából a szuperblokk azon mezője által nyújtott az eredeti bájtsorrendet használja; a szuperblokk sp->native mezője azonosítja
segítséget is kihasználjuk, amelyben az első, jelenleg még felhasználatlan i-csomó- be a használt bájtsorrendet. Szükség esetén mind az oldjcopy, mind a new jcopy
pont helye van feljegyezve. függvények a conv2, illetve conv4 függvényeket hívják meg a bájtsorrend felcseré­
Az i-csomópont kiválasztása után a getjn o d e eljárás meghívásával a m em óriá­ léséhez. Nyilvánvaló, hogy mindaz, amit eddig m ondtunk a M INIX 3-ra nem vo­
ban lévő táblába kerül, majd mezői, részben a program kód által (23038- 23044. natkozik, m ert az nem támogatja a V I fájlrendszert alkalmazó lemezek használa­
sor) részben a w ipejnode eljáráson keresztül (23060. sor) feltöltődnek. A munka tát. Továbbá, a könyv írásáig senki sem akarta a M INIX 3-at eltérő bájtsorrendű
ezen speciális megosztására azért került sor, m ert a w ipejnode eljárásra a fájl- gépre alkalmazni. D e ezek a lehetőségek m egm aradtak azokra a napokra, amikor
rendszer más részében az i-csomópont néhány mezőjének (de nem mindnek!) ki­ a M INIX 3-at még sokoldalúbbá akarnák tenni.
nullázásakor van szükség. A d u p jn o d e eljárás (23257. sor) az i-csomópont használati számlálójának ér­
Az állomány törlése után a hozzá tartozó i-csomópontot a freejn o d e eljárás tékét növeli meg, és egy, m ár megnyitott állomány újbóli megnyitásakor kerül
(23079. sor) szabadítja fel. Ekkor csupán annyi történik, hogy az i-csomópont bit­ meghívásra. A második megnyitáskor m ár nincs szükség az állomány i-csomó­
térkép megfelelő bitjének értéke nullára változik, és a szuperblokkban tárolt, az pontjának lemezről történő ismételt beolvasására.
első használaton kívüli i-csomópontot kijelölő mező felfrissítődik.
Az updatejim es elnevezésű függvény (23099. sor) arra használatos, hogy a
rendszerórától megkaphassuk a pontos időt, illetve megváltoztathassuk a frissítés­ A szuperblokk-kezelés
re szoruló időmezők tartalm át. A stat és az fstat rendszerhívások szintén használ­
ják az updatejim es függvényt, így ezt PUBLIC típusúnak definiáljuk. A szuperblokkokat és a bittérképeket kezelő eljárásokat a super.c állomány tartal­
Az rw jn o d e eljárás (23125. sor) az rwj>lock eljáráshoz hasonlít. Egy i-csomó- mazza, amelyben mindössze öt eljárás (lásd 5.42. ábra) található.
pont lemezről m em óriába töltésére szolgál, amely a következő lépéseken keresz­ H a egy i-csomópontra vagy zónára van szükségünk, a korábban látottaknak
tül kerül kivitelezésre. megfelelően az allocjnode vagy az alloc_zone eljárások valamelyikét hívjuk meg.
598 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 599

Eljárás neve Tevékenység A következő függvény, a mounted (23489. sor) csupán egy blokkeszköz bezá­
alloc_bit Egy bit lefoglalása a zóna- vagy i-csomópont bittérképben rásakor kerül meghívásra. Egy eszköz utolsó bezárásakor a gyorsítótárban hozzá
free_bit Egy bit felszabadítása a zóna- vagy i-csomópont bittérképben tartozó adatokat rendszerint kidobáljuk onnan. Ez azonban egyáltalán nem kí­
qet_super Egy eszköz szuperblokktáblában való keresése vánatos, ha az adott eszköz véletlenül egy felcsatolt fájlrendszerhez tartozik. A
qet_block_size A használandó blokkméret lekérdezése
mounted függvényt az eszköz i-csomópontját kijelölő m utatóval hívjuk meg. Ha
mounted Annak meghatározása, hogy egy adott i-csomópont egy felcsatolt az eszköz a gyökéreszköz, vagy egy felcsatolt fájlrendszerhez tartozik, a függvény
(vagy a gyökér-) fájlrendszerben van-e TRUE értékkel tér vissza.
read_super Egy szuperblokk beolvasása Végezetül itt találjuk még a read super eljárást (23509. sor) is. Ez részben az
rw_block, illetve rw jn o d e eljárásokhoz hasonló, azonban csak olvasás esetén kerül
5.42. ábra. A szuperblokk- és a bittérképkezelés során használatos eljárások meghívásra. A szuperblokk egyáltalán nem olvasódik be a blokkgyorsítótárba, ha­
nem közvetlenül az eszközről olvasódik be az első 1024 bájt. A rendszer normális
A megfelelő bittérkép átvizsgálására ezek mindegyike az alloc_bit (23324. sor) el­ üzemeltetése során a szuperblokk lemezre írása nem szükséges. A read_super el­
járást használja. A vizsgálat a következő három, egymásba ágyazott ciklusból áll: lenőrzi azon fájlrendszer változatát, amelyről épp az előbb olvasott be, és szükség
esetén elvégzi az átalakításokat. így a szuperblokk mem óriában lévő másolata még
1. A külső ciklus az adott bittérkép blokkjain fut végig. akkor is a szabványos szerkezettel fog rendelkezni, ha a lemezről történő beolva­
2. A középső ciklus egy blokk szavain fut végig. sás során esetleg még teljesen más szerkezettel vagy bájtsorrenddel rendelkezett.
3. A legbelső ciklus egy szó bitjein fut végig.

A középső ciklus azt vizsgálja meg, hogy az aktuális szó megegyezik-e egy olyan A fájlleírók kezelése
szóval, amely csupa egyest tartalmaz. H a igen, az illető szóban sem szabad i-cso-
m ópont, sem szabad zóna nincsen, így a következő szó kerül vizsgálatra. Ha ta­ A M INIX 3 a fájlleírók és a filp tábla kezeléséhez speciális eljárásokkal rendelke­
lálunk egy olyan szót, amely ettől eltérő értékű, vagyis legalább egy darab 0 bit zik (lásd 5.39. ábr), amelyek a filedes.c állományban találhatók. Egy állomány lét­
szerepel benne, működésbe lép a legbelső ciklus, hogy megtalálja a szabad (vagyis rehozásakor vagy megnyitásakor szükségünk van egy szabad állományleíróra és a
0 értékű) bitet. H a az összes blokk átvizsgálása után sem találunk ilyen szót, tehát filp táblában egy szabad rekeszre, amelyek m egkeresését a g e tjd eljárás (23716.
sem szabad i-csomópontok, sem szabad zónák nincsenek, a N O B IT (0) értéket sor) végzi el. Ezeket azonban általában nem jelöljük meg azonnal, hiszen ahhoz,
kapjuk vissza. Az efféle keresések nagyon sok processzoridőt igényelnek, de az hogy biztosak lehessünk a create és az open rendszerhívások sikeres végrehajtásá­
alloc_bit eljárásnak kezdetben átadott, az első használaton kívüli i-csomópontra ban, még jó néhány egyéb ellenőrzést is el kell végeznünk.
vagy zónára m utató szuperblokkmezők éppen abban segítenek, hogy ezek a kere­ A g e tjilp eljárást (23761. sor) használjuk annak eldöntésére, hogy az állomány-
sések csak rövid ideig tartsanak. leíró elérhető-e. H a igen, a g etjilp eljárás ennek filp m utatóját adja vissza.
Egy bit felszabadítása sokkal egyszerűbb, mint annak lefoglalása, m ert semmi­ Az utolsó eljárás a.fin d j i l p eljárás (23774. sor). Annak eldöntéséhez szükséges,
féle keresésre nincs szükség. A free_bit eljárás (23400. sor) meghatározza, hogy a vajon egy processzus nem egy megszakadt adatcsőbe ír-e (ami azt jelenti, hogy az
bittérkép melyik blokkja tartalm azza a felszabadítandó bitet, majd nullára állítja adatcső egy másik processzus számára olvasás céljából nincs megnyitva). A filp
azt. Ehhez először meghívja a get_block eljárást, elvégzi a m em óriában a kívánt bit táblában elvégezve egy teljes körű keresést, beazonosítja a lehetséges olvasókat.
nullázását, majd meghívja a put_block eljárást. H a egyet sem talál, az adatcső megszakad és az írás meghiúsul.
A get_super elnevezésű következő eljárás (23445. sor) a szuperblokktáblát vizs­
gálja meg és abban egy adott eszközt keres. Egy fájlrendszer felcsatolásakor ellen­
őrizni kell például, hogy a fájlrendszer nincs-e m ár felcsatolva. Ez az ellenőrzés Fájlzárolás
úgy is elvégezhető, hogy a g etsuper eljárást az adott állományrendszerhez tartozó
eszköz kikeresésére kérjük fel. H a nem találja meg a keresett eszközt, a fájlrend­ A POSIX rekordzároló függvényeit az 5.43. ábrán láthatjuk. Az állomány egy
szer még nincs felcsatolt állapotban. részét az fenti rendszerhívás végrehajtásakor, kiválasztva az F S E T L K vagy az
A M INIX 3 esetén a fájlrendszer-kiszolgáló képes eltérő m éretű blokkokkal is F SE T LK W kérések közül a megfelelőt, zárolhatjuk az írás és olvasás, vagy csak
dolgozni, de egy partícióban csak egyféle használható. A get_blokk_size függvény­ az írás elől. Azt, hogy az adott állomány egy része zárolt állapotban van-e, az F_
nyel (23467. sor) lehet lekérdezni a blokkméretet. Az adott eszköz szuperblokk- G E T L K kérés használatával lehet eldönteni.
táblájában keres, és ha az eszköz fel van csatolva, akkor a blokkm éretet adja visz- A lock.c állományban mindössze két függvény található. Az fenti rendszerhívás
sza. H a az eszköz nincs felcsatolva, akkor a M IN BLO K K SIZ E értéket adja. a lock_op függvényt (23820. sor) az 5.43. ábrán bem utatott műveletek valamelyi-
600 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 601

Kérés kódja Jelentés elvégző eljárást. Ezt a c a llje c s elnevezésű eljárásokat kijelölő m utatók tömbjéből
F SETLK Az állomány egy adott részének írás és olvasás elől való zárolása a ca lljir értékét m utatóként használva választjuk ki.
F SETLKW Az állomány egy adott részének írás elől való zárolása A vezérlés központi ciklusba történő visszakerülése után, ha a d o n tjep ly jelzőt
F GETLK Annak meghatározása, hogy az állomány egy adott része zárolás alatt áll-e korábban megfelelően állítottuk be, nem lehetséges válasz küldése (például egy
processzust azért függesztettünk fel, m ert üres adatcsőből próbált meg olvasni).
5.43. ábra. A POSIX rekordzároló műveletei. Az egyes műveleteket az fenti rendszerhívás Egyébként a válaszküldésen van a sor a reply (24087. sor) hívásával. A központi
használatával aktiválhatjuk ciklus utolsó utasítását oly m ódon szerkesztették meg, hogy az érzékeli egy állo­
mány szekvenciális beolvasását, és a rendszer teljesítményének javítása érdekében
kének a kódjával hívja meg. Ez a kiválasztott terület elérhetőségét illetően végez a gyorsítótárba olvassa annak következő blokkját, még mielőtt erre külön utasítást
el néhány hibaellenőrzést: ha egy új zárolást hozunk létre, az nem ütközhet egy kapna.
m ár meglévő zárolással, illetve egy létező zárolásból, annak eltávolításakor nem Két másik függvény közvetlenül kapcsolódik a fájlrendszer központi ciklusához.
jöhet létre két új zárolás. Bármilyen zárolás feloldásakor az ugyanebben az állo­ A getjvork eljárás (24099. sor) azt ellenőrzi, hogy egy korábban felfüggesztett eljá­
mányban található másik függvény, a lockjevive (23964. sor) kerül meghívásra. rás nem került-e időközben folytatható állapotba. H a igen, ez az eljárás elsőbbsé­
A lock_revive függvény működésbe hozza az eddigi zárolások m iatt felfüggesztett get élvez az új üzenetekkel szemben. A fájlrendszer csak akkor hívja új üzenetért
processzusok mindegyikét. Ez a módszer azonban egy kompromisszumon alap­ az operációs rendszer központi részét (24124. sor), ha m ár nincs több elvégzendő
szik; annak pontos meghatározása, hogy mely processzusok vártak egy adott zá­ belső feladat. Néhány sorral továbblépve találjuk a reply (24159. sor) hívást, amely
rolás m egszüntetésére, további program kódot igényelne. Azokat a processzuso­ azután hívódik, hogy a rendszerhívás befejeződött, akár sikeresen, akár nem. Ez
kat, amelyek újraéledésük után még mindig zárolt állományra várakoznak, újra üzenetet küld vissza a hívónak. A processzust leállíthatja egy szignál, ezért az ope­
felfüggesztjük. Ez a stratégia azon alapul, hogy a zárolást csak ritka esetekben rációs rendszer központi része által visszaküldött állapotkódot figyelmen kívül
használjuk. Amennyiben a M INIX 3 alatt egy sokfelhasználós központi adatbá­ hagyjuk. Ebben az esetben egyébként sincs mit tenni.
zis kiépítése lenne a feladatunk, a fenti stratégiát más form ában lenne kívánatos
megvalósítanunk.
A lo ckjevive függvényt hívjuk meg abban az esetben is, amikor egy zárolás alatt A fájlrendszer kezdeti beállítása
lévő állományt bezárunk. Ez olyankor történhet meg például, amikor egy zárolt
állományon még m űveleteket végző processzust szüntetünk meg. A main.c állomány fennm aradó része olyan függvényekből áll, amelyek a rendszer
elindításakor használatosak. A legfontosabb szerepet azf s j n i t játssza, amely még
a fájlrendszer központi ciklusának megkezdése előtt hívódik meg. A 2. fejezetben
5.7.3. A főprogram a processzusok ütem ezésének vizsgálatakor láttuk a 2.43. ábrán a M INIX 3 indítá­
sakor a porcesszusok kezdeti ütemezését. A fájlrendszer alacsonyabb prioritással
A fájlrendszer központi ciklusa a main.c állományban található meg a 24040. sor­ lett beütemezve a sorban, mint a processzuskezelő, tehát biztosak lehetünk, hogy
ral kezdődően. Szerkezetét tekintve nagyon hasonló a processzuskezelőnél és az indításkor a processzuskezelőnek esélye van arra, hogy előbb fusson, mint a fájl-
I/O-eszközkezelőknél megismert központi ciklusokhoz. A g etjvo rk hívása a kö­ rendszer. A 4. fejezetben vizsgáltuk a processzuskezelő inicializálását. A PM fel­
vetkező kérést tartalm azó üzenet megérkezését várja (hacsak egy olyan procesz- építi a processzustáblát, hozzáadva magát és a betöltési m em óriakép más procesz-
szus folytathatóvá nem válik, amely korábban egy adatcsőben vagy egy term inálon szusait, aztán mindegyikről üzenetet küld a fájlrendszernek, így az FS inicializálni
került felfüggesztésre). Ezenkívül a who globális változóhoz hozzárendeli a hívó tudja a megfelelő elem eket a fájlrendszer FS részében. Most m ár folytathatjuk a
processzustáblája megfelelő rekeszének azonosítóját, illetve a c a l l j r globális vál­ tevékenység második részével.
tozóhoz a végrehajtandó rendszerhívás azonosítóját. Am ikor a fájlrendszer elindul, azonnal belép saját ciklusába az f s jn it- ben a
A központi ciklusba való visszatérés után három jelző beállítása történik meg: 24189-24202 sorokban. Az első utasítás a ciklusban a récéivé hívása, amely lekér­
az fp kijelöli a hívó processzustáblájának megfelelő rekeszét, a super_user meg­ dezi a PM-nek a 18235. sorban meghívott p m j n i t inicializáló függvény által kül­
adja, hogy a hívó a szuperfelhasználó-e, vagy sem. A bejelentésüzeneteknek dött üzenetét. M inden üzenet tartalm azza a processzusszámot és PID-et. Az elsőt
van a legnagyobb prioritása, a SYS SIG üzenetet ellenőrzi először, hogy meg­ indexként használja a fájlrendszer a processzustáblázathoz, a m ásodikat pedig el­
tudja, a rendszer leállítás állapotában van-e. A második legnagyobb prioritású a m enti az fp _pid mezőben. Ezután a szuperfelhasználó valós és effektív uid-jét, gid-
SYS A LA R M , ami azt jelenti, hogy a fájlrendszer által beállított időtartam lejárt. jét és a csupa 1-est tartalm azó umask-ot állítja be. Amikor a N Ő N E szimbolikus
A N O T IF Y _M E SSA G E azt jelenti, hogy egy eszközvezérlő készen áll és d ev jta tu s érték érkezik az üzenet processzusszám mezőjében, akkor a ciklus befejeződik, és
állapotba került. Ezután következik a fő mutatvány - meghívjuk a rendszerhívást üzenetet küld vissza a processzuskezelőnek, jelezve, hogy m inden rendben.
602 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 603

Ezután a fájlrendszer saját inicializálása befejeződik. Először fontos konstan­ kok össze vannak kapcsolva. A megértéshez segítségül szolgálhat, ha megvizsgál­
sok értékének érvényességét ellenőrzi. Ezután több függvényhívás következik, juk, hogyan is alakul ki az 5.37. ábrán bem utatott állapot. A gyorsítótár b u f _pool
amelyek inicializálják a blokkgyorsítótárat, az eszközáblázatot, betöltik a RAM- függvény általi kezdeti beállítása után az összes átm eneti adattár azonnal az LRU-
lemezt, ha kell, és betöltik a gyökéreszköz szuperblokkját. Ettől a pillanattól a listába kerül, és amint azt az 5.44.(a) ábrán vázoltuk, mindegyikőjük a 0. hasító-
gyökéreszköz elérhető és egy ciklus indul a processzustábla FS részének ellenőr­ lánchoz kapcsolódik hozzá. H a szükségünk van egy átm eneti adattárra, illetve
zésére, és a betöltési memóriaképbeli valamennyi processzus felismeri a gyökér­ amíg az használatban van, az 5.44.(b) ábrán bem utatott helyzethez jutunk. Itt azt
könyvtárat, és azt használja munkakönyvtárként (24228-24235. sor). láthatjuk, hogy az egyik blokk az LRU-listából eltávolításra került, és most egy
A z fs jn it, miután befejeződött a processzuskezelővel a kommunikációja, elő­ másik hasítóláncban található.
ször a b u f jjo o l elnevezésű függvényt hívja meg (24132. sor). Ez a blokkgyorsítótár A blokkokat rendszerint azonnal felszabadítjuk, amelyek ezután nyomban visz-
által használt láncolt listákat hozza létre. Az 5.37. ábra a blokkgyorsítótár alapál­ szakerülnek az LRU-listába. Az 5.44.(c) ábra m utatja be a blokk LRU-listába való
lapotát mutatja, amikor mind az LRU-listában, mind a hasítóláncban lévő blok- visszakerülése utáni helyzetet. A nnak ellenére, hogy ezt a blokkot már nem hasz­
náljuk, szükség esetén a m ár kiolvasott információt belőle újra kiolvashatjuk, így
a blokkot a hasítóláncban megtartjuk. A rendszer huzamosabb működése során
majdnem minden blokk felhasználásra kerül és a különböző hasítóláncok között
lesz véletlenszerűen szétszórva. Az LRU-lista ekkor az 5.37. ábrának megfelelően
NULL fog kinézni.
A b u f _pool után a build dump függvény hajtódik végre, amit majd később vizs­
gálunk az eszközkezelő más függvényeivel együtt. Ezután a lo a d ja m hívódik
meg, amely a következőkben tárgyalandó igetenv (24241. sor) függvényt használja.
Ez a függvény az indítóparam éter nevét kulcsként használva lekérdezi a kerneltől
a numerikus eszközazonosítót. Ha egy működő M INIX 3-rendszerben kiadjuk a
sysenv parancsot, akkor azt látjuk, hogy kim enetként a sysenv az eszközöket num e­
rikusán jeleníti meg, például

rootdev=912

A fájlrendszer számokkal azonosítja az eszközöket. A szám értékét a 256 x major


+ minor képlet adja, ahol major a főeszközszám, minor pedig a mellékeszközszám.
A példában a major értéke 3, a minor értéke 144, ami a /dev/cOdlpOsO eszköznek felel
meg, amely szokásos telepítési helye a M INIX 3-nak két lemezmeghajtós gépeken.
A lo a d ja m függvényhívás (24260. sor) m emóriahelyet foglal a RAM-lemez
számára, és betölti ide a gyökérkönyvtárát, ha az indítóparam éter ezt előírja. Ez
Vége Eleje az igetenv függvényt használja a rootdev, ramimagedev és ramsize param éterek le­
kérdezésére, amelyek az indítási környezetben lettek beállítva (24278-24280. sor).
H a az indítóparam éterek között szerepel a

rootdev=ram

akkor a ramimagedev nevű eszközről a RAM-lemezbe másolja a gyökérfájlrendszert,


blokkról blokkra, figyelmen kívül hagyva a fájlrendszer adatszerkezetét. Ha a
ramsize indítóparam éter nagyobb, mint a betöltési eszköz fájlrendszerének mérete,
akkor is a kért terület foglalódik le, és a RAM-lemez fájlrendszer m éretét megnöve­
li a param éter szerinti m éretre (24404-24420. sor). Ez az egyetlen alkalom, amikor
5.44. ábra. A blokkgyorsítótár inicializálása. (a) Mielőtt még bármely átmeneti adattár a fájlrendszer valaha is szuperblokkot ír, de csakúgy, mint a szuperblokk olvasása­
használatban lenne, (b) Egy blokk kérése után. (c) A blokk felszabadítása után kor, most sem kerül gyorsítótárba, hanem a d e v jo közvetlenül az eszközre írja.
5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 605
604

Két dolgot érdem es itt megemlíteni. Az első a 24291-től 24307. sorokban lévő eljárások. (Akárcsak a processzuskezelőnél, a fájlrendszerben is használatos az a
programrészlet, amely a CD-ROM -ról történő indítást kezeli. E rre használatos megállapodás, hogy az xxx rendszerhívást a do_XX X névre hallgató eljárás való­
a cdprobe függvény, amelyet nem tárgyaltunk. Az érdeklődő olvasó megnézheti sítja meg.) Egy állomány megnyitása vagy létrehozása a következő három lépés
az fs/cdprobe.c program ot a mellékelt CD-n, vagy a weben. A második az, hogy végrehajtását jelenti.
függetlenül a M INIX 3 blokkm éretétől, az indítóblokk mindig 1 KB m éretű, és a
szuperblokk az eszköz második 1 KB-os blokkjától töltődik be. M inden más meg­ 1. Az i-csomópont megtalálása (annak lefoglalása, illetve amennyiben új állo­
oldás bonyolult lenne, m ert a blokkm éret csak a szuperblokk betöltése után válik mányról van szó, kezdeti értékekkel való feltöltése).
ismertté. 2. A megfelelő könyvtárbejegyzés megtalálása vagy létrehozása.
H a a ramsize értéke nullától különböző, a lo a d ja m függvény az üres RAM- 3. Az állományhoz tartozó állományleíró beállítása és visszaküldése.
lemez számára helyet foglal. Ebben az esetben a RAM-lemez mindaddig nem
használható fájlrendszerként, amíg azt az m kfs paranccsal erre elő nem készítet­ A create és az open hívások mindegyike két dolgot tesz meg: megszerzi az állo­
tük, hiszen a fájlrendszer egyetlen struktúrája sem m ásolódott rá. Ugyanakkor egy mány nevét, és meghívja azt a c o m m o n jp e n elnevezésű eljárást, amely a két hívás
ilyen RAM-lemez, ha a fájlrendszer fordításakor arra lehetőséget biztosítottunk, végrehajtása során felmerülő közös feladatok elvégzéséért felelős.
felhasználható másodlagos gyorsítótárként. A c o m m o n jp e n eljárás (24573. sor) működését azzal kezdi, hogy ellenőrzi,
A main.c állomány utolsó függvénye a lo a d ju p er függvény (24426. sor). Ez ál­ vajon a szabad állományleíró és a filp tábla rekeszei rendelkezésre állnak-e. Ha
lítja be a szuperblokktábla kezdeti értékét és olvassa be a gyökéreszköz szuper­ a hívó eljárás egy új állomány létrehozását kérte (az O C R E A T bit korábban tör­
blokkját. ténő egyesre állításával), akkor a 24594. sorban található n ew jio d e eljárás kerül
meghívásra. A könyvtárbejegyzés létezése esetén a n ew jio d e eljárás a már létező
i-csomópontot kijelölő m utatót adja vissza. Ellenkező esetben létrehozza mind az
új könyvtárbejegyzést, mind annak i-csomópontját. H a az i-csomópont valamilyen
5.7.4. Egyedi fájlokon végzett műveletek
okból nem hozható létre, a n e w jo d e eljárás beállítja az e r r jo d e globális változót.
Ebben a szakaszban azokat a rendszerhívásokat tekintjük át, amelyek (a könyv­ Egy hibakód azonban nem m inden esetben jelent egyben hibát is. H a a n e w jo d e
tárakon végzett műveletekkel szemben) az egyedi fájlokon - egyidejűleg csak egy egy m ár létező állományt talál, a hibakód ezen állomány létezésére utal, tehát
példányon - hajtanak végre valamilyen műveletet. Azzal kezdjük, hogy megvizs­ ebben az esetben ez elfogadható hiba (24597. sor). H a az O jC R E A T bitet nem
gáljuk, hogyan történik egy fájl létrehozása, megnyitása, valamint bezárása. Ez­ állítottuk egyesre, akkor egy másik módszerrel, a p a th x állományban lévő eat_
után részletesen megvizsgáljuk azt a technikát, amellyel egy fájl írása és olvasása path függvénnyel (ezt a későbbiekben még részletesen tárgyaljuk) keresünk i-cso-
történik, majd áttekintjük, m iben különböznek az adatcsövek, valamint az ezeken m ópontot. Ennél a pontnál a következő fontos dolgot kell m egértenünk: ha nem
végzett műveletek a közönséges fájlokon végzett műveletektől. találunk, vagy nem sikerül létrehoznunk egy i-csomópontot, a c o m m o n jp e n el­
járás végrehajtása, még mielőtt elérné a 24606. sort, egy hibaüzenettel megszakad.
Ellenkező esetben az állományleíró kijelölésével és a filp tábla egy rekeszének
Fájlok létrehozása, megnyitása és lezárása igénylésével folytatódik a végrehajtás. Ezt követően, ha éppen új állományt hoztunk
létre, a 24612. és 24680. sorok közötti rész egyszerűen kimarad a végrehajtásból.
Az open.c állomány hat rendszerhívás forráskódját tartalmazza. Ezek sorrendben H a az állomány nem új, a fájlrendszernek meg kell vizsgálnia, miféle állomány­
a következők: create, open, mknod, mkdir, close és lseek. A create és az open rendszer- ról van szó, milyen az állomány védettségi állapota stb., hogy eldönthesse, meg­
hívásokat együtt, majd ezután a többieket külön-külön vizsgáljuk meg. nyitható-e az illető állomány. A 24614. sorban szereplő forbidden hívása először
A Unix régebbi változataiban a create és az open hívások különböző célok meg­ egy általános vizsgálatot végez el az rwx biteken. H a az állomány egy teljesen kö­
valósítására szolgáltak. Egy nem létező állomány megnyitása hibát eredményezett; zönséges állomány és a c o m m o n jp e n eljárást az O TRUNC bit 1 értéke m el­
egy új állományt m inden esetben először azzal a create hívással kellett létrehozni, lett hívtuk meg, az állomány hossza nullára állítódik majd (24620. sor) újból a
amely egyben a m ár létező állományok hosszának nullára csökkentését is végezte. forbidden eljárás kerül hívásra, jelen esetben azért, hogy megbizonyosodjunk az
A POSIX-rendszerben nincs szükség a két elkülönülő hívásra. A POSIX-beli open állomány írhatóságáról. H a az engedélyek ezt lehetővé teszik, a wipejn o d e és
rendszerhívás egyaránt lehetővé teszi új állományok létrehozását, valamint már rw jn o d e meghívásával az i-csomópont új kezdeti értékeket kap és lemezre íródik.
létező állományok hosszának nullára csökkentését, így a create hívás mindössze az Az egyéb típusú állományok esetében (könyvtárak, speciális állományok, valamint
open hívás egy lehetséges alműveletét szimbolizálja, és csupán a régebbi progra­ nevesített adatcsövek) elvégezzük rajtuk a megfelelő vizsgálatokat. Egy eszköz
mokkal való kompatibilitás fenntartása végett van rá szükség. A create, valamint az esetén például a 24640. sorban (a dmap struktúrát felhasználva) az adott eszköz
open hívásokat kezelő eljárások a d o jr e a t (24537. sor) és a do open (24550. sor) megnyitása céljából meghívjuk a megfelelő rutint, míg egy névvel ellátott adatcső
606 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 607

esetén a pipe_open eljárás hívására kerül sor (24646. sor), és az adatcsövekre ér­ felfüggesztett állapotban lévő processzusokat próbálja beazonosítani. H a sikerrel
vényes, különböző vizsgálatokat hajtunk rajta végre. jár, az összes processzus végrehajtása folytatódik.
A c o m m o n jp e n eljárás forráskódjának nagy része, akárcsak a fájlrendszer Az mknod rendszerhívást a d o jn k n o d eljárás (24785. sor) kezeli, amely a do_
más eljárásai esetén, nem más, mint a hibákat és illegális kombinációkat kiszűrő creat eljárásra hasonlít azzal a különbséggel, hogy ez először létrehozza az i-cso­
program. Ez nem valami hangzatos dolog, azonban egy hibáktól mentes, megbíz­ m ópontot, majd egy könyvtárbejegyzést is hozzárendel. A munka nagy részét
ható fájlrendszer működéséhez elengedhetetlen. H a valami nincs rendben, a már valójában a 24797. sorban meghívott n e w jo d e végzi el. Ha az i-csomópont már
korábban lefoglalt állományleíró és a filp tábla rekesze, az i-csomópontotal együtt, létezik, hibaüzenetet kapunk vissza. Ez ugyanaz a hibaüzenet, amely a n ew jio d e
szabaddá válik (24683-24689. sor). Ebben az esetben a common_open negatív ér­ eljárás c o m m o n jp e n által történő hívásakor elfogadható hibát eredményezett;
tékkel tér vissza, ami hibára utal. H a m inden rendben van, az állományleíró, amely most azonban a hibaüzenet visszajut a hívóhoz, amely ennek megfelelően fog
egy pozitív szám, kerül visszaadásra. cselekedni. Itt nem szükséges az a lépésről lépésre történő vizsgálat, amelyet a
Ezzel elérkeztünk ahhoz a ponthoz, hogy a n ew jio d e eljárás (24697. sor) műkö­ c o m m o n jp e n eljárásnál láttunk.
dését egy kicsit részletesebben is megvizsgálhassuk. Ez foglalja le az i-csomópontot Az mkdir rendszerhívás kezeléséért a d o jn k d ir eljárás (24805. sor) a felelős.
és juttatja el a fájlrendszerbe a create és az open rendszerhívások számára szüksé­ Éppúgy, mint az előzőkben tárgyalt rendszerhívásoknál, a n e w jo d e eljárás itt
ges elérési utat. A később tárgyalásra kerülő mknod és mkdir rendszerhívások szin­ is lényeges szerepet játszik. Az állományoktól eltérően a könyvtárak mindig ren­
tén használják ezt az eljárást. A 24711. sor utasítása a legutolsó könyvtárnévvel delkeznek kapcsolatokkal, és sohasem teljesen üresek, hiszen bármely könyvtár a
bezárólag kiértékeli az elérési utat (vagyis összetevőnként megvizsgálja azt); a létrehozásától kezdve két elem et mindig tartalmaz: a . és a .. elemeket, amelyek
három sorral később megjelenő advance eljárás pedig azt vizsgálja meg, hogy az magára a könyvtárra, illetve az eggyel feljebb lévő könyvtárra utalnak. Azt, hogy
elérési út utolsó összetevője megnyitható-e. Például az egy állomány hány darab kapcsolattal rendelkezhet, a L IN K J /IA X változó szabja
meg (ez az include/limits.h definíciós állományban mint SHRT_MAX, 32767 érték­
fd = creat(’7usr/ast/foobar", 0755); re van beállítva a standard Intel 32 bites rendszereken futó M INIX 3 számára).
Mivel egy adott könyvtárban az eggyel feljebb elhelyezkedő könyvtárra történő
utasítás végrehajtásakor a la stjiir megpróbálja a táblákba tölteni a /usr/ast könyv­ hivatkozás egy odam utató kapcsolat, a d o jn k d ir első dolga annak ellenőrzése,
tárhoz tartozó i-csomópontot, illetve visszaadni az ezt kijelölő m utatót. H a az ál­ hogy lehetséges-e az eggyel feljebb elhelyezkedő könyvtárban további kapcsolatok
lomány nem létezik, rövidesen szükségünk lesz erre az i-csomópontra ahhoz, hogy létrehozása (24819. és 24820. sor). Az ellenőrzés hibaüzenet nélküli végrehajtása
a foobar állományt a könyvtár tartalm ához adhassuk. Az összes egyéb, állományo­ után meghívja a n e w jo d e eljárást, amelynek sikeres befejezése esetén megje­
kat hozzáadó vagy törlő rendszerhívás szintén a la stjiir eljárást használja az eléré­ lennek a . és a .. könyvtárbejegyzésekek (24841. és 24842. sor). Ezen műveletek
si útban szereplő utolsó könyvtár megnyitásához, mielőtt ott bárm it is csinálna. egyike sem bonyolult, ennek ellenére előfordulhatnak zavarok (például betelt a
H a a n e w jo d e eljárás észleli, hogy nem létezik az adott állomány, a 24717. sor­ lemez). A dolgok teljes összezavarodását elkerülendő fel kell tehát arra is készül­
ban meghívja az allocjnode eljárást, és egy m utató visszaküldésével egy új i-cso­ nünk, hogy vissza tudjuk állítani a processzus megkezdése előtti állapotot, ha idő­
m ópontot foglal le és tölt be. H a nincs több szabad i-csomópont, a n ew jiode vég­ közben az adott processzus befejezhetetlenné válna.
rehajtása meghiúsul, és a N IL N O D E változóval tér vissza. Egy állomány bezárása egyszerűbb, mint megnyitása. Ezt a d o jlo s e eljárás
Amennyiben volt még lefoglalható i-csomópont, a végrehajtás a 24727. sornál (24865. sor) végzi el. Az adatcsövek és speciális állományok némi odafigyelést igé­
az i-csomópont néhány m ezőjének kitöltésével, lemezre való kiírásával és az állo­ nyelnek, azonban a közönséges állományoknál az em lített eljárásnak szinte csak
mány nevének a célkönyvtárban történő elhelyezésével (24732. sor) folytatódik. annyi teendője van, hogy csökkentse a filp számláló értékét, ellenőrizze, hogy ezen
Látjuk, hogy a fájlrendszernek folyamatos hibavizsgálatot kell végeznie, és egy érték nem nulla-e, illetve, ha ez bekövetkezne, a p u tjn o d e eljárás használatával
hiba felbukkanása esetén mindazokat az erőforrásokat - például i-csomópontok az i-csomópontot visszaküldje, utolsó lépésként pedig eltávolítsa a zárolásokat, és
vagy blokkok - , amelyek kapcsolatban állnak a hibával, szabaddá kell tennie. Ha a újraélessze mindazokat a processzusokat, amelyek eddig felfüggesztett állapotuk­
M INIX 3-at ilyenkor, amikor például kifogyott az i-csomópontból, hagynánk ösz- ban az adott állományon lévő zárolás feloldására várakoztak.
szezavarodni ahelyett, hogy visszaállítaná az adott hívás előtti állapotot, és a hívó­ Jegyezzük meg: egy i-csomópont visszaküldése azt jelenti, hogy számlálója az
nak visszaküldene egy hibakódot, a fájlrendszer lényegesen egyszerűbb lenne. inode i-csomópont táblában nullára csökken, vagyis végső soron törlődik a táblá­
Am int azt m ár korábban említettük, az adatcsövek speciális kezelést igényel­ ból. Ennek a műveletnek azonban semmi köze az i-csomópont felszabadításához
nek. H a egy adatcső számára nem áll legalább egy olvasó/író pár rendelkezésre, a (ami azt jelenti, hogy a bittérképen úgy állítjuk be a megfelelő bitet, hogy az ez­
pipe open eljárás (24758. sor) felfüggeszti a hívót. Ellenkező esetben viszont azt a után az i-csomópont újrahasználhatóságát mutassa). Az i-csomópont csak akkor
release eljárást hívja meg, amely a processzustáblában az adatcsőhöz kapcsolódó, szabadul fel, ha a hozzá tartozó állományt az összes lehetséges könyvtárból eltá-
volítottuk.
608 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 609

Az opert.c állomány utolsó eljárása a d o jse e k eljárás (24939. sor), amelyet egy Bájtsorszám
pozicionálás m egtörténte után az új fájlpozíció értékének beállításához hívunk
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
meg. A fájlpozíció beállítására irányuló határozott kérés nem egyeztethető össze a
folyamatos beolvasással, ezért a 24968. sorban az előreolvasás nem engedélyezett.
Blokk— --------- <+■------------Blokk

Fájl olvasása
Szelet = 6
Egy állomány megnyitása után írható vagy olvasható állapotba kerül. Az írás és az
olvasás során egyaránt sok függvényt használunk. Ezek a read.c állományban talál­ Aktuális pozíció = 6
hatók. Először ezeket tárgyaljuk, majd a write.c elnevezésű következő állományra
lépünk tovább, amely mindössze a speciálisan csak íráskor használt függvények m Szelet = 2

forráskódját tartalmazza. Az írás és olvasás művelete számos ponton különbözik Aktuális pozíció = 9 --- 1
egymástól, ahhoz azonban elég sok hasonlóság van közöttük, hogy a d o je a d eljá­
rásnak (25030. sor) egy jelző R E A D IN G -re való beállítása után mindössze a közös
readjvrite eljárást kelljen meghívnia. A következő részben a dojvrite hasonlóan
w, Szelet = 1

egyszerű működését látjuk majd. 5.45. ábra. Három példa annak szemléltetésére, hogyan is történik egy 10 bájtos állomány
A readjvrite eljárás a 25038. sornál kezdődik. A 25063. és 25066. sorok között esetén az első darab méretének meghatározása. A blokkméret 8 bájt, a kért bájtok
egy olyan speciális forráskódrész található, amelyre a processzuskezelőnek van száma 6. A kívánt darabot a vonalkázott területjelenti
szüksége ahhoz, hogy a fájlrendszerrel teljes szegmenseket tudjon a felhasználói
területre töltetni. A rendes hívások feldolgozása a 25068. sorban kezdődik. Elő­ történik egy darab hosszának megállapítása 6, 2, illetve 1 bájt hosszúságú darabok
ször néhány érvényesség-ellenőrzés történik (például véletlenül nem olyan állo­ esetén. A tényleges számolás a 25159. és a 25169. sorok között valósul meg.
mányokból próbálunk-e olvasni, melyek csak írásra vannak megnyitva), majd né­ Az adott darab beolvasását valójában az r w jh u n k eljárás végzi. A vezérlés visz-
hány változó kap kezdeti értéket. Mivel a karakterspeciális fájlokból történő olva­ szaszerzése után különböző számlálók és m utatók értékét növeli meg, majd elkez­
sás nem a blokkgyorsítótáron keresztül történik, ezeket a 25122. sorban kiszűrjük. dődik a következő iteráció. H a a ciklus a végére érve befejeződik, az állomány vé­
A 25132. és 25145. sorok közti ellenőrzések csak írás során kerülnek végrehaj­ ge és más változók értékei (például adatcsőm utatók) felfrissíthetek.
tásra, és csak azokra az állományokra van hatásuk, amelyek m érete nagyobbá vál­ Végezetül az előreolvasás során az az i-csomópont, amelyből, illetve az a po­
hat, mint amennyi az írás alatt álló eszközre ráfér, vagy az olyan írásokra, amelyek zíció, ahonnan kezdve az olvasás történik, globális változókban raktározódik, így
az állomány vége utáni hozzáírás során az állományban egy lyuk megjelenését a felhasználónak küldött válaszüzenet után a fájlrendszer elkezdhet a következő
eredményezik. Amint azt a M INIX 3 áttekintése során m ár megismertük, a zó- blokk beolvasásán dolgozni. A fájlrendszer sok esetben a következő lemezblokk­
nánkénti több blokk jelenléte olyan problém ákat hozhat felszínre, amelyek spe­ ra várva felfüggesztésre kerül. Ezen idő alatt a felhasználói processzus elkezdheti
ciális kezelést igényelnek. Az adatcsövek szintén speciálisak, így ezek is ellenőr­ az im ént beolvasott adat feldolgozását. A feldolgozás és az I/O-műveletek közötti
zésre szorulnak. időbeli átfedés lényegesen javíthat a rendszer teljesítményén.
Az olvasási művelet szíve, legalábbis közönséges állományok esetében, a 25157. Az r w jh u n k eljárás (25251. sor) megkapja az i-csomópontot és a fájlpozíciót,
sorban kezdődő ciklus. Ez a ciklus tördeli olyan darabokra a kért adatot, hogy a ezeket valódi fizikai blokkazonosítókká alakítja, majd kéri a blokk (illetve annak
darabok mindegyikének m érete éppen egy szimpla lemezblokk m éretével egyez­ egy része) felhasználói területre történő átvitelét. A relatív fájlpozíció fizikai le­
zék meg. Egy vizsgált darab a pillanatnyi helyen kezdődik, és addig terjed, amíg a mezeimmé történő átváltását az a rea d jn a p függvény végzi el, amely tud az i-cso-
következő feltételek valamelyike nem teljesül. m ópontokról és a közvetett blokkokról. A 25280. sorban található b és a 25281.
sorban lévő dev változók tartalm azzák közönséges állományok esetén a fizikai
1. Beolvastuk az összes bájtot. blokk- és eszközazonosítót. A 25303. sorban a get block hívásával utasítjuk a gyor­
2. Elértük a blokk határát. sítótár kezelőjét az adott blokk m egkeresésére és szükség esetén beolvasására.
3. Az állomány végébe ütköztünk. A 25295. sorban a rahead gyorsítótár-kezelő hívása biztosítja a blokk beolvasását
a gyorsítótárba.
Ezen feltételek olyanok, hogy valamelyik kielégítéséhez bármely darabnak m ind­ Miután birtokunkban van a blokkot kijelölő mutató, a 25317. sorban a sysjircopy
össze egy blokkból kell állnia. Az 5.45. ábrán három példát m utatunk arra, hogyan kernelhívás gondoskodik a blokk kívánt részének a felhasználói területre történő
610 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 611

átviteléről. Ezután a pút block eljárás felszabadítja a blokkot, amely a későbbiek­ Belépési pont
ben - amikor arra sor kerül - a gyorsítótárból törölhetővé válik. (M iután a get_
block m egkapta a blokkot, az mindaddig nincs az LRU-listában, és nem is kerül ^ r__
oda vissza, amíg a blokk fejlécében lévő számláló a blokk használatát jelzi, így a (^do_reacP^) ^da
blokk ez idő alatt m entesül a gyorsítótárból való kikerülés alól; a put_block eljárás
csökkenti ezen számláló értékét, és amikor az eléri a nullát, a blokk visszakerül az
LRU-listába.) A forráskód a 25327. sorban jelzi, vajon az írás művelet betöltöt- read_writej) Az írás/olvasás főeljárása

te-e a blokkot. M indazonáltal a put_block számára az n változóban átadott érték


egyáltalán nem befolyásolja, hogy a listában tulajdonképpen hová is kerül vissza a
blokk; ilyenkor minden blokk az LRU-lista végére kerül. devJtT^) (^jpe-check) (^rw_chunjT) Egy blokk olvasása vagy írása
A logikai fájlpozíciót fizikai blokkazonosítóvá a readjnap függvény (25337. sor) Speciális Adatcsövek,
fájlok
alakítja át az i-csomópont figyelembevételével. Azon blokkok esetén, amelyek
elég közel vannak az állomány kezdetéhez, azaz az első hét zóna valamelyikébe
esnek (természetesen az i-csomópontok által m eghatározott zónákról van szó),
elegendő egy egyszerű számolás a kívánt zóna, majd blokk meghatározásához. get blockj) történő átvitel a gyorsítótárba
Messzebb elhelyezkedő blokkok esetén szükségünk lehet egy vagy több közvetett
blokk beolvasására is.
Egy közvetett blokk beolvasására az r d jn d ir eljárást (25400. sor) használjuk.
Keresés a gyorsítótárban
A függvényhez adott megjegyzés kissé idejétmúlt. A 68000 típusú processzort tá­
mogató kód eltávolításra került csakúgy, mint a M INIX V I fájlrendszer kódja.
Azonban érdem es megjegyezni, hogy ha valaki hozzá akar venni más fájlrendsze­
reket vagy platform okat tám ogató részt, ahol a lemezes adatábrázolás vagy a bájt­
sorrend eltérő, beillesztheti ebbe a fájlba. H a zavaros konverzióra lenne szükség,
rw_dev Felsorolás a dmap táblázatban
akkor azt itt elvégezve elérhetnénk, hogy a fájlrendszer további része azonos for­
m átum ban látná az adatokat.
A read_ahead eljárás (25432. sor) átalakítja a logikai címeket fizikai blokkazo­ Üzenetküldés a kernelnek
nosítókká, annak ellenőrzése céljából, vajon a blokk a gyorsítótárban van-e (ha
nem lenne ott, beolvassa) meghívja a get_block eljárást, majd azonnal visszaküldi 5.46. ábra. Egy állomány beolvasásakor használt főbb eljárások
a blokkot. Tehát semmilyen műveletet nem végez az adott blokkon. Mindössze an­
nak esélyét szeretné növelni, hogy a blokk a közelben legyen, amennyiben a követ­ block eljáráshoz, amely a gyorsítótárat egyidejűleg több blokk érkezésére készíti
kezőkben esetleg szükség lenne rá. fel. Ezután a blokkok egy listájával az rw_scattered eljárást hívjuk meg. Az ezután
Jegyezzük meg, hogy a read_ahead eljárás mindössze a main eljárásban lévő történő dolgokat már korábban megtárgyaltuk. Ebből most csak annyit idézünk
központi ciklusból hívható, a read rendszerhívás feldolgozásának részeként egy­ fel, hogy az eszközmeghajtók rw jcattered általi hívásakor mindegyik meghajtónak
általán nem. Azt is fontos megértenünk, hogy a read_ahead hívása csak azután csak annyi kérésre szabad válaszolnia, amennyit hatékonyan tud kezelni. Ez így
történik meg, m iután egy üzenet visszaküldésre került, így a felhasználó abban az elég bonyolultan hangzik, azonban éppen ezek a bonyolítások teszik lehetővé a ha­
esetben is folytathatja futását, ha a fájlrendszernek az előreolvasás során egy le­ talmas adatállományokat lemezről beolvasó alkalmazások lényeges felgyorsulását.
mezblokkra még várnia kell. Az 5.46. ábra m utatja be egy állomány olvasása során használatos főbb eljárá­
M agát a readjihead eljárást úgy tervezték, hogy az mindig csak a következő sok egymáshoz való viszonyát, pontosabban azt, hogy melyik is hívja melyiket.
blokk beolvasását kérje. A munka tényleges elvégzéséhez a readx állomány utol­
só függvényét, a rahead függvényt hívja meg. A rahead függvény (25451. sor) a „ha
egy kicsit több jó, akkor a sokkal több, még jobb” elven működik. Mivel a lemezek Fájl írása
és más tárolóeszközök esetén sok esetben viszonylag hosszú ideig tart a kívánt el­
ső blokk megtalálása, azonban ezt követően számos, egymás mellett elhelyezke­ A fájlokba történő írás forráskódja a writex állományban található. Egy fájl írá­
dő blokk viszonylag gyorsan beolvasható, egy kevés pluszráfordítással lényegesen sa hasonló az olvasásához, csak most a do jvrite eljárás (25625. sor) a WRITING
több blokk beolvasása lehetséges. Egy előzetes beolvasási kérelem érkezik a get_ jelző beállítása után hívja meg a readjvrite eljárást. Az írás és olvasás közti lég-
612 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 613

főbb különbség az, hogy az írás új lemezblokkok lefoglalását is igényelheti. A Valahányszor új blokkra van szükség, az rw_chunk meghívja a new_block eljárást
rea d jn a p eljárással megegyező write jn a p (25635. sor) az i-csomópontban, illetve (25787. sor). Az 5.47. ábrán egy folyamatosan növekedő állomány hat egymás utá­
a hozzá tartozó közvetett blokkokban nem a fizikai blokkazonosítókat keresi ki, ni állapota látható. Ebben a példában a zóna 2 KB, a blokk pedig 1 KB hosszú.
hanem ezek helyére ír be újakat (ha pontosak akarunk lenni, akkor zóna- és nem A new_block legelső hívásakor a 12-es zónát (24-es és 25-ös blokkot) foglalja
blokkazonosítókról kell beszélnünk). le. A következő alkalommal a 25-ös blokkot használja fel, amelyet m ár korábban
A write jn a p eljárás forráskódja hosszú és eléggé részletes, hiszen sok lehető­ lefoglalt ugyan, de eddig még nem használt el. A harm adik híváskor a 20-as zónát
séggel kell foglalkoznia. H a a beszúrandó zóna az állomány elejéhez közel van, (40-es és 41-es blokk) foglalja le, és így tovább. A zero_block függvény (25839. sor)
akkor ez az információ egyszerűen bekerül az i-csomópontba. egy blokkot ürít ki korábbi tartalm ának kitörlésével. M űködésének előbbi leírása
A legrosszabb helyzet akkor fordul elő, amikor az állomány hossza túllépi a tényleges forráskódjánál lényegesen hosszabb.
szimplán közvetett blokk által kezelhető m éretet, azaz szükség lesz a duplán köz­
vetett blokkra is. Ekkor helyet kell foglalni a szimplán közvetett blokk számára,
majd címét a duplán közvetett blokkban kell elhelyezni. Erre, akárcsak olvasás­ Adatcsövek
kor, most is egy külön eljárás, a w rjn d ir elnevezésű szolgál. Amennyiben a duplán
közvetett blokk igénylése helyesen történt ugyan, de a lemez telítettségi állapota Az adatcsövek sok szempontból hasonlók a közönséges fájlokhoz. A most követ­
m iatt a szimplán közvetett blokk számára m ár nem tudunk helyet foglalni, a dup­ kező részben a különbségek bem utatására fektetjük a hangsúlyt. A tárgyalandó
lán közvetett blokkot vissza kell küldenünk, nehogy megrongáljuk a bittérképet. forráskód a pipe.c állományban található.
H a ezen a ponton pánikba esnénk, és egyszerűen bedobnánk a törülközőt, a Először is az adatcsöveket eltérő módon, a create rendszerhívás helyett a pipe
forráskód sokkal egyszerűbb lehetne. A felhasználó szempontjából azonban sok­ rendszerhívás használatával hozzuk létre. Ezt a hívást a do_pipe eljárás (25933.
kal praktikusabb, ha a lem ezterület teljes betöltöttségekor a write rendszerhívás sor) kezeli. A do_pipe valójában az adatcső számára lefoglal egy i-csomópontot,
egy hibaüzenettel tér vissza ahelyett, hogy egy m egrongálódott fájlrendszer követ­ és két ehhez tartozó állományleírót ad vissza. Az adatcsövek a felhasználó helyett
kezményeként összeomlana a rendszer. a rendszerhez tartoznak és egy külön erre kijelölt eszközön (amelyet az includel
A w rjn d er eljárás (25726. sor) a szükséges adatátalakítások elvégzésére a minix/config.h definíciós állományban állíthatunk be) találhatók. Mivel az adatcső­
conv4 rutint hívja meg, majd beteszi egy közvetlen blokkba az új zónaazonosítót. ben lévő adatokat nem kell megőrizni, ez az eszköz jól megfér a RAM-lemezen is.
Jegyezzük meg, hogy ezen függvény neve, sok más íráshoz és olvasáshoz használt Az adatcső írása és olvasása szintén eltér egy kicsit az állományok írásától és
függvényhez hasonlóan, szintén nem igaz a szó szoros értelmében. A lemezre tör­ olvasásától, mivel egy adatcső kapacitása véges. Egy, m ár tele lévő adatcsőbe való
ténő tényleges írást a blokkgyorsítótár m űködését fenntartó függvények végzik el. írás kísérlete az író processzus felfüggesztését eredményezi. Hasonlóan üres adat­
A write.c állomány következő eljárása a clear_zone eljárás (25747. sor), amely a csőből történő olvasó az olvasási processzus felfüggesztéséhez vezet. Az adatcső
hirtelen az állomány közepébe kerülő blokkok kitörlésének problém áját hivatott valójában két m utatóval rendelkezik: az aktuális pozíció (ezt használják az olvasó
megoldani. Ez akkor következhet be, amikor egy állományvég utáni pozicionálást processzusok), a másik pedig a m éretet (ezt használják az író processzusok).
egy adat kiírása követi. Ez a helyzet szerencsére csak ritkán fordul elő. A pipe_check eljárás (25986. sor) hajtja végre m indazokat az ellenőrzéseket,
amelyek azt hivatottak eldönteni, hogy egy adott művelet elvégezhető-e az adat-
(a) 24 Szabad zónák: 12 20 31 36... csövön. Ezen ellenőrzések mellett, amelyek a hívó felfüggesztéséhez vezethetnek,
a pipe_check a release eljárást is meghívja, hogy megvizsgálja, vajon egy korábban
(b) 24 25 adathiány vagy éppen túl sok adat jelenléte következtében felfüggesztett procesz-
szus jelenleg tovább folytatható-e. Az újraindítások alvó olvasó processzusok ese­
tében a forráskód 26017., míg alvó író processzusok számára a 26052. sorában tö r­
(c) 24 25 40
ténnek. A megszakadt adatcsőbe (nincsenek olvasók) történő írás szintén ezen a
ponton válik nyilvánvalóvá.
(d) 24 25 40 41
Egy processzus felfüggesztése a suspend eljárással (26073. sor) történik. Ez az
eljárás a processzustáblába m enti a hívás param étereit, és a fájlrendszer válasz­
(e) 24 25 40 41 62 üzenetét megakadályozandó, a d o n tjep ly jelzőt TRUE-ra állítja.
Blokksorszám A release eljárást (26099. sor) használjuk annak ellenőrzésére, hogy egy adat­
(f) 24 25 40 41 62 63 csővel kapcsolatos korábban felfüggesztett processzus folytatható-e. H a az eljárás
talál ilyen processzust, meghívja a revive függvényt, amely a megfelelő jelzőt úgy
5.47. ábra. (a)-(f) 1 KB-os blokkok egymás utáni lefoglalása 2 KB hosszúságú zónák esetén állítja be, hogy azt a központi ciklus a későbbiekben észrevegye. Ez a függvény
614 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 615

nem rendszerhívás, mivel azonban ez is az üzenettovábbítási technikát használja, eat_pathj) Útvonal i-csomóponttá konvertálása
szintén bekerült az 5.33.(c) ábrába.
A pipe.c állomány utolsó eljárása a d o jm p a u se elnevezésű (26189. sor). Amikor
a processzuskezelő egy processzus számára próbál meg jelzéseket küldeni, először advance Egy összetevő feldolgozása
ki kell találnia, hogy az adott processzus nincs-e egy adatcső vagy egy speciális ál­
lomány miatt felfüggesztve (ha ez történne, azt először az E IN T R hibaüzenettel
életre kell keltenie). Mivel a processzuskezelő semmit nem tud az adatcsövekről Az útvonal --- s ------------ T'N
és a speciális állományokról, a fájlrendszertől üzenetben érdeklődik felőlük. Ezt
elemeinek C'search_duj) QgeUnode^
Az i-csomópont
betöltése
végigjárása
az üzenetet dolgozza fel a dojm pause, amely az adott processzust újraindítja, ha
az fel lenne függesztve. A revive függvényhez hasonlóan a d o jn p a u s e sem rend­
szerhívás annak ellenére, hogy a rendszerhívásokkal sok hasonlóságot mutat.
Lemezeim Blokk Blokk visszaadása
A pipe.c program ban az utolsó két függvény a se le c tje q u e stjip e (26246. sor) és kikeresése megkeresése a gyorsítótárba
a selectjn a tc h j i p e (26278. sor) a select rendszerhívást támogatja, amelyet itt nem a gyorsítótárban
tárgyalunk.
5.48. ábra. Az elérési utak kikeresése során használt néhány eljárás

5.7.5. Könyvtárak és elérési utak Ezen a ponton a la stjiir ismeri tehát az elérési utat és azon könyvtár i-cso­
m ópontjának mutatóját, amelyben az elérési út első összetevőjét kell keresnie.
Az előbb megismertük, hogyan történik az állományok írása és olvasása. Következő A 26382. sorban belép egy ciklusba, és összetevőről összetevőre kielemzi az elérési
feladatunk az, hogy megismerkedjünk az elérési utak és könyvtárak kezelésével. utat. Amikor ennek a végére ér, visszaküldi az utolsó könyvtárat kijelölő m utatót.
A g e tja m e (26413. sor) olyan segédeljárás, amely a karakterláncokból kiszedi
az egyes összetevőket. Ennél sokkal érdekesebb az advance eljárás (26454. sor),
Az elérési út i-csomóponttá történő átváltása amely egy könyvtárat kijelölő m utatót és egy karakterláncot param éterként kap­
va, az illető könyvtárban az adott karakterláncot keresi. H a megtalálja, visszaküldi
Sok rendszerhívás (például open, unlink és mount) tartalm az param éterként elérési a hozzá tartozó i-csomópont mutatóját. Az összekapcsolt fájlrendszerek közötti
utakat (például állománynevek) is. Ezen hívások legtöbbjének, még mielőtt magát átvitel részletei szintén itt kerülnek definiálásra.
a hívást kezdenék el végrehajtani, meg kell szerezniük a megnevezett állomány Annak ellenére, hogy az advance eljárás felügyeli a karakterlánc kikeresését,
i-csomópontját. Az elérési út i-csomóponttá való átalakítását részletesebben is a karakterlánc tényleges könyvtárbejegyzéssel való összehasonlítása a fájlrend­
megvizsgáljuk. Nagy általánosságban ezt az 5.16. ábrához kapcsolódóan egyszer szerben kivételes helyet elfoglaló search_dir eljárásban (26535. sor) történik; ez
már megtettük. az egyetlen olyan hely ugyanis, ahol ténylegesen a könyvtárállományok kerülnek
Az elérési utak elemzése a path.c állományban történik. Ennek legelső eljárása, vizsgálatra. Az eljárás két egymásba ágyazott ciklust tartalmaz, az egyik a könyvtár
az eatj a t h (26327. sor) kapja meg az elérési utat kijelölő m utatót, elemzi, kike­ blokkjain, a másik egy adott blokk elemein fut végig. A könyvtárba történő új ne­
resi a m em óriába töltendő i-csomópontot, majd ennek mutatójával tér vissza. Az vek bejegyzéséhez vagy onnan való kitörléséhez szintén a searchjiir eljárást hasz­
utolsó könyvtár i-csomópontjának megszerzéséhez a la stjiir eljárást hívja meg, az náljuk. Az elérési utak kikeresése során használatos főbb eljárások egymás közötti
elérési út utolsó összetevőjének megszerzéséhez pedig az advance eljárást mozgó­ kapcsolatait az 5.48. ábra szemlélteti.
sítja. Sikertelen keresés esetén - ennek oka lehet például az, hogy az elérési útban
szereplő könyvtárak valamelyike nem létezik, vagy létezik, de keresés nem enge­
délyezett benne - az i-csomópontot kijelölő m utató helyett a N IL INO D E kerül Fájlrendszerek felcsatolása
visszaküldésre.
Az elérési utak lehetnek abszolútak vagy relatívak, és egymástól a / jellel elvá­ Van két olyan rendszerhívás, amely a fájlrendszert m int egészet befolyásolja. Ezek
lasztva sok összetevőből állhatnak. Ezekkel a kérdésekkel a la stjiir eljárás foglal­ a mount és az umount hívások. Ezek teszik lehetővé a különböző másodlagos esz­
kozik. A nnak eldöntésére, hogy abszolút vagy relatív elérési útról van-e szó, elő­ közökön lévő, egymástól teljesen független fájlrendszerek oly m ódon történő egy­
ször az elérési út legelső karakterét vizsgálja meg (26371. sor). Abszolút elérési máshoz „ragasztását”, hogy azok egy egységes, illesztési problémáktól mentes
út esetén a rip m utatót úgy állítja be, hogy az a gyökér i-csomópontjára mutasson, adatszerkezetet alkossanak. A felcsatolás, amint azt az 5.38. ábrán láttuk, valójá­
míg relatív elérési út esetén az aktuális munkakönyvtár i-csomópontját jelölje ki. ban azáltal érhető el, hogy beolvassuk a felcsatolásra kijelölt fájlrendszer gyöke­
616 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 617

rének i-csomópontját, valamint szuperblokkját, és a szuperblokkban beállítunk A mount.c állomány utolsó eljárása a name_to_dev eljárás (26839. sor), amely
két m utatót. Ezek egyike azt az i-csomópontot jelöli ki, ahová a felcsatolás történt, egy speciális állomány elérési útját alapul véve megszerzi annak i-csomópontját,
a másik pedig a felcsatolt fájlrendszer gyökerének i-csomópontját mutatja. Ezek a majd kiolvassa abból az állományhoz rendelt fő és másodlagos eszközazonosító
m utatók tartják össze a fájlrendszereket. számot. Ezek az azonosítók ugyanis m agában az i-csomópontban vannak tárolva,
A m utatók beállítása a do_mount eljárás közvetítésével a mount.c állomány rendszerint ott, ahová az első zóna kerülne. Ez a rekesz a speciális állományoknál
26819. és 26820. sorában történik meg. A m utatók beállítását megelőző kétoldal- azért használható fel erre a célra, m ert a speciális állományok nem rendelkeznek
nyi forráskód szinte csak a fájlrendszer felcsatolásakor lehetséges hibaüzenetek zónákkal.
feldolgozásával foglalkozik. Ezek közül csak néhányat sorolunk most fel.

1. A kijelölt speciális állomány nem blokkeszköz. Fájlok kapcsolása és szétkapcsolása


2. A speciális állomány blokkeszköz ugyan, de m ár felcsatolás alatt áll.
3. A felcsatolásra kijelölt fájlrendszer bűvös száma hibás. Vizsgálatunk következő állomása a lin kx állomány, amely az állományok össze­
4. A felcsatolásra kijelölt fájlrendszer érvénytelen (nem léteznek i-csomó­ kapcsolását vagy szétkapcsolását végzi. A d o jin k eljárás (27034. sor) abban na­
pontok). gyon hasonlít a d o jn o u n t eljáráshoz, hogy forráskódja m ajdnem teljes egészében
5. Az az állomány, amelyre a felcsatolást kértük, nem létezik, vagy egy speciális a lehetséges hibák vizsgálatára fordítódik. Néhány a
állomány.
6. Nincs hely a felcsatolt fájlrendszer bittérképe számára. link(file_name, link_name);
7. Nincs hely a felcsatolt fájlrendszer szuperblokkja számára.
8. Nincs hely a felcsatolt fájlrendszer gyökeréhez tartozó i-csomópont számára. hívás során előforduló hibát az alábbiakban sorolunk fel:

Talán nem a leghelyénvalóbb m ár megint ugyanazt hangsúlyoznunk, de egy gya­ 1. A file jia m e nem létezik vagy nem érhető el.
korlati operációs rendszerhez hozzátartozik az is, hogy forráskódjának lényegi 2. A file jia m e m ár elérte lehetséges kapcsolatainak maximális számát.
hányada olyan apró tevékenységek ellátását szolgálja, amelyek ugyan nem jelen­ 3. A file jia m e egy könyvtárat jelent (ehhez csak a rendszergazda kapcsolhat
tenek szellemi kihívást, azonban a rendszer megbízható működése szempontjából hozzá valamit).
döntők. H a a felhasználó, mondjuk, havonta egyszer hibás hajlékonylemezt pró­ 4. A lin k ja m e m ár létezik.
bál felcsatolni, aminek következtében rendszere összeomlik, és egy megrongáló­ 5. A f i le j a m e és a lin k ja m e különböző eszközökön található.
dott fájlrendszert hagy hátra, a felhasználó nem önmagát, hanem a tervezőt fogja
hibáztatni, és a rendszert minősíti ezután megbízhatatlannak. H a nem ütközünk semmilyen hibába, akkor a fenti utasítás hatására a lin k ja m e
Thomas Edison a híres feltaláló egyszer egy rendkívül találó megjegyzést tett. karakterláncnak megfelelő néven egy új, a file ja m e állományhoz tartozó i-cso­
Úgy nyilatkozott, hogy „zseninek” lenni 1 százalék ötletet és 99 százalék izzadsá- m ópont azonosítójával rendelkező könyvtárbejegyzés jön létre. A forráskódban a
gos m unkát jelent. Egy jó és egy silány rendszer között nem az előbbi briliánsán nam el felel meg a file ja m e változónak, míg a name2 jelenti a lin k ja m e változót.
kivitelezett ütem ező algoritmusai tesznek különbséget, hanem az összes apró A tényleges könyvtárbejegyzést a 27086. sorban a d o jin k által meghívott searchjiir
részlet pontos kivitelezése. hozza létre.
A fájlrendszer lecsatolása sokkal egyszerűbb, mint annak hozzákapcsolása - Az állományok és könyvtárak eltávolítása ezek szétkapcsolásával történik. Az
sokkal kevesebb dolgot lehet elrontani. A do_umount eljárás (26828. sor) hívá­ unlink és az rmdir rendszerhívások m unkáját egyaránt a d o jin lin k eljárás (27104.
sával kezdődik a munka, amely két részre bomlik. A d o jim o u n t maga ellenőrzi, sor) végzi el. Ebben az esetben is rengeteg ellenőrzést kell elvégeznünk; annak el­
hogy a szuperfelhasználó hívta-e meg, a nevet eszközszámmá konvertálja, és az­ lenőrzését, hogy egy állomány létezik-e, illetve egy könyvtár nem hozzákapcsolási
tán hívja az umount-ot (26846. sor), amely befejezi a műveletet. Az egyetlen lé­ pont-e, a d o jin lin k -ben található közös program kód végzi el, majd annak meg­
nyeges pont annak biztosítása, hogy semmilyen processzus ne használjon olyan felelően, hogy melyik rendszerhívásról van szó, meghívja a rem ovejlir vagy az
állományokat, illetve munkakönyvtárakat, amelyek a lecsatolandó fájlrendszerhez unlink Jile eljárások egyikét. Rövidesen ezeket is megtárgyaljuk.
tartoznak. Ennek ellenőrzése rendkívül egyszerű: át kell vizsgálni a teljes i-csomó- A link.c állományban tám ogatott másik rendszerhívás a rename. Akik Unixot
pont táblát, hogy lássuk, vannak-e a m em óriában olyan i-csomópontok, amelyek a használnak, ismerik a parancsértelm ező mv parancsát, amely tulajdonképpen ezt a
lecsatolandó fájlrendszerhez tartoznak (leszámítva a gyökeréhez tartozó i-csomó­ rendszerhívást használja; a név a hívás egy másik tevékenységét tükrözi. A rename
pontot). H a vannak ilyenek, az umount rendszerhívás végrehajtása sikertelen lesz. nem csupán arra szolgál, hogy egy állomány nevét a könyvtáron belül megváltoz­
tassuk, de használatával az adott állományt könnyen az egyik könyvtárból a másik­
618 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 619

ba mozgathatjuk. Ráadásul ez egyetlen oszthatatlan elemi műveletben történik, tár törölhetőségét ellenőrző vizsgálatot végez el, majd ezután meghívja az unlink_
így bizonyos versenyhelyzeteket is el tudunk kerülni. A m unkát a do_rename eljá­ file eljárást (27415. sor). H a semmilyen hiba nem jelentkezik, a könyvtár törlődik
rás (27162. sor) végzi el. A parancs végrehajtása előtt jó néhány feltétel teljesülé­ és i-csomópontjának kapcsolatok számát figyelő számlálója eggyel csökken.
sét ellenőrizni kell. Ezek közül néhányat az alábbiakban sorolunk fel:

1. Az eredeti állománynak léteznie kell (27177. sor). 5.7.6. További rendszerhívások


2. A régi elérési út nem lehet olyan könyvtár, amely a könyvtárfában az új eléré­
si út fölött helyezkedik el (27195-27212. sor). A rendszerhívások utolsó csoportja rendkívül tarka, olyan elemek tartoznak ide, mint
3. Sem a sem a nem használható régi vagy új névként (27217. és 27218. például az állapot, a könyvtárak, a védelem, az idő, illetve ehhez hasonló dolgok.
sorok).
4. Az elérési utakban szereplő utolsó könyvtárak mindegyikének ugyanazon az
eszközön kell lennie (27221. sor). A könyvtárak és fájlok állapotának megváltoztatása
5. Az elérési utakban szereplő utolsó könyvtárak mindegyikének írhatónak és
kereshetőnek kell lennie, egy olyan eszközön, amely szintén írható (27224. és A stadir.c állomány négy rendszerhívás forráskódját tartalmazza; ezek: chdir, fchdir,
27225. sorok). chroot, stat és fstat. A la stjiir eljárás vizsgálata során láttuk, hogyan történik egy
6. Sem a régi, sem az új név nem eshet egybe olyan könyvtárral, amelyhez egy elérési út kikeresése - kezdve az elérési út legelső karakterének vizsgálatával,
fájlrendszer épp fel van csatolva. hogy eldönthessük, vajon az / jel-e vagy sem. Ennek eredményétől függően ugyanis
egy mutató vagy a gyökérkönyvtárat, vagy az éppen aktuális munkakönyvtárat fogja
Ezeken túl van még néhány egyéb feltétel is, amelyeket csak az új név létezésekor tartalmazni.
kell megvizsgálni; ezek közül a legfontosabb az, hogy az adott névvel m ár rendel­ Az egyik munkakönyvtárról (vagy gyökérkönyvtárról) egy másikra történő át­
kező állomány törölhető legyen. váltás csupán a könyvtárak m utatóinak a hívó processzustáblájában történő meg-
A do_rename eljárás forráskódjában találkozhatunk néhány olyan, a tervezés­ cserélését jelenti, amit a d o jh d ir (27542. sor) és a d o jh r o o t (27580. sor) eljárá­
sel kapcsolatos döntéssel is, amelyek célja bizonyos problém ák előfordulásának sok végeznek. Először m indkettő a szükséges ellenőrzéseket hajtja végre, majd
csökkentése. Egy állomány teljesen betöltött lemezen való, m ár létező névre tö r­ meghívja a change függvényt (27594. sor), amely további ellenőrzéseket végez,
ténő átnevezése még akkor is sikertelen lenne - amennyiben a m űveletet nem a majd hívja a changej n t o eljárást (27611. sor), amely megnyitja az új könyvtárat, és
régi állomány törlésével kezdenénk (éppen ez történik a 27260. és 27266. sorok a régit ezzel helyettesíti.
között) ha az állomány a végén egyáltalán nem foglalna el több helyet, mint A d o jc h d ir (27529. sor) eljárás tám ogatja az fchdir-t, amely egy alternatív m ód­
kiinduláskor. Ugyanezt az elvet használjuk fel a 27280. sorban, vagyis az ugyan­ szert ad a chdir művelet elvégzésére, amikor is az argumentum egy fájlleíró, és
abban a könyvtárban történő új név létrehozása előtt töröljük a régit, annak elke­ nem elérési út. Először ellenőrzi, hogy a fájlleíró érvényes-e, ha igen, akkor hívja
rülése érdekében, hogy az adott könyvtár esetleg egy többletblokkot igényeljen. a changej n t o eljárást, amely elvégzi a munkát.
Ha azonban az új és a régi állomány más könyvtárba kerülnek, az előbb em lített A d o jh d ir eljárásban felhasználói chdir hívások esetén a forráskód 27552. és
elv lényegtelenné válik, és a 27285. sorral még a régi állomány törlése előtt létre­ 27570. sorai közötti rész nem kerül végrehajtásra. Ez a rész speciálisan a procesz-
hozzuk az új állományt (a másik könyvtárban). Mindez azért történik így, m ert szuskezelő hívásai számára van fenntartva, amikor az exec hívások kezelése érde­
a rendszer épsége szempontjából egy olyan összeomlás, amely két, ugyanarra az kében a felhasználói könyvtárra váltunk át. H a ugyanis a felhasználó megpróbálja
i-csomópontra m utató állománynevet hagy maga után, sokkal ártalmatlanabb, mondjuk a saját könyvtárában található a.out állományt futtatni, a processzuske­
mint egy olyan, amelynek eredm ényeként olyan i-csomópont jön létre, amelyhez zelőnek egyszerűbb erre a könyvtárra átváltania, mint azt megkeresni, hogy hol is
semmilyen könyvtárbejegyzés nem tartozik. Annak valószínűsége, hogy épp egy van az illető állomány.
átnevezési művelet közepén futunk ki a szabad tárterületből, rendkívül alacsony A stat és az fstat rendszerhívás lényegében megegyezik egymással. Különbség
- a rendszerösszeomlás valószínűsége még ennél is alacsonyabb - , azonban az csak a fájlok megadásában van: míg az első egy megnyitott állomány elérési útját
ilyen eseteknél a legrosszabb eshetőségre való felkészülés semmibe nem kerül. adja eredményül, a második annak állományleíróját. A felsőszintű d o jta t (27638.
A link.c állományban fennm aradó függvények a korábban m ár megtárgyaltakat sor) és d o js ta t (27658. sor) eljárások a munka elvégzéséhez a sta tjn o d e függvényt
támogatják. Közülük az elsőt, truncate (27316. sor), a fájlrendszer más részei is hívják meg. A sta tjn o d e függvény hívása előtt a d o s ta t eljárás megnyitja az állo­
meghívják. Ez egy adott i-csomópont zónáin fut végig, és a közvetett blokkokkal mányt az i-csomópontjának megszerzése céljából. Ily m ódon mind a d o jta t, mind
együtt felszabadítja azokat. A rem ovejlir függvény (27375. sor) számos, a könyv­ a d o js ta t egy i-csomópontot kijelölő m utatót ad át a sta tjn o d e függvénynek.
620 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 621

A statjn o d e függvény (27673. sor) összes tevékenysége abból áll, hogy az i-cso- rwx bitcsoport egyikét, és ellenőrzi, hogy megengedett vagy tiltott-e az ennek meg­
m ópontból információt olvas ki és azt egy átm eneti adattárba másolja. A 27713. felelő elérés.
és 27714. sor sys_copy hívásával ezt az átm eneti adattárat a felhasználói területre A read_only eljárás (27999. sor) egy aprócska belső eljárás, amely azt határozza
ténylegesen át kell másolni, mivel ennek m érete túlságosan nagy ahhoz, hogy egy meg, hogy azon állományrendszer, amelyben a neki átadott i-csomópont találha­
üzenetbe beférhessen. tó, csak olvasásra vagy írásra és olvasásra van-e felcsatolva. Ez a csak olvasásra fel­
Végül lássuk a d o jsta tfs (27721. sor) függvényt. Az fstatfs nem POSIX-függ- csatolt állományrendszerbe történő írás megelőzése érdekében szükséges.
vény, bár a POSIX definiál egy hasonló fstatvfs függvényt, amely azonban sokkal
nagyobb adatszerkezetet ad vissza. A M INIX 3 fstatfs csak az információ egy ré­
szét adja, a fájlrendszer blokkm éretét. A függvény prototípusa: 5.7.7. Az l/O-eszközcsatoló

_PROTOTYPE(int fstatfs, (int fd, struct statfs *st)); Amint m ár többször is megemlítettük, a M INIX 3-at úgy tervezték, hogy robusz­
tus operációs rendszer legyen azáltal, hogy m inden eszközvezérlő felhasználói tér­
A statfs struktúra egyszerű, elfér egy sorban: ben futó processzus legyen, amely közvetlenül nem fér hozzá a kernel adatszerke­
zetéhez vagy kódjához. Az elsődleges előnye ennek a megközelítésnek, hogy egy
struct statfs { off_t f_bsize; /* fájlrendszer blokkméret */ }; hibás eszköz nem okozhatja a rendszer összeomlását, de van más következménye
is. Az egyik az, hogy az eszközvezérlőket nem kell közvetlenül az indítás után elin­
Ezek a definíciók az includeIsyslstatfs.h definíciós állományban vannak. dítani, indíthatók a betöltés befejeződése után bármikor. Ebből az is következik,
hogy az eszközvezérlő akármikor leállítható, újraindítható vagy helyettesíthető
másik vezérlővel, a rendszer futása közben. Ez a flexibilitás term észetesen bizo­
Adatvédelem nyos feltételekhez kötött, például nem indítható ugyanarra az eszközre több ve­
zérlő. Azonban ha a lemezmeghajtó összeomlik, akkor újraindítható RAM-lemez
A M INIX 3 védelmi technikája az rwx biteket használja. M inden állomány esetén másolatról.
három ilyen bitcsoport létezik: a tulajdonos, annak csoportja és az ezeken kívüli A M INIX 3 eszközvezérlői a fájlrendszerben érhetők el. Felhasználói I/O-kérés-
egyéb felhasználók számára. A biteket a chmod rendszerhívással állíthatjuk, am e­ re válaszul a fájlrendszer üzenetet küld a felhasználói térben futó eszközvezérlő­
lyet a protect.c állományban lévő do_chmod eljárás (27824. sor) kezel. A védelmi nek. A dmap táblázatban m inden lehetséges eszköz főszámához van egy elem. Ez
mód megváltoztatása, egy sor érvényességi vizsgálat elvégzése után, a 27850. sor­ biztosítja az eszköz fősorszáma és az eszközvezérlő közötti megfeleltetést. A kö­
ban történik. vetkezőkben vizsgálandó két fájl a dmap táblázat kezelésével kapcsolatos. A táblá­
A chown rendszerhívás annyiban hasonlít a chmod híváshoz, hogy m indketten zatot magát a dmap.c deklarálja. Ez a fájl tartalmazza a táblázat inicializálását és
az állományokhoz tartozó i-csomópontok belső mezőjének tartalm át írják felül. egy új rendszerhívás, a devctl célja az eszközvezérlők indításának, leállításának és
A kivitelezés is hasonló, bár a do chown eljárással (27862. sor) csak a rendszer- újraindításának támogatása. Ezután a device.c fájlt nézzük, amely eszközök szoká­
gazda változtathatja meg egy állomány tulajdonosát. A közönséges felhasználók sos műveleteit tartalmazza; ezek az open, close, read, write és ioctl.
ezzel a hívással csak saját állományaik csoportazonosítóját állíthatják be. Eszköz megnyitásakor, lezárásakor, olvasásakor vagy írásakor a dmap szolgál­
Az umask rendszerhívás teszi lehetővé, hogy a felhasználó létrehozzon egy sab­ tatja a m űveletet elvégző eljárás nevét. Ezen eljárások mindegyike a fájlrendszer
lont (ezt a processzustáblában tárolja), amely a későbbi create hívások védelmi bit­ névterében van. Néhány eljárás nem csinál semmit, de néhány hívja az eszközve­
jeit módosítja. A hívás teljes kivitelezése mindössze egyetlen utasítást igényelne zérlőt a kívánt I/O-művelet elvégzésére. Szintén a táblázat szolgáltatja minden
(27907. sor), ha a hívásnak a régi sablonértéket nem kellene eredményül vissza­ eszköz főszámához a processzusszámot.
küldenie. Ez a többletfeladat azonban a szükséges forráskódsorok számának meg­ Valahányszor egy új eszközt adunk a M INIX 3-hoz, ebben a táblázatban egy új
háromszorozódásához vezet (27906-27908. sor). sor keletkezik, amely tartalm azza azt a műveletet, amelyet megnyitáskor, lezárás­
Az access rendszerhívás teszi lehetővé egy processzus számára, hogy megvizsgál­ kor, olvasáskor vagy íráskor végezni kell, ha kell. Egy egyszerű példa erre, ha egy
hassa, vajon elérhet-e egy állományt a m egadott m ódon (például olvasás számá­ mágnesszalageszközt hozzáadunk a M INIX 3-hoz, és a hozzá tartozó speciális
ra) vagy sem. Ez a do_access eljáráson keresztül (27914. sor) valósul meg, amely fájlt megnyitjuk, akkor a táblázatbeli eljárásnak meg kell tudnia mondani, hogy az
az állomány i-csomópontjának megszerzése után meghívja a forbidden elnevezésű eszköz használatban van-e már.
belső eljárást (27938. sor). Ez vizsgálja meg, vajon le van-e tiltva az elérés. A for­ A dmap.c a D T makródefinícióval kezdődik (28115-28117. sor), amely a dmap
bidden eljárás az uid és a gid vizsgálatán túl az i-csomópontban található inform á­ táblázat inicializálását végzi. Ez a m akro egyszerűvé teszi új eszköz hozzáadását,
ciót is megvizsgálja. Annak függvényében, hogy ott mit talál, kiválasztja a három amikor átkonfiguráljuk a M INIX 3-rendszert. A dmap táblázat elemeit az includel
622 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 623

minix/dmap.h definiálja, minden elem tartalm az egy függvényre m utató pointert, A d o d e v c tl (28157. sor) az első függvényhívás, amely devctl szolgáltatást hív.
amely az olvasás és írás m űveletet végzi, olyat, amely a megnyitást és lezárást végzi, A jellenlegi változat nagyon egyszerű, két kérést ismer; ezek a DEV_M AP és a
processzusszámot (processzustáblázatbeli indexet, és nem PID -et), továbbá jelző­ D E V UMAR és az utóbbi EN O SYS hibaüzenettel tér vissza, ami azt jelenti, hogy
ket. A tényleges táblázat egy ilyen elem eket tartalm azó tömb, amelynek a deklará­ „a függvény nincs im plementálva”. Ez nyilvánvalóan stophézag. DEV_M AP ese­
ciója a 28132. sorban van. Ez a táblázat a fájlrendszerben globálisan hozzáférhető. tén a map_drive függvény hívása következik.
A táblázat m éretét N R D EVICE tartalm azza és értéke 32, ami majdnem kétszer Hasznos lehet annak elmagyarázása, hogyan használatos a devctl, és mi a jövő­
akkora, mint ahány eszközt a jelenlegi M INIX 3-változat támogat. Szerencsére a beli felhasználásának a terve. A reinkarnációs szerver (RS) szerverprocesszust
C nyelv szerint minden nem inicializált változó értéke 0 lesz, ami biztosítja, hogy a használja a M INIX 3 az operációs rendszer futás közbeni felhasználói szerverek
nem használatos elemekben ne jelenjen meg hamis információ. és vezérlők indításának a tám ogatására. A reinkarnációs szerver csatolófelületéül
A dmap deklarációját követi az init_dmap PRIVÁTÉ deklarációja. Ezt D T m ak­ szolgál a service segédprogram, és az léteire-ben láthatunk példát a használatára.
rók tömbje definiálja m inden lehetséges főeszközre. M inden egyes makró kifejté­ Például
se a tömb egy elem ét inicializálja fordítási időben. Néhány ilyen m akró áttekintése
segít megérteni a működésüket. Az init_dmap[l] a memóriavezérlő definiálását service up /sbin/floppy -dev /dev/fdO
adja, amely 1 főszámú eszköz. A makró a következőképpen néz ki:
Ez a parancs azt eredményezi, hogy a reinkarnációs szerver devctl hívást alkal­
DT(1, gen_opcl, genjo, MEM_PROC_NR, 0) maz a /sbin/floppy bináris fájl elindítására, amely a Idev/fdO eszközspecifikus fájl
számára eszközvezérlő lesz. Ehhez az RS exec-kel hajtja végre a binárist, de be­
A memóriavezérlő mindig jelen van, és a rendszer indításakor betöltődik. Az 1 el­ állít egy jelzőt, amely megtiltja a futását mindaddig, amíg rendszerprocesszussá
ső param éter azt jelenti, hogy ez az eszköz kötelező. A gen_opcl argumentum adja nem transzformálta. Am ikor a processzus m ár a m em óriában van, és ismert a
meg azt a függvényt, amelyet megnyitás és lezárás esetén kell hívni, a g e n jo azt, processzustábla-beli indexe, a megadott eszköz főeszközszámát meghatározza.
amelyet olvasás és írás esetén kell hívni, a M ÉM PROC_NR a memóriavezérlő Ezt az információt tartalm azza a devctl D E V M AP m űveletet kezdeményező fájl­
számára fenntartott processzustáblázat elem ét jelöli ki, és az utolsó 0 argum en­ szervernek visszaküldött üzenet. Az I/O-csatolók inicializálása szempontjából ez a
tum azt mondja, hogy nem kell jelzőt beállítani. Nézzük a következőt, ami az init_ legfontosabb része a reinkarnációs szerver feladatának. A teljesség kedvéért meg­
dmap[2]. Ez a hajlékonylemez-meghajtót definiálja, és a következőképpen néz ki: említjük, hogy az eszközvezérlő inicializálásának befejezéséhez az RS végrehajt
egy sys_privctl hívást, hogy a rendszerprocesszus inicializálja az eszköz priv p ro ­
DT(0, no_dev, 0,0, DMAP_MUTABLE) cesszustáblájának elemét, és engedélyezze a futást. Em lékeztetünk a 2. fejezetre,
hogy a dedikált priv táblaelem teszi lehetővé, hogy az egyébként közönséges fel­
Az első „0” argumentum azt jelenti, hogy az eszköznek nem kell a betöltési m e­ használói processzus rendszertaszkká váljon.
móriaképben szerepelnie. A második argumentum azt mondja, hogy az eszköz A reinkarnációs szerver új és alapvető a M INIX 3 jelenlegi kiadásában. A ter­
megnyitásakor az alapértelm ezett no dev függvényt kell hívni. Ez a függvény az vek szerint a későbbi M INIX 3-kiadások még hatékonyabb reinkarnációs szervert
E N O D E V „nincs ilyen eszköz” hibaüzenettel tér vissza. A következő két 0 szintén tartalmaznak, amely már eszközöket nemcsak indítani, de leállítani és újraindítani
alapértelm ezett érték, mivel az eszköz nem nyitható meg, ezért nem lehet I/O- is képes lesz. Továbbá képes lesz az eszközök figyelésére és hibás működés esetén
műveletet végezni, és a 0 processzustábla-index azt jelenti, hogy nincs processzus autom atikusan újra tud indítani. A legfrissebb információk m egtalálhatók a www.
hozzárendelve. A DM AP_M UTABLE argumentum azt jelenti, hogy az elem meg­ minix3.org oldalon, valamint a comp.os.minix hírcsoportnál.
változtatható. (Megjegyzendő, hogy ennek a jelzőnek a hiánya a memóriavezérlő Folytatva a dmap.c program ot, a map_driver függvény a 27178. sornál kezdődik.
esetén azt jelenti, hogy az inicializálás után nem változtatható.) A M INIX 3 kon­ A működése egyszerű. H a a dmap táblaelem DM AP M U TABLE jelzője be van ál­
figurálható úgy, hogy a betöltő tartalm azzon hajlékonylemez-meghajtót, de úgy lítva, akkor megfelelő értékeket ír m inden elembe. A megnyitás és lezárás kezelé­
is, hogy ne. H a a hajlékonylemez-meghajtót tartalmazza a betöltési memóriakép sére három különböző változata van; az egyiket a style param éter választja ki, am e­
és a label=FLOPPY indítóparam éterrel specifikáltuk, hogy ez az alapértelm ezett lyet az RS által a fájlrendszernek küldött üzenet tartalm az (28204-28206. sor).
lemezes eszköz, akkor a fájlrendszer indításakor a hozzá tartozó elem meg fog Megjegyezzük, hogy a. dmap jla g s nem módosul, ha eredetileg DMAP_MUTABLE
változni. Ha a hajlékonylemez-meghajtót nem tartalm azza a betöltési m em ória­ volt, a devctl hívás után is az marad.
kép, vagy tartalmazza, de nem az alapértelm ezett lemezes eszköz, akkor a hozzá A harmadik függvény a dmap.c program ban a b u ildjnap. Ezt az f s j n i t hívja a
tartozó elem nem fog megváltozni az FS indításakor. Azonban még így is később fájlrendszer indításakor, még mielőtt a főciklusába belépne. Először végigmegy
feléleszthető a hajlékonylemez-meghajtó. Ezt tipikusan az léteire végezheti az init az init dmap tábázat minden elemén, és minden olyan elemre, amelynek nem
futásakor. no_dev a dmap_opel mezője, a kifejtett makrót bemásolja a globális dmap táblá­
624 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 625

zatba. Ezzel inicializált lesz a táblaelem. Egyébként nem inicializált eszköz esetén a g etjn o re változót használjuk arra, hogy a D E V N O STATUS üzenet eléréséig
alapértelm ezett érték kerül a dmap táblaelembe. A b u ild jn a p további része még ismételje a ciklusmagot.
érdekesebb. Több lemezeszközt is tartalm azó betöltési mem óriakép is készíthető. Amikor tényleges I/O-műveletet kell végezni, akkor a dev j i (28406. sor) hívódik
Alapként az srcltools/ könyvtárbeli Makefile az atjvini, biosjvini és floppy vezérlő­ meg a readjvrite (25124. sor) eljárásból karakterspeciális fájl kezelésére, illetve az
ket tartalmazza. Ezek mindegyike kap egy címkét, és a label=item indítóparam é­ rw_block (22661. sor) eljárásból blokkspeciális fájl kezelésére. Ez standard üzenetet
ter m ondja meg, hogy aktuálisan melyik eszköz töltődik be és aktivizálódik mint készít (lásd 3.17. ábra) és ezt elküldi a megfelelő eszközvezérlőnek vagy a g en jo ,
alapértelm ezett lemezvezérlő. A 28248. és 28250. sorban az e n v je t ja r a m hívás vagy a e tty jo meghívásával, a dmap táblázat dp->dm apjlriver elemének függvé­
olyan könyvtári rutinokat hív, amelyek végső soron a sys_getinfo kernelhívást al­ nyében. Amíg a d e v jo várja a választ az eszköztől, a fájlrendszer várakozik. Nincs
kalmazzák a label és controller indítóparam éterek elérésére. Végül a 28267. sor­ belső multiprogramozás. Általában ez a várakozás rövid ideig tart (kb. 50 ms). De
ban meghívásra kerül a buildjnap, amely módosítja dmap táblában a betöltési lehetséges, hogy adat nem lesz elérhető, különösen valószínű ez terminál esetén.
eszközhöz tartozó elemet. A kulcskérdés itt az, hogy a processzusszámot DRVR_ Ebben az esetben a válasz lehet SUSPEND, amely időlegesen felfüggeszti a hívó
PROC_NR értékre állítja be, amely a processzustáblában a 6. elem. alkalmazást, de a fájlrendszer folytatja működését.
A továbbiakban a deviee.e program ot vizsgáljuk, amely az eszközök futás közbe­ A g e n jp c l (28455. sor) eljárást lemezes eszközökre hívja a rendszer, amelyek
ni I/O elvégzéséhez szükséges eljárásokat tartalmazza. hajlékonylemezek, merevlemezek vagy m em óriaalapú eszközök. Ü zenetet állít
Az első a d e v jp e n (28334. sor). Ezt a fájlrendszer más részei hívják, leggyak­ össze, majd ugyanúgy, mint az olvasásnál ás írásnál, a dmap táblázatból m eghatá­
rabban a c o m m o n jp e n a mai. c-ben, amikor open m űveletet kell végrehajtani rozza, hogy g e n jo , avagy e tty jo alkalmazandó, és ennek megfelelő üzenetet küld
eszközspecifikus fájlra, de meghívódik lo a d ja m és d o jn o u n t eljárásokból is. A az eszközt vezérlő processzusnak.
tevékenysége tipikus több itt tárgyalt eljárás esetén. M eghatározza az eszköz fő­ Termináleszköz megnyitására a tt y j p c l (28482. sor) függvényt hívja. Ez hívja
számát, ellenőrzi annak érvényességét, és értékével m eghatározza a dmap táblá­ a g e n jp c l eljárást, miután szükség szerint m ódosította a jelzőket, és ha a hívást
ból a meghívandó függvényre m utató pointert, és meg is hívja a 28349. sorban. a tty-1 a term inált hívó processzus vezérlő termináljává tette, akkor bejegyzi ezt a
processzustábla f p j t y elemében.
r = (*dp->dmap_opcl)(DEV_open, dev, proc, flags) A /dev/tty egy fikció, nem tartozik egyetlen eszközhöz sem. Ez egy mágikus meg­
nevezés, amelyet az interaktív felhasználó használhat saját term ináljának m egne­
Lemezeszköz esetén a meghívott függvény g e n jp c l, term inál esetén tty jp c l. Ha vezésére, függetlenül attól, hogy fizikailag melyik term inált használja. A /dev/tty
a hívás SUSPEND értéket ad vissza, akkor valami súlyos hiba történt, open hívás megnyitására és lezárására a cttyjp cl (28518. sor) eljárást hívja. Ez megvizsgálja,
nem lehet sikertelen ilyen módon. hogy az aktuális processzus f p j t y processzustábla-elemét módosította-e korábbi
A következő hívás, a d e v jlo s e (28357. sor) egyszerűbb. Nem várható, hogy ér­ c tty jp c l hívás, kijelölve a vezérlő terminált.
vénytelen eszközre hívják meg, és nem jelent veszélyt a sikertelen lezárás, így a A setsid rendszerhívás megköveteli a fájlrendszertől bizonyos beállítások el­
kód rövidebb, mint az azt magyarázó szöveg: csupán egy sor. Azzal végződik, hogy végzését, amelyet a d o je ts id (28534. sor) végez el. Ez módosítja az aktuális pro­
meghívja ugyanazt a * j p c l eljárást, amelyet megnyitás esetén is hívott. cesszus processzustábla-elemét, bejegyezve, hogy a processzus szekcióvezető, és
Am ikor a fájlrendszer értesítést kap az eszközvezérlőtől, meghívja a d e v jta - nincs vezérlő processzusa.
tus (28366. sor) függvényt. Az értesítés üzenet azt jelenti, hogy valamilyen ese­ Az ioctl rendszerhívást elsődlegesen a deviee.e kezeli. Azért tárgyaljuk itt, m ert
mény történt, és ez a függvény felelős azért, hogy kiderítse, mi volt az esemény, szorosan kapcsolódik az eszközvezérlő csatolófelületéhez, ioctl hívásakor d o jo c tl
és elindítsa a megfelelő tevékenységet. A bejelentés származási helye egy procesz- függvény hívódik (28554. sor), amely felépít egy üzenetet, és elküldi azt a megfe­
szus, tehát először kikeresi a dmap táblázatban, hogy melyik eszköztől származik lelő eszközvezérlőnek.
(28371-28373. sor). Előfordulhat, hogy a bejelentés hibát tartalmaz, ezért nem POSIX-kompatibilis program ok számára két függvényt deklarál az include/
hiba, ha nem talál a táblázatban neki megfelelő elem et és a d e v jta tu s így tér visz- termios.h termináleszközök vezérléséhez. A C programkönyvtár ioctl hívásokra
sza. H a megtalálta, akkor a belép a 28373-28389. sorokban leírt ciklusba. A cik­ fordítja le ezeket a függvényeket. Nem termináleszközök esetén több művelet
lusmag m inden egyes végrehajtásakor egy üzenetet küld a vezérlőprocesszusnak, megvalósítására használatos az ioctl; ezek többségét a 3. fejezetben tárgyaltuk.
amelyben annak állapotát kérdezi le. Három féle válasz várható. A DEV_REVTVE A következő függvény, a g e n jo (28575. sor) az igazi munkavégző ebben a prog­
üzenetek kaphatjuk, ha az I/O-kérést küldő eredeti processzus előzőleg fel­ ramban. H a az elvégzendő művelet akár megnyitás, lezárás, olvasás, írás, akár
függesztett állapotban volt. Ekkor a revive (pipe.c; 26146. sor) eljárás hívódik. ioctl, ez a függvény hívódik meg a művelet befejezésére. Mivel a /dev/tty nem fi­
A D E V IO R E A D Y üzenetet kaphatjuk, ha select hívást hajtott végre az eszköz. zikai eszköz, ezért amikor egy rá hivatkozó üzenetet kell küldeni, akkor a e tty jo
Végül D E V N O S T A T U S üzenetet kaphatunk, és ténylegesen ilyet várunk, de va­ hívás (28652. sor) megadja az eszköz helyes fő- és mellékszámát, és behelyettesíti
lószínűleg csak azután, hogy a másik két típus valamelyikét m ár megkaptuk. Ezért azokat az üzenetbe az elküldés előtt. A ténylegesen használt fizikai eszköz dmap
626 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 627

táblázatbeli elem ét használja a hívás megvalósítására. A M INIX 3 jelenlegi konfi­ A mise.c állományban néhány olyan rendszerhíváshoz kapcsolódó eljárás ka­
gurációjában a g e n jo hívás adja az eredményt. pott helyet, amely máshová egyáltalán nem illeszthető be.
A no_dev (28677. sor) hívódik meg a nem létező eszközökre, például hálózati A do_getsysinfo egy csatoló felület a sys_datacopy kernelhíváshoz. Ez az infor­
eszközre olyan gépen, amelyiken nincs hálózati támogatás. A visszatérési érték az mációs szerver (IS) nyomkövetésének tám ogatásához kell. Ez biztosítja az IS szá­
E N O D E V státusz. Ez megvéd az összeomlástól nem létező eszközre történt hivat­ mára, hogy a fájlrendszer adatszerkezeteiről m ásolatot tudjon készíteni, amelyet
kozás esetén. m egm utathat a felhasználónak.
A deviee.e utolsó függvénye a elone_opel (28691. sor). Néhány eszköz megnyi­ A dup rendszerhívás az állományleírót duplikálja. Más szavakkal, egy olyan új
tásakor speciális feldolgozást igényel. Az ilyen eszközöket „klónozzák”, ami azt állományleírót hoz létre, amely ugyanarra az állományra mutat, mint az eredeti.
jelenti, hogy sikeres megnyitás után helyettesítik egy új eszközzel, amelynek új A hívásnak létezik egy dup2 elnevezésű változata is. A hívás mindkét változatát a
egyedi mellékazonosítója van. A M INIX 3 nem használja ezt a képességet, azon­ do_dup eljárás kezeli. Ez az eljárás a régebbi bináris program ok tám ogatása céljá­
ban használatos hálózati eszközök engedélyezésénél. Az olyan eszköz, amely ezt ból került be a M INIX 3-ba. Jelenleg egyik hívás sem használatos már. A M INIX 3
igényli, a dmap táblázat dmap_opel mezőjében a elone_opel értékkel jelzi ezt. Ez C könyvtár jelenlegi változata minden olyan esetben, amikor egy C forráskódban
a reinkarnációs szerverből ST Y L E jO L O N E megadásával történő hívással érhe­ ezen hívások valamelyikébe ütközik, az fenti rendszerhívást hozza működésbe.
tő el. Amikor elone_opcl megnyit egy eszközt, akkor ugyanúgy kezdődik, mint a Egy megnyitott állományon elvégzendő műveletek végrehajtásának kérésére a leg­
gen_opel esetén, de egy új mellékeszközszámot adhat vissza a visszatérő üzenet kedveltebb mód az fenti rendszerhívás, amelyet a d o jc n tl eljárás kezel. A műveletek
REP STATUS mezőjében. H a ez történik, akkor egy új ideiglenes fájlt létesít, ha az 5.49. ábrán bem utatott POSIX-ban definiált jelzők segítségével kerülnek ki­
lehet új i-csomópontot létesíteni. Látható könyvtári elem nem születik. Ez nem is jelölésre. A hívást egy állományleíróval, egy kérési kóddal és az adott kérés által eset­
szükséges, m ert a fájl m ár meg van nyitva. legesen szükséges további operandusok átadásával kezdeményezzük. Például a régi

dup2(fd,fd2);
Idő
hívásnak megfelelő új hívás az
Minden fájl tartalmaz három 32 bites számot az idő kezelésére. Kettő ezek közül
az utolsó hozzáférést és az utolsó módosítást tárolja. A harmadik az i-csomópont fcntl(fd, F_DUPFD, fd2);
állapotának utolsó módosítását rögzíti. Ez az idő a fájl majdnem minden hozzáfé­
résekor változik, kivéve az olvasást (read) és a végrehajtást (exec). Ezeket az időket form ában áll elő. A kérések többsége egy jelző beolvasása vagy módosítása; éppen
az i-csomópont tartalmazza. A hozzáférési és módosítási időket a fájl tulajdonosa ezért a forráskód csupán néhány sorból áll. Az F_SETFD kérés például azon bit
vagy a szuperfelhasználó a utime rendszerhívással beállíthatja. A time.c program beállítását végzi el, amely egy állomány azonnali bezárását jelöli ki, ha a tulajdo­
d o jitim e eljárása (28818. sor) hajtja végre a rendszerhívást, amely behozza az i-cso­ nos processzus egy exec hívást hajtana végre. Az F jG E TF D kérés annak megálla­
mópontot és tárolja benne az időt. A 28848. sorban az idő módosítási igényét jelző pítására szolgál, hogy egy állományt be kell-e azonnal zárni, miután egy exec hívás
bitet beállítja, így a rendszer nem végez költséges és redundáns clock ji m e hívást. került végrehajtásra. Az F SETFL és az F GETFL kérések azon jelzők beállítását
Am int azt az előző fejezetben láttuk, a valós időt úgy lehet m eghatározni, hogy teszik lehetővé, amelyek egy adott állomány nem zárolt állapotát vagy a hozzáírási
a rendszer indítása óta eltelt időt (amelyet az időzítőtaszk kezel) hozzá kell adni művelet adott állományon történő elvégezhetőségét mutatják.
az indításkori valós időhöz. Az stime rendszerhívás adja meg a valós időt. A leg­
több m unkát a processzuskezelő végzi, de a fájlrendszer is tárolja az indításkori Kérés kódja Jelentés
időt a boottime globális változóban. A processzuskezelő m inden stime híváskor F_DUPFD Állományleíró másolatának létrehozása
üzenetet küld a fájlrendszernek. A fájlrendszer do_stime (28859. sor) eljárása ak­ F_GETFD A„exec esetén bezárandó"jelző beolvasása
tualizálja boottime értékét az üzenetből. F_SETFD A„exec esetén bezárandó"jelző beállítása
F_GETFL Az állományállapot-jelzők beolvasása
F_SETFL Az állományállapot-jelzők beállítása
5.7.8. Egyéb rendszerhívások F_GETLK Egy állomány zárolási állapotának beolvasása
F_SETLK írás/olvasás zárolás létrehozása egy állományon
Ebben a részben áttekintünk néhány fájlt, amelyek pótlólagos rendszerhívásokat F_SETLKW (rászárolás létrehozása egy állományon
tám ogatnak. A következő alfejezetben tárgyalunk olyan függvényeket, amelyek a
fájlrendszer általános segédprogramjai. 5.49. ábra. Az fenti rendszerhívás számára szükséges POSIX-paraméterek
628 5. FÁJLRENDSZEREK 5.7. A MINIX 3 FÁJLRENDSZERÉNEK MEGVALÓSÍTÁSA 629

A d o jc n tl kezeli továbbá az állományzárolásokat is. Az F GETLK, F SE T L K például egy i-csomópont vagy bittérkép, amelyek lemezről történő beolvasásakor
vagy F SE TLW K kérésekkel történő hívás átfordítódik a korábban már alaposan vagy oda irányuló kiírásakor kerülnek meghívásra. A lemezt létrehozó rendszer
megtárgyalt lock_op eljárás meghívására. bájtsorrendje a szuperblokkban van feljegyezve. A fájlrendszer többi részének
A következő rendszerhívás a syne hívás, amely lemezre írja a m em óriába töltés szükségtelen bárm it is tudnia a lemezen alkalmazott bájtsorrendről.
óta megváltozott összes blokkot és i-csomópontot. A hívást a do_sync eljárás dol­ Végül tekintsük azt a két fájlt, amelyek specializált segédszolgáltatásokat nyúj­
gozza fel. Ez egyszerűen végignézi az összes táblát, hogy van-e bennük megvál­ tanak a fájlkezelőnek. A fájlrendszer kérheti a rendszertaszkot riasztás beállításá­
tozott elem. Először az i-csomópontokat kell feldolgozni, mivel az rw jn o d e a ra, de ha több időpontra is be akar állítani riasztást, akkor ezeket egy saját láncolt
blokkgyorsítótárba irányítja kimenetét. M iután m inden megváltozott i-csomópont listában kezelheti, csakúgy, mint azt az előző fejezetben láttuk a processzuskeze­
a blokkgyorsítótárba került, az összes megváltozott blokk lemezre íródik. lőnél. A timers.c tartalm azza ezeket a segédprogramokat. Végül a M INIX 3 egy
A fork, exec, exit és set rendszerhívások valójában a memóriakezelő hívásai, egyedi CD-ROM -kezelést valósít meg, amely egy M INIX 3-lemezt rejt több par­
azonban eredm ényüket a fájlrendszernek is el kell küldeni. Egy processzus elága­ tícióval a CD-ROM -on, és lehetővé teszi élő M INIX 3 indítását CD-ROM -ról.
zásakor lényeges, hogy erről az operációs rendszer központi része, a processzus­ A M INIX 3-fájlok nem láthatók olyan operációs rendszerben, amely csak stan­
kezelő és a fájlrendszer egyaránt értesüljenek. Ezek a „rendszerhívások” nem a dard CD-ROM -fájlform átum okat ismernek. A cdprobre.c program betöltéskor
felhasználói processzustól érkeznek, hanem a processzuskezelőtől. A d o jo rk , do_ megkeresi a CD-ROM -eszközt és azokat a fájlokat, amelyek a M INIX 3 betölté­
exit és do_set eljárások a processzustábla állományrendszerbeli részébe jegyzik fel séhez kellenek.
a lényeges információkat. A do_exec kikeresi és (a do_close eljáráson keresztül)
bezárja az „exec esetén bezárandó”-ként megjelölt valamennyi állományt.
Ezen állomány utolsó függvénye valójában nem rendszerhívás, de úgy kezel­ 5.7.10. Egyéb MINIX 3-komponensek
jük, m intha az lenne. Ez a d o jeviv e függvény. Akkor hívjuk meg, ha egy taszk
korábban nem tudta a fájlrendszer által kért m unkát befejezni - például egy fel­ Az előző fejezetben tárgyalt processzuskezelő és az ebben a fejezetben tárgyalt
használói processzus számára nem tudott bem eneti értékeket adni -, azonban fájlrendszer felhasználói szerverek; ezek olyan szolgáltatásokat nyújtanak, am e­
időközben teljesítette azt. Ilyenkor a fájlrendszer újraéleszti a processzust és egy lyek hagyományos tervezésű rendszerek esetén egyetlen monolitikus kernelbe
válasz üzenetet küld számára. integrálhatók. Azonban ezek nem az egyedüli szerverek a M INIX 3-ban. Vannak
A select.h és a select.c a select rendszerhívásnak nyújt támogatást. A select akkor más felhasználói szerverek is, amelyek rendszerjogosultsággal futnak és az operá­
kell, amikor egy önálló processzusnak többszörös I/O-folyamot kel kezelnie, pél­ ciós rendszer részének tekinthetők. Ebben a könyvben nincs hely a részletes tár­
dául kommunikációs vagy hálózati program. Részletesebb tárgyalása meghaladja gyalásukra, de legalább meg szeretnénk említeni őket.
a könyv kereteit. Az egyikkel m ár foglalkoztunk ebben a fejezetben. Ez a reinkarnációs szer­
ver, az RS, amely közönséges processzust indít, amelyet átvált rendszertaszkká.
A M INIX 3 jelenlegi változatában arra szolgál, hogy elindítson egy olyan eszköz­
5.7.9. Fájlrendszer-segédeljárások vezérlőt, amely nem része a betöltési m emóriaképnek. A későbbi változatban ké­
pes lesz vezérlő leállítására és újraindítására, és ténylegesen figyelni a vezérlőket,
A fájlrendszerben van néhány olyan általános célú eljárás, amelyet eltérő helyze­ autom atikusan leállítani és újraindítani hibás működés esetén. A reinkarnációs
tekben is használunk. Ezeket a utility.c állományban gyűjtöttük össze. szerver forráskódja az src/server/rs könyvtárban található.
A clock jim e a rendszertaszknak küld üzeneteket a pontos valós idő lekérdezése Az IS információs szervert is megem lítettük futólag. Ez nyomkövetési inform á­
céljából. A fe tc h jia m e eljárásra azért van szükség, m ert nagyon sok rendszerhívás ciókat készít, amit a PC stílusú billentyűzeten egy funkcióbillentyű lenyomásával
rendelkezik param éterként fájlnévvel. H a a fájlnév rövid, a felhasználó által a fájl- lehet kezdeményezni. Az információs szerver forráskódja az src/server/is könyvtár­
rendszernek küldött üzenetben ez szerepel. H a azonban a fájl neve hosszú, akkor ban található.
a felhasználói területen lévő nevet kijelölő m utató kerül be az üzenetbe. A fetch_ Az információs szerver és a reinkarnációs szerver relatíve rövid programok. Van
name mindkét esetet ellenőrzi, és ilyen vagy olyan módon megszerzi a fájl nevét. egy harmadik, nem kötelező szerver is, az IN É T hálózati szerver. Ez m eglehető­
Két függvény a hibák egy általános osztályát kezeli. A n o jy s hibakezelő akkor sen nagy, a m érete hozzávetőlegesen akkora, mint a M INIX 3 betöltési m em ória­
kerül meghívásra, ha a fájlrendszer olyan rendszerhívást kap, amely nem a sajátjai képéé. Ezt a reinkarnációs szerver indítja, teljesen úgy, mint az eszközvezérlőket.
közül való. A panic elnevezésű pedig, ha valami katasztrofális dolog történt, kiír egy Az inét szerver forráskódja az src/server/inet könyvtárban található.
üzenetet, és az operációs rendszer központi részét a törülköző bedobására kéri. Végül megemlítünk egy rendszerkom ponenst, amelyet eszközvezérlőnek és
Az utolsó két függvény, a conv2 és a conv4 az eltérő bájtsorrendű processzorok nem szervernek tekinthetünk. Ez a napló eszköz. Mivel az operációs rendszer
problém ájának m egoldását segítik. Ezek a rutinok olyan adatszerkezetek, mint nagyon sok kom ponense önálló processzusként fut, kívánatos adni egy egységes
630 5. FÁJLRENDSZEREK FELADATOK 631

eszközt a diagnosztikai, figyelmeztető- és hibaüzenetek kezelésére. A M INIX 3 Feladatok


eszközvezérlőt biztosít a /dev/klog áleszközre, amely üzeneteket fogad, és kiírja
azokat a fájlba. A forráskód az src/server/log könyvtárban található. 1. Az NTFS Unicode fájlneveket használ. A Unicode karakterek 16 bitesek. Mi
az előnye a Unicode fájlneveknek az ASCII fájlnevekkel szemben?
2. Néhány fájl elején mágikus szám található. Mi ennek a szerepe?
3. Az 5.4. ábrán néhány fájlattribútum látható. A táblázatban nem szerepel a pa­
5.8. Összefoglalás ritás. Hasznos attribútum lenne a paritás? H a igen, mire lehetne használni?
4. Adjon meg az /etc/passwd fájl számára 5 különböző elérési utat. (Tanács: hasz­
Kívülről nézve a fájlrendszer állományok és könyvtárak, valamint az ezeken vég­ nálja fel a . és a .. könyvtárbejegyzéseket.)
zett műveletek összességéből áll. Az állományok írhatók és olvashatók, a könyvtá­ 5. A soros elérésű állományokkal rendelkező rendszerek mindig rendelkeznek
rak létrehozhatók és megszüntethetők, az állományok pedig az egyik könyvtárból egy olyan művelettel, amely az állományok elejére m utat vissza. Szükséges-c
a másikba mozgathatók. A legtöbb m odern fájlrendszer támogatja a könyvtári ezen művelet a véletlen hozzáférésű állományokat tám ogató rendszerek ese­
rendszer hierarchikus felépítését, amelyben a könyvtáraknak végtelen sok alkönyv­ tében?
táruk lehet. 6. Néhány operációs rendszer a rename rendszerhívást használja egy állomány
Belülről nézve a fájlrendszer eléggé másként fest. A fájlrendszer tervezőinek átnevezésére. Van-e valamilyen különbség, ha ezt a hívást használjuk egy állo­
olyan dolgokkal kellett törődniük, mint a tárolóhely lefoglalása, illetve annak nyo­ mány átnevezésekor azzal szemben, ha az állományt egy új néven másik állo­
mon követése, hogy melyik blokk melyik állományhoz tartozik. Azt is láttuk, ho­ mányba másoljuk át, majd töröljük a régit?
gyan lehet a különböző rendszereknek egymástól eltérő könyvtárszerkezete. A 7. Tekintsük az 5.7. ábrán bem utatott könyvtárszerkezetet. H a a pillanatnyi m un­
fájlrendszer megbízhatósága és teljesítménye szintén fontos kérdések. kakönyvtár /usr/jim, mi annak az állománynak az abszolút elérési útja, amely­
A biztonság és az adatvédelem mind a felhasználók, mind a tervezők szempont­ nek relatív elérési útja .Jast/xl
jából életbe vágóan fontos. Megtárgyaltunk néhány régebbi rendszerben jelen lévő 8. Tekintsük a következő javaslatot. A fájlrendszer egyetlen gyökérkönyvtára he­
biztonsági hiányosságot és olyan általános problémát, amelyek sok rendszernél fel­ lyett legyen m inden felhasználóhoz egyedi gyökérkönyvtár. Ezzel flexibiliseb­
bukkannak. Megnéztük, hogy működik a jogosultságok kezelése jelszóval, hozzáfé­ bé válna a fájlrendszer? Indokolja a válaszát.
rést vezérlő listával és más módszerekkel, valamint ezek használata nélkül. M ind­ 9. Unix-fájlrendszerben a chroot paranccsal a gyökérkönyvtár beállítható tetsző­
ezeken túl, az adatvédelem kapcsán megtárgyaltuk annak egy mátrixmodelljét is. leges könyvtárra. Van ennek biztonsági következménye? Indokolja válaszát.
Végezetül részletesen megvizsgáltuk a M INIX 3 fájlrendszerét, amelynek m é­ 10. Unix-rendszerben beolvasható a könyvtári bejegyzés. M iért szükséges külön
rete ugyan óriási, ő maga azonban nem túlzottan bonyolult. Ez fogadja a felhasz­ parancs a könyvtári bejegyzés olvasására, amikor az is csak fájl? A felhasz­
nálói processzusok munkavégzésre irányuló kéréseit, végzi el az eljárási m utatók nálók maguk nem olvashatják a könyvtárakat?
táblájában a megfelelő kijelöléseket, majd hívja meg azt az eljárást, amely a kért 11. A standard PC-k egyidejűleg legfeljebb négy operációs rendszert tartalm az­
rendszerhívást végzi. Részegységekből történő felépítésének, valamint az ope­ hatnak. Van olyan módszer, amivel ez növelhető? Milyen következményei len­
rációs rendszer központi részén kívül való elhelyezkedésének köszönhetően a nének a javaslatának?
MINIX 3-ról leválasztható és kisebb módosítások elvégzése után akár egy önálló 12. Az állományok folyamatos foglalása, mint azt a szövegben említettük, a lemez
hálózatifájl-kiszolgálóként is alkalmazható. felaprózódásához vezet. Vajon ez egy belső vagy külső felaprózódás? Vonjunk
Belülről megvizsgálva, a M INIX 3 ideiglenesen egy ún. blokkgyorsítótárban párhuzam ot ez és egy - az előző fejezetben megtárgyalt - dolog között.
helyezi el az adatokat, és ha egy fájlt szekvenciálisán kezelünk, akkor kísérletet 13. Az 5.10. ábra az MS-DOS eredeti FAT-fájlrendszerének szerkezetét mutatja.
tesz az adatok előreolvasására. Amennyiben ennek a gyorsítótárnak elég nagy a Eredetileg a fájlrendszer csak 4096 blokkot tartalm azott, így 4096 elemű táblá­
m érete, az adott program csoportot egymás után többször is megkérő műveletek­ zat (12 bit) elég volt. H a ezt a sém át közvetlenül kiterjesztenénk úgy, hogy 232
nél, mint például fordítás során, a program kód nagy része m ár a m em óriában lesz blokkot tartalmazzon, akkor mekkora helyet foglalna el a FAT?
megtalálható. 14. Képzeljünk el egy olyan operációs rendszert, amely csak egyetlen könyvtár
létezését támogatja, viszont ebben a könyvtárban tetszőleges számú és akár­
milyen hosszú névvel rendelkező állomány előfordulhat. Lehetséges-e vala­
milyen módon egy közelítőleg hierarchikus állományrendszert szimulálni? Ha
igen, milyen módon?
15. A szabad lem ezterületet egy üres listával vagy bittérképpel lehet számon tarta­
ni. A lemezcímek tárolása D számú bitet igényel. Tételezzük fel, hogy van egy
632 5. FÁJLRENDSZEREK FELADATOK 633

B blokkal rendelkező lemezünk, amelyen F üres blokk van. Határozzuk meg, jelszót fejthessen meg. Védelmet nyújt-e ezen eljárás egy olyan hallgató ellen,
milyen feltételek mellett foglal el az üres lista kevesebb helyet, mint a bittér­ aki a saját gépén a rendszer-adminisztrátor jelszavát próbálja meg kitalálni?
kép. Adjuk meg a lemez tárterületének százalékában, hogy a D = 16 választás 26. Egy számítástudományi tanszék helyi hálózata nagyszámú Unix-gépből áll.
mellett m ekkora lem ezterületnek kell ehhez üresen maradnia. A felhasználók bármely gépen kiadhatják a
16. Tételezzük fel, hogy minden Unix-állomány első részét ugyanabban a lemez­
blokkban tároljuk, mint a hozzá tartozó i-csomópontot. Milyen előnyünk szár­ m achine4 w h o
mazna ebből?
17. Egy állományrendszer teljesítménye nagyban függ a gyorsítótárban való meg­ formájú parancsot, és végrehajthatják a machine4 elnevezésű gépen anélkül,
találási arány (a gyorsítótárban m egtalált blokkok aránya) értékétől. H a a hogy oda fizikailag belépnének. Ezt úgy oldották meg, hogy a felhasználó operá­
gyorsítótárból történő kérés végrehajtásához 1 ms, a lemezről történő kérés ciós rendszerének központi része elküldi a távoli gépnek a parancsot és a felhasz­
végrehajtásához viszont 40 ms valamint, illetve a gyorsítótárban való megta­ náló azonosítóját. Biztonságos-e ez az eljárás, ha az operációs rendszerek köz­
lálási arány h, határozzunk meg egy kérés végrehajtásához szükséges átlagos ponti része mind megbízható (azaz védelmi hardverrel felszerelt nagy, időosztá­
időt. Ábrázoljuk ezen összefüggést h függvényében, ha h a (0, 1) intervallum­ sos miniszámítógépek rendszere)? Hogyan változik a helyzet, ha a gépek közül
ban változik! néhány védelmi hardverrel fel nem szerelt, hallgatói személyi számítógép?
18. Mi a különbség a merev és a szimbolikus kapcsolás között? Adjuk meg mind­ 27. Egy állomány törlésekor annak blokkjai általában a szabad listába kerülnek,
egyik előnyét. de nem törlődnek azonnal. Gondolja, jó ötlet volna az operációs rendszerrel
19. Adjunk meg három csapdát, amelyre figyelni kell fájlrendszer mentésekor. az egyes blokkokat még azelőtt töröltetni, hogy azok felszabadításra kerülné­
20. Egy hajlékonylemezen 400 cilinder van, ezek mindegyike 8 sávot tartalm az nek? Válaszában térjen ki mind a biztonsági, mind a teljesítménnyel kapcsola­
512 bájtos blokkokkal. Egy pozicionálás cilinderenként 1 ms-ig tart. H a egy tos összetevőkre, és magyarázza meg ezek hatásait.
állomány blokkjait nem próbáljuk meg egymáshoz közel elhelyezni, két logi­ 28. Az általunk megtárgyalt három védelmi technika a képességeket, az elérést
kailag egymás után következő blokk (vagyis az állományban egymás után ta­ szabályozó listák és a Unix rwx bitjei. Állapítsuk meg egyenként, hogy az alább
lálható) átlagos pozicionálási időt igényel, ami 5 ms. H a azonban az operációs felsorolt védelmi problém áknál melyik technika használható a három közül.
rendszer megpróbálja az összetartozó blokkokat csoportosítva elhelyezni, ak­ (a) Ken mindenki számára, kivéve m unkatársait, olvashatóvá szeretné tenni
kor a blokkok között az átlagos távolság 2 cilindernyire csökkenthető, és így a állományait.
pozicionálási idő 100 ms-ra csökken. Mennyi ideig tart egy 100 blokkból álló (b) Mitch és Steve szeretne néhány titkos állományt megosztani.
állomány beolvasása a két esetben, ha a forgási késleltetés 10 ms, az átvitelhez (c) Linda állományai egy részét nyilvánossá szeretné tenni.
pedig 20 ms szükségeltetik blokkonként? A Unix esetén a csoportokat olyan osztályokként képzeljük el, mint szak, hall­
21. Van-e számottevő haszna a tárterület időnkénti tömörítésének? Indokolja vála­ gatók, titkárnők és így tovább.
szát. 29. Meg tud-e bárm it is tám adni a trójai faló típusú vírus egy olyan rendszerben,
22. Mi a különbség egy vírus és egy féreg között? Hogyan szaporodnak? amelynek védelme képességekre épül?
23. Diplomája megszerzése után egy olyan óriási egyetem számítóközpontjának 30. A filp tábla m éretét jelenleg az fs/const.h definíciós állományban található
vezetői posztját pályázza meg, amely éppen most szabadult meg ósdi operá­ N R F IL P S változó határozza meg. Mivel több felhasználót szeretne hálózati
ciós rendszerétől és vezette be a Unixot. Pályázata sikerrel jár. M unkakezdés rendszerében elhelyezni, szeretné az include/minix/config.h definíciós állomány­
után negyed órával helyettese ordítva rohan be az Ön irodájába: „Néhány hall­ ban található N R PROCS változó értékét megnövelni. Hogyan definiálható
gató rájött a jelszók titkosítására használt algoritmusunkra, és elküldte a hir­ N R FILPS az N R PROCS változó függvényében?
detőtáblára.” Mit tenne Ön ebben a helyzetben? 31. Tételezzük fel, hogy egy technikai áttörésnek köszönhetően a „nem felejtő”
24. Két számítástudományi szakos hallgató, Carolyn és Elinor, az i-csomópontok- RAM - ez áram kimaradásnál is m egbízhatóan őrzi meg a benne lévő adatokat
ról beszélgetnek. Carolyn azt a nézetet vallja, hogy mivel a memóriák napjaink­ - a hagyományos RAM-hoz képest mindenfajta árbeli vagy teljesítménybeli
ban m ár nagyok és olcsók, egy állomány megnyitásakor sokkal egyszerűbb az hátrány nélkül jelenik meg a piacon. Mely pontokon befolyásolná ez az új fej­
i-csomópont táblában az állomány i-csomópontjáról egy újabb másolatot elhe­ lesztés a fájlrendszertervezést?
lyezni, mint a táblát végignézni, hogy az i-csomópont nincs-e m ár ott. Elinor 32. A szimbolikus kapcsolások olyan állományok, amelyek közvetett m ódon m u­
nem ért egyet ezzel a véleménnyel. Kinek van igaza? tatnak más állományokra vagy könyvtárakra. A közönséges kapcsolatoktól el­
25. Az n bit hosszúságú véletlen számokon alapuló M orris-Thompson-féle védel­ térően, például a M INIX-ben pillanatnyilag alkalmazott közönséges kapcso­
mi eljárást arra tervezték, hogy azzal megnehezítsék egy külső behatoló számá­ latoktól eltérően, a szimbolikus kapcsolatok saját, adatblokkot kijelölő i-cso­
ra, hogy egyszerű karakterfüzérek előre történő titkosításával nagy mennyiségű m óponttal rendelkeznek. Az adatblokk tartalm azza azon állomány elérési ú t­
634 5. FÁJLRENDSZEREK

ját, amelyhez a kapcsolatot hozzárendeltük, és az i-csomópont lehetővé teszi,


hogy a kapcsolatnak eltérő tulajdonosa vagy engedélyei legyenek, mint annak 6. További irodalom
az állománynak vannak, amihez azt hozzákapcsoltuk. A szimbolikus kapcsolat
és az állomány vagy könyvtár, amelyre az m utat, akár különböző eszközökön
is lehetnek. A szimbolikus kapcsolatok nem alkotják részét az 1990-es POSIX
szabványnak, de a jövőben minden bizonnyal bekerülnek majd a POSIX-ba.
Hozzunk létre szimbolikus kapcsolatokat a M INIX 3 számára.
33. A M INIX 3-ban jelenleg a 32 bites fájlpointer szabja meg a maximális fájlmére­
tet. A jövőben 64 bites pointereket használva 232-l-n é l nagyobb fájlok is lehet­
nek, ami azt eredményezi, hogy háromszorosan indirekt blokkok is kellenek.
Módosítsuk az FS-t úgy, hogy háromszorosan indirekt blokkokat is kezeljen.
34. Mutassuk meg, hogy rendszerünk a ROBUST jelző beállításával az összeom­
lásokkal szemben többé-kevésbé megbízhatóbbá válik. Azt, hogy a M INIX 3
aktuális változata hogyan reagál az ilyen irányú változtatásokra, még nem Az előző öt fejezetben jó néhány tém át körbejártunk. Jelen fejezetet segítségül
tanulmányozták alaposabban; az bármelyik irányba elmozdulhat. Vizsgáljuk szánjuk mindazok számára, akik az operációs rendszerekről megszerzett tudásu­
meg alaposan, mi történik akkor, amikor egy megváltozott tartalm ú blokkot kat tovább szeretnék fejleszteni. A 6.1. alfejezet tartalm azza a javasolt irodalmat,
eltávolítanak a gyorsítótárból. Vegyük figyelembe, hogy egy megváltozott tar­ míg a 6.2. alfejezetben soroltuk fel betűrendben a könyvünk megírásához felhasz­
talm ú adatblokk általában egy megváltozott i-csomópont, illetve bittérkép nált összes könyvet, valamint tudományos cikket.
megjelenésével jár együtt. A felsorolt hivatkozásokon túl az operációs rendszerekről további cikkek
35. Dolgozzunk ki egy olyan eljárást, amellyel lehetővé válik egy „idegen” ál­ találhatók a kétévente m egrendezett A C M Symposium on Operating Systems
lományrendszer támogatása, például egy M S-DOS-állományrendszernek a Principles (ACM), valamint az évente m egrendezett International Conference on
M INIX 3-állományrendszer valamely könyvtárához történő hozzákapcsolása. Distributed Computing Systems (IE E E ) elnevezésű konferenciák kiadványaiban.
36. írjunk két olyan program ot, C-ben vagy parancsértelm ező nyelven, amelyek Hasonlóan jól használható a USENIX Symposium on Operating Systems Design
M INIX 3-ban rejtett csatornán üzenetet küldenek és fogadnak. Tanács: a jo­ and Implementation c. kiadványa is. Az A C M Transactions on Computer Systems
gosultságbit akkor is lekérdezhető, ha a fájl egyébként nem elérhető, továbbá és az Operating Systems Review c. folyóiratokban szintén találhatunk az operációs
a sleep paranccsal vagy rendszerhívással adott ideig várakoztatni lehet. M érjük rendszerekkel kapcsolatos munkákat.
az átviteli arányt tétlen rendszer esetén. Aztán mesterségesen nagymértékben
terheljük le a rendszert sok háttérprocesszus indításával, és ismét mérjük az
átviteli arányt.
37. Implem entáljuk M INIX 3-ban a közvetlen fájlt, tehát amikor az adatot magá­ 6.1. Ajánlott irodalom
ban az i-csomópontban tároljuk, amivel lemezhez fordulást takarítunk meg.
Következzenek a javasolt irodalmak fejezetenkénti bontásban.

6.1.1. Bevezetés és általános témájú munkák

Bővet és Cesati: Understanding the Linux Kernel. 3. kiadás


Ez talán a legjobb választás azoknak, akik a Linux-kernel belső működését szeret­
nék megérteni.

Brinch Hansen: Classic Operating Systems


A z operációs rendszerek m ár elég régóta jelen vannak ahhoz, hogy néhány kö­
zülük klasszikusnak számítson: rendszerek, amelyek hatására a világ máshogyan
tekint a számítógépekre. A könyv 24 cikk gyűjteménye az operációs rendszerek jö ­
vőjét meghatározó rendszerekről, olyan kategóriákba gyűjtve, mint nyitott üzemű,
636 6.TOVÁBBI IRODALOM 6.1. AJÁNLOTT IRODALOM 637

kötegelt, multiprogramozásos, időosztásos, PC és osztott operációs rendszerek. program ok POSIX szabványra való átalakításához és az új program ok POSIX-
Akit érdekel az operációs rendszerek története, olvassa el ezt a könyvet. környezetben történő fejlesztéséhez. Számos forráskódpéldát és néhány teljes
program ot is tartalmaz. Részletesen bem utatja az összes POSIX által használt
Brooks: The Mythical Man-Month: Essays on Software Engineering könyvtári függvényt és definíciós állományt is.
Szellemes, szórakoztató, ugyanakkor rendkívül sok információt tartalm azó könyv
arról, hogyan ne írjunk operációs rendszert, egy olyan szerzőtől, aki m ár végigjárta McKusick és Neville-Neil: The Design and Implementation ofthe FreeBSD Operating
ezt az utat. A könyv tele van hasznos tanácsokkal. System
Ezt kell elolvasnunk, ha a m odern Unix-verziók, jelen esetben a FreeBSD belső
Corbató: On Building Systems That Will Fail m űködésének alapos m agyarázatára vagyunk kíváncsiak. Tartalmazza a procesz-
A szerző, az időosztási technika atyja, a Turing-díj átvételekor m egtartott elő­ szusok, az I/O, a memóriakezelés, hálózatkezelés és szinte m inden más leírását.
adásában ugyanazokat a problém ákat boncolgatja, amelyeket Brooks is tárgyal a
Mythical Man-Month című könyvében. A rra a végkövetkeztetésre jut, hogy min­ Milojicic: Operating Systems: Now and in the Future
den bonyolult rendszer végső soron megbukik, tehát ahhoz, hogy egyáltalán esé­ Tegyük fel, hogy feltehetünk egy sor kérdést a világ 6 vezető operációsrendszer­
lyünk legyen a sikerre, a tervezés során alapvetően el kell kerülnünk a bonyolult­ szakértőjének a területről és a fejlődés irányáról. Ugyanazokat a válaszokat kap­
ságot, és az egyszerűség fenntartására kell törekednünk. juk? Súgunk: nem. Nézzük meg, mit mondanak.

Deitel: Operating Systems. 3. kiadás Ray és Ray: Visual Quickstart Guide: Unix. 2. kiadás
Az operációs rendszerekről szóló általános tankönyv. A hagyományos témák mellett a Linux A könyvünkben szereplő példák m egértését elősegíti, ha nem ismeretlen szá­
és a Windows XP operációs rendszerekkel kapcsolatos esettanulmányokat is tartalmaz. m unkra a Unix használata. Ez a sok Unix-könyv egyike, amely kezdőknek m utatja
be a Unix használatát. Bár megvalósítása különbözik, a felhasználó felé a M INIX
Dijkstra: My Recollections o f Operating System Design Unixnak látszik, így ez vagy egy ehhez hasonló könyv a M INIX használatában is
Az operációs rendszertervezés egyik úttörőjének visszaemlékezései, kezdve azok­ segítséget nyújt.
kal az időkkel, amikor még az „operációs rendszer” kifejezés nem is létezett.
Russinovich és Solomon: Microsoft Windows Intemals. 4. kiadás
IEEE, Information Technology - Portable Operating System Interface (POSIX), első Tűnődött m ár valaha azon, milyen a Windows belső m űködése? Ne tűnődjünk to­
rész: System Application Program Interface (API) [C nyelven] vább. Ez a könyv elmond mindent, amit feltételezhetően tudni akar a processzu­
Ez a kiindulási alap. Jelentős része valójában egészen könnyen m egérthető, kü­ sokról, memóriakezelésről, I/O-ról, hálózatkezelésről, biztonságról és rengeteg
lönösen a „Rationale and N otes” címre hallgató B. függelék, amely megvilágítja, másról.
hogy m iért is úgy történnek a dolgok, ahogyan. A szabványdokumentumra való
hivatkozásnak van még egy előnye: ebben, definíció szerint, nincsenek hibák. H a Silberschatz és Galvin: Operating System Concepts. 7. kiadás
ugyanis egy m akróutasítás nevében szereplő elgépelés a szerkesztési folyamaton Egy újabb operációs rendszerekkel foglalkozó tankönyv, amely felöleli a procesz-
túljut, akkor a továbbiakban az m ár nem hibaként, hanem a hivatalos változatként szusokat, a tárkezelést, az állományokat és az osztott rendszereket. Két konkrét
él tovább. esetet is bem utat: a Linuxot és a Windows XP-t.

Lampson: Hints fór Computer System Design Stallings: Operating Systems. 5. kiadás
Butler Lampson, aki a világon egyike az újszerű operációs rendszerek vezető ter­ Még egy tankönyv az operációs rendszerekről. Tartalmazza az összes szokásos té­
vezőinek, az évek során megszerzett tapasztalataira alapozva jó néhány tippet, makört, foglalkozik egy keveset az osztott rendszerekkel és egy függelék erejéig a
javaslatot, valamint útm utatást gyűjtött össze ebben a cikkében, és rendezte szó­ sorban állás elméletével is.
rakoztató és rendkívül sok információt nyújtó módon egymás mellé. Akárcsak
Brook könyvét, ezt is m inden leendő operációsrendszer-tervezőnek célszerű el­ Stevens és Rago: Advanced Programming in the Unix Environment. 2. kiadás
olvasnia. Ez a könyv bem utatja, hogyan kell olyan C program okat írni, amelyek a Unix
rendszerhívási csatolófelületét és a szabvány C könyvtárakat használják. A példák
Lewine: POSIXProgrammer’s Guide a FreeBSD 5.2.1, a Linux 2.4.22, a Solaris 9, a Darwin 7.4.0 és a Mac OS X 10.3-
Ez a könyv a szabványdokumentumokhoz viszonyítva sokkal olvashatóbb form á­ alapú FreeBSD/M ach változataira vonatkoznak. Részletesen leírja ezen rendszer
ban tárgyalja a POSIX szabványt. Ezen túlm enően útm utatást nyújt a régebbi POSIX-hoz való viszonyát.
638 6. TOVÁBBI IRODALOM 6.1. AJÁNLOTT IRODALOM 639

6.1.2. Processzusok Corbet et al.: Linux Device Drivers. 3. kiadás


H a igazán tudni akarjuk, hogyan működik az I/O, próbáljunk meghajtóprogram ot
Andrews és Schneider: Concepts and Notations fór Concurrent Programming írni. Ez a könyv bem utatja, hogy Linux alatt ezt hogyan tehetjük meg.
Ez egy bevezetés (illetve áttekintés) a processzusok, valamint a processzusok közötti Geist és Dániel: A Continuum ofD isk Scheduling Algorithms
kommunikáció rejtelmeibe, beleértve a tevékeny várakozást, a szemaforokat, mo­ Egy általánosított lemezíró/olvasó fejet mozgató kar ütem ezésére közöl algorit­
nitorokat, az üzenetküldést és egyéb megoldásokat. A cikk ezen elvek különböző must a cikk. Az ezzel kapcsolatos kiterjedt szimulációs és kísérleti eredmények szin­
programozási nyelveken történő megvalósítását is bemutatja. tén megtalálhatók benne.

Ben-Ari: Principles o f Concurrent and Distributed Programming Holt: Somé Deadlock Properties o f Computer Systems
A könyv három részből áll. Az első rész többek között a kölcsönös kizárásról, a A holtpontok tárgyalása. H olt cikkében egy olyan irányított gráf modellt vezet be,
szemaforokról, a m onitorokról és az étkező filozófusok problém ájáról szól. A m á­ amelynek alkalmazásával kielem ezhető néhány holtponthoz vezető helyzet is.
sodik rész az osztott számításokat tárgyalja, valamint azokat a nyelveket, amelyek
hasznosak az osztott számításokhoz. A harmadik rész az együttműködés alapelve­ IE E E Computer magazin, 1994. március
iről és megvalósításáról szól. A Computer magazinnak ez a száma nyolc olyan, a fejlettebb I/O-t tárgyaló cikket
közöl, amelyek lefedik a szimuláció, a nagy teljesítményű tárolás, a gyorsítótárak, a
Bic és Shaw: Operating System Principles párhuzamos számítógépek I/O-műveletei és a multimédia-alkalmazások területeit.
Ez az operációs rendszerekről szóló tankönyv négy fejezetben tárgyalja a procesz-
szusokat, nemcsak a szokásos alapelveket, hanem elég sok dolgot a megvalósítás­ Levine: Defining Deadlocks
ról is. Ebben a rövid cikkben Levine érdekes kérdéseket vet fel a holtpontok szokványos
definícióival és példáival kapcsolatosan.
Miló et al.: Process Migration
Ahogy a PC-klaszterek fokozatosan kiszorítják a szuperszámítógépeket, a pro­ Swift et al.: Recovering Device Drivers
cesszusok egyik gépről másikra mozgatása (például terheléselosztáshoz) egyre A meghajtóprogramok az operációs rendszer többi részéhez képest egy nagyság­
fontosabbá válik. Ebben az áttekintő m űben a szerzők a migráció működésének renddel nagyobb hiba-előfordulással rendelkeznek. Tehetünk-e valamit a megbíz­
m ikéntjét tárgyalják, annak előnyeivel és csapdáival együtt. hatóság javítása érdekében? A cikk bem utatja, hogyan használhatók az árnyék­
m eghajtók e cél elérése érdekében.
Silberschatz és Galvin: Operating System Concepts. 7. kiadás
A könyv 3. és 7. fejezete közötti rész a processzusok, valamint a processzusok Tsegaye és Foss: A Comparison ofthe Linux and Windows Device Driver Architecture
közötti kommunikáció részleteivel foglalkozik, beleértve az ütemezés, a kritikus A Linux és a Windows meglehetősen különböző m eghajtóprogram-architektúrával
szekciók, a szemaforok, a m onitorok és a processzusok közötti kommunikáció rendelkezik. A cikk m indkettőt tárgyalja, bem utatva, miben hasonlítanak és mi­
klasszikus problém áinak kérdéseit. ben térnek el.

Wilkes et al.: The H P AutoRAID Hierarchical Storage System


6.1.3. Bevitel/kivitel A nagy teljesítményű m erevlemez-rendszereknél egy olyan fontos, új fejlesztés a
RAID („olcsó lemezek redundáns töm bje”), amelyben kicsi lemezek egész sora
Chen et al.: RAID: High Performance Reliable Secondary Storage dolgozik együtt, hogy biztosítsa a rendszer óriási sávszélességét. Ebben a cikkben
A ma elérhető legjobb rendszereknél a gyors I/O elérése céljából a többszörös le­ a szerzők a H P laborjaiban m egépített rendszerük néhány részletét teszik közzé.
mezmeghajtók párhuzam os használata szokásos. A szerzők tárgyalják magát az
ötletet, továbbá megvizsgálják a különböző szervezéseket a teljesítmény, az ár és a
megbízhatóság szempontjából. 6.1.4. Memóriakezelés
Coffman et al.: System Deadlocks Bic és Shaw: Operating System Principles
Rövid bevezető a holtpontok tárgykörébe, abba, hogy mi is okozza őket, és ho­ A könyv három fejezetet szentel a memóriakezelés, a fizikai memória, a virtuális
gyan kerülhetők el és hogyan észlelhetők. m em ória és az osztott m emória tárgyalására.
640 6. TOVÁBBI IRODALOM 641
6.1. AJÁNLOTT IRODALOM

Denning: Virtual Memory juk 200 000 PC vásárlása lehetne, akármilyen PC-k megteszik. A második lépés
A virtuális m emória különböző tulajdonságait vizsgáló, klasszikusnak számító pedig e cikk elolvasása lenne, hogy csinálja ezt a Google.
cikk. Denning egyike volt ezen terület úttörőinek; az ő nevéhez fűződik a m unka­
halmaz elvének megalkotása. H afner és M arkoff: Cyberpunk: Outlaws and Hackers on the Computer Frontier
A világ különböző számítógépes rendszereibe behatoló fiatal, számítógépes kaló­
Denning: Working Sets Pást and Present zokról szóló három történet a New York Times számítógépekkel foglalkozó tudósí­
Számos memóriakezelő és lapozó algoritmus remek áttekintése. A cikk átfogó tójának, aki az interneten terjedő, illegális behatoló programokról is írt, valamint
irodalomjegyzéket is tartalmaz.
társszerzőjének tollából.

Denning: The Locality Principle Harbron: File Systems: Structures and Algorithms
Egy újabb keletű visszatekintés a lokalitás alapelvének történetére és a m em ória­ A fájlrendszerek tervezéséről, alkalmazásáról és teljesítményéről szóló könyv. A fájl-
lapozáson túli alkalmazhatóságainak tárgyalása. rendszerek szerkezetét és a kapcsolódó algoritmusokat egyaránt tárgyalja.

Halpern: VIM: Taming Software with Hardware


McKusick et al.: A Fást File System fór Unix
Ebben a provokatív cikkben H alpern azt bizonygatja, hogy óriási összegeket köl­ A Unix-fájlrendszert teljesen átdolgozták a 4.2 BSD változatban. A cikk összefog­
tenek szoftverek gyártására, hibakeresésére és fenntartására, amelyek m em ória­ lalja az új fájlrendszer tervezését és felépítését, különös hangsúllyal a fájlrendszer
optimalizálással járnak együtt nemcsak az operációs rendszerek, de fordítók és teljesítményére.
más szoftverek szintjén is. Továbbá, hogy makroökonómiai szempontból jobb len­
ne ezt a pénzt több m em ória vásárlására költeni az egyszerű, egyértelmű és meg­ Satyanarayanan: The Evolution ofC oda
bízható szoftverek elérése érdekében. A mobil számítástechnika terjedésével a fix rendszerek és a mobil eszközök közöt­
ti integráció és szinkronizáció megoldása egyre sürgetőbb. A Coda volt az egyik
Knuth: The A rt o f Computer Programming. 1. kötet. úttörő ezen a területen. Ennek fejlődését és m űködését írja le a könyv.
Ebben a m unkában az „először megfelelő”, a „legjobban illeszkedő” és egyéb,
memóriakezeléssel kapcsolatos algoritmusokat tárgyalja, valamint hasonlítja ösz- Silberschatz et al.: Operating System Concepts. 7. kiadás
sze a szerző.
A könyv 10. és 11. fejezete foglalkozik a fájlrendszerekkel, beleértve többek kö­
zött a fájlokkal végzett műveleteket, az elérési m ódozatokat, a kompatibilitási sze­
Silberschatz et al.: Operating System Concepts. 7. kiadás mantikát, a könyvtárakat, a védelmi eljárásokat és ezek megvalósítását.
A könyv 8. és 9. fejezete foglalkozik a memóriakezeléssel, beleértve a memória és
a háttértároló közötti adatmozgatást, a lapozást és a szegmentálást. Az írók a la­ Stallings: Operating Systems. 5. kiadás
pozó algoritmusok több változatát is bemutatják. A könyv 16. fejezete részletesen megtárgyalja a biztonsággal kapcsolatos témákat,
különös tekintettel a számítógépes kalózokra, a vírusokra és egyéb veszélyekre.

6.1.5. Fájlrendszerek U ppuluri et al.: Preventing Race Condition Attacks on File Systems
Vannak helyzetek, amikor egy processzus azt feltételezi, hogy két művelet végre­
Denning: The United States vs. Craig Neidorf hajtása oszthatatlan, nincs közbeeső művelet-végrehajtás. H a egy másik procesz-
M iután egy fiatal számítógépes kalóz rájött, hogyan működik a telefonhálózat, szus mégis behatol ezek közé, és végrehajt egy másik műveletet, a biztonság sérül­
és erről adatokat is nyilvánosságra hozott, számítógépes csalással vádolták meg. het. Ez a cikk a problém át és annak javasolt megoldását tárgyalja.
A cikk ezzel az üggyel foglalkozik, amely olyan alapvető kérdéseket hozott a fel­
színre, mint például a szólásszabadság kérdése. A cikk megjelenése után eltérő vé­ Yang et al.: UsingModel Checking to Find Serious File System Errors
leményeket, valamint Denning részéről egy kemény hangú választ váltott ki. A fájlrendszer hibái adatvesztéshez vezethetnek, így felfedezésük rendkívül fon­
tos. A cikk egy formális technikát ír le, amely segít e hibák felderítésében, még mi­
Ghemawat et al.: The Google File System előtt bármi kárt okoznának. Egy tényleges fájlrendszerkódon lefuttatott modellel-
Tegyük fel, hogy elhatározzuk, az egész internetet otthon szeretnénk tárolni, hogy lenőrzés eredm ényét is bemutatják.
igazán gyorsan találjunk meg dolgokat. Hogyan csinálnánk? Az első lépés m ond­
6.2. BETŰRENDES IRODALOMJEGYZÉK 643
642 6.TOVÁBBI ir o d a l o m

CHOU, A., YANG, J.-E, CHELF, B. és HALLEM, S.: An Empirical Study of


6.2. Betűrendes irodalomjegyzék Operating System Errors, Proc. 18th Symp. on Oper. Syst. Prin., ACM, pp. 73-88,
2001.
ANDERSON, T.E., BERSHAD, B.N., LAZOWSKA, E.D. és LEVY, H.M.: Scheduler
COFFMAN, E.G., ELPHICK, M.J. és SHOSHANI, A.: System Deadlocks,
Activations: Effective Kernel Support fór the User-Level M anagem ent of
Computing Surveys, vol. 3, pp. 67-78, 1971. jún.
Parallelism ,/!CM Trans. on Computer Systems, vol. 10, pp. 53-79,1992. febr.
CORBATÓ, F.J.: On Building Systems T hat Will Fail, Commun. o f the ACM, vol.
ANDREWS, G.R. és SCHNEIDER, EB.: Concepts and Notations fór Concurrent
34, pp. 72-81,1991. szept.
Programming, Computing Surveys, vol. 15, pp. 3-43, 1983. márc.
CORBATÓ, EJ., MERWIN-DAGGETT, M. és DALEY, RC: An Experimental
AYCOCK, J. és BARKER, K.: Viruses 101, Proc. Tech. Symp. on Comp. Sci. Educa-
TimeSharing System, Proc. AFIPS FallJoint Computer Conf, AFTPS, pp. 335-344,
tion, ACM, pp. 152-156, 2005.
1962.
BACH, M.J.: The Design o f the Unix Operating System, U pper Saddle River, NJ:
CORBATÓ, F.J., SALTZER, J.H. és CLINGEN, C.T.: MULTICS-The First Seven
Prentice Hall, 1987.
Years, Proc. AFIPS SpringJoint Computer Cant, AFIPS, pp. 571-583,1972.
BALA, K., KAASHOEK, M.E és WEIHL, W: Software Prefetching and Caching
CORBATÓ, F.J. és VYSSOTSKY, VA.: Introduction and Overview of the MULTICS
fór Translation Lookaside Buffers, Proc. First Symp. on Oper. Syst. Design and
System, Proc. AFIPS FallJoint Computer Conf, AFIPS, pp. 185-196,1965.
Implementation, USENIX, pp. 243-254, 1994.
CORBET, J., RUBINI, A. és KROAH-HARTMAN, G.: Linux Device Drivers, 3rd
BASILI, VR. és PERRICONE, B.T.: Software errors and Complexity: An Empirical
Ed. Sebastopol, CA: O ’Reilly, 2005.
Investigation, Commun. o f the ACM, vol. 27, pp. 43-52, 1984. jan.
COURTOIS, EJ., HEYMANS, F. és PARNAS, D.L.: Concunent Control with
BAYS, C.: A Comparison of Next-Fit, First-Fit, and Best-Fit, Commun. o f the
Readers and Writers, Commun. o f the ACM, vol. 10, pp. 667-668,1971. okt.
ACM, vol. 20, pp. 191-192,1977. márc.
DALEY, RC. és DENNIS, J.B.: Virtual Memory, Processes, and Sharing in
BEN-ARI, M: Principles o f Concurrent and Distributed Programming, U pper Saddle
MULTICS, Commun. o f the ACM, vol. 11, pp. 306-312,1968. máj.
River, NJ: Prentice HaJl, 1990.
DEITEL, H.M., DEITEL, E J. és CHOFFNES, D. R : Operating Systems, 3rd Ed.,
HIC, L.E és SHAW, A.C.: Operating System Principles, U pper Saddle River, NJ:
U pper Saddle River, NJ: Prentice-Hall, 2004.
Prentice Hall, 2003.
DENNING, D.: The U nited states vs. Craig Neidorf, Commun. o f the ACM, vol.
BOEHM, Threads Cannot be Im plem ented as a Library, Proc. 2004 A C M
34, pp. 22-43,1991. márc.
SIG P LA N Conf. on Prog. Láng. Design and Impl., ACM, pp. 261-268, 2005.
DENNING, EJ.: The Working Set Model fór Program Behavior, Commun. o f the
BŐVET, D.E és CESATI, M.: Understanding the Linux Kernel, 2. kiad., Sebastopol,
ACM, vol. 11, pp. 323-333,1968a.
CA, O ’Reilly, 2002.
DENNING, EJ.: Thrashing: Its Causes and Prevention, Proc. AFIPS National
BRINCH HANSEN, E: Operating System Principles U pper Saddle River, NJ:
Computer C onf AFIPS, pp. 915-922, 1968b.
Prentice Hall, 1973.
DENNING, EJ.: Virtual Memory, Computing Surveys, vol. 2, pp. 153-189, Sept.
BRINCH HANSEN, R: Classic Operating Systems, New York: Springer-Verlag,
1970. DENN ING, P.J.: Working Sets Pást and Present, IEEE Trans. on Software
2001 .
Engineering, vol. SE-6, pp. 64-84, 1980. jan.
BROOKS, F. R, Jr.: The Mythical Man-Month: Essays on Software Engineering,
DENNING, EJ.: The Locality Principle, Commun. o f the ACM, vol. 48, pp. 19-24,
Anniversary Ed., Boston: Addison-Wesley, 1995.
2005. júl.
CERF, VG.: Spam, Spim, and Spit, Commun. o f the ACM, vol. 48, pp. 39-43, 2005.
D ENN IS, J.B .ésVAN HORN,E.C.:Program m ingSem anticsforM ultiprogram m ed
ápr.
Computations, Commun. o f the ACM, vol. 9, pp. 143-155,1966. márc.
CHEN, H, WAGNER, D. és DEAN, D.: Setuid Demystified, Proc. l lth U SENIX
DIBONA, C., OCKM AN, S. és STONE, M. eds.: Open Sources: Voices from the
Security Symposium, pp. 171-190, 2002.
Open Source Revolution, Sebastopol, CA: O ’Reilly, 1999.
CHEN, EM., LEE, E.K., GIBSON, G.A., KATZ, R.H. és PATTERSON, D.A.:
D U K STR A , E.W.: Co-operating Sequential Processes, in ProgrammingLanguages,
RAID: High Performance Reliable Secondary Storage, Computing Surveys, vol.
Genuys, F. (Ed.), London: Academic Press, 1965.
26, pp. 145-185,1994. jún.
D IJK STRA , E.W.: The Structure of T H E Multiprogramming System, Commun.
CHERITON, D.R: An Experim ent Using Registers fór Fást Message-Based
o f the ACM, vol. 11, pp. 341-346, 1968. máj.
lnterprocess Communication, Operating Systems Review, vol. 18, pp. 12-20,1984.
okt. D IJK STR A , E.W.: My Recollections of Operating System Design, Operating
Systems Review, vol. 39, pp. 4-40, 2005. ápr.
CHERVENAK, A., VELLANSKI, és KURMAS, Z.: Protecting File Systems: A
D O D G E, c., IRVINE, c. és NGUYEN, T.: A Study of Initialization in Linux and
Survey of Backup Techniques, Proc. 15th Symp. on Mass Storage Systems, IEEE,
1998 OpenBSD, Operating Systems Review, vol. 39, pp. 79-93, 2005. ápr.
644 6.TOVÁBBI IRODALOM 6.2. BETŰRENDES IRODALOMJEGYZÉK 645

E N G LER , D., CHEN, D.Y. és CHOU, A.: Bugs as Inconsistent Behavior: A HOARE, C.A.R.: M onitors, A n Operating System Structuring Concept, Commun.
General Approach to Inferring Errors in Systems Code, Proc. 18th Symp. on o f the ACM, vol. 17, pp. 549-557, Oct. 1974; Erratum in Commun. o.fthe ACM,
Oper. Syst. Prin., ACM, pp. 57-72, 2001. vol. 18, p. 95,1975. febr.
EN G LER, D.R., KAASHOEK, M.F. és O ’TO O LE, J. Jr.: Exokernel: An HOLT, R.C: Somé Deadlock Properties of Com puter Systems, Computing Surveys,
Operating System Architecture fór Application-Level Resource M anagement, vol. 4, pp. 179-196,1972. szept.
Proc. 15th Symp. on Oper. Syst. Prin., ACM, pp. 251-266,1995. HUCK, J. és HAYS, J.: Architectural Support fór Translation Table M anagement
FABRY, R.S.: Capability-Based Addressing, Commun. o f the ACM, vol. 17, pp. in Large Address Space Machines, Proc. 20th A nnual In t’l Symp. on Computer
403-412,1974. júl. Arch., ACM, pp. 39-50,1993.
FEELEY, M .J., M ORGAN, W.E., PIG ID N , E H ., KARLIN, A.R., LEVY, H.M. HUTCHINSON, N.C., MANLEY, S., FEDERWISCH, M., HARRIS, G., HITZ, D,
és THEK> KATH, C.A.: Implementing Global Memory M anagem ent in a KLEIMAN, S és O ’MALLEY, S.: Logical vs. Physical File System Backup, Proc.
W orkstation Cluster, Proc. 15th Symp. on Oper. Syst. Prin., ACM, pp. 201-212, Third USENIX Symp. on Oper. Syst. Design and Implementation, USENIX, pp.
1995. 239-249,1999.
FEUSTAL, E.A.: The Rice Research Com puter-A Tagged Architecture, Proc. IEEE: Information technology-Portable Operating System Interface (POSIX), Part
A FIPS C o n f 1972. 1: System Application Program Interface (API) [C Language], New York: IEEE,
FO TH ER IN G H A M , J.: Dynamic Storage Allocation in the Atlas Including an 1990.
Automatic Use of a Backing Store, Commun. o f the ACM, vol. 4, pp. 435-436, JACOB, B. és MUDGE, T.: Virtual Memory: Issues of Im plem entation, IEE E
1961. okt. Computer, vol. 31, pp. 33-43,1998. jún.
GARFINK EL, S.L. és SHELAT, A.: Rem em brance of D ata Passed: A Study of JOHANSSON, J. és RILEY, S: Protect Your Windows NetWork: From Perimeter to
Disk Sanitization Practices, IE E E Security & Privacy, vol. 1, pp. 17-27, 2003. Data, Boston: Addison-Wesley, 2005.
jan.-febr. KERNIGHAN, B.W. és RITCHIE, D.M.: The C Programming Language, 2. kiad.,
GEIST, R. és DÁNIEL, S.: A Continuum of Disk Scheduling Algorithms, A C M U pper Saddle River, NJ: Prentice Hall, 1988.
Trans. on Computer Systems, vol. 5, pp. 77-92,1987. febr. KLEIN, D.V: Foiling the Cracker: A Survey of, and Improvements to, Password
GHEMAWAT, S., G Ó B I OFF, H. és LEUN G, S.-T.: The Google File System, Security, Proc. Unix Security WorkshopJI, USENIX, 1990. aug.
Proc. 19th Symp. on Oper. Syst. Prill., ACM, pp. 29-43,2003. KLEINROCK, L.: Queueing Systems, Vol. 1, New York: John Wiley, 1975.
GRAHAM, R.: Use of High-Level Languages fór System Programming, Project KNUTH, D.E.: The Art o f Computer Programming, Volume 1: Fundamental
MAC R eport TM-13, M.I.T., 1970. szept. Algorithms, 3rd Ed., Boston: Addison-Wesley, 1997.
HAFNER, K. és MARKOFF, J.: Cyberpunk: Outlaws and Hackers on the LAMPSON, B.W.: A Scheduling Philosophy fór Multiprogramming Systems,
Computer Frontier, New York: Simon and Schuster, 1991. Commun. o f the ACM, vol. 11, pp. 347-360,1968. máj.
HALPERN, M.: VIM: Taming Software with Hardware, IE E E Computer, vol. 36, LAMPSON, B.W.: A Note on the Confinement Problem, Commun. o f the ACM,
pp. 21-25,2003. okt. vol. 10, pp. 613-615,1973. okt.
HARBRON, T.R.: File Systems: Structures and Algorithms, U pper Saddle River, LAMPSON, B.W.: Hints fór Com puter System Design, IE E E Software, vol. 1, pp.
NJ: Prentice Hall, 1988. 11-28,1984. jan.
HARRIS, S., HARPER, A., EAGLE, C., NESS, J. és LESTER, M.: Gray Hat LEDIN, G., Jr.: Nőt Teaching Viruses and Worms is Harmful, Commun. o f the
Hacking: The Ethical Hacker’s Handbook, New York: McGraw-Hill Osborne ACM, vol. 48, p. 144, 2005. jan.
M edia, 2004. LESCHKE, T.: Achieving Speed and Flexibility by Separating M anagem ent from
HAUSER, C., JACOBI, C„ THEIM ER, M., WELCH, B. és W EISER, M.: Using Protection: Embracing the Exokernel Operating System, Operating Systems
Threads in Interactive Systems: A Case Study, Proc. 14th Symp. on Oper. Syst. Review, vol. 38, pp. 5-19, 2004. okt.
Prin., ACM, pp. 94-105,1993. LEVINE, G.N.: Defining Deadlocks, Operating Systems Review vol. 37, pp. 54-64,
HEBBARD, B. et al.: A Penetration Analysis of the Michigan Terminál System, 2003a. jan.
Operating Systems Review, vol. 14, pp. 7-20,1980. jan. LEVINE, G.N.: Defining Deadlock with Fungible Resources, Operating Systems
HERBORTH, C.: Unix Advanced: Visual Quickpro Guide, Berkeley, CA: Peachpit Review, vol. 37, pp. 5-11, 2003b. júl.
Press, 2005. LEVINE, G.N.: The Classification of Deadlock Prevention and Avoidance is
HERDER, J.N.: Towards a True M icrokernel Operating System, M.S. Thesis, Vrije Erroneous, Operating Systems Review, vol. 39, 47-50, 2005. ápr.
Universiteit, Am sterdam, 2005. febr. LEWINE, D.: P O SIX Programmer’s Guide, Sebastopol, CA: O ’Reilly & Associates,
1991.
646 6. TOVÁBBI IRODALOM
6.2. BETŰRENDES IRODALOMJEGYZÉK 647

LI, K. és HUDAK, R: M emory Coherence in Shared Virtual Memory Systems,


A C M Trans. on Computer Systems, vol. 7, pp. 321-359, 1989. nov. SALTZER, J.H. és SCHROEDER, M.D.: The Protection of Inform ation in
LINDE, R.R.: Operating System Penetration, Proc. AFIPS National Computer C om puter Systems, Proc. IEEE, vol. 63, pp. 1278-1308, 1975. szept.
Conf, AFIPS, pp. 361-368, 1975. SALUS, EH.: A Quarter Century ofUnix, Boston: Addison-Wesley, 1994.
LIONS, J.: L ions’ Commentary on Unix 6th Edition, with Source Code, San Jose, SANDHU, R.S.: Lattice-Based Access Control Models, Computer, vol. 26, pp.
CA: Peer-to-Peer Communications, 1996. 9-19,1993. nov.
SATYANARAYANAN, M.: The Evolution of Coda, A C M Trans. on Computer
MARSH, B.D., SCOTT, M.L., LEBLANC, T.J. és MARKATOS, E.E: First-Class
Systems, vol. 20, pp. 85-124, 2002. máj.
UserLevel Threads, Proc. 13th Symp. on Oper Syst. Prin., ACM, pp. 110-121,
SEA WRIGHT, L.H. és MACKINNON, R.A.: VM/370-A Study of Multiplicity and
1991.
Usefulness, IB M Systems Journal, vol. 18, pp. 4-17,1979.
McHUGH, J.A.M. és DEEK, EE: An Incentive System fór Reducing Malware
SILBERSCHATZ, A., GALVIN, EB. és GAGNE, G.: Operating System Concepts, 1.
Attacks, Commun. o f the ACM, vol. 48, pp. 94-99, 2005. jún.
kiad., New York: John Wiley, 2004.
McKUSICK, M.K., JOY, W.N., LEFFLER, S.J. és FABRY, R.S.: A Fást File System
STALLINGS, W.: Operating Systems, 5. kiad., U pper Saddle River, NJ: Prentice
fór Unix, A C M Trans. on Computer Systems, vol. 2, pp. 181-197, 1984. aug.
Hall, 2005.
McKUSICK, M.K. és NEYILLE-NEIL, G.V: The Design and Implementation o f
STEVENS, W.R és RAGO, S. A.: Advanced Programming in the Unix Environment,
the FreeBSD Operating System, Addison-Wesley: Boston, 2005.
2. kiad., Boston: Addison-Wesley, 2005.
MILO, D., DOUGL1S, F., PAINDA VEINE, Y, W HEELER, R. és ZHOU, S.: Process
STOLL, C.: The Cuckoo’s Egg: Tracking a Spy through the Maze o f Computer
Migration,v4CM Computing Surveys, vol. 32, pp. 241-299, 2000. júl.-szept.
Espionage, New York: Doubleday, 1989.
M ILOJICIC, D.: Operating Systems: Now and in the Future, IE E E Concurrency,
SWIFT, M.M., ANNAMALAI, M., BERSHAD, B.N. és LEVY, H.M.: Recovering
vol. 7, pp. 12-21,1999. jan.-m árc.
Device Drivers, Proc. Sixth Symp. on Oper Syst. Design and Implementation,
MOODY, G.: Rebel Code Cambridge, MA: Perseus, 2001.
USENIX, pp. 1-16, 2004.
MORRIS, R. és THOMPSON, K.: Password Security: A Case History, Commun.
TAI, K.C. és CAR.VER, R.H.: VP: A New O peration fór Semaphores, Operating
o f the ACM, vol. 22, pp. 594-597, 1979. nov.
Systems Review, vol. 30, pp. 5-11,1996. júl.
MULLENDER, S.J. és TANENBAUM, A.S.: Imm ediate Files, Software-Practice
TALLURI, M. és IDLL, M.D.: Surpassing the TLB Performance of Superpages
and Experience, vol. 14, pp. 365-368,1984. ápr.
with Less Operating System Support, Proc. Sixth Int’l C onf on Architectural
NAUGHTON, J.: A Brief History o f the Future, Woodstock, NY: Overlook Books,
2000. Support fór Progr. Láng. and Operating Systems, ACM, pp. 171-182,1994.
TALLURI, M., HILL, M.D. és KHALIDI, Y.A.: A New Page Table fór 64-bit
NEMETH, E., SNYDER, G., SEEBASS, S. és HEIN, T. R.: Unix System
Address Spaces, Proc. 15th Symp. on Oper. Syst. Prin., ACM, pp. 184-200,1995.
Administation, 3rd Ed., U pper Saddle River, NJ, Prentice Hall, 2000.
TANENBAUM, A.S.: M odem Operating Systems, 2. kiad., U pper Saddle River: NJ,
ORGANICK, E.I.: The Multics System, Cambridge, MA: M .I.T Press, 1972.
Prentice Hall, 2001.
OSTRAND, T.J., WEYUKER, E.J. és BELL, R.M.: W here the Bugs Are, Proc.
TANENBAUM, A.S., VAN RENESSE, R., STAVEREN, H. VAN, SHARP, G.J.,
2004 A C M Symp. on Softw. Testing and Analysis, ACM, 86-96, 2004.
MULLENDER, S.J., JANSEN, J. és ROSSUM, G. VAN: Experiences with the
PETERSON, G.L.: Myths about the M utual Exclusion Problem, Information
A m oeba Distributed Operating System, Commun. o f the ACM, vol. 33, pp.
Processing Letters, vol. 12, pp. 115-116,1981. jún.
46-63,1990. dec.
PRECHELT, L.: An Empirical Comparison of Seven Programming Languages,
TANENBAUM, A.S. és VAN STEEN, M.R.: Distributed Systems: Principles and
IE E E Computer, vol. 33, pp. 23-29, 2000. okt.
Paradigms, U pper Saddle River, NJ, Prentice Hall, 2002.
RAY, D.S. és RAY, E.J.: Visual Quickstart Guide: Unix, 2. kiad., Berkeley, CA:
TEORY, T.J.: Properties of Disk Scheduling Policies in M u ltip rogram m ed
Peachpit Press, 2003.
Com puter Systems, Proc. AFIPS Fali Joint Computer C onf AFIPS, pp. 1-11,
ROSENBLUM, M. és OUSTERHOUT, J.K.: The Design and Im plem entation of
1972
a LogStructured File System, Proc. 13th Symp. on Oper. Syst. Prin., ACM, pp.
1-15,1991. THOMPSON, K.: Unix Im plem entation, Bell System Technical Journal, vol. 57, pp.
1931-1946,1978. júl.-aug.
RUSSINOVICH, M.E. és SOLOMON, D,A.: Microsoft Windows Internals, 4. kiad.,
TREESE, W.: The State of Security on the Internet, NetWorker, vol. 8, pp. 13-15,
Redmond, W A: Microsoft Press, 2005.
2004. szept.
SALTZER, J.H.: Protection and Control of Inform ation Sharing in MULTICS,
TSEGAYE, M. és FOSS, R.: A Comparison of the Linux and Windows Device
Commun. o f the ACM, vol. 17, pp. 388-402,1974. júl.
Driver Architectures, Operating Systems Review, vol. 38, pp. 8-33, 2004. ápr.
648 6. TOVÁBBI IRODALOM

UHLIG, R, NAGLE, D., STANLEY, T, MUDGE, T., SECREST, S. és BROWN,


R: Design Tradeoffs fór Software-Managed TLBs, A C M Trans. on Computer
Függelék
Systems, vol. 12, pp. 175-205, 1994. aug.
UPPULURI, E, JO SH I, U. é s RAY, A.: Preventing Race Condition Attacks on
File Systems, Proc. 2005 A C M Symp. on Applied, Computing, ACM, pp. 346-353,
2005.
VAHALIA, U.: Unix Intemals-The New Frontiers, 2. kiad., U pper Saddle River, NJ:
Prentice Hall, 1996.
VOGELS, W.: File System Usage in Windows NT 4.0, Proc. A C M Symp. on
Operating System Principles, ACM, pp. 93-109,1999.
WALDSPURGER, C.A. és WEIHL, W.E.: Lottery Scheduling: Flexible
Proportional-Share Resource M anagement, Proc. First Symp. on Oper. Syst.
Design and Implementation, USENIX, pp. 1-11, 1994.
WEISS, A.: Spyware Be Gone, NetWorker, vol. 9, pp. 18-25, 2005. márc. F.l. A MINIX 3 telepítése
WILKES, J., GOLDING, R., STAELIN, C. és SULLIVAN, T.: The H P AutoRAID
Hierarchical Storage System, A C M Trans. on Computer Systems, vol. 14, pp.
108-136,1996. febr. A függelék elmagyarázza a M INIX 3 telepítésének mikéntjét. A teljes M INIX
WULF, W.A., COHEN, E.S., CORWIN, W.M., JONES, A.K., LEVIN, R., PIERSON, 3-telepítéshez Pentium processzoros gépre van szükség, amely legalább 16 MB
C. és POLLACK, F.J.: HYDRA: The Kernel of a M ultiprocessor Operating RAM-mal, 1 GB szabad lem ezterülettel, ID E CD-ROM -m al és ID E merevlemez­
System, Commun. o f the ACM, vol. 17, pp. 337-345,1974. jún. zel rendelkezünk. A minimális telepítéshez (amely nem tartalm azza a parancsok
YANG, J., TWOHEY, E, ENGLER, D. és MUSUVATHI, M.: Using Model Checking forráskódját) 8 MB RAM és 50 MB szabad lem ezterület szükséges. Soros ATA
to Find Serious File System Errors, Proc. Sixth Symp. on Oper. Syst. Design and (SATA), USB és SCSI lemezek pillanatnyilag nem tám ogatottak. Az USB CD-
Implementation, USENIX, 2004. ROM -ok használatának leírását a www.minix3.org honlapon találjuk.
ZEKAVSKAS, M J ., SAWDON, W.A. és BERSHAD, B.N.: Software Write Detection
fór a Distributed Shared Memory, Proc. First Symp. on Oper. Syst. Design and
Implementation, USENIX, pp. 87-100,1994. F.1.1. Előkészület
ZWICKY, E.D.: Torture-Testing Backup and Archive Programs: Things You Ought
to Know bút Probably Would R ather Nőt, ProfFifth Cont on Large Installation H a rendelkezésünkre áll a telepítő C D -R O M (a könyvből), az első két lépést át-
Systems Admin., USENIX, pp. 181-190,1991. ugorhatjuk, de tanácsos ellenőrizni a www.minix3.org oldalon, hogy van-e elérhető
újabb változat. H a natív mód helyett szimulátoron kívánjuk a M INIX 3-at futtat­
ni, akkor az F.5 részt olvassuk el először. H a nem áll rendelkezésünkre ID E CD-
ROM , akkor vagy szerezzük be a speciálisan USB CD-ROM -okhoz készült betöl­
tési m em óriatérképet (boot image), vagy használjunk szimulátort.

1. Töltsük le a MINIX 3 CD-ROM-képet


A M INIX 3 C D -R O M -képet a M INIX 3 honlapjáról, a www.minix3.org oldalról
tölthetjük le.

2. Készítsük el az indítható MINIX 3 CD-ROM-ot


Csomagoljuk ki a letöltött fájlt. Egy .iso kiterjesztésű C D -R O M -képet és ezt a le­
írást fogjuk kapni. Az .iso fájl bitről bitre egy CD-ROM -képnek felel meg. írjuk ki
CD-ROM -ra, hogy indítható C D -R O M -ot kapjunk.
H a az Easy CD Creator 5 program ot használjuk, akkor válasszuk ki a „Record
CD from CD image” m enüpontot a File menüből és a m egjelenő dialógusablak-
650 FÜGGELÉK F.1. A MINIX 3 TELEPÍTÉSE 651

bán a fájltípust változtassuk .cif-ről .iso-ra. Válasszuk ki a képfájlt és kattintsunk H a Windows 95, 98, M E vagy 2000 rendszert futtatunk, és a lemez egyetlen FAT
az „O pen”-re. Ezután kattintsunk a „Start Recording” gombra. partícióból áll, a CD-RO M -on (vagy a zeleps.com helyen) található preszl34.exe
H a a Nero Express 5 program ot használjuk, akkor válasszuk a „Disc Image or program segítségével csökkenthetjük annak m éretét, hogy helyet alakítsunk ki a
Saved Project” lehetőséget, és változtassuk a típust „Image Files”-ra, válasszuk ki M INIX számára. Bármilyen más esetben olvassuk el a világhálón elérhető, fen­
a képfájlt, és kattintsunk az „O pen”-re. Válasszuk ki a CD-írót, és kattintsunk a tebb em lített oktatóanyagot.
„Next”-re. Amennyiben 128 GB-nál nagyobb m éretű merevlemezzel rendelkezünk, a
H a Windows XP-rendszert használjuk, és nem áll rendelkezésünkre CD-író M INIX 3-partíciónak teljes egészében az első 128 G B-on belül kell lennie (a le­
program, akkor az alexfeinman.brinkster.net/isorecorder.html oldalon találunk egy mez blokkjainak címzési módja miatt).
ingyenesen használható szoftvert, amellyel ki tudjuk írni a CD-képet. FIGYELEM: Ha hibát követünk el a lemez particionálásakor, akár el is veszt­
hetjük a lemezen lévő adatainkat, ezért mindenképpen mentsük azokat CD-ROM-
3. Határozzuk meg, hogy milyen Ethemet-lapkával rendelkezünk ra vagy DVD-re a particionálás megkezdése előtt. A lemezparticionálás nagy fi­
A M INIX 3 számos E thernet-lapkát tám ogat LAN, ADSL és kábelszolgálta­ gyelmet igényel, tehát óvatosan hajtsuk végre.
tón keresztüli hálózateléréshez. A tám ogatottak közé tartozik például az Intel
Pro/100, a RealTek 8029 és 8139, az AM D LANCE és több 3Com-lapka. A te­
lepítés közben a telepítő megkérdezi, hogy rendelkezünk-e, és ha igen, milyen F.1.2. Rendszerindítás
lapkával? Derítsük ki ezt m ár most a gépünkhöz tartozó dokumentációból.
Rendelkezésünkre áll egy másik megoldás is, ha Windowst használunk. Indítsuk el Ezen a ponton m ár rendelkeznünk kell felszabadított lemezterülettel. H a még
az Eszközkezelőt (Device M anager): nem tettük meg, tegyük meg most, hacsak nem akarunk egy m ár létező partíciót
M INIX 3-partícióvá alakíttatni.
Windows 2000: Start > Beállítások > Vezérlőpult > Rendszer > H ardver >
Eszközkezelő 1. Rendszerindítás CD-ROM-ról
Windows XP: Start > Vezérlőpult > Rendszer > H ardver > Eszközkezelő Helyezzük be a CD lemezt a meghajtóba, és indítsuk arról a számítógépet. H a
16 MB vagy annál több RAM-mal rendelkezünk, akkor válasszuk a „Regular”,
Ezek közül a „Rendszer” kiválasztásához dupla kattintásra, a többihez egyszeres ha csak 8 MB-nyival, akkor a „Small” lehetőséget. H a a számítógép a merevle­
kattintásra van szükség. A „Hálózati kártyák” melletti + jel kibontásával megkap­ mezről indul a CD -RO M helyett, akkor indítsuk újra a gépet, lépjünk be a BIOS
juk a kártya típusát. írjuk ezt le. H a nincs, vagy nem tám ogatott a lapkánk, akkor beállító programba, változtassuk meg a betöltési eszközök sorrendjét úgy, hogy a
is futtathatjuk a M INIX 3-at, de E thernet nélkül. C D -R O M a merevlemez előtt szerepeljen a listában.

4. Particionáljuk a merevlemezt 2. Bejelentkezés adminisztrátorként (root)


H a kívánjuk, a M INIX 3-at indíthatjuk a C D-ROM -ról is, de ha bármi hasznosat Amikor a login prom pt megjelenik, jelentkezzünk be roof-ként. Sikeres beje­
szeretnénk vele csinálni, akkor hozzunk létre egy külön partíciót a m erevleme­ lentkezés után megjelenik a parancsértelm ező prom ptja (# ). Ezen a ponton a
zen. M INIX 3 teljes m értékben működőképes. Az
A particionálás előtt elővigyázatosságból m indenképpen mentsük az adatainkat
külső adathordozóra, CD-ROM-ra vagy DVD-re. Fájljaink értékesek, védjük őket. Is /usr/birt | more
Hacsak nem vagyunk nagy tapasztalattal rendelkező szakértők a lemezparti-
cionálás terén, olvassuk el a www.minix3.org/doc/partitions.html oldalon találha­ begépelésével megnézhetjük, milyen szoftverek állnak rendelkezésünkre. A szó­
tó lemezparticionálási oktatóanyagot. H a m ár tudjuk, hogyan kell a partíciókat köz lenyomásával görgethetjük a listát. H a kíváncsiak vagyunk, hogy például a foo
kezelni, hozzunk létre egy legalább 50 MB m éretű, folytonos szabad lemezterü- nevű program mit csinál, gépeljük be a
letet, vagy ha az összes parancs forráskódjára is szükségünk van, akkor egy 1 GB
m éretűt. H a nem tudjuk, hogyan kell a partíciókat kezelni, de rendelkezünk mari foo
particionáló programmal, amilyen például a Partidon Magic is, használjuk azt sza­
bad lem ezterület létrehozására. Győződjünk meg arról is, hogy legalább 1 elsőd­ parancsot. A felhasználói kézikönyv a www.minix3.org/manpages honlapon is elér­
leges partíció (vagy elsődleges indítórekord - M aster Boot Record - hely) szabad. hető.
A M INIX 3-telepítőszkript ezután végigvezet minket a M INIX-partíció elkészíté­
sén, amely vagy az elsődleges, vagy a másodlagos IDE-lem ezen lehet.
652 F.l. A MINIX 3TELEPÍTÉSE 653
FÜGGELÉK

3. Indítsuk el a telepítőszkriptet 4.1. Válasszuk ki a lemezt, amelyre a MINIX 3 kerül


A M INIX 3 merevlemezre telepítéséhez gépeljük be a következőt: Egy ID E vezérlő maximum 4 lemezt tud vezérelni. A setup szkript megvizsgálja
mindegyiket. Az esetlegesen megjelenő hibaüzeneteket hagyjuk figyelmen kívül.
setup
Amikor a m eghajtók listázásra kerülnek, válasszunk közülük egyet, és erősítsük
meg a választását. Amennyiben két merevlemezzel rendelkezünk, és úgy döntünk,
hogy a M INIX 3-at a másodikra telepítjük, de problém ába ütközünk a rendszer
Ez után a parancs után (és minden más parancs után is) nyomjuk meg az enter
indításakor, akkor a megoldáshoz olvassuk el a www.minix3.org/doc/using2disks.
( r e t u r n ) billentyűt. Amikor a telepítőszkript a képernyő alján egy kettőspon­
tot jelenít meg, nyomjuk meg az enter billentyűt a folytatáshoz. H a a képernyő html oldal tartalm át.
hirtelen teljesen üres lesz, akkor a ctrl -F 3 lenyomásával válasszuk a szoftveres
görgetést (erre általában csak nagyon régi számítógépek esetében van szükség). 4.2. Válasszunk ki egy lemezterületet
Itt jegyezzük meg, hogy a ctrl billentyű azt jelenti, hogy a ctrl lenyomva tartása Most válasszuk ki, hogy a M INIX 3 milyen lem ezterületre kerüljön. Három vá­
mellett kell az adott billentyűt lenyomni. lasztási lehetőség van:

(1) Egy szabad terület választása.


(2) Egy létező partíció felülírása.
F.1.3. Telepítés a merevlemezre
(3) Egy partíció törlése és a vele szomszédos szabad terület összefűzése.
Az itt következő lépések megfelelnek a képernyőn megjelenőknek.
Az (1) és (2) választása esetén gépeljük be a terület sorszámát. A (3) választá­
1. Válasszuk ki a billentyűzet típusát sához gépeljük be a
Amikor a nemzeti billentyűzet kiválasztását kéri a szkript, akkor tegyük meg. Ez és
delete
minden más lépés esetében is van egy alapértelm ezett választási lehetőség, amely
szögletes zárójelek között jelenik meg. H a az megfelelő, akkor elegendő az enter
billentyűt megnyomni. A legtöbb esetben az alapértelm ezett lehetőség megfelelő a sort, majd az ezután m egjelenő kérdésre adjuk meg a terület sorszámát. Ez a terü­
kezdők számára. Az us-swap billentyűzet esetében a caps lock és a ctrl billentyűk let felülírásra kerül, és az előző tartalm a örökre elvész.
fel lesznek cserélve, ahogyan az a Unix-rendszerek esetében szokásos.
4.3. Erősítsük meg az előző választásainkat
2. Válasszuk ki az Ethernet-apka típusát Elértünk arra a pontra, ahonnan már nincs visszaút. A szkript felteszi a kérdést, hogy
Kiválaszthatjuk, hogy az elérhető Ethernet-m eghajtóprogram ok közül melyik ke­ biztosan folytatni akarjuk-e? Amennyiben igen, a kiválasztott területen található
rüljön telepítésre (esetleg egyikük sem). Válasszunk egyet a lehetőségek közül. adat örökre elvész. H a biztosak vagyunk a folytatásban, akkor gépeljük be, hogy

3. Minimális vagy teljes telepítés? yes


H a szűkös a rendelkezésre álló lemezterület, az „M ” lenyomásával választhatjuk a
és üssük le az enter billentyűt. A ctrl -C lenyomásával kiléphetünk a telepítő
minimális telepítést, amely az összes bináris állományt magában foglalja, de a for­
ráskódok közül csak a rendszerhez tartozók kerülnek telepítésre. 50 MB elegendő szkriptből anélkül, hogy a partíciós tábla megváltozna.
ehhez. H a legalább 1 GB rendelkezésre áll, akkor válasszuk a teljes telepítést az
„F” lenyomásával. 5. Újratelepítési lehetőség
Amennyiben már létező M INIX 3-partíciót választottunk, választhatunk a tel­
4. Hozzunk létre vagy válasszunk partíciót a MINIX 3 számára jes telepítés (Full install), amely m indent töröl a partícióról, és az újratelepítés
Először arra kell válaszolnunk, hogy értünk-e a M INIX 3-lemezparticionáláshoz? (Reinstall) között, amely utóbbi nem befolyásolja a m ár létező /home partíció
H a igen, akkor a part program segítségével teljes hozzáférést kapunk az elsődleges tartalm át. Ez azt jelenti, hogy személyes fájljainkat nyugodtan elhelyezhetjük a
/home katalógusban, és telepíthetünk frissebb M INIX 3-verziókat, amikor azok
indítórekord (M aster Boot Record) szerkesztéséhez (és esetlegesen annak teljes
elrontásához). H a nem vagyunk szakértők a tém ában, akkor válasszuk az alapér­ megjelennek, személyes fájljaink elvesztése nélkül.
telm ezett lehetőséget, amely egy autom atikus lépésről lépésre útm utató a lemez­
partíció M INIX 3 számára formázásához.
654 FÜGGELÉK F.l. A MINIX 3 TELEPÍTÉSE 655

6. Adjuk meg a /home méretét 1. Fordítsuk le a tesztprogramcsomagot


A kiválasztott partíció három részre lesz felosztva: root, /usr és /home. Ez utóbbi A M INIX 3 teszteléséhez a parancssorba (# ) gépeljük be a következőket:
használható a személyes fájlok tárolására. Adjuk meg, hogy a partíció m ekkora ré­
sze legyen fenntartva a fájljaink számára. Válaszunkat meg is kell erősítenünk. cd /usr/src/test
make
7. Adjuk meg a blokkméretet
Az 1 KB, 2, 4 és 8 KB m éretű blokkok tám ogatottak, de 4 KB m éretnél nagyobb és várjunk, amíg mind a 40 fordítás elkészül. A ctrl-D lenyomásával lépjünk ki.
választása esetén a forráskódban egy konstans értéket meg kell változtatni, és a
rendszert újra kell fordítani. H a a memória m érete 16 MB vagy annál nagyobb, ak­ 2. A tesztprogramcsomag futtatása
kor válasszuk az alapértelm ezettet (4 KB), egyébként használjuk az 1 KB méretet. A rendszer teszteléséhez lépjünk be bin felhasználóként (ez szükséges), és a tesz­
telő program ok futtatásához gépeljük be a következőket:
8. Várjuk meg a hibás blokkok detektálását
A telepítőszkript most átvizsgálja a partíciókat, hibás blokkokat keresve. Ez so­ cd /usr/src/test
káig tarthat, nagyméretű partíciók esetében akár 10 percnél is tovább. Legyünk ./run
türelmesek. H a teljesen biztosak vagyunk abban, hogy nincsenek hibás blokkok,
akkor az egyes vizsgálatokat a ctrl -C lenyomásával megszüntethetjük. M indnek rendben le kell futnia, bár ez akár 20 percig is eltarthat egy gyors gépen,
és akár egy óránál is tovább lassú gép esetében. Megjegyzés: a setuid bit megfelelő
9. Várjuk meg a fájlok másolását m űködésének tesztelése érdekében szükséges, hogy a teszt programcsomag fordí­
Amikor az átvizsgálás befejeződik, a fájlok automatikusan átmásolódnak CD-ROM - tása adm inisztrátorként (root), a futtatása bin felhasználóként történjen.
ról a merevlemezre. Minden fájl neve megjelenítésre kerül másolásakor. A máso­
lás befejeztével a M INIX 3 telepítése kész. Állítsuk le a rendszert a 3. A teljes operációs rendszer újrafordítása
H a m inden teszt rendben lefutott, most újrafordíthatjuk a rendszert. Ez nem fel­
shutdown tétlenül szükséges, mivel a rendszer lefordított állapotában került telepítésre.
Azonban ha később m ódosítani kívánunk a rendszeren, szükségünk van arra, hogy
begépelésével. Mindig így állítsuk le a rendszert az esetleges adatvesztés elkerülé­ újra tudjuk fordítani. Em ellett a rendszer újrafordítása jó teszt arra, hogy egyálta­
se érdekében, a M INIX 3 ugyanis bizonyos fájlokat RAM -lemezen tárol, amelyek lán működik-e? Gépeljük be a
csak a rendszer leállításakor kerülnek ténylegesen visszaírásra a merevlemezre.
cd /usr/src/tools
make
F.l .4. Tesztelés
parancsokat, hogy a számos rendelkezésre álló opció megjelenjen. Most készít­
Ez a rész bemutatja, hogyan tesztelhetjük a telepítést, módosítás után hogyan for­ sünk egy új indítható rendszerképet a
díthatjuk újra a rendszert, valamint hogyan indíthatjuk újra később. A kezdéshez
indítsuk el az új M INIX 3-rendszert. Például ha a 0. vezérlő 0. lemezének 3. partí­ su
cióját használtuk, gépeljük be, hogy make clean
time make image
boot c0d0p3
parancsok begépelésével. Ezzel újrafordítjuk az operációs rendszert, beleértve
és jelentkezzünk be adm inisztrátorként (root). Nagyon ritkán előfordulhat, hogy a a kernel m ódú és a felhasználói módú részeket is. Ugye nem tartott sokáig? Ha
BIOS által m egjelenített meghajtósorszám (amelyet a betöltési felügyelőprogram van hajlékonylemez-meghajtónk, készíthetünk indítható hajlékonylemezt későbbi
is használ) nem egyezik meg a M INIX 3 által használttal. Ekkor először próbáljuk használatra a formázott lemez behelyezése utáni
meg a telepítőszkript által megjelenített meghajtósorszám használatát. Itt a jó al­
kalom az adminisztrátori jelszó m egadására is. H a segítségre van szükségünk, ol­ ma ke fd boot
vassuk el a mán passwd leírást.
656 FÜGGELÉK F.2. A MINIX 3 FORRÁSKÓDJA - CD MELLÉKLET 657

parancs begépelésével. Amikor az elérési útvonalat kell kiegészítenünk, gépeljük boot cOdOpI
be az
parancsot kell használnunk, és így tovább.
fdO A harmadik rendszerindítási lehetőség a M INIX 3-partíció aktívvá tétele és a
M INIX 3 betöltési felügyelőprogramjának használata a M INIX 3 vagy bármely más
nevet. Ez a megközelítés pillanatnyilag nem működik USB hajlékonylemezekkel, operációs rendszer indításához. A részletekért látogassunk el a www.minix3.orgl
mivel egyelőre nincs M INIX 3 USB hajlékonylemez-meghajtó program. A merev­ manpages/man8/boot. 8. html oldalra.
lemezre telepített betöltési mem óriakép frissítése a Végül a negyedik lehetőség egy több rendszer indítására képes betöltőprogram
telepítése, amilyen például a LILO vagy a G R U B (www.gnu.org/software/grub) .
make hdboot Ezek használatával tetszőleges operációs rendszer könnyen indítható. A több
rendszer indítására képes betöltőprogram ok tárgyalása túlm utat útm utatónk ke­
paranccsal történik. retein, de a tém áról információ található a www.minix3.org/doc oldalon.

4. A rendszer leállítása és újraindítása


Az új rendszer indításához először állítsuk le a jelenlegit: F.1.5. Szimulátor használata

shutdown A M INIX 3 futtatásának egy teljesen más megközelítése az, ha nem natív m ód­
ban a csupasz hardveren futtatjuk, hanem egy másik operációs rendszer felett.
Ez a parancs elment bizonyos fájlokat, majd visszakerülünk a M INIX 3 betöltési Különböző virtuális gépek, szimulátorok és em ulátorok állnak rendelkezésre ilyen
felügyelőprogramjához. A betöltési felügyelőprogram lehetőségeinek összefog­ a célra. ím e néhány a legnépszerűbbek közül:
lalóját a
• VMware (www.vmware.com);
help • Bochs (www.bochs.org);
• Q EM U (www.qemu.org).
begépelésével kaphatjuk meg. Bővebb inform ációért látogassuk meg a www.min.ix3.
org/manpages/man8/boot.8.html oldalt. Most m ár eltávolíthatjuk a CD-ROM -ot Olvassuk el a hozzájuk tartozó dokumentációt. Egy program futtatása szimuláto­
vagy a hajlékonylemezt, és kikapcsolhatjuk a számítógépet. ron hasonló ahhoz, ahogyan az a tényleges gépen is történik, ezért térjünk vissza az
1. részhez, szerezzük be a legújabb CD-ROM -ot, és folytassuk onnan az olvasást.
5. Újraindítás máskor
H a rendelkezésünkre áll hajlékonylemez-meghajtó egység, akkor a legegyszerűb­
ben az új indítólemez behelyezésével és a számítógép bekapcsolásával indíthat­
juk el a M IN IX 3-at. Ez pár m ásodpercet vesz csak igénybe. Másik megoldásként F.2. A MINIX 3 forráskódja - CD melléklet
indíthatjuk a M INIX 3 C D-ROM -ról is, jelentkezzünk be bin felhasználóként és
gépeljük be a Rendszerkövetelmények

shutdown A CD m ellékleten rendelkezésre bocsátott szoftver telepítésének minimális rend­


szerkövetelményei a következők.
parancsot, hogy a M INIX 3 betöltési felügyelőprogramjához jussunk. Ekkor gé­
peljük be a
Hardver
boot cOdOpO
A M INIX 3 operációs rendszer futtatásához szükséges hardver:
parancsot, hogy a rendszer a 0. vezérlő 0. m eghajtójának 0. partíciójáról induljon.
Természetesen ha a M INIX 3-at a 0. meghajtó 1. partíciójára telepítettük, akkor a • Pentium vagy azzal kompatibilis processzorral rendelkező PC
• 16 MB vagy több RAM
658 FÜGGELÉK F.3. FÁJ LMUTATÓ 659

• 200 MB szabad lem ezterület F.3. Fájlmutató


• ID E CD-ROM -m eghajtó
• ID E merevlemez Include könyvtár (include directory) 15200 drivers/tty/keyboard.c
00000 include/ansi.h 13600 drivers/tty/tty.c
NEM TÁMOGATOTT: Soros ATA (SATA), USB és SCSI lemezek. Más lehetsé­ 00200 include/errno.h 13400 drivers/tty/tty.h
ges konfigurációk esetén látogassunk el a www.minix3.org oldalra. 00900 include/fcntl.h
00100 include/limits.h Kernel
00700 include/signal.h 10400 kernel/clock.c
Szoftver 00600 include/string.h 04700 kernel/config.h
01000 include/termios.h 04800 kernel/const.h
A M INIX 3 egy operációs rendszer. H a meg kívánjuk tartani a jelenlegi operációs 01300 include/timers.h 08000 kernel/exception.c
rendszerünket és adatainkat (ami ajánlott), továbbá fel szeretnénk készíteni szá­ 00400 include/unistd.h 05300 kernel/glo.h
mítógépünket többféle rendszer indítására, particionálnunk kell a merevlemezt. 04400 include/ibm/interrupt.h 08100 kernel/i8259.c
Az alábbi lehetőségeket állnak rendelkezésünkre: 04300 include/ibm/portio.h 05400 kernel/ipc.h
04500 include/ibm/ports.h 04600 kernel/kernel.h
• Partition Magic (www.powerquest.com/partitionmagic) 03500 include/minix/callnr.h 08700 kernel/klib.s
03600 include/minix/com.h 08800 kernel/klib386.s
vagy 02300 include/minix/config.h 07100 kernel/main.c
02600 include/minix/const.h 06200 kernel/mpx.s
• The Partition Resizer (www.zeleps.com) 04100 include/minix/devio.h 06300 kernel/mpx386.s
04200 include/minix/dmap.h 05700 kernel/priv.h
vagy 02200 include/minix/ioctl.h 07400 kernel/proc.c
03000 include/minix/ipc.h 05500 kernel/proc.h
• kövessük a www.minix3.org/partitions.html oldalon leírtakat. 02500 include/minix/sys_config.h 08300 kernel/protect.c
03200 include/minix/syslib.h 05800 kernel/protect.h
03400 include/minix/sysutil.h 05100 kernel/proto.h
Telepítés 02800 include/minix/type.h 05600 kernel/sconst.h
01800 include/sys/dir.h 06900 kernel/start.c
A telepítés végrehajtható internetkapcsolat nélkül is, de néhány dokumentáció 02100 include/sys/ioc_disk.h 09700 kernel/system.c
csak a www.minix3.org oldalon érhető el. Teljes telepítési leírás található a CD-n 02000 include/sys/ioctl.h 09600 kernel/system.h
Adobe Acrobat PD F formátumban. 01600 include/sys/sigcontext.h 10300 kernel/system/do_exec.c
01700 include/sys/stat.h 10200 kernel/system/do_setalarm.c
01400 include/sys/types.h 06000 kernel/table.c
Terméktámogatás 01900 include/sys/wait.h 04900 kernel/type.h
09400 kernel/utility.c
A CD-n található M INIX 3-szoftverrel kapcsolatos további technikai információ­ Eszközmeghajtók (drivers)
kért látogassunk el a www.minix3.org címen elérhető hivatalos M INIX-oldalra. 10800 drivers/drivers.h Fájlrendszer (file system)
12100 drivers/at_wini/at_wini.c 21600 servers/fs/buf.h
12000 drivers/at_wini/at_wini.h 22400 servers/fs/cache.c
11000 drivers/libdriver/driver.c 21000 servers/fs/const.h
10800 drivers/libdriver/driver.h 28300 servers/fs/device.c
11400 drivers/libdriver/drvlib.c 28100 servers/fs/dmap.c
10900 drivers/libdriver/drvlib.h 21700 servers/fs/file.h
11600 drivers/memory/memory.c 23700 servers/fs/filedes.c
15900 drivers/tty/console.c 21500 servers/fs/fproc.h
660 FÜGGELÉK

20900 servers/fs/fs.h 21100 servers/fs/type.h


21400 servers/fs/glo.h
22900 servers/fs/inode.c
25600 servers/fs/write.c Tárgymutató
21900 servers/fs/inode.h Processzuskezelő (process manager)
27000 servers/fs/link.c 19300 servers/pm/break.c
23800 servers/fs/lock.c 17100 servers/pm/const.h
21800 servers/fs/lock.h 18700 servers/pm/exec.c
24000 servers/fs/main.c 18400 servers/pm/forkexit.c
26700 servers/fs/mount.c 20400 servers/pm/getset.c
24500 servers/fs/open.c 17500 servers/pm/glo.h
22000 servers/fs/param.h 18000 servers/pm/main.c
26300 servers/fs/path.c 20500 servers/pm/misc.c
25900 servers/fs/pipe.c 17600 servers/pm/mproc.h
27800 servers/fs/protect.c 17700 servers/pm/param.h 1401-es, IBM 22, 23 ANSI-vezérlőszekvencia (ANSI escape
21200 servers/fs/proto.h 17000 servers/pm/pm.h 360-as sorozat 23 sequence)335-336
25000 servers/fs/read.c 17300 servers/pm/proto.h 6502 CPU 28 aperiodikus valós idejű rendszer (aperiodic
27500 servers/fs/stadir.c 19500 servers/pm/signal.c 7094-es 22, 23, 24 reál time system) 125
23300 servers/fs/super.c 17800 servers/pm/table.c 8086-as 28 Apple 28-29
22100 servers/fs/super.h 20300 servers/pm/time.c #define 149 arányos ütemezés (fair share scheduling)
22200 servers/fs/table.c 20200 servers/pm/timers.c #if 152,177 124-125
28800 servers/fs/time.c 17200 servers/pm/type.h #ifdef 149,151,156 arányosság (proportionality) 113
architektúra, számítógép (architecture,
A computer) 18
Ada 20 argc 44
adapter (device adapter) 240 argv 44
adatcső (Pipe) 38 assembly nyelv (assembly language) 21
adatintegritás (data integrity) 544 asszociatív memória (associative memory)
adatszegmens (data segment) 45 414
adatrész (D space) 441, 450, 453 aszinkron átvitel (asynchronous transfer)
Aiken, Howard 20 247
aktív partíció (activc partition) 133 áteresztőképesség (throughput) 113
aktív várakozás (spin lock) 88 áthaladási idő (turnaround time) 113
aktuális könyvtár (current directory) 512 átlapolt keresés (overlapped seek) 297
alaplap (parentboard) 244, 297, 306, 311, átmeneti tároló (block cache) 54
325, 326, 372 attribútum (attribute) 506
alapvető I/O-rendszer (basic I/O system)
375, 376, 387, 388, 397 B
állapotbit (status bit) 243 Babbage, Charles 20
állapotváltozó (condition variable) 98 bankár algoritmus (banker’s algorithm)
álnév (alias) 522 265,392
alpartíciós tábla (subpartition table) 174,516 bázisregiszter (base register) 399
alvás és ébredés (sleep and wakeup) 91 bebocsátó ütemező (admission scheduler)
alvás primitív (sleep primitive) 91 117
Amoeba (Amoeba) 563 behatoló (intruder) 545
ANSI C 148 belső töredezettség (internál
ANSI escape szekvencia lásd fragmentation) 429
ANSI-vezérlőszekvencia Berkeley Software Distribution 27
662 TÁRGYMUTATÓ TÁRGYMUTATÓ 663

best fit algoritmus 404 bittérképes üzemmód (bitmap mode) 335 csak olvasható memória (read only elsődleges indítórekord (master boot
betöltési felügyelőprogram (boot monitor) bitvektor (bitmap) 46 memory) 28 record) 133, 173, 515
146, 165, 175-176, 375, 376, 378, 388 bizalmas adatkezelés (data confidentiality) csapda (trap) 139, 210, 549 elsőként be, elsőként ki lapcserélés (first-in
betöltési memóriakép (boot image) 133, 544 csere (swapping) 400-405 first-out page replecement) 419
175, 378, 469, 473 biztonság (security) 543 csoport (group) 558 elvek és megvalósítás (policy versus
betölthető betűkészletek (loadable fonts) védelmi mechanizmusok (protection csoportazonosító (group identification) 35 mechanism) 126
352-353 mechanisms) 55-56, 164,179 Engelbart, Douglas 28
betölthető billentyűzettérképek (loadable blokk (block) előreolvasása (read ahead) D erőforrás (resource) 256
keymaps) 329, 349-352 540 DDOS lásd osztott szolgáltatásmegtagadás felcserélhető erőforrás (fungible
bevitel/kivitel (input/output) blokkgyorsítótár (block cache) 537 definíciós fájl, MINIX 3 (header file) resource) 256
blokkméret (block size) 253 blokkméret (block size) 253, 527 147-162 megszakíthatatlan (nonpreemptable) 256
démon (daemon) 254 blokkolódás (block) 75 definíciós fájl, MINIX 3 (include file) 147 megszakítható (preemptable) 256
DM A (Direct Memory Access) 244-246 blokkos eszköz (block device) 239, 249, 353 Dekker algoritmusa (Dekker's algorithm) 88 pályagörbe (trajectory) 266
eszköz (device) 239-240 blokkspecifikus fájl (block special file) 38, démon (daemon) 72,132, 254, 362 erőforrásholtpont (resource deadlock) 258
eszközvezérlő (device controller) 54, 67 Disk Operating System 28 erőforrás-kezelő (resource manager) 19
240-241 bővítmény (plug-in) 548 DMA (Direct Memory Access) 244-246 értesítés, MINIX 3 (notification) 444, 469
felhasználói szintű szoftver (user-space BSD lásd Berkeley Software Distribution DOS lásd szolgáltatásmegtagadás; Disk értesítő üzenet (notification message) 469
software) 253 bűvös szám lásd mágikus szám Operating System escape karakter (escape character) 332
háttértárolás (spooling) 254 Byron, Lord 20 escape szekvencia lásd vezérlőszekvencia
hibakezelés (error handling) 252 E eszközfüggetlenség (device independence)
lemez (disk) 296-322 C ébredés primitív (wakeup primitive) 91 246
memórialeképezésű (memory-mapped) C nyelv (C language) 72,147,156,162, ébresztőt váró bit (wakeup waiting bit) 93 eszközmeghajtó (device driver) 130,132,
242-243 166,180,141-143 ECC lásd hibajavító kód 240, 248-250, 336-388
monopol módú eszköz (dedicated C run-time start-off 455 echózás (echoing) 330-332, 334,341, 366, eszközregiszter (device register) 16
device) 252 Cbreak mód (Cbreak mode) 51, 334 368, 369, 382 eszközvezérlő (device controller) 240
pufferezés (buffering) 252 cím (address) Eckert, J. Presper 21 étkező filozófusok probléma (dining
RAM-lemez (RAM disk) 289-296 fizikai (physical) 165 egyezményes koordinált világidő (universal philosophers problem) 104-107
terminál 322-388 virtuális cím (virtual address) 406 coordinated time) 222 exokernel (exokernel) 63
lásd még I/O címfordítási gyorsítótár (translations egységes kapcsolódási felület (uniform
bezárás probléma (confinement problem) lookaside buffer) 413-415 interface) 251 F
564 címkézett architektúra (tagged egységes névhasználat (uniform naming) 246 fájl (file) 36-39
billentyűkód (scan code) 325, 329, 339, architecture) 561 egyszer használatos jelszó (onc-timc blokkspecifikus (block special) 38, 54,
340-342, 344, 350, 373-376, 379 címtartomány (address space) 34 password) 552 67, 503
billentyűzetbemenet (keyboard input) C-lista (C-list) 560 éhezés (starvation) 105 futtatható (executable) 452-456
339-344 CMS lásd Conversational Monitor System EIDE lásd kiterjesztett integrált eszköz karakterspecifikus (character special) 38,
billentyűzetszoftver (keyboard software) Conversational Monitor System 61 elemi művelet (atomic action) 93 48, 67, 340, 503
327-335 CP/M 28 ellenintézkedés (countermeasurement) -kezelés (file management) 47-52
billentyűzetmeghajtó, MINIX 3 (keyboard CPU-kihasználtság (CPU utilization) 113 554 -kiterjesztés (extension) 501
driver) 372-380 CPU-ütemező (CPU scheduler) 118 ellenőrző makró (feature test macro) 148, közönséges (regular file) 503
billentyűzettérkép (keymap) 337, 338, CPU-igényes processzus (compute-bound 163 -megvalósítás (implementing files) 517
350-352, 361, 373, 376, 378 process) 110 ellenség (adversary) 545 -műveletek (file operations) 507
bináris szemafor (binary semaphore) 94 CRSTO 455 előfeldolgozó, C (preprocessor, C) 72,148, végrehajtható (executable) 131,146,164,
BIOS lásd alapvető I/O-rendszer CRT monitor lásd katódsugárcsöves 149,177 176,194
bittérkép (bitmap) 138,168,170,188,195, monitor előlapozás (prepaging) 425 fájlátviteli protokoll (file transfer protocol)
402 C-szálak (C-threads) 81 elosztott rendszer (distributed system) 27 54
bittérképes megjelenítő (bitmap display) 394 CTSS lásd kompatibilis időosztásos első generációs számítógép (first fájlhelyfoglalási táblázat (file allocation
bittérképes terminál (bitmap terminál) 393 rendszer generation computer) 20-21 table) 519
664 TÁRGYMUTATÓ TÁRGYMUTATÓ 665

fájlkiszolgáló (file server) 26 FIFO lásd elsőként be, elsőként ki H holtpontmegelőzés (deadlock prevention)
fájlleíró (file descriptor) 38, 47 lapcserélés hajlékonylemez (floppy disk) 18,132-133, 262-265
fájlrendszer (file system) 130, 336-345, first fit algoritmus (first-fit algorithm) 319-322 holtpont modell (deadlock modeling)
354,358-370, 378, 394, 500 404 hajlékonylemez-meghajtó (floppy disk 258-261
felcsatolás (mounting) 246, 579 fizikai azonosítás (physical identification) driver) 319-322 hozzáférést vezérlő lista (access control
gyökér- (root) 38 553 hálózati operációs rendszer (network list) 557
hatékonysága (file system performance) főeszközszám (major device number) operating system) 29 HTTP lásd hiperszöveg-átviteli protokoll
537 251 hálózati szerver (network server) 131 HVL (ACL) 558
-konzisztencia (file system consistency) főgéptől független nyomtatás (off-line hardveres görgetés (hardware scrolling) Hydra (Hydra) 561
534 printing) 23 347, 348, 375, 378, 383,388
-megbízhatóság (file system reliability) foglalt végződés (reserved suffix) 151 harmadik generációs számítógép 23-27 I
530 folyamatállapot-szegmens (task state háromszintű ütemezés (three level IBM 561
-megvalósítás (implementation of file segment) 185,205 scheduling) 117-118 IBM 1401 22, 23
system) 515 fordított prioritás (priority inversion) 91 háromszorosan indirekt (triple indirect) IBM 360 23
naplózott (log-structured file system) forráskódszerkezet, MINIX 3 (source code 521 IBM 7094 22, 23, 24
542 organization) 141-144 határregiszter (limit register) 399 IBM PC 28, 31, 324, 325, 342, 372, 380, 394
-szerkezet (file system layout) 515 FORTRAN 21-23 háttérkatalógus (spooling directory) 83 IBM system/360 23
táblakezelés (table management) 591 FS lásd fájlrendszer háttérkönyvtár (spooling directory) 254 i-csomó lásd i-csomópont
tárolóhely-foglalás (storage allocation) FTP lásd fájlátviteli protokoll háttértárolás (spooling) 25, 254 i-csomópont (i-node) 53, 520
590 függvényprototípus (function prototype) helyettesítőjel (wildcard) 559 IDE (Integrated Drive Electronics) 297
fájlszerkezet (file structure) 502 149 helyfoglalás (allocation) időosztás (timesharing) 25
FAT (FAT) 519 funkcióbillentyű (function key) 135,138 folytonos (contiguous allocation) 517 időszelet (Quantum) 118
feladat (job) 21 futtatható szkript (executable script) 476 láncolt listás (linked list allocation) 518 időzítő (clock) 220
feladatvezérlés (job control) 45, 361 lokális vagy globális (local versus local) időzítő (timer) 220
felcserélhető erőforrás (fungible resource) G 426-428 felhasználói szintű, MINIX 3 (user space
256 garantált ütemezés (guaranteed helyi hálózat (local area network) 26 in MINIX 3) 463-464
feldolgozott mód (cooked mode) 51,328 scheduling) 123 hiányzó blokk (missing block) 535 időzítőhardver (clock hardware) 220-222
felhasználóazonosítás (user GE-645 26 hibajavító kód (error-correcting code) 241, időzítők, MINIX 3-implementáció (timers,
authentication) 550 generikus jog (generic right) 562 390 implementation in MINIX 3) 483-488
felhasználóbarát (user-friendliness) 28 gépi nyelv (machine language) 16 hibakezelés (error handling) 247, 252 időzítőmeghajtó, MINIX 3 (clock driver)
felhasználói azonosító (user Identification) GID lásd csoportazonosító hibás blokk (bad block) 304 225-231
35 globális helyfoglalás (global allocation) hiperszöveg-átviteli protokoll (hypertext időzítő megszakításkezelője, MINIX 3
felhasználói mód (user mode) 130 426-428 transfer protocol) 54 (clock interrupt handler) 226
felhasználói szintű I/O-szoftver (user-space globális helyfoglalási algoritmusok (global hitelesítés (authentication) 101 időzítőszoftver (clock software) 222-225
I/O software) 253 allocation algorithms) 426-428 hivatkozásbit (referenced bit) 412 időzítőtaszk (clock task) 129
feltételes fordítás (conditional globális leírótábla (global descriptor table) hivatkozáslokalitás (locality of reference) MINIX 3 220-231
compilation) 149-151 435—437 413, 424 IDT lásd megszakításleíró tábla
felügyeleti fájlzárolás (advisory file görgetés (scrolling) 335, 336, 347 holtpont (deadlock) 96, 255-270 igény szerinti lapozás (demand paging)
locking) 583 grafikus felhasználói felület (graphical user alapelvek (definition) 257 424
felügyeleti időzítő (watchdog timer) 225, interface) 28 bankár algoritmus (banker’s algorithm) indirekt blokk (indirect block) 521
371, 393 GUI lásd grafikus felhasználói felület 265-266,268-270 indítás, MINIX 3 (bootstrapping) 173-176
felügyeleti időzítő, MINIX 3 (watchdog gyártó-fogyasztó probléma (producer- erőforrás (resource) 256-257 indítóprogram (bootstrap) 133
timer) 227-228 consumer problem) 91-95, 99-100 felismerés és helyreállítás (detection and indítóblokk (boot block) 174, 515
felügyelőprogram (monitor) 174 gyermekprocesszus (child process) 35 recovery) 262 indítólemez (boot disk) 132
felügyelt hívás (supervisor call) 57 gyorsítótár (cache) 537 feltételek (condition) 257 indítóparaméter (boot parameter) 175,
felügyelt mód (supervisor mode) 17 gyökérfájlrendszer (root file system) 38 strucc algoritmus (ostrich algorithm) 261 307-309, 311
féreg (worm) 547 gyökérkönyvtár (root directory) 37 holtpont elkerülése 265-270 inét szerver (inét server) 131
666 TÁRGYMUTATÓ TÁRGYMUTATÓ 667

információs szerver (information server) jogosultsági bitek (permission bits) lásd kitöltő karakter (fillér character) 331 L
130,135, 379 mód kivétel (exception) 189,193 LAMP (Linux, Apache, MySQL, PHP/
inicializálás (initialization) jogosultsági szint (privilege level) 171 klasszikus IPC-problémák (classical IPC Per!) 33
MINIX-processzuskezelő (MINIX JVM lásd Java virtuális gép problems) 103-109 LAN lásd helyi hálózat
process manager) 469-473 étkező filozófusok (dining philosophers) lap, virtuális memória (page, Virtual
MINIX-kernel 134-136 K 104—107 memory) 407
inicializált változó (initialized variable) 166 kanonikus mód (canonical mode) 51, 328, olvasók és írók (readers and writers) lapcímtár (page directory) 437
init processzus (init process) 74,176,182, 329, 331, 334, 341, 358, 362-372 107-109 lapcserélési algoritmusok (page swapping
132-136,143-146, 375, 376, 469 kapcsolás (link) 514 kliensprocesszus (client process) 64 algorithms) 417-424
inkrementális mentés (incremental dump) merev (hard link) 522 kliens-szerver modell (client-server model) elsőként be, elsőként ki (first-in, first-
532 szimbolikus (symbolic link) 522 63-65 out) 419
input/output lásd bevitel/kivitel; I/O kapuzójel regiszter (strobed register) 318 kódlap (code page) 329 globális (global) 426
időzítő (clock) 220-231 karakteres eszköz (character device) 239, kódrész (I space) 441-444, 450, 453 laphiba-gyakoriság (page fault
Intel 8086 28 249 kódszegmens (text segment) 45 frequency) 423
intelligens terminál (intelligent terminál) karakterspeciflkus fájl (character special kombinált kód- és adatrész (combined I legrégebben használt lapcserélés (least
327 file) 38, 48, 67, 340 and D space) 441, 442, 449,450, 455 recently used) 417-424
interaktív ütemezés (interactive katódsugárcsöves monitor (cathode ray kompatibilis időosztásos rendszer lokális (local) 426
scheduling) 118-125 tűbe monitor) 324 (compatible time sharing system) 26 második lehetőség (second chance) 420
invertált laptábla (inverted page table) 415 kémprogram (spyware) 547 korlátos tároló (bounded buffer) 91 munkahalmaz óra algoritmus (wsclock
I/O, MINIX 3 képernyőmeghaitó, MINIX 3 (display kölcsönös kizárás (mutual exclusion) 85 algorithm) 426
billentyűzet 327-335, 339-344 driver) 380-388 könnyűsúlyú processzus (lightweight N R U algoritmus (NR U algorithm) 418
képernyő 335-336, 344-353 képesség (capability) 560 process) 79 optimális lapcserélési algoritmus
terminálmeghajtó 353-388 képességi lista (capability list) 560 könyvtár (directory) 36, 503, 509 (optimál page replacement) 417
I/O-adapter (I/O adapter) 306 kernel 64,129 megvalósítás (implementation) 521 óra (clock) 417-424
I/O-csatorna (I/O channel 241 kernel mód (kernel mode) 17,129 NTFS lásd új technológiájú fájlrendszer öregítő (aging) 417-424
I/O-eszköz (I/O device) 239-240 kernelhívás (kernel call) 57,129, 210, 446 Windows 98 (Windows 98 directory) 523 laphiba (page fault) 408
I/O-eszközvezérlő (I/O device controller) Kernighan-Ritchie C 148,149,156,165, könyvtárkezelés (directory management) laphiba-gyakoriság algoritmus (page fault
240-241 468 52-54 frequency algorithm) 426-428
I/O-igényes processzus (I/O bound kétfázisú zárolás (two-phase locking) 269 könyvtárszerkezet, hierarchikus lapkeret (pageframe) 407
process) 110,120,115-118 kétszeresen indirekt (double indirect) 521 (hierarchical directory system) 509 lapméret (pagesize) 429
I/O-kapu (I/O port) 242,325,340, 373,379, kezelő (handler) környezetátkapcsolás (context switch) 119 lapos megjelenítő (fiat panel display) 323
386, 388-390 megszakítás (interrupt) 94, 327,328, kötegelt rendszer (batch system) 22 lapozás (paging) 405-409
I/O-szoftver (I/O software) 246-255 339, 340, 342, 344, 363, 373-375, 378, kötegelt rendszer ütemezése (batch Pentium 435
I/O védelmi szint (I/O protection level) 164 389, 393 scheduling) 114-118 tervezési szempontok (design issues)
IPC lásd processzusok közötti szignál (signal) 3 5 ,4 6 ,8 0 ,8 1 ,4 5 6 ,4 5 9 , központi puffergyűjtő terület (central 424-430
kommunikáció 461, 482, 486 buffer pool) 329, 330 laptábla (page table) 409, 410-412
IPC alapművelet (IPC primitive) 210, 391 kezelőkészlet és használatának közvetítő szoftver (middleware) 27 invertált laptábla (inverted page table)
írásátteresztő (write-through) 539 szétválasztása (mechanism versus közvetlen elérés (random access) 506 415
IS lásd információs szerver policy) 65 közvetlen fájl (immediate file) 526 többszintű laptábla (multilevel page
ISA lásd utasításkészlet-architektúra kihívás-válasz (challenge-response) 552 közvetlen memóriaelérés (direct memory table) 410
ismétlődő mód (square-wave mode) 221 kiírást kezelő szoftver (display software) access) 244 laptáblastruktúra (page table structure)
335-336 kritikus szekció (critical section) 84-86 412
J kiterjesztett billentyűelőtag (extended key kritikus terület (critical region) 84-86 látszatpárhuzamosság (pseudoparallelism)
Java virtuális gép (Java virtual machine) 63 prefix) 376 kulcsgyűjtő (key logger) 547 69
jelszó (password) 551 kiterjesztett gép (extended machine) 19 kulcsmező (key tieid) 503 LBA lásd lineáris blokkcímzés
Jobs, Steven 28 kiterjesztett IDE-lemez (extended IDE külső töredezettség (external LBA48 lemezcímzés (LBA disk
jog (right) 556 disk) 309 fragmentation, checkerboarding) 434 addressing) 314
668 TÁRGYMUTATÓ TÁRGYMUTATÓ 669

legkevesebb privilégium elve (principle of lokális helyfoglalási algoritmusok (local megszakítható ütemezés (preemptive metaadat (metadata) 503
least privilege) 563 allocation algorithms) 426-428 scheduling) 111 MFT (MFT) 521, 526
legközelebbit keres elsőként (shortest seek lokális leírótábla (local descriptor table) mellékeszköz (minor device) 54 Microsoft 28
first) 301 204, 435-437 mellékeszközszám (minor device number) mikroarchitektúra szint (microarchitecture
legrégebben használt lapcserélési lomtár (recyclc bin) 531 251 level) 16
algoritmus (least recently used Lord Byron 20 memóriatömörítés (memory compaction) mikroprocesszor (microprocessor) 28
algorithm) 421 Lovelace, Ada 20 400-402 mikroprogram (microprogram) 16
legrövidebb feladatot először ütemezés LRU (LRU) 538 memóriaütemező (memory scheduler) 117 mikroszámítógép (microcomputer) 28
(shortest job first scheduling) 115-116 lyuklista, MINIX 3 (hole list) 450-451 memóriahierarchia (memory hierarchy) MINIX 3
legrövidebb maradék futási idejű lyuktábla (hole table) 450,465,469 395 adatcső (pipe) 583, 613
következzen ütemezés (shortest memóriakezelés (memory management) adatszerkezetek (data structures)
remaining time next scheduling) M 395-498 162-173
116-117 Mac OS X 29 alapvető (basic) 396-399 adatvédelem (data protection) 620
legrövidebb processzus következzen magánélet (privacy) 545 best fit algoritmus (best-fit algorithm) állományleíró (file descriptor) 581
ütemezés (shortest process next mágikus szám (magic number) 173,505, 404 áttekintés (overview)
scheduling) 122-123 587 bittérképek (bitmaps) 402 időzítőmeghajtó (clock driver)
leírótábla (descriptor table) 171 mágikus szó (shebang) 476 csere (swapping) 417-424 225-231
lekapcsolás (unlink) 514 makefile 142 first fit algoritmus (first-fit algorithm) processzuskezelő (process manager)
lemez (disk) 296-322 Malware (Malware) 546 404 439-465
hajlékonylemez (floppy) 18,132 mappa (folder) 509 láncolt listák (linked lists) 403^105 processzusok (processes) 128-141
lemezfej-ütemező algoritmus (disk arm második generációs számítógép (second lapcserélési algoritmusok (page rendszertaszk (system task) 210-214
scheduling algorithm) 300 generation computer) 21-23 replacement) 417-424 terminálmeghajtó (terminál driver)
lemezfejléc (disk preamble) 241 második lehetőség lapcserélési algoritmus next fit algoritmus (next-fit algorithm) 336-353
lemez nélküli munkaállomás (diskless (second chance paging algorithm) 420 404 belső szerkezet (internál structure)
workstation) 176 masterboot lásd elsődleges indítórekord quick fit algoritmus (quick-fit algorithm) 129-132
lemezszoftver (disk software) 300 Mauchley, John 21 404 betöltési felügyelőprogram (boot
hibakezelés (error handling) 303-305 MBR lásd elsődleges indítórekord szegmentálás (segmentation) 431-439 monitor) 146,165,175-176,178,180,
pályavonalankénti raktározás (track-at- megjelenítést vezérlő szoftver (display tervezési kérdések (design issues) 183, 206, 230, 308, 375-376, 378, 388,
a-time caching) 305 software) 335-336 424-430 469-473
lemezfej-ütemezés (disk arm scheduling) megosztott (program)kód (shared text) virtuális memória (virtual memory) betölthető betűkészletek (loadable
FCFS (first-come, first-served) 300 441,449 405-416 fonts) 352-353 .
liftes algoritmus (elevátor algorithm) 302 MINIX 3 449,451 worst fit algoritmus (worst-fit algorithm) betölthető billentyűzettérképek
SSF (shortest seek first) 301 megszakítás (interrupt) 243-244, 327, 328, 404 (loadable keymaps) 349-352
lemezterület-kezelés (disk space 335, 337, 340, 342, 344, 345, 353, 356, memóriakezelő (memory manager) 395 billentyűzetbemenet (keyboard input)
management) 527 357, 363, 373, 379, 389, 390, 392, 393 memóriakezelő egység (memory 339-344
levelesláda (mailbox) 102 megszakításkérés (interrupt request) 325, management unit) 407 billentyűzetmeghajtó (keyboard driver)
LFS (LFS) 542 344, 373-375, 392 memórialeképezésű I/O (memory-mapped 372-380
lineáris blokkcímzés (linear block megszakításkezelő (interrupt handler) 185, I/O) 242-243 bittérkép (bitmap) 572
addressing) 313 203, 226-227, 248 memóriaszelet (click) 157,447 blokkgyorsítótár (block cache) 576
lineáris cím (linear address) 437 megszakításleíró tábla (interrupt memóriatérkép (core image) 34 blokkok kezelése (block mamagement)
Linux 32 descriptor table) 78,179, 204 mentés (backup) 531 591
logikai blokkcímzés (logical block megszakításvektor (interrupt vector) 78, fizikai (physical dump) 532 blokkos eszköz (block device) 280
addressing) 298 183,187-188,215,230 inkrementális (incremental dump) 532 blokkoseszköz-meghajtó (block device
logikai bomba (logic bomb) 547 megszakíthatatlan erőforrás logikai (logical dump) 533 driver) 280
lokális címke (local label) 187 (nonpreemptable resource) 256 merev kapcsolás (hard link) 514 definíciós fájlok (header files) 147-162,
lokális helyfoglalás (local allocation) megszakítható erőforrás (preemptable mesterfáj ltáblázat (master file table) 521, 587
426-428 resource) 256 526 D E V C A N C E L 284, 309
670 TÁRGYMUTATÓ TÁRGYMUTATÓ 671

DEV_CLOSE 284, 287, 309, 354 fájlzárolás (file locking) 583, 599 inicializált változók (initialized adatstruktúrák (data structures)
DEV_GATHER 284, 294, 309, 314 felhasználói szintű időzítők (user space variables) 166, 171 446-451
DEV_IOCTL 284, 287,309,354 timers) 463-464 I/O-eszközcsatoló (device interface) áttekintés (overview) 439-465
DEV_OPEN 284, 309, 312 felhasználói szintű I/O-szoftver (user- 621 definíciós fájlok (header files) 446-451
DEV_READ 284, 309, 354, 359 level I/O software) 278 képernyőmeghajtó (display driver) főprogram (main program) 469-73
D EV SC A TT ER 284 felügyeleti időzítő (watchdog timer) 380-388 implementálás (implementation)
DEVJSELECT 284 227-228 kiegészítő eljárások (Utilities) 206-209 465^*93
DEV WRITE 284, 309, 354 flip tábla (flip table) 582 kiterjesztett partíció (extended partition) inicializálás (initialization) 469-473
egyéb komponensek (other components) főprogram (main program) 600 289 processzus memóriaképe (core dump)
629 fordítása és futtatása (compiling and könyvtárak és elérési utak (directories 46, 330-333, 337, 379, 457, 460, 462,
elindulás (startup) 132-134 running) 144 and paths) 578,614 466,470,488
értesítés (notification) 444,469 forráskódszerkezete (source code könyvtárak megváltoztatása (changing processzusok
eszközfüggetlen I/O-szoftver (device- organization) 141-144 directories) 619 a memóriában (processes in memory)
independent I/O software) 278 hajlékonylemez-meghajtó (floppy disk közös blokkos eszközmeghajtó szoftver 447-449
eszközfüggetlen terminálmeghajtó driver) 319-322 (common block device driver áttekintése (overview of processes)
(device independent terminál driver) hardverfüggő kerneltámogatás software) 283 128-141
353-372 (hardware-dependent kernel support) lyuklista (hole list) 450-451 közötti kommunikáció (interprocess
eszközmeghajtó (device driver) 274-278 201-206 mágikus szám (magic number) 173,194, communication) 136-139,194-198
EXTERN definíció (EXTERN hasítótábla (hash table) 576 569 ütemezése (process scheduling)
definition) 155,156,439,468 holtpontkezelés (deadlock handling) meghajtókönyvtára (driver library) 287 139-141
ezred másodperces időzítés (millisecond 279-280 megosztott (program)kód (shared text) RAM-lemezmeghajtó (RAM disk
timing) 228-229 i-csomópont (i-node) 574 442, 449-450 driver) 291-296
fájl i-csomópontok kezelése (i-node megszakításkezelés (interrupt handling) megvalósítása (RAM disk driver
bezárása (file closing) 604 management) 595 183-194 implementation) 293
írása (writing a file) 611 idő (time) 626 megszakításkezelő (interrupt handler) read rendszerhívás (read system call)
létrehozása (file creation) 604 időzítőimplementáció (timer 270-274 585
megnyitása (file opening) 604 implementation) 485 memóriakezelés (memory management) reinkarnációs szerver (reincarnation
olvasása (reading a file) 608 időzítőmeghajtó megvalósítása (clock áttekintés (overview) 439-465 server) 131
fájlleírók kezelése (file descriptor driver implementation) 225-231 implementáció (implementation) rendszer-inicializáció (system
management) 599 időzítő megszakításkezelője (clock 465-493 initialization) 176-183
fájlműveletek (operations on individual interrupt handler) 226 memóriakezelő segédeljárások (memory rendszerkönyvtár (system library)
files) 604 időzítőszolgáltatások (clock services) 229 management Utilities) 492-493 217-220
fájlok időzítőtaszk (clock task) 220-231 memóriaszerkezet (memory layout) rendszertaszk (system task) 209-220
kapcsolása (linking files) 617 implementáció (implementation) 441-444 riasztások és időzítők (alarms and
megváltoztatása (changing files) 619 időzítőmeghajtó (clock driver) 225-231 merevlemez-meghajtó (hard disk driver) timers) 483^188
szétkapcsolása (unlinking files) 617 processzuskezelő (process manager) 306-319 speciális fájlok (special files) 291-293,
fájlpozíció (file position) 48,582 465-493 megvalósítása (implementation o f the 583
fájlrendszer (file system) 566 processzusok (processes) 141-209 hard disk) 310 specifikus fájlok (special files) 38, 48,54,
felcsatolása (mounting file system) rendszertaszk (system task) 214-217 nyomkövetési lista (debugging dump) 67, 340
615 terminálmeghajtó (terminál driver) 168 superblokk (super block) 569
felépítése (file system layout) 568 353-388 PM-adatstruktúrák (PM data structures) szignál (signal) 458
kezdeti beállítása (initialization of file indítás (bootstrapping) 173-176 446-451 szignál elkapása (catching a signal)
system) 601 indítóblokk (boot block) 569 processzuskezelés megvalósítása 456-463
megvalósítása (file system indítóparaméter (boot parameter) 174- (implementation of process szignálkezelés (signal handling) 456-463,
implementation) 586 180,183, 291, 307-309,311,469-473 management) 141-231 480-483
segédprogramok (file system Utilities) inicializáció (initialization) 134-136, processzuskezelő (process manager) szinkron riasztás (synchronous alarm)
628 176-183 439-465 211,215,217,218, 227-229
672 TÁRGYMUTATÓ TÁRGYMUTATÓ 673

szuperblokk-kezelés (superblock keymap.src 351 errno.h 150 select.h 153


management) 597 send 457, 473 exception.c 202, 459 sigcontext.h 152
taszkok (tasks) 121,129,130, 132-136, sendrec 473 exec.c 452-456 signal.c 480
138-140,150,166,171,172,180-182, sys_copy 474 fcntl.h 150, 353, 465 signal.h 150, 458
200, 201 sys_exit 474 fs.h 148 start.c 178-179, 183, 204-206
terminál-adatszerkezet (terminál data sysjork 474 getset.c 489 stat.h 152
structure) 329, 332 sys_getimage 471 glo.h 156,163,165,166,171,187, 203, stddef.h 151
terminálkimenet (terminál output) sys_getinfo 471,492 208, 230 stdio.h 151
336-353 sys_kill 487 i8259.h 188, 202-204 stdlib.h 151
terminálmeghajtó (terminál driver) sys_memset 478 installboot 146,174 string.h 150
336-388 sys_newmap 478 int86.h 162 svrctl.h 153
termios struktúra (termios structure) 52, sys_setalarm 489 interrupt.h 162 sys_config.h 154,155
150, 333, 334, 337, 338, 354,355,358, sys_sigsend 487 ioc_disk.h 153 syslib.h 160, 213, 214,471
360, 370 sys_times 489 ioctl.h 153-154 system.c 212, 214—217
története 30-33 us-std.src 351, 373 ipc.h 163,166,158-160 system.h 171, 214
ütemezés (scheduling) 198-201 MINIX 3-forrásfájlok (MINIX 3 source is 135 sysutil.h 160
üzenetek (messages) 567 files) kernel.h 148,160,166,163, 465 table.c 156,165,171-173,180-181,199,
üzenetkezelés (message handling) 444-446 a.out.h 443 keyboard.c 339, 351, 372, 373, 377-379, 208, 465
vezérlőszekvencia (escape sequence) alloc.c 492 387 termios.h 150,154, 337, 355
336, 366, 374, 381-385 ansi.h 148-149,151 keymap.h 162, 351, 352, 375 time.c 489
zombik (zombies) 452, 460, 462, 474, at_wini.c 310, 319, 394 klib.s 206-208 timers.c 489
475, 486 bios.h 162, 311 klib386.s 206, 208, 217 timers.h 151,489
MINIX 3-fájlok (MINIX 3 files) bitmap.h 162 limits.h 149 trace.c 491
/boot/image 146,174 break.c 480 lóg 133,146 tty.c 274, 339, 355-372
/dev/boot 286, 292, 294, 295 callnr.h 161 main.c 178,179,183,199, 469-473 tty.h 353-355
/dev/console 339, 340, 362, 372, 373 clock.c 225-231 memory.c 293, 296 ttytab.h 452
/dev/kmem 292-295 cmos.h 162 memory .h 162 type.h 157,163-165, 203, 213, 285, 465,
/dev/log 362 com.h 161,169 misc.c 206, 490 490
/dev/mem 292, 294, 295 config.h 148,154,155,163-164,169, 209, mproc.h 447, 466 types.h 151,152
/dev/null 286, 290,292, 294 214, 355, 377 mpx.s 177, 206 u64.h 162
/dev/ram 286, 291, 292, 294, 295 console.c 339, 372, 373, 377, 380, 381, mpx386.s 164,173,177-179,181-183, unistd.h 150,465
/dev/ttycl 372 388 190,193,194, 202, 204, 237 utility.c 208, 492
/dev/zero 286, 290, 293-295 const.h 144,155,157,164, 465 mpx88.s 177 wait.h 153
/etc/passwd 136 cpu.h 162 param.h 468 MINIX 3-kernelhívások (MINIX 3 kernel
/etc/rc 74,135,146, 212 crsto.s 455 partition.h 162 calls)
/etc/termcap 356 devio.h 161 pm.h 148, 465 irqsetpolicy 377
/etc/ttytab 74,135,136 dir.h 153 portio.h 162 notify 137-38,159,195,197,198, 210,
/usr /spool/locks/ 279 diskparm.h 162 ports.h 162 227-228, 232, 279
/usr/adm/wtmp 135 dmap.h 162 priv.h 195,169-170 récéivé 136-139,159,194-198, 210, 227,
/usr/bin/getty 136 do_exec.c 217, 218 proc.c 196,195-197 232, 340, 391
/usr/bin/login 136 do_irqctl.c 340 proc.h 199,166-170, 467 revive 161
/usr/bin/stty 136 do_setalarm.c 217 protect.c 202, 204-206 send 100,101,103,136-139,159,167,
/usr/lib/i386/libsysutil.a 161 driver.c 274, 281, 284, 285, 288, 293, 294, protect.h 171, 204 194,197, 210, 232, 279, 340, 391
drivers/tty/vidcopy.s 383 310 proto.h 163,165, 469 sendrec 136-139,159,171,279, 340
init 474 driver.h 274, 293 ptrace.h 153 sys_abort 376
init processzus (init process) 132-136, drvlib.c 274, 281, 287, 288, 312 pty.c 357 sys_datacopy 287
143-146,176,182 drvlib.h 287, 288 sconst.h 166,169 sys_exit 295
674 TÁRGYMUTATÓ TÁRGYMUTATÓ 675

sys_gctkinf° 295 setuid 465, 477 munkaállomás (workstation) 26 rétegelt (layered) 59-60
sys_getkmessages 387 sigaction 457, 460, 466, 480, 481, 484 munkahalmaz modell (working set model) struktúrája (structure) 57-65
sys_getmachine 295, 356 sigalrm 484 424-426 története 20-33
sys_irqenable 319, 377 siginit 484 munkakönyvtár (working directory) 37, 512 virtuális gép (virtual machine) 60-63
sys_irqsetpolicy 313 sigkill 456 munkavezető (session leader) 362 optimális lapcserélési algoritmus (optimál
sysjdll 375 signal 98, 248 Murphy törvénye (Murphy's law) 84 page replacement) 417
sys_physcopy 294 sigpending 481 Mutex 95-96 óra (clock) 220
sys_segctl 295, 296 sigpipe 458 óra algoritmus (clock algorithm) 420
sys_setalarm 317, 371, 386 sigprocmask 457, 460, 482 N óra lapcserélési algoritmus (clock page
sys_vircopy 294, 361, 381, 388 sigreturn 444, 458, 460, 462, 482,485, nagyszámítógép (mainframe) 21 replacement algorithm) 421
sys_voutb 317, 386 486, 488 NEC PD 765 lapka (chip) 18 órajel (clock tick) 221
MINIX 3 POSIX-rendszerhívások sigsuspend 444, 482, 486, 488 nem gyakran használt algoritmus (nőt elveszett (clock tick, lost) 166, 227, 230
(MINIX 3 POSIX system calls) sleep 91, 90-93 frequently used algorithm) 422 OS/360 23-24
alarm 82,130, 213, 222, 228, 229 stat 152 nemkanonikus mód (noncanonical mode) osztott kód lásd megosztott (program)kód
brk 130,440,444^ 46, 449, 456, 478, stime 444,464, 489 51, 328, 334, 341, 358, 359, 362-372 osztott könyvtár (shared library) 433
480,486 time 444, 464, 489 nem megszakítható ütemezés osztott szolgáltatásmegtagadás (distributed
chdir 130 times 213 (nonpreemptive scheduling) 111 denial of service) 546
close 282,283 unlink 130 nem rezidens (nonresident) 526 öregítő algoritmus (aging algorithm) 123,
exec 74,130,136,151, 205, 208, 218, 219, unpause 161 Neumann János 20 423
440-444, 449, 452^155, 476-479, 494 utime 464 next fit algoritmus (next-fit algorithm) 404
execve 72, 73 wait 98,99,153, 248, 444,450,452,474, NRU algoritmus (NR U algorithm) 418 P
exit 73,130,136, 444, 451, 455, 474 475,488 NTFS (NTFS) 501,525 parancsértelmező (shell) 34, 39
fork 72-74, 81,130,136,168, 209, 210, waitpid 153, 444, 475 null mutató (null pointer) 208, 355, 481 partíció (partition) 54,133, 515
261, 441, 442, 444, 451, 452, 473, 474, wakeup 91, 90-93 nyers mód (raw mode) 51, 328, 329, elsődleges (primary) 516
494 write 253, 294, 345, 354, 360, 381, 382, 333-335 kiterjesztett (extended) 516
fstat 152 488 nyílt forráskód (open source) 33 logikai (logical partition) 516
getgid 446, 464, 489 mód (mode) 41, 47,5 5 ,5 6 nyomkövetési lista (debug dump) 168 partíciós tábla (partition table) 133
getpgrp 465, 490 módosított bit (modified bit) 413 nyomtatódémon (printer daemon) 83 PDP-1 27
getpid 446, 465 monitor 96-100 nyugtázás (acknowledgement) 101 PD P-7 27
getprocnr 490 monolitikus operációs rendszer P D P-11 28
getsetpriority 491 (monolithic operating system) 57-59 O Pentium lapozása (Pentium paging) 435
getsysinfo 446 monopol módú eszköz (dedicated device) olvasók és írók probléma (readers and Pentium virtuális memória kezelése
getuid 446, 464, 489 252 writers problem) 107-109 (Pentium virtual memory) 435
ioctl 153,154, 328, 333, 337, 338, 351- monoprogramozás (monoprogramming) operációs rendszer (operating system) 15 periodikus valós idejű rendszer (periodic
354, 360-363, 370,388, 444,458,481 396-397 első generációja 20-21 reál time system) 125
kill 74,130, 212 MOSTEK 6502 28 fogalmai (concepts) 33-40 Peterson megoldása (Peterson's solution)
mount 130 Motif 29 harmadik generációja 23-27 88-89
open 253, 283, 285, 353 Motorola 68000 28,157 karakterisztika (characteristics) 17 PID 42
pause 76, 444, 485, 488 MPI lásd üzenetküldő felület kliens-szerver (client-server) 64-65 piszkos bit (dirty bit) 412
ptrace 153, 445, 465, 491 MS-DOS 28, 500 második generációja 21-23 plug ’n play 244
read 294,335, 354,359,363,364,368, MULTICS 26 memóriakezelés (memory management) POSIX 27
371,463,488 multiprogramozás (multiprogramming) 396-399 definíciós fájlok (header files) 143
reboot 445, 465, 487 23-25, 70, 397-398 MINIX 30-33 primitív, üzenet (primitive, message) 100,
sbrk 446, 456 fix számú feladattal (multiprogramming mint erőforrás-kezelő (as resource 340
select 153, 359, 372, 374 with fixed tasks) 397-398 manager) 19 prioritásos ütemezés (priority scheduling)
setgid 465, 477 mértéke (degree of multiprogramming) mint kiterjesztett gép (as extended 119-121
setsid 465, 489 118 machine) 18-19 PRIVÁTÉ 156
676 TÁRGYMUTATÓ TÁRGYMUTATÓ 677

processzor állapotszó (processor status tevékeny várakozás (busy waiting) 86-90 rendszerprocesszus (system process) 131 SSF lásd legközelebbit keres elsőként
word) 164 üzenetküldés (message passing) 100-103 rendszertaszk, MINIX 3 (system task) 129, standard bemenet (standard input) 39
processzus (process) 34-35 versenyhelyzet (race condition) 83-84 209-220 standard kimenet (standard output) 39
befejezése (process termination) 73-74 processzustáblázat (process table) 34, 77 rétegek (overlays) 405 static 156
létrehozása (process creation) 71-73 processzusvezérlő blokk (process control rétegelt operációs rendszer (layered strucc algoritmus (ostrich algorithm) 261
megvalósítása (process implementation) block) 77 operating system) 59-60 stty parancs (stty command) 136
77 prompt 39 riasztás szignál (alarm signal) 35, 464 süti (cookie) 547
MINIX 3 141-209 PSW 164 megvalósítás, MINIX 3 (implementation system V 27
memóriaképe (core dump) 458 P-szálak (P-threads) 81 in MINIX 3) 483-488 szabad blokk (free block) 529
ütemezése (process scheduling) 139-141 pszeudoterminál (pseudoterminal) 278, RISC 29, 33 szálak (threads) 79-82
MINIX 3 198-201 337, 338, 355, 357, 369, 371 rögzített méretű partíció (fix partition) C-szálak (C-threads) 81
processzusállapot (process state) 75-77 PUBLIC 156, 215, 218, 226, 229, 231 397-398 P-szálak (P-threads) 81
processzusátkapcsolás (context switch) 119 pufferezés (buffering) 247, 252 ROM lásd csak olvasható memória számításigényes processzus (compute-
processzusátkapcsolás (process switch) 119 puffergyorsítótár (buffer cache) 537 rosszindulatú program (malicious bound process) 110,115
processzushierarchia (process hierarchy) program) 546 szegmens (segment) 431
74-75 Q round robin ütemezés (round robin adat (data) 45, 78,194, 205, 400-402,
processzuskezelés (process management) quick fit algoritmus (quick-fit algorithm) scheduling) 118-119 435—437, 441-444, 447-449, 452-457,
42-45 404 rövidút (shortcut) 522 463, 476-480, 489
processzuskezelő (process manager) 130, RS lásd reinkarnációs szerver Intel és MINIX 205, 444
439 R RS-232 terminál (RS-232 terminál) kód (text) 45, 78, 292, 447, 449-450, 453,
adatstruktúrák (data structures) 465 RAID (Redundant Array of Independent 326-327 476-480
áttekintés (overview) 439 Disk) 299 RWX bitek (RWX bits) 37 leírótábla (descriptor table) 444
definíciós fájlok (header files) 465 sávos módszer (striping) 299 memória (memory) 433
főprogram (main program) 469 RAM-lemez (RAM disk) 133, 289-296 S regiszter (register) 444
implementálás (implementation) 465 hardver és szoftver (hardware and SATA lásd soros ATA verem (stack) 45,136,193, 205, 402, 429,
inicializálás (initialization) 469 software) 290 SCSI 240 432, 444, 447-450, 458,476-480
processzusmodell (process model) 69-71 randevú (rendezvous) 103 SETGID (SETGID) 556 szegmentálás (segmentation) 431-439
processzusok közötti kommunikáció reinkarnációs szerver (reincarnation SETUID (SETUID) 556 Pentium 435-437
(interprocess communication) 35, server) 74,131, 623 SETUID bit 52, 55-56, 465, 477, 490 szekvenciális elérés (sequential access) 505
83-103, 391 rejtett csatorna (covert channel) 563, 564 SLED (Single Large Expensive Disk) 299 szekvenciális processzus (sequential
alvás és ébredés (sleep and wakeup) relokáció, memória (relocation, memory) sorok (queues) process) 69
91-93 398-399 bemeneti (input) 72 szemafor (semaphore) 93-95
étkező filozófusok (dining philosophers) rendelkezésre állás (system availability) időzítő (timer) 213 szeparált kód- és adatrész (separate I and
104-107 545 karakterbeolvasás 328, 329, 332-333, D space) 441
gyártó-fogyasztó (producer-consumer) rendszerértesítő üzenet (system 339_344, 353-355, 362-371 szerep (role) 559
91-95 notification message) 444 küldési (send) 195,197 szerver (server) 64,130
háttérkatalógus (spooler directory) rendszerállapot (state) 266 processzus (process) 115 szignál (signal) 45^17,130,456
83-84 biztonságos (safe) 266 többszintű MINIX (multilevel in szignálkezelés (signal handling), MINIX 3
kölcsönös kizárás (mutual exclusion) rendszerhívás (system call) 33, 40-56, 209 MINIX) 173,139-141,167-169,189, 456-463
86-90 fájlkezelés (file management) 47-52 198-201, 215, 232 szignálkezelő (signal handler) 456
kritikus szekció (critical section) 84—86 könyvtárkezelés (directory management) többszörös (multiple) 121-122 szignálok, MINIX 3-beli implementáció
MINIX 3 136-139,194-198 52-54 soros ATA (Serial AT Attachment) 311 (signals, implementation in MINIX 3)
monitor 96-100 processzuskezelés (process soros vonal (serial line) 278 480483
mutex 96-96 management) 42-45 sorsjáték-ütemezés (lottery scheduling) szignálok kezelése, MINIX 3 (catching
olvasók és írók (readers and writers) 237 szignálkezelés (signaling) 45-47 123-124 signals) 480,481
Peterson algoritmusa 88-89 rendszerkönyvtár, MINIX 3 (system sózás (salting) 552 szigorú valós idejű (hard reál time) 125
szemafor (semaphore) 93-95 library) 217-220 specifikus fájl (special file) 38 szigorú váltogatás (strict alteration) 87
678 TÁRGYMUTATÓ TÁRGYMUTATÓ 679

szimbólummal kezdődő blokk (block többszörös sorok ütemezése (multiple ütemezés (scheduling) üzenetkezelő alapművelet (message
started by symbol) 442 queues scheduling) 121-122 algoritmusok csoportosítása (categories primitive) 136-139, 159,171, 210
szinkron átvitel (synchronous transfer) 247 tömörítés (compaction) 401 of algorithms) 111 üzenetküldés (message passing) 100-103
szinkron riasztás (synchronous alarm) 227 töredezettség (fragmentation) arányos (fair share) 124-125 üzenetküldő felület (message-passing
szinkronizáció (synchronization) 95 belső (internál) 429 célok (goals) 112-114 interface) 103
szoftveres görgetés (software scrolling) külső (external) 434 elvek és megvalósítás (policy versus
347, 348, 375, 378, 382, 383, 388 trójai faló (trojan horse) 547 mechanism) 126 V
szoftvermegszakítás (software interrupt) TSL utasítás (TSL instruction) 90 garantált (guaranteed) 123 válaszidő (response time) 113,114
139 háromszintű (three level) 117-118 valós idejű rendszer (reál time system) 125
szolgáltatás (service) 131 interaktív rendszer (interactive system) valós idejű ütemezés (reál time scheduling)
MINIX 3 135 UART lásd univerzális aszinkron adóvevő 118-25 125-126
szolgáltatásmegtagadás (denial of service) UID lásd felhasználói azonosító kötegelt rendszer (batch system) 114-18 váltó karakter (escape character) 332
546 új technológiájú fájlrendszer (new legrövidebb feladatot először (shortest védelem (protection) 55-56
szuperblokk (superblock) 517 technology file system) 525 job first) 115-116 védelmi mechanizmusok (protection
szuperfelhasználó (superuser) 35 univerzális aszinkron adóvevő 326 legrövidebb maradék futási idejű mechanisms) 544, 555
Unix következzen (shortest remaining time védelmi tartományok (protection domains)
T bázisidőpont (beginning of time) 222 next) 116-117 555
takarító (cleaner) 543 csatolt fájlrendszer (mounted file legrövidebb processzus következzen védett üzemmód (protected mode) 158
tárcímleképezéses terminál (memory- system) 246 (shortest process next) 122-123 vektor (vector)
mapped terminál) 323-325 eszközmeghajtó (device driver) 275 megszakítható ütemezés (preemptive I/O-kérés (I/O request) 212, 386
tartomány (domain) 555 eszközszám (device number) 251 scheduling) 111, 114-118, 139, 230 megszakítás (interrupt) 78
taszk (task) 132 fájlok (files) 35-39 megvalósítása (scheduling véletlen adatvesztés (accidental data loss)
terheléselosztás (load control) 428 fájlrendszer (Unix file system) 500 mechanism)126 548
terminál (terminál) hibajelzés (error reporting) 82 MINIX 3 198-201 veremszegmens (stack segment) 45
bittérképes 393 holtpont (deadlock) 261 nem megszakítható ütemezés versenyhelyzet (race condition) 84
terminálbemenet (terminál input) 339-344 indítóblokk (boot block) 174 (nonpreemptive scheduling) 111, veszélyek (threat) 544
terminálhardver (terminál hardware) jelszó (Unix password) 551 114-118 vezérlősorozat-bevezető jel (control
323-327 könyvtár (Unix directory) 511, 524 prioritásos ütemezés (priority sequence introducer) 349
terminálkimenet (terminál output) link rendszerhívás (link system call) 52 scheduling) 119-121 vezérlőszekvencia (escape sequence) 327,
344-353 processzusok (processes) 33-35,73 processzus (process) 109-128 335-336
terminálmeghajtó, MINIX 3 (terminál processzusok közötti kommunikáció round robin ütemezés (round robin videó RAM (videó RAM) 323-325, 335,
driver) 336-388 (interprocess communication) 103 scheduling) 118-119 336, 338, 345, 347, 348, 394
terminálmód (terminál mode) 51 struktúra (structure) 27 sorrendi (first come first served) 115 videovezérlő (videó controller) 323, 324,
terminálszoftver (terminál software) szálak (threads) 82 sorsjáték (lottery) 123-124 335, 346-348, 383, 386-388
327-336 szignálok (signals) 357, 361 szál (thread) 126-128 virtuális cím (virtual address) 406
termios struktúra (termios structure) 52, szkript (script) 476 többszörös sorok (multiple queues) virtuális cím tartomány (virtual address
150,154, 333, 334,337, 338, 354, 355, terminál I/O (terminál I/O) 329-334 121-122 space) 406
358, 360, 370 története 27 valós idejű rendszer (reál time system) virtuális gép (virtual machine) 15,19,
tétlen taszk (idle task) 208 utasításkészlet-architektúra (instruction set 125-126 61-63
tevékeny várakozás (busy waiting) 86, 243, architecture) 16 ütemezési algoritmus (scheduling virtuális gép monitora (virtual machine
377, 380, 394 útvonal (path) algorithm) 109-128 monitor) 61
Thompson, Ken 154,156 megadása (path name) 511 ütemezési elv (scheduling policy) 126 virtuális konzol (virtual console) 338
toleráns valós idejű rendszer (soft reál time relatív (relatíve) 512 ütemezhető rendszer (schedulable system) virtuális memória (virtual memory) 400,
system) 125 teljes (absolute) 511 126 405—416
többprocesszoros (multiprocessor) 69 útvonalnév (path name) 37 ütemező (scheduler) 109 lapcserélési algoritmusok (page
többszintű laptábla (multilevel page table) üresmemória-tábla (free memory table) üveg terminál (glass tty) 327 swapping algorithms) 417-424
410-412 470 üvegre író terminál (glass tty) 327 lapozás (paging) 405-409
680 TÁRGYMUTATÓ

munkahalmaz modell (working set worst fit algoritmus (worst-fit algorithm)


model) 424-426 404
Pentium 435-437 wsclock algoritmus (wsclock algorithm)
szegmentálás (segmentation) 431-439 426
tervezési szempontok (design issues) wsclock lapcserélési algoritmus (wsclock
424-430 page replacement algorithm) 426
virtuális memória interfész (virtual
memory interface) 430 X
VM/370 61 X Window-rendszer (X Window system) 29
XDS 940 122
W
Windows 29, 62, 66-67, 262, 500 Z
2000 252 zárolási állomány (lock file) 280
95 500 zárolásváltozó (lock variable) 87
98 500, 523 zilog Z80 28
NT 29, 501 zombi állapot (zombie state) 452
XP 252, 396, 501 Zuse, Konrad 21

You might also like