260 likes | 428 Views
PROCESSPROGRAMMERING. Föreläsning 5 (12.3.2007) Innehåll: IPC: Delat minne IPC: Semaforer. Delat minne. Två eller flera processer kan kommunicera med varandra genom att använda en gemensam minnesplats
E N D
PROCESSPROGRAMMERING Föreläsning 5 (12.3.2007) Innehåll: IPC: Delat minne IPC: Semaforer Jonny Karlsson 12.3.2007
Delat minne Två eller flera processer kan kommunicera med varandra genom att använda en gemensam minnesplats En process kommer åt information sparad i en delad minnesplats via en pekarvariabel som pekar till minnesplatsen Delat minne är den snabbaste typen av IPC-kommunikation eftersom data ej fysiskt behöver flyttas via två kommunicerande processer. Jonny Karlsson 12.3.2007
Användningsprincip Jonny Karlsson 12.3.2007
Skapa/ta i bruk gemensamt minne #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int flag); key Ett nyckelvärde som identifierar ett delat minne size Minnessegmentets storlek i byte flag Ett bitmönster som skapas med bitwise or (|). Ena komponenten anger skyddskoden, t.ex. 0777, och den andra komponenten är ett av följande symboliska värden: IPC_CREAT Skapar minnessegmentet om det ej finns IPC_EXECL shmget misslyckas om minnessegmentet finns Returnerar En identifikator för det delade minnet (icke negativt heltal) om shmget lyckas. -1 vid misslyckande Jonny Karlsson 12.3.2007
Skapa/ta i bruk gemensamt minne Ex. Två processer skapar och tar i bruk ett gemensamt minnessegment. Ena processen skapar (Den som exekveras först) och den andra tar i bruk. Jonny Karlsson 12.3.2007
”Baka in” delat minnessegment i exekverande process adressrymd #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> void *shmat(int MID, void *addr, int flag); MID Identifikatorn för det skapade/ibruktagna delade minnet (positivt heltal som returnerats av shmget()) addr Önskad begynnelseadress för delat minne. addr = 0 UNIX väljer begynnelseadressen (rekommenderas) flag Bitmönster. Vanligen 0 eller SHM_RND eller SHM_RDONLY eller SHM_RND|SHM_RDONLY SHM_RND Önskad begynnelseadress avrundas till närmaste möjliga värde SMH_RDONLY Nuvarande process får endast läsa delat minne Jonny Karlsson 12.3.2007
”Baka in” delat minnessegment i exekverande process adressrymd Returnerar void pekare på det delade minnessegmentet -1 vid misslyckande Jonny Karlsson 12.3.2007
”Baka in” delat minnessegment i exekverande process adressrymd Ex. Förverkliga en gemensam teckentabell Jonny Karlsson 12.3.2007
Hantering av delat minnessegment Ett delat minnessegments egenskaper kan kontrolleras och ändras m.h.a följande struktur: struct shmid_ds { struct ipc_perm shm_perm; IPC-rättigheter struct anon_map *shm_amp; Pekare för Kerneln int shm_segsz; Storlek på minnessegment ushort shm_lkcnt; Låsningsräknare pid_t shm_lpid; PID för senaste shmop() pid_t shm_cpid; Minnesskaparens PID ulong shm_nattch; Antal anslutna processer ulong shm_cnattch; Används av shminfo() time_t shm_atime; Tid för senaste anslutn. time_t shm_dtime; Tid för senaste frånkoppl time_t shm_ctime; Tid för senaste ändring } Jonny Karlsson 12.3.2007
Statushantering av delat minnessegment Tillståndet hos ett delat minne hanteras med systemandopet shmctl(): #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmctl(int MID, int cmd, struct shmid_ds *buf); MID Identifikatorn för det delade minnet. (Heltal som returnerats av shmget()) cmd Kommando/åtgärd: IPC_STAT Meddelandeköns statusinfo kopieras till fältena i den post som utpekas av buf IPC_SET Meddelandeköns statusinfo ställs in enligt fältena i den post som utpekas av buf IPC_RMID Friger delat minne (3:e param = 0) Jonny Karlsson 12.3.2007
Statushantering av delat minnessegment buf Pekare till en post av typen shmid_ds (se föregående slide) Returnerar 0 vid framgång -1 vid misslyckande Jonny Karlsson 12.3.2007
Semaforer • En semafor är en räknare som används för att kontrollera samtidig åtkomst av en delad resurs. • Kan beskrivas som ett trafikljus: • semafor == 0 visar rött ljus och sätter en process i väntetillstånd • semafor > 0 visar grönt ljus och tillåter en process att komma åt en delad resurs. Jonny Karlsson 12.3.2007
Funktionsprincip • Testa semaforen som kontrollerar åtkomsten. • Om semaforens värde är positivt kan processen använda den delade resursen. Processen minskar samtidigt semaforens värde med 1 för att indikera att processen har använt en enhet hos resursen. • Om semaforens värde är 0 försätts processen i pausläge tills semaforens värde åter igen blir positivt. När en väntande process väcks upp startar den på nytt från steg 1. • En process som blivit klar med en delad resurs ökar semaforens värde med 1. Samtidigt • väcks en process som köar till samma delade resurs upp. • Binära semaforer är den vanligaste semafortypen. Dessa kan endast anta värdet 1 • (grönt) eller 0 (rött) • En semafor som kan initialieras till vilket positivt heltalsvärde som helst kallas för • heltalssemafor och kan användas för att t.ex. räkna hur många enheter hos en delad • resurs som har använts. Jonny Karlsson 12.3.2007
Semafor operationer • Två typer: • P-operationer • V-operationer • P-operationen används för att testa semaforen och minska semaforens värde med 1 (göra semaforen röd). • V-operationen används för att öka på en semafors värde (göra semaforen grön) och väcka upp en väntande process som köar till samma delade resurs (göra semaforen grön). Jonny Karlsson 12.3.2007
P-operation Pseudo-kod för en P-operation Jonny Karlsson 12.3.2007
V-operation Pseudo-kod för en V-operation Jonny Karlsson 12.3.2007
Programmeringsexempel • Initialiserar semaforen med värdet 1 (grön) • Programmets icke-kritiska del = den del av programmet som inte hanterar en delad resurs • Före en kritisk sektion av programmet inleds utförs en P-operation.(1 – Testar, 2 väntar eller gör semaforen röd) • Programmets kritiska sektion = den del av programmet som hanterar en delad resurs. • När processen hanterat den delade resursen klart utför den en V-operation (Gör semaforen grön och väckar upp väntande processer) Jonny Karlsson 12.3.2007
Ta i bruk en semafortabell #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int flag); key Positivt heltal, samma i alla processer som använder samma semafor nsems Antal semaforer som skall tas i bruk flag Liknande bitmönster som msgflg och shmflg (se meddelandeköer och delat minne). ex. 0777|IPC_CREAT Returnerar Semaforidentifikator (heltal > 0) vid framgång -1 vid misslyckande Jonny Karlsson 12.3.2007
Ta i bruk en semafortabell Ex.Process 1 och Process 2 skapar/tar i bruk en (en semafortabell innehållande endast en semafor) gemensam semafor. Jonny Karlsson 12.3.2007
Hantering aven semafortabell #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl(int semid, int semnum, int cmd, union semnum { int val; struct semid_ds *buf; unsigned short *array; } arg); semid semaforidentifikatorn som returnerades av semget semnum indexvärdet på semafortabell-elementet där önskad semafor finns cmd symbolikst värde som anger hurudan operation som skall utföras av semctl Jonny Karlsson 12.3.2007
Hantering av en semafortabell • GETVAL värdet på semaforen med index semnum returneras (fjärde parameter behövs ej, kan sättas till 0) • SETVAL semaforen med index semnum får värdet arg.val (fjärde parameter skall vara ett heltal) • GETPID processnummer returneras för den process som senast avläste eller ändrade värdet på semaforen med index semnum i semafortabellen. • GETNCNT ett heltal 0 returneras, detta heltal anger antalet processer, som väntar på att semaforen med index semnum skall inkrementeras (ifall index =+1 väntar processerna på en V-operation) • GETZCNT ett heltal 0 returneras, detta heltal anger antalet processer som väntar på att semaforen med index semnum skall få värdet 0 • GETALL värden på alla semaforer kopieras till tabellen arg.array.(semnum ej betydelse t.ex.0) • SETALL semafortabellens semaforer får nya värden från tabellen arg.array (semnum ej betydelse) • IPC_RMID semafortabellen raderas. Alla processer som köar till någon av semaforerna väcks upp. Jonny Karlsson 12.3.2007
Hantering av en semafortabell • IPC_STAT semafortabellen status info sparas i den post som arg.buf adresserar. Denna post har datatypen struct semid_ds och definieras i sys/sem.h och sys/ipc.h • IPC_SET semafortabellen får nya status info från den post som arg.buf adresserar struct semid_ds Innehåller statusinfo om semaforen (se man-fil eller kursboken Jonny Karlsson 12.3.2007
Hantering av en semafortabell Ex. Initialisering och radering av semafortabeller Jonny Karlsson 12.3.2007
Semafor-operationer #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop(int semid, struct sembuf semoparray[], size_t nops); struct sembuf { ushort sem_num; Semaforens indexvärde i semafortabellen short sem_op; Semaforoperation sem_flg Semaforflagga: IPC_NOWAIT, SEM_UNDO eller 0 } (mera info om sem_op och sem_flg på nästa slide) nops antalet semaforoperationer Jonny Karlsson 12.3.2007
Semafor-operationer sem_op = -1 P-operation: 1. semaforen testas 2. om semaforvärdet är > 0 får processen hantera delad resurs och utför operationen: semaforvärde += sem_op; (minskar semaforvärdet med 1) om semaforvärdet == 0 försätts processen i väntetillstånd med beaktande av värdet i semflg och efter att den uppväckts av en annan process utförs P-operationen på nytt. sem_op = 1 V-operation: Operationen semaforvärde += semop (ökar semaforvärdet med 1) utförs alltid och samtidigt väcks alla processer som väntar på inkrementering av denna semafor. Jonny Karlsson 12.3.2007
Semafor-operationer Ex. P- och V-operationer Jonny Karlsson 12.3.2007