1 / 26

PROCESSPROGRAMMERING

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

varana
Télécharger la présentation

PROCESSPROGRAMMERING

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PROCESSPROGRAMMERING Föreläsning 5 (12.3.2007) Innehåll: IPC: Delat minne IPC: Semaforer Jonny Karlsson 12.3.2007

  2. 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

  3. Användningsprincip Jonny Karlsson 12.3.2007

  4. 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

  5. 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

  6. ”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

  7. ”Baka in” delat minnessegment i exekverande process adressrymd Returnerar void pekare på det delade minnessegmentet -1 vid misslyckande Jonny Karlsson 12.3.2007

  8. ”Baka in” delat minnessegment i exekverande process adressrymd Ex. Förverkliga en gemensam teckentabell Jonny Karlsson 12.3.2007

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. P-operation Pseudo-kod för en P-operation Jonny Karlsson 12.3.2007

  16. V-operation Pseudo-kod för en V-operation Jonny Karlsson 12.3.2007

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. Hantering av en semafortabell Ex. Initialisering och radering av semafortabeller Jonny Karlsson 12.3.2007

  24. 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

  25. 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

  26. Semafor-operationer Ex. P- och V-operationer Jonny Karlsson 12.3.2007

More Related