This shows you the differences between two versions of the page.
so:cursuri:curs-04 [2014/03/10 19:50] razvan.deaconescu [Demo-uri] |
so:cursuri:curs-04 [2019/03/09 16:06] (current) razvan.deaconescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Curs 04 - Planificarea execuției====== | + | ====== Curs 04 - Planificarea execuției. IPC ====== |
- | <html> | + | * [[http://prezi.com/7hdjlraoycrn/so-curs-4/?kw=view-7hdjlraoycrn&rc=ref-31844697|Curs 04 - Planificarea execuției (vizualizare Prezi)]] |
- | <iframe src="http://prezi.com/embed/7hdjlraoycrn/?bgcolor=ffffff&lock_to_path=0&autoplay=no&autohide_ctrls=0&features=undefined&disabled_features=undefined" width="550" height="400" frameBorder="0"></iframe> | + | * [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-04.pdf|Curs 04 - Planificarea execuției (PDF)]] |
- | </html> | + | * [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-04_IPC.pdf|Curs 04 - Comunicarea interprocese (PDF)]] |
+ | |||
+ | * [[https://docs.google.com/document/d/1s9mWubSu19r4aCThxlDx7MW7uFu3o2v9tSHuvhnfbME/edit?usp=sharing|Notițe de curs]] | ||
- | * [[http://prezi.com/7hdjlraoycrn/so-curs-4/?kw=view-7hdjlraoycrn&rc=ref-31844697 | Curs 04 - Planificarea execuției (vizualizare Prezi)]] | ||
- | * [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-04.pdf | Curs 04 - Planificarea execuției (PDF)]] | ||
* Suport curs | * Suport curs | ||
* Operating System Concepts Essentials | * Operating System Concepts Essentials | ||
* Capitolul 5 - CPU Scheduling | * Capitolul 5 - CPU Scheduling | ||
- | * Modern Operating Systems | + | * Modern Operating Systems, 2nd Ed |
* Capitolul 2 - Processes and Threads | * Capitolul 2 - Processes and Threads | ||
* Secțiunea 5 - Scheduling | * Secțiunea 5 - Scheduling | ||
+ | * Modern Operating Systems, 3rd Ed | ||
+ | * Capitolul 2 - Processes and Threads | ||
+ | * Secțiunea 2.4 - Scheduling | ||
+ | * Linux System Programming | ||
+ | * Capitolul 9 - Signals | ||
+ | * Windows System Programming | ||
+ | * Capitolul 11 - Interprocess Communication | ||
+ | |||
+ | <html> | ||
+ | <center> | ||
+ | <iframe src="https://prezi.com/embed/7hdjlraoycrn/?bgcolor=ffffff&lock_to_path=0&autoplay=no&autohide_ctrls=0&features=undefined&disabled_features=undefined" width="550" height="400" frameBorder="0"></iframe> | ||
+ | </center> | ||
+ | </html> | ||
+ | |||
+ | <html> | ||
+ | <center> | ||
+ | <iframe src="https://docs.google.com/viewer?url=http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-04_IPC.pdf&embedded=true" width="600" height="480" style="border: none;"> | ||
+ | </iframe> | ||
+ | </center> | ||
+ | </html> | ||
===== Demo-uri ===== | ===== Demo-uri ===== | ||
Line 33: | Line 53: | ||
</code> | </code> | ||
- | Din output-ul comenzii de mai sus, extragem numărul de schimbări de context. Numărele de schimbări de context se găsesc, respectiv, pe liniile care încep cu //Voluntary context switches//, respectiv //Involuntary context switches//. | + | Din output-ul comenzii de mai sus, extragem numărul de schimbări de context. Numerele de schimbări de context se găsesc, respectiv, pe liniile care încep cu //Voluntary context switches//, respectiv //Involuntary context switches//. |
Rulăm din nou comanda<code bash> | Rulăm din nou comanda<code bash> | ||
Line 50: | Line 70: | ||
Întrucât nu se mai lucrează cu terminalul aferent ieșirii standard, nu se execută multe operații blocante și nu se tranferă date generate de comandă în fișier. Rezultă direct un număr și mai mic de schimbări de context (atât voluntare cât și nevoluntare) și o durată de execuție mai mică a procesului. | Întrucât nu se mai lucrează cu terminalul aferent ieșirii standard, nu se execută multe operații blocante și nu se tranferă date generate de comandă în fișier. Rezultă direct un număr și mai mic de schimbări de context (atât voluntare cât și nevoluntare) și o durată de execuție mai mică a procesului. | ||
- | ==== Alterare prioritate proces ==== | + | ==== Modificare prioritate proces ==== |
- | Dorim să analizăm impactul configurării priorității statice (nice) a sistemului. Pentru aceasta vom porni același proces cu diverse valori pentru nice și vom observa durat de rulare. | + | Dorim să analizăm impactul configurării priorității statice (nice) a sistemului. Pentru aceasta vom porni același proces cu diverse valori pentru nice și vom observa durata de rulare. |
Intrăm în directorul ''nice/'' din arhiva cu demo-uri a cursului și parcurgem fișierele ''cpu.c'' și ''start-all''. Fișierul ''cpu.c'' execută operații care țin procesorul ocupat; fișierul ''start-all'' este un script care pornește 6 procese cu diverse valori pentru nice. | Intrăm în directorul ''nice/'' din arhiva cu demo-uri a cursului și parcurgem fișierele ''cpu.c'' și ''start-all''. Fișierul ''cpu.c'' execută operații care țin procesorul ocupat; fișierul ''start-all'' este un script care pornește 6 procese cu diverse valori pentru nice. | ||
Line 68: | Line 88: | ||
* 2 procese vor fi subprioritare (''nice = 19''). | * 2 procese vor fi subprioritare (''nice = 19''). | ||
- | Pentru fiecare proces, este reținut output-ul într-un fișier. Pentru a afla timpul a fiecărui proces în fișierul rezultat, folosim comanda:<code bash> | + | Pentru fiecare proces, este reținut output-ul într-un fișier. Pentru a afla timpul fiecărui proces în fișierul rezultat, folosim comanda:<code bash> |
grep -H 'Elapsed' pri* | grep -H 'Elapsed' pri* | ||
</code> | </code> | ||
Observăm că procesele prioritare au avut cel mai scurt timp de rulare iar cele subprioritare cel mai lung timp. Planificatorul a ținut, așadar, cont de valoarea priorității statice (''nice''). | Observăm că procesele prioritare au avut cel mai scurt timp de rulare iar cele subprioritare cel mai lung timp. Planificatorul a ținut, așadar, cont de valoarea priorității statice (''nice''). | ||
+ | |||
+ | ==== Durată timp de așteptare în coada READY (yield) ==== | ||
+ | |||
+ | Vrem să vedem cât timp durează pentru un proces să stea în coada READY. Pentru aceasta forțăm trecerea procesului din starea RUNNING în starea READY; ulterior, când va veni rândul său, procesul va fi planificat și va fi trecut din nou în starea RUNNING. | ||
+ | |||
+ | Forțarea trecerii procesului din starea RUNNING în starea READY se face cu ajutorul apelului [[http://man7.org/linux/man-pages/man2/sched_yield.2.html|sched_yield]]. Acesta eliberează procesorul curent și trece procesul în starea READY. Dacă nu există alt proces în starea READY, procesul curent va fi replanificat practic instant înapoi pe procesor. | ||
+ | |||
+ | Intrăm în directorul ''yield/'' din arhiva cu demo-uri a cursului și parcurgem fișierele ''yield.c'' și ''run-many''. Fișierul ''yield.c'' execută operații care țin procesorul ocupat apoi apelează ''sched_yield''; în momentul apelării ''sched_yield'' procesul este trecut din starea RUNNING în starea READY; în momentul în care procesul revine din ''sched_yield'', a fost replanificat, adică retrecut din starea READY în starea RUNNING; se rulează 10 runde. Fișierul ''run-many'' este un script care pornește mai multe procese ''yield''; numărul de procese pornite este argumentul primit ca parametru. | ||
+ | |||
+ | Pentru a putea rula, începem prin compilarea programului ''yield.c'' folosind comanda<code bash> | ||
+ | make | ||
+ | </code> | ||
+ | În urma compilării obținem executabilul ''yield''. | ||
+ | |||
+ | Ca să pornim mai multe procese din executabil, rulăm pe rând scriptul ''run-many'' cu un număr crescător dat ca parametru:<code bash> | ||
+ | ./run-many 1 | ||
+ | ./run-many 2 | ||
+ | ./run-many 3 | ||
+ | ./run-many 4 | ||
+ | ./run-many 5 | ||
+ | </code> | ||
+ | |||
+ | Pentru rulările de la început durata apelului ''sched_yield'' (adică tranziția RUNNING -> READY și înapoi READY -> RUNNING) este de 1-2 microsecunde. Practic este instantă schimbarea. De la o anumită valoare primită ca argument durata crește semnificativ pentru anumite apeluri (de ordinul miilor de microsecunde). | ||
+ | |||
+ | Motivul acestei creșteri este atingerea numărului de procesoare/core-uri ale sistemului. Fiecare core/procesor are coada proprie READY. Dacă se creează un număr de procese mai mic sau egal cu numărul de procesoare/core-uri ale sistemului atunci nu există competiție pe procesor; un proces este trecut în starea READY și apoi revine imediat în RUNNING. | ||
+ | |||
+ | În momentul în care există unele core-uri care au alocate mai multe procese atunci un proces în READY va aștepta ca un alt proces din RUNNING să elibereze procesorul (fie prin yielding, fie prin blocare, fie prin expirarea cuantei). De aici se observă creșterea duratei apelului ''sched_yield''. | ||
+ | |||
+ | Durata apelului ''sched_yield'' este timpul de așteptare al procesului (//waiting time//), timp care se dorește să fie cât mai mic. | ||
+ | |||
+ | ==== Folosire pipe-uri ==== | ||
+ | |||
+ | Dorim să creăm un exemplu simplu de folosire a pipe-urilor anonime pentru comunicare între procese înrudite. | ||
+ | |||
+ | Intrăm în directorul ''pipe/'' din arhiva cu demo-uri a cursului și parcurgem fișierul ''pipe.c''. |