This shows you the differences between two versions of the page.
so:cursuri:curs-05 [2014/03/17 19:37] razvan.deaconescu [Memoria sistemului] |
so:cursuri:curs-05 [2019/03/15 09:46] (current) razvan.deaconescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Curs 05 - Gestiunea memoriei ====== | ====== Curs 05 - Gestiunea memoriei ====== | ||
- | |||
- | <html> | ||
- | <iframe src="http://prezi.com/embed/gfswijyf3vsk/?bgcolor=ffffff&lock_to_path=0&autoplay=0&autohide_ctrls=0&features=undefined&disabled_features=undefined" width="550" height="400" frameBorder="0" webkitAllowFullScreen mozAllowFullscreen allowfullscreen></iframe> | ||
- | </html> | ||
* [[http://prezi.com/gfswijyf3vsk/?utm_campaign=share&utm_medium=copy&rc=ex0share | Curs 05 - Gestiunea memoriei (vizualizare Prezi)]] | * [[http://prezi.com/gfswijyf3vsk/?utm_campaign=share&utm_medium=copy&rc=ex0share | Curs 05 - Gestiunea memoriei (vizualizare Prezi)]] | ||
* [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-05.pdf | Curs 05 - Gestiunea memoriei (PDF)]] | * [[http://elf.cs.pub.ro/so/res/cursuri/SO_Curs-05.pdf | Curs 05 - Gestiunea memoriei (PDF)]] | ||
+ | |||
+ | * [[https://docs.google.com/document/d/19vfKQ4PRci64ZKHzrELigoygpLIkw1ZLGczmCpeS8kU/edit?usp=sharing|Notițe de curs]] | ||
* Suport curs | * Suport curs | ||
* Operating System Concepts Essentials | * Operating System Concepts Essentials | ||
* Capitolul 7 - Main Memory | * Capitolul 7 - Main Memory | ||
- | * Modern Operating Systems | + | * Modern Operating Systems, 2nd Ed. |
* Capitolul 4 - Memory Management | * Capitolul 4 - Memory Management | ||
* Secțiunile 4.1, 4.2, 4.3, 4.8 | * Secțiunile 4.1, 4.2, 4.3, 4.8 | ||
+ | * Modern Operating Systems, 3rd Ed. | ||
+ | * Capitolul 3 - Memory Management | ||
+ | * Secțiunile 3.1, 3.2, 3.3, 3.7 | ||
* [[http://lwn.net/Articles/250967/ | Ulrich Drepper - What every programmer should know about memory]] | * [[http://lwn.net/Articles/250967/ | Ulrich Drepper - What every programmer should know about memory]] | ||
+ | |||
+ | <html> | ||
+ | <center> | ||
+ | <iframe src="https://prezi.com/embed/gfswijyf3vsk/?bgcolor=ffffff&lock_to_path=0&autoplay=0&autohide_ctrls=0&features=undefined&disabled_features=undefined" width="550" height="400" frameBorder="0" webkitAllowFullScreen mozAllowFullscreen allowfullscreen></iframe> | ||
+ | </center> | ||
+ | </html> | ||
===== Demo-uri ===== | ===== Demo-uri ===== | ||
Line 71: | Line 78: | ||
În fișierul ''address-space.c'' alocăm și dezalocăm memorie folosind stiva (la un apel de funcție), apelurile ''malloc'' și ''free'', respectiv apelurile ''mmap'' și ''munmap''. Înaintea executării unui pas programul așteaptă 5 secunde, timp în care putem urmări evoluția spațiului de adresă. | În fișierul ''address-space.c'' alocăm și dezalocăm memorie folosind stiva (la un apel de funcție), apelurile ''malloc'' și ''free'', respectiv apelurile ''mmap'' și ''munmap''. Înaintea executării unui pas programul așteaptă 5 secunde, timp în care putem urmări evoluția spațiului de adresă. | ||
- | TODO | + | Pentru a urmări evoluția programului avem nevoie de două console. Într-o consolă compilăm și rulăm programul, iar în alta verificăm funcționalitatea sa folosind ''pmap''. |
+ | |||
+ | Pentru acesta în prima consolă compilăm și rulăm:<code bash> | ||
+ | make | ||
+ | ./address-space | ||
+ | </code> | ||
+ | Apoi, în cealaltă consolă rulăm periodic comanda:<code bash> | ||
+ | pmap $(pidof address-space) | ||
+ | </code> | ||
+ | |||
+ | Observăm cum se modifică dimensiunile diverselor regiuni după alocare. Stiva nu se modifică; stiva este deja alocată iar spațiul ocupat de ''buffer'' nu conduce la alterarea stivei. Pentru ''malloc''/''free'' și ''mmap''/''munmap'' se alocă/eliberează dimensiunea cerută în conformitate cu apelul. | ||
+ | |||
+ | ==== Granularitatea alocării de memorie ==== | ||
+ | |||
+ | Deși un apel de genul ''malloc'' permite alocare fină de memorie (de nivelul octeților), în spate sistemul de operare și hardware-ul alocă memorie la nivel de pagină. Un apel de alocare a memoriei va aloca mai mult spațiu pentru a permite viitoare alocări. | ||
+ | |||
+ | Pentru a verifica acest lucru folosim subdirectorul ''allocation-granularity/''. Fișierul ''allocation-granularity.c'' este un program care primește ca argument dimensiunea care să fie transmisă apelului ''malloc'' și apoi așpteaptă 5 secunde înainte și după pentru a putea urmări efectul acestei alocări asupra spațiului de adresă, după care procesul este închis. | ||
+ | |||
+ | Vom folosi două console: pe o consolă vom rula programul iar pe alta vom investiga spațiul de adresă aferent. Pentru aceasta pe prima consolă vom compila și vom rula procesul:<code bash> | ||
+ | make | ||
+ | ./allocation-granularity 1 | ||
+ | </code> în vreme ce pe a doua consolă vom consulta spațiul de adresă al procesului:<code bash> | ||
+ | pmap $(pidof allocation-granularity) | ||
+ | </code> | ||
+ | |||
+ | Prima comandă alocă un singur octet în mod dinamic în cadrul spațiului de adresă. Ultima comandă o vom rula de mai multe ori pentru a verifica modul în care se modifică spațiul de adresă al procesului. Vedem că la o simplă alocare de 1 octet se alocă o zonă mai mare în spațiul de adresă al procesului, conform modului intern de lucru al apelului de bibliotecă ''malloc''. | ||
+ | |||
+ | ==== Informații despre TLB ==== | ||
+ | |||
+ | Pentru a afla informații despre TLB instalăm pachetul ''cpuid''. Pe un sistem Debian-based folosim comanda<code bash> | ||
+ | apt-get install cpuid | ||
+ | </code> | ||
+ | |||
+ | Ca să determinăm informații despre TLB folosim comanda<code bash> | ||
+ | cpuid | grep TLB | ||
+ | </code> | ||
+ | |||
+ | Dacă vrem să urmărim numărul de miss-uri pentru TLB putem folosi ''perf''. De exemplu, pentru a urmări TLB miss-urile într-un interval de 10 secunde la nivelul sistemului folosim comanda<code bash> | ||
+ | sudo perf stat -e iTLB-load-misses -a sleep 10 | ||
+ | </code> | ||
+ | |||
+ | TLB miss-urile cresc în momentul schimbării spațiului de adresă, adică la planificarea proceselor. Dacă avem multe schimbări de spațiu de adresă între procese atunci numărul de TLB miss-uri va crește. Pentru a verifica acest lucru, din [[http://elf.cs.pub.ro/so/res/cursuri/curs-04-demo.zip|arhiva laboratorului 4]], din subdirectorul ''nice/'' rulăm scriptul ''start-all'' (după ce am compilat în prealabil executabilul ''cpu''). După ce am rulat scriptul folosim o altă consolă pentru a măsura numărul de TLB miss-uri, folosind aceeași comandă ca mai sus:<code bash> | ||
+ | sudo perf stat -e iTLB-load-misses -a sleep 10 | ||
+ | </code> | ||
+ | Observăm un număr semnificativ mai mare de TLB miss-uri datorat numeroaselor schimbări de context ce au loc între procesele pornite de scriptul ''start-all'. |