Operációs rendszerek. 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor)

Hasonló dokumentumok
Operációs rendszerek. A mai program. Inter Process Communication. Processz közti kommunikáció

UNIX: folyamatok kommunikációja

Hálózati architektúrák laborgyakorlat

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Operációs rendszerek. 4. gyakorlat: Szignálok küldése, kezelése

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Számítógépes hálózatok

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Programozás C és C++ -ban

Operációs rendszerek. Az NT folyamatok kezelése

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

5. Gyakorlat. struct diak {

Programozás II. 2. Dr. Iványi Péter

Konkurens TCP Szerver

Bevezetés, a C++ osztályok. Pere László

Programozás C++ -ban 2007/7

Szkriptnyelvek. 1. UNIX shell

Dr. Varga Imre. Socket-programozás. C nyelven

Programozás C++ -ban

Programozás C++ -ban

Programozási Nyelvek: C++

Dr. Schuster György október 14.

C programozási nyelv

Programozás 5. Dr. Iványi Péter

Programozás II. 4. Dr. Iványi Péter

C programozási nyelv Pointerek, tömbök, pointer aritmetika

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Programozás 6. Dr. Iványi Péter

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Pénzügyi algoritmusok

Óbudai Egyetem. C programozási nyelv

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

A programozás alapjai 1 Rekurzió

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Információs Technológia

Java II. I A Java programozási nyelv alapelemei

QBE Édes Otthon lakásbiztosítás tarifáló webservice. Fejlesztői dokumentáció 1.0.2

Kivételkezelés a C++ nyelvben Bevezetés

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Dr. Varga Imre Debreceni Egyetem, Informatikai Kar. Socket-programozás. C nyelven, Linux alatt

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Programozás I gyakorlat

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Operációs rendszerek. UNIX fájlrendszer

Kölcsönhatás diagramok

Matematikai és Informatikai Intézet. 4. Folyamatok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Készítette: Nagy Tibor István

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Socket programozás Példák

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás alapjai. 10. előadás

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Stack Vezérlés szerkezet Adat 2.

Osztályok. 4. gyakorlat

Hálózati operációs rendszerek II. OES biztonsági rendszere

OOP #14 (referencia-elv)

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Mobil Partner telepítési és használati útmutató

Programozás II. Fájlkezelés

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

Titkosítás NetWare környezetben

UNIX folyamatok kommunikációja

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 15. Széchenyi István Egyetem, Gy r

Bevezetés a C++ programozási nyelvbe

A C programozási nyelv II. Utasítások. A függvény.

ISA szimulátor objektum-orientált modell (C++)

Mutatók és mutató-aritmetika C-ben március 19.

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

Java II. I A Java programozási nyelv alapelemei

Debreceni Egyetem Matematikai és Informatikai Intézet. 13. Védelem

UNIX folyamatok kommunikációja

Programozás I gyakorlat

Operációs rendszerek. UNIX/Linux fájlrendszerek

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

1. Alapok. Programozás II

C++ programozási nyelv Konstruktorok-destruktorok

Mir l lesz szó? Operációs rendszerek. A sorbaállási modell. A sorbaállási modell. Er forrás csoportosítás 1. Er forrás csoportosítás 2

Pénzügyi algoritmusok

Programozás I gyakorlat

Rekurzió. Dr. Iványi Péter

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Mintavételes szabályozás mikrovezérlő segítségével

Programozás I. 5. Előadás: Függvények

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

The modular mitmót system. DPY kijelző kártya C API

Átírás:

Operációs rendszerek 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor) A UNIX System V Release-óta minden rendszer biztosít három egyszerűabsztrakciót a processzusok közti kommunikáció megvalósítására. Ezek: Osztott memória szegmens: egy meghatározott méretű memória puffer, melyhez egyszerre több processzus is kapcsolódhat. Üzenetsor: processzusok közti ütközésektől mentes üzenettovábbítást biztosít. Szemafor készlet: a Dijkstra-féle szemafor kiterjesztése (ezzel csak a következő gyakorlaton foglalkozunk). Közös tulajdonságok Minthogy mind a három mechanizmus az operációs rendszer objektuma, így közös jellemzőiket az alábbiakban foglalhatjuk össze: Rendszerhívásokkal használhatjuk Van külső azonosítója, un. kulcs, amivel az operációs rendszer azonosítja a mechanizmust Van belső azonosítója, amivel a processzus azonosítja a mechanizmust Hasonlóan a fájlokhoz van tulajdonosa, csoportja (UID/GID), amit a létrehozó processzus effektív jogaiból örököl, és vannak hozzáférési jogok Hasonlítanak a rendszerhívások is amivel használhatjuk Kontrollja három tevékenységből áll, státusz olvasása, attribútum beállítása és mechanizmus megszüntetése Osztott memória Létrehozása és azonosító megszerzése #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int shmflg); A key argumentum tartalmazza az osztott memória külső azonosítóját (ez a legtöbb rendszeren long int típusú), a size a lefoglalni kívánt memória méretét. Az shmflg a függvényhívás egyéb paramétereit tartalmazza. Ennek alsó 9 bitje a hozzáférési jogosultságokat (a fájloknál megszokott struktúrában), a további biteket logikai

műveletekkel kapcsolhatjuk be, vagy ki a megfelelő makró használatával. Itt csak az IPC_CREAT opciót fogjuk használni. Ha a megadott shmflg nulla értékű, akkor nem hozunk létre memóriát, csak megszerezzük a megadott kulcsú és méretű szegmens azonosítóját. A függvény visszatérési értéke pozitív szám, ha sikeres a művelet és ilyenkor az osztott memória azonosítóját adja. Ha sikertelen volt, akkor -1 a visszatérési érték és az errno tartalmazza a hiba kódját. Használat void* shmat(int id, const void* shmaddr, int shmflg); int shmdt(const void* shmaddr); Hogy egy processzus használhasson egy (már létrehozott) memóriát előbb hozzáférést kell kapnia hozzá. Erre használjunk az shmat hívást, aminek id argumentumába megadjuk az osztott memória azonosítóját, az shmaddr és az shmflg argumentumokkal megszabhatjuk, hogy milyen címre kérjük az osztott memória leképzését (ennek részleteit a man-ból olvashatjuk). Ha az shmaddr helyén null pointert adunk meg, akkor az operációs rendszerre bízzuk a cím kiválasztását. A hívás visszatérési értéke az a pointer ahol az osztott memóriához hozzáférhetünk, vagy (void*) -1, ha sikertelen, ilyenkor az errno tartalmazza a hiba kódját. Használat után el kell engedni az osztott memóriát. Erre az shmdt szolgál, aminek egyetlen argumentuma az a pointer, amin az osztott memória elérhető. Sikeres végrehajtást a nulla visszatérési érték jelez, még hibát a -1 (hibakód az errno-ban ). Attribútumok, kontroll int shmctl(int id, int cmd, struct shmid_ds *buf); A függvény argumentumai: id az osztott memória azonosítója, cmd egy utasítás, amit tenni szeretnénk az osztott memóriával, és egy buf pointer egy pufferre, ami az osztott memória attribútum struktúrája. IPC_STAT: Ezzel az utasítással lekérdezhető az osztott memória állapota, melyet a megadott buf által mutatott struktúrában jelenít meg. Az attribútum struktúra a következő: struct shmid_ds { struct ipc_perm shm_perm; /* hozzáférési jogok */

}; int shm_segsz; /* osztott mem. mérete (bytes) */ time_t shm_atime; /* utolsó rákapcsolódás ideje */ time_t shm_dtime; /* utolsó elengedés ideje */ time_t shm_ctime; /* utolsó módosítás ideje */ unsigned short shm_cpid; /* a létrehozó PID-je */ unsigned short shm_lpid; /* az utolsó operációt végző PID-je */ short shm_nattch; /* éppen rákapcsolt processzek száma */ /* az alábbiakkal nem tudunk mit kezdeni */ unsigned short shm_npages; /* size of segment (pages) */ unsigned long *shm_pages; struct shm_desc *attaches; /* descriptors for attaches */ Az ipc_perm struktúra pedig a következő: struct ipc_perm { key_t key; /* külső azonosító */ ushort uid; /* tulajdonos euid, egid */ ushort gid; ushort cuid; /* létrehozó euid, egid */ ushort cgid; ushort mode; /* alsó 9 bitje a hozzáférési jogok */ ushort seq; /* egy sorszám */ }; IPC_SET: ezzel az utasítással az ipc_perm struktúra tartalmát módosíthatjk. IPC_RMID: megszünteti az osztott memóriát (a buf lehet NULL) Példa: http://www.iit.uni-miskolc.hu/~repasi/os/peldak/shm/ Üzenetsor Létrehozása és azonosító megszerzése #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int msgflg); A függvény használata és működése hasonlít az shmget függvényhez, azzal a különbséggel, hogy nem kell megadni semmilyen méretet.

Használat int msgsnd ( int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg ); ssize_t msgrcv ( int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg ); Üzenet küldésére az msgsnd függvényt használjuk. Megadjuk az üzenetsor azonosítóját, az üzenet puffert, az üzenet puffer méretét, és egy jelzést, a függvény viselkedéséről. Visszatérési értéke nulla, ha sikeres és -1, ha nem. Ha az üzenetsor tele van (nem fér több üzenet bele), akkor blokkolódik a hívás és csak akkor tér vissza, ha sikeresen elhelyezte az üzenetet a sorban. Ha megadjuk az IPC_NOWAIT jelzést, akkor nem fog várakozni, hanem az errno változó EAGAIN értéket kap. Az msgrcv függvény üzenet olvasásra szolgál. Meg kell adni az üzenetsor azonosítóját, az üzenet puffert, annak maximális méretét, a kívánt üzenet típusát és a függvény viselkedését befolyásoló flageket. A függvény hívásakor a processzus blokkolódik, amíg nem áll rendelkezésre üzenet a sorban, ezt a viselkedést lehet az IPC_NOWAIT flaggel felülbírálni, ilyenkor az errno változó értéke EAGAIN lesz, ha nem volt üzenet a sorban. Visszatérési értéke 1, ha hiba lépett fel, egyébként egy pozitív szám, ami az olvasott üzenet méretét adja vissza. Az üzenet struktúra egy tetszőleges adatstruktúra lehet, egyetlen megkötés, hogy az elején van egy long típusú adattag, ami az üzenet típusát jelzi. Ha az üzenet olvasásakor, az olvasandó üzenet típusának nullát adunk meg, akkor a soron következő üzenetet olvassunk. Ha egy pozitív számot adunk meg, akkor a következő megfelelő típusú üzenetet olvashatjuk, ha pedig negatív számot, akkor a megadott szám ellentettjénél kisebb típusú üzenetek kerülnek olvasásra. Attribútumok, kontroll int msgctl ( int msqid, int cmd, struct msqid_ds *buf ); A függvény működése megegyezik az shmctl működésével, csak az attribútum struktúra tér el: struct msqid_ds { struct ipc_perm msg_perm; ushort msg_qnum; /* sorban álló üzenetek száma */ ushort msg_qbytes; /* a sor max. mérete (bytes) */ ushort msg_lspid; /* az utolsó msgsnd hívó PID-je */ ushort msg_lrpid; /* az utolsó msgrcv hívó PID-je */ time_t msg_stime; /* utolsó msgsnd ideje */

} time_t msg_rtime; /* utolsó msgrcv ideje */ time_t msg_ctime; /* utolsó módosítás ideje */ Példa: http://www.iit.uni-miskolc.hu/~repasi/os/peldak/msg/ Irodalom: Dr. Vadász Dénes: Operációs rendszerek c. tárgy jegyzete