Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Semaforer Hvordan virker semop() hvis der er flere operationer ? I hvilken rækkefølge vækkes blokerede semaforer ? man semop.. The system call semantic.

Lignende præsentationer


Præsentationer af emnet: "Semaforer Hvordan virker semop() hvis der er flere operationer ? I hvilken rækkefølge vækkes blokerede semaforer ? man semop.. The system call semantic."— Præsentationens transcript:

1 Semaforer Hvordan virker semop() hvis der er flere operationer ? I hvilken rækkefølge vækkes blokerede semaforer ? man semop.. The system call semantic assures that the operations will be performed if and only if all of them will succeed.... The process sleeps until..

2 Vække-rækkefølge P0P1P2 R

3 Testprogram Hovedprogram: Børneproces 1 Børneproces 2 1. p(); printf(".."); printf(".."); 2. printf("Start i k.r. "); p(); p(); 3. start børneproces 1 printf(".."); printf(".."); 4. start børneproces 2 v(); v(); 5. sleep(2); 6. printf(".. "); 7. v();

4 Testprogram.. main() { int pid,i; create_sem(); p(); printf("Hovedprogram starter i kritisk region \n"); for (i=1;i<=2;i++) { pid=fork(); if (pid==0) { printf("Proces %d på vej ind i kritisk region \n",i); p(); printf("Proces %d starter i kritisk region \n",i); v(); exit(0); } sleep(2); printf("Hovedprogram forlader kritisk region \n"); v(); }

5 Test-resultat (i) Hovedprogram starter i kritisk region Proces 1 på vej ind i kritisk region Proces 2 på vej ind i kritisk region Proces 1 starter i kritisk region Proces 2 starter i kritisk region Hovedprogram forlader kritisk region

6 Procestilstande kørende blokeretklar OS (skedulator) vælger næste klare proces Blokerede processer skal være klar før de kan køre igen

7 Semafor-implementation P1P2 Semafor For hver semafor vedligeholder operativsystemet information om hvilke processer, som er blokeret "på" semaforen. Hver gang semaforens heltalsværdi tælles op, "vækkes" de processer, som nu potentielt kan køre. Dvs. de markeres som "klar". Skedulatoren afgør hvem som kører først.

8 Testprogram (ii).. main() { int pid,i; create_sem(); p(); printf("Hovedprogram starter i kritisk region \n"); for (i=1;i<=2;i++) { pid=fork(); if (pid==0) { printf("Proces %d på vej ind i kritisk region \n",i); p(); printf("Proces %d starter i kritisk region \n",i); v(); exit(0); } sleep(2); printf("Hovedprogram forlader kritisk region \n"); v(); } switch(i) { case 1:.. case 2:.. }

9 Påvirkning af skedulering switch(i) { case 1: nice(19); } switch(i) { case 1: work(); } switch(i) { case 1: work(); case 2: work(..); }

10 Test-resultat (ii) Hovedprogram starter i kritisk region Proces 2 på vej ind i kritisk region Proces 1 på vej ind i kritisk region Proces 1 starter i kritisk region Proces 2 starter i kritisk region Hovedprogram forlader kritisk region

11 Kan jeg være sikker på mine test-resultater ? Børneproces 1 Børneproces 2 printf(".."); printf(".."); p(); p(); printf(".."); v(); Morale: Det er skedulatoren, der allokerer cpu-tid til processerne.

12 "Forhånds-bestilling" philosopher(int i) { while (TRUE) { think(); take_forks(i); eat(); put_forks(i+1); } take_forks(int i) { int left = i, right = (i+1) % 5; down(sem_left,sem_right); } semop() tilbyder flere semafor-operationer i samme kald til semop() semafor-værdier ændres kun hvis alle ændringer kan gennemføres uden blokering læs detaljer på man-sider

13 Semafor-arrays Enhver semafor tilhører et semafor-array Det er arrayet der identificeres af semafor-id-et Normalt bruges semafor-arrays med kun et enkelt element semop() giver mulighed for "alt-eller-intet" operationer på semaforer indenfor samme array

14 Grænseflade til semafor-arrays (forslag) create_mult_sem() // opret og initialiser // et array med 2 semaforer p_first() // p/down til første sem. p_second() // -- anden -- p_both() // -- begge v_first() v_second() v_both() del_mult_sem() // nedlæg semafor-arrayet

15 P1P2 Semafor 0Semafor 1 H Målsætning Skabe den viste tilstand Efter forespørgsler fra processer i rækkefølge H, P1, P2.

16 Testprogram (alt-eller-intet) Hovedprogram: 1. p_first(); 2. start børneproces 1 3. start børneproces 2 5. sleep(..); 4. v_first(); Børneproces 1 p_both(); v_both(); Børneproces 2 sleep(..); p_second(); v_second();

17 p_first(void) { struct sembuf sem_b; sem_b.sem_num = 0; // 0-te semafor sem_b.sem_op = -1; // p / down sem_b.sem_flg = SEM_UNDO; // omgør semop(min_sem_id,&sem_b, 1); } Kald af semop() (1 operation) På 0-te ("første") semafor Bemærk at sembuf-struktur parameter-overføres som adresse/pointer

18 p_second() { struct sembuf sem_b = {1,-1,SEM_UNDO}; semop(..,&sem_b, 1); } Kald af semop() (1 operation, forenklet) Initialisering af struktur ved hjælp af liste med attributter

19 p_both() { int i; struct sembuf sem_b[2] = {0,-1,SEM_UNDO, // 0-te semafor 1,-1,SEM_UNDO}; // 1-ste semafor semop(get_mult_semid(),sem_b, 2); } Kald af semop() (to operationer) Hvordan overføres arrayet sem_b ?


Download ppt "Semaforer Hvordan virker semop() hvis der er flere operationer ? I hvilken rækkefølge vækkes blokerede semaforer ? man semop.. The system call semantic."

Lignende præsentationer


Annoncer fra Google