Presentation laddar. Vänta.

Presentation laddar. Vänta.

Jonny Karlsson 25.10.2005 PROCESSPROGRAMMERING Föreläsning 9 (25.10.2005) Innehåll: - IPC: Semaforer.

Liknande presentationer


En presentation över ämnet: "Jonny Karlsson 25.10.2005 PROCESSPROGRAMMERING Föreläsning 9 (25.10.2005) Innehåll: - IPC: Semaforer."— Presentationens avskrift:

1 Jonny Karlsson 25.10.2005 PROCESSPROGRAMMERING Föreläsning 9 (25.10.2005) Innehåll: - IPC: Semaforer

2 Jonny Karlsson 25.10.2005 Vad är en semafor? 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 > 0visar grönt ljus och tillåter en process att komma åt en delad resurs.

3 Jonny Karlsson 25.10.2005 Funktionsprincip 1.Testa semaforen som kontrollerar åtkomsten. 2.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. 3.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.

4 Jonny Karlsson 25.10.2005 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).

5 Jonny Karlsson 25.10.2005 P-operation void P(semaphore s) { if(s > 0) if(s > 0) s--; s--; else else { enter_queue(); enter_queue(); pause(); pause(); P(s); P(s); }} Pseudo-kod för en P-operation

6 Jonny Karlsson 25.10.2005 V-operation void V(semaphore s) { s++; s++; if(!empty(process_queue)) if(!empty(process_queue)) wake_up(process_in_queue); wake_up(process_in_queue);} Pseudo-kod för en V-operation

7 Jonny Karlsson 25.10.2005 Programmeringsexempel semaphore s = 1; //1 while(1){ ej_kritisk_sektion_i(); //2 ej_kritisk_sektion_i(); //2 P(s); //3 P(s); //3 kritisk_sektion_i(); //4 kritisk_sektion_i(); //4 V(s); //5 V(s); //5} 1.Initialiserar semaforen med värdet 1 (grön) 2.Programmets icke-kritiska del = den del av programmet som inte hanterar en delad resurs 3.Före en kritisk sektion av programmet inleds utförs en P-operation.(1 – Testar, 2 väntar eller gör semaforen röd) 4.Programmets kritiska sektion = den del av programmet som hanterar en delad resurs. 5.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)

8 Jonny Karlsson 25.10.2005 Ta i bruk en semafortabell #include int semget(key_t key, int nsems, int flag); keyPositivt heltal, samma i alla processer som använder samma semafor nsemsAntal semaforer som skall tas i bruk flagLiknande bitmönster som msgflg och shmflg (se meddelandeköer och delat minne). ex. 0777|IPC_CREAT ReturnerarSemaforidentifikator (heltal > 0) vid framgång -1 vid misslyckande

9 Jonny Karlsson 25.10.2005 Ta i bruk en semafortabell Process 1: #define SK 99 int SID; SID = semget(SK,1,0777|IPC_CREAT); Process 2: #define SK 99 int SID; SID = semget(SK,1,0777|IPC_CREAT); Ex. Process 1 och Process 2 skapar/tar i bruk en (en semafortabell innehållande endast en semafor) gemensam semafor.

10 Jonny Karlsson 25.10.2005 Hantering av en semafortabell #include int semctl(int semid, int semnum, int cmd, union semnum { int val; struct semid_ds *buf; unsigned short *array; } arg); semidsemaforidentifikatorn som returnerades av semget semnumindexvärdet på semafortabell-elementet där önskad semafor finns cmdsymbolikst värde som anger hurudan operation som skall utföras av semctl

11 Jonny Karlsson 25.10.2005 Hantering av en semafortabell GETVAL värdet på semaforen med index semnum returneras (fjärde parameter behövs ej, kan sättas till 0) 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) 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. 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) 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 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) 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) 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. IPC_RMID semafortabellen raderas. Alla processer som köar till någon av semaforerna väcks upp.

12 Jonny Karlsson 25.10.2005 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_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 IPC_SET semafortabellen får nya status info från den post som arg.buf adresserar struct semid_dsInnehåller statusinfo om semaforen (se man-fil eller kursboken

13 Jonny Karlsson 25.10.2005 Hantering av en semafortabell /*initialiserar semaforvärdet i semafortabell[0] som indexeras /*av SID till värdet 1*/ semctl(SID, 0, SETVAL, 1); /*raderar semafortabell[0]*/ semctl(SID, 0, IPC_RMID, 0); Ex. Initialisering och radering av semafortabeller

14 Jonny Karlsson 25.10.2005 Semafor-operationer #include 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_flgSemaforflagga: IPC_NOWAIT, SEM_UNDO eller 0 } (mera info om sem_op och sem_flg på nästa slide) nopsantalet semaforoperationer

15 Jonny Karlsson 25.10.2005 Semafor-operationer sem_op = -1P-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. 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 = 1V-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.

16 Jonny Karlsson 25.10.2005 Semafor-operationer struct sembuf V_op, P_op; P_op.sem_num = 0; P_op.sem_op = -1; P_op.sem_flg = 0; V_op.sem_num = 0; V_op.sem_op = 1; V_op.sem_flg = 0; ej_kritisk_sektion(); semop(SID, &P_op, 1); kritisk_sektion(); semop(SID, &V_op, 1); Ex. P- och V-operationer


Ladda ner ppt "Jonny Karlsson 25.10.2005 PROCESSPROGRAMMERING Föreläsning 9 (25.10.2005) Innehåll: - IPC: Semaforer."

Liknande presentationer


Google-annonser