Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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&​amp;​lock_to_path=0&​amp;​autoplay=0&​amp;​autohide_ctrls=0&​amp;​features=undefined&​amp;​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&​amp;​lock_to_path=0&​amp;​autoplay=0&​amp;​autohide_ctrls=0&​amp;​features=undefined&​amp;​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'​.
so/cursuri/curs-05.1395077840.txt.gz · Last modified: 2014/03/17 19:37 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0