Differences

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

Link to this comparison view

sd-ca:teme:tema1-2024 [2024/03/18 15:28]
maria.sfiraiala
sd-ca:teme:tema1-2024 [2024/03/27 21:24] (current)
maria.sfiraiala [Actualizări]
Line 1: Line 1:
-<​hidden>​ 
 ====== Segregated Free Lists ====== ====== Segregated Free Lists ======
  
Line 7: Line 6:
   * [[maria.sfiraiala@gmail.com|Maria Sfîrăială]]   * [[maria.sfiraiala@gmail.com|Maria Sfîrăială]]
   * [[matei.mantu1@gmail.com|Matei Mantu]]   * [[matei.mantu1@gmail.com|Matei Mantu]]
 +
 +  * Data publicării:​ **18.03.2024 17:00:00**
 +  * Deadline **HARD**: **07.04.2024 23:55:00**
  
 ===== Actualizări ===== ===== Actualizări =====
  
 +  * Eliminare mesaj de eroare INVALID_COMMAND:​ **22.03.2024**
 +  * Publicare checker: **22.03.2024**
 +  * Update checker: **26.03.2024**
 +  * Mențiune privind obligativitatea eliminării blocurilor la alocare din vectorul de liste: **27.03.2024**
 ===== Obiective ===== ===== Obiective =====
  
Line 24: Line 30:
 ===== Definiție ===== ===== Definiție =====
  
-**Segregated Free Lists** reprezintă o structură de date formată dintr-un vector, care, pentru fiecare intrare, reține adresa de început a unei **liste duble înlănuțuite** cu blocuri de memorie liberă de aceeași dimensiune. Inițial, dimensiunile blocurilor vor fi puteri ale lui 2, pentru ca în urma alocărilor,​ să fie fragmentate sau reconstituite,​ de la caz la caz.+**Segregated Free Lists** reprezintă o structură de date formată dintr-un vector, care, pentru fiecare intrare, reține adresa de început a unei **liste duble înlănțuite** cu blocuri de memorie liberă de aceeași dimensiune. Inițial, dimensiunile blocurilor vor fi puteri ale lui 2, pentru ca în urma alocărilor,​ să fie fragmentate sau reconstituite,​ de la caz la caz.
  
 Așa cum îi spune și numele, această structură de date reține **doar** blocurile nealocate, pentru cele alocate fiind folosită o altă structură de date. Așa cum îi spune și numele, această structură de date reține **doar** blocurile nealocate, pentru cele alocate fiind folosită o altă structură de date.
Line 49: Line 55:
       - Adresele din heap vor fi în intervalul [heap_base, heap_base + heap_size).       - Adresele din heap vor fi în intervalul [heap_base, heap_base + heap_size).
     * Parametrul <​tip_reconsituire>​ va fi relevant pentru cerința FREE, găsiți mai multe detalii la secțiunea acesteia.     * Parametrul <​tip_reconsituire>​ va fi relevant pentru cerința FREE, găsiți mai multe detalii la secțiunea acesteia.
 +
 +<​note>​
 +<​adresă_start_heap>​ reprezintă un număr pozitiv, nenul.
 +</​note>​
  
 <​note>​ <​note>​
Line 58: Line 68:
       - Caută un bloc în vectorul de liste cu o dimensiune mai mare sau egală decât <​nr_bytes>​ și îl scoate din listă.       - Caută un bloc în vectorul de liste cu o dimensiune mai mare sau egală decât <​nr_bytes>​ și îl scoate din listă.
         * Dacă există mai multe blocuri cu o dimensiune egală cu <​nr_bytes>,​ se alege cea cu adresa mai mică.         * Dacă există mai multe blocuri cu o dimensiune egală cu <​nr_bytes>,​ se alege cea cu adresa mai mică.
-        * Dacă există doar blocuri cu o dimensiune mai mare decât <​nr_bytes>, ​se se alege blocul cu adresa mai mică și se **fragmentează**,​ adică se marchează zona de <​nr_bytes>​ octeți ca fiind alocată, iar restul de octeți până la dimensiunea blocului se adaugă în lista corespunzătoare dimensiunii noi.+        * Dacă există doar blocuri cu o dimensiune mai mare decât <​nr_bytes>,​ se alege blocul cu adresa mai mică și se **fragmentează**,​ adică se marchează zona de <​nr_bytes>​ octeți ca fiind alocată, iar restul de octeți până la dimensiunea blocului se adaugă în lista corespunzătoare dimensiunii noi.
         * Dacă nu există blocuri libere cu dimensiunea mai mare sau egală cu <​nr_bytes>,​ se afișează mesajul de eroare **“Out of memory\n”**.         * Dacă nu există blocuri libere cu dimensiunea mai mare sau egală cu <​nr_bytes>,​ se afișează mesajul de eroare **“Out of memory\n”**.
       - Marchează blocul ca fiind alocat în structura de date aleasă de voi pentru managementul zonelor folosite.       - Marchează blocul ca fiind alocat în structura de date aleasă de voi pentru managementul zonelor folosite.
Line 168: Line 178:
  
 Explicația este: Explicația este:
- +  * Inițial, heap-ul conține blocuri de 4 mărimi diferite (8, 16, 32, 64 biți), fiecare listă de blocuri având o lungime totală de 256 biți. 
-  * Avem un spațiu de memorie de 1024 de bytes, împărțit astfel: +  * În total, avem un spațiu de memorie de 1024 de bytes, împărțit astfel: 
-    * Pool-ul de blocuri de dimensiune 8 conține adrese de la 0x1 la 0x100. +    * Pool-ul de blocuri de dimensiune 8 conține adrese de la 0x1 la 0x100. ​(256 / 8 = 32 blocuri) 
-    * Pool-ul de blocuri de dimensiune 16 conține adrese de la 0x101  la 0x200. +    * Pool-ul de blocuri de dimensiune 16 conține adrese de la 0x101  la 0x200. ​(256 / 16 = 16 blocuri) 
-    * Pool-ul de blocuri de dimensiune 32 conține adrese de la 0x201 la 0x300. +    * Pool-ul de blocuri de dimensiune 32 conține adrese de la 0x201 la 0x300. ​(256 / 32 = 8 blocuri) 
-    * Pool-ul de blocuri de dimensiune 64 conține adrese de la 0x301 la 0x400. +    * Pool-ul de blocuri de dimensiune 64 conține adrese de la 0x301 la 0x400. (256 / 64 = 4 blocuri)
-  * Se alocă un spa272țiu de 10 bytes, acesta va fi în pool-ul de 16 bytes. Adresa returnată va fi 0x101. +  * Se alocă un spațiu de 10 bytes, acesta va fi în pool-ul de 16 bytes. Adresa returnată va fi 0x101. Cum dimensiunea cerută pentru alocare este mai mică decât blocul primit la alocare, acesta se va fragmenta. Vom aloca 10 adrese începând de la adresa 0x101 și restul adreselor (de la 0x10B la la 0x110) vor forma un block liber de 6 octeți.  
-  * Se alocă un spațiu de 16 bytes, acesta va fi în pool-ul de 16 bytes. Adresa returnată va fi prima disponibilă din pool, adică 0x111.+  * Se alocă un spațiu de 16 bytes, acesta va fi în pool-ul de 16 bytes. Adresa returnată va fi prima disponibilă din pool, adică 0x111. În acest caz nu avem nevoie de fragmentare.
   * Se încearcă alocarea unui spațiu de 2000 bytes, dar acest lucru nu este posibil, deoarece 2000 depășește dimensiunea celui mai mare bloc posibil. Se va afișa mesajul de eroare “Out of memory”.   * Se încearcă alocarea unui spațiu de 2000 bytes, dar acest lucru nu este posibil, deoarece 2000 depășește dimensiunea celui mai mare bloc posibil. Se va afișa mesajul de eroare “Out of memory”.
-  * Se scrie string-ul GIGEL la adresa 0x111.+  * Se scrie string-ul GIGEL la adresa 0x111. La adresa 0x111 va fi litera G, la 0x112 I, la 0x113 G șamd.
   * Se afișează DUMP-ul de memorie, conform specificațiilor menționate în enunț.   * Se afișează DUMP-ul de memorie, conform specificațiilor menționate în enunț.
   * Se citesc 2 bytes de la adresa 0x113, GE.   * Se citesc 2 bytes de la adresa 0x113, GE.
Line 201: Line 211:
     * Dacă se dorește **scrierea** începând cu o adresă care nu a fost alocată, se afișează mesajul de eroare **“Segmentation fault (core dumped)\n”** și se face un dump al memoriei, după regulile de la funcția DUMP_MEMORY.     * Dacă se dorește **scrierea** începând cu o adresă care nu a fost alocată, se afișează mesajul de eroare **“Segmentation fault (core dumped)\n”** și se face un dump al memoriei, după regulile de la funcția DUMP_MEMORY.
     * Dacă se dorește **scrierea** începând cu o adresă care a fost alocată, dar care pe parcursul scrierii conține zone nealocate, se afișează mesajul de eroare **“Segmentation fault (core dumped)\n”** și se face un dump al memoriei, după regulile de la funcția DUMP_MEMORY.     * Dacă se dorește **scrierea** începând cu o adresă care a fost alocată, dar care pe parcursul scrierii conține zone nealocate, se afișează mesajul de eroare **“Segmentation fault (core dumped)\n”** și se face un dump al memoriei, după regulile de la funcția DUMP_MEMORY.
-  * INVALID_COMMAND 
-    * Dacă parametrul unei comenzi sau comanda în sine nu este validă, se afișează mesajul de eroare **"​Invalid command\n"​** și se citește următoare comandă. 
  
 ==== Bonus (20p) ==== ==== Bonus (20p) ====
Line 212: Line 220:
 <​code>​ <​code>​
 Fie situația în care avem un singur bloc liber, de dimensiune 16 bytes, Fie situația în care avem un singur bloc liber, de dimensiune 16 bytes,
-care începe de la adresa ​0x0.+care începe de la adresa ​0x1.
  
 MALLOC 6 MALLOC 6
 ---> Se fragmentează blocul de 16 bytes într-o parte de 6 bytes ---> Se fragmentează blocul de 16 bytes într-o parte de 6 bytes
      ce va fi alocată și o parte de 10 bytes ce rămâne liberă      ce va fi alocată și o parte de 10 bytes ce rămâne liberă
-     Se întoarce adresa ​0x0.+     Se întoarce adresa ​0x1.
 MALLOC 5 MALLOC 5
 ---> Se fragmentează blocul de 10 bytes într-o parte de 5 bytes ---> Se fragmentează blocul de 10 bytes într-o parte de 5 bytes
      ce va fi alocată și o parte de 5 bytes ce rămâne liberă      ce va fi alocată și o parte de 5 bytes ce rămâne liberă
-     Se întoarce adresa ​0x6+     Se întoarce adresa ​0x7
-FREE 0x6+FREE 0x7
 ---> Se alipește fragmentul de 5 bytes cu fragmentul liber de ---> Se alipește fragmentul de 5 bytes cu fragmentul liber de
      5 bytes.      5 bytes.
      ​Rezultă un bloc de dimensiune 10 bytes.      ​Rezultă un bloc de dimensiune 10 bytes.
-FREE 0x0+FREE 0x1
 ---> Se alipește fragmentul de 6 bytes cu fragmentul liber de ---> Se alipește fragmentul de 6 bytes cu fragmentul liber de
      10 bytes.      10 bytes.
Line 236: Line 244:
 <​code>​ <​code>​
 Fie situația în care avem un singur bloc liber, de dimensiune 16 bytes, Fie situația în care avem un singur bloc liber, de dimensiune 16 bytes,
-care începe de la adresa ​0x0.+care începe de la adresa ​0x1.
  
 MALLOC 6 MALLOC 6
 ---> Se fragmentează blocul de 16 bytes într-o parte de 6 bytes ---> Se fragmentează blocul de 16 bytes într-o parte de 6 bytes
      ce va fi alocată și o parte de 10 bytes ce rămâne liberă      ce va fi alocată și o parte de 10 bytes ce rămâne liberă
-     Se întoarce adresa ​0x0.+     Se întoarce adresa ​0x1.
 MALLOC 5 MALLOC 5
 ---> Se fragmentează blocul de 10 bytes într-o parte de 5 bytes ---> Se fragmentează blocul de 10 bytes într-o parte de 5 bytes
      ce va fi alocată și o parte de 5 bytes ce rămâne liberă      ce va fi alocată și o parte de 5 bytes ce rămâne liberă
-     Se întoarce adresa ​0x6+     Se întoarce adresa ​0x7
-FREE 0x0+FREE 0x1
 ---> Se creează un bloc nou de dimensiune 6 bytes. ---> Se creează un bloc nou de dimensiune 6 bytes.
      ​Există 2 liste cu câte un bloc fiecare, unul de 5 bytes și unul de 6 bytes.      ​Există 2 liste cu câte un bloc fiecare, unul de 5 bytes și unul de 6 bytes.
-FREE 0x6+FREE 0x7
 ---> Se alipește fragmentul de 5 bytes cu fragmentele de 5 și 6 bytes. ---> Se alipește fragmentul de 5 bytes cu fragmentele de 5 și 6 bytes.
      ​Există o singură listă, cu un singur bloc, de dimensiune 16      ​Există o singură listă, cu un singur bloc, de dimensiune 16
Line 277: Line 285:
 <note warning> <note warning>
  
-  * Este **obligatorie** construirea unei implementări care folosește conceptul de vector de liste.+  * Este **obligatorie** construirea unei implementări care folosește conceptul de **vector de liste dublu înlănțuite**. 
 + 
 +  * Este **obligatoriu** să realizați eliminarea blocurilor din vectorul de liste atunci când acestea sunt alocate.
  
   * Nerespectarea acestor constrângeri va conduce la **notarea temei cu 0 puncte**.   * Nerespectarea acestor constrângeri va conduce la **notarea temei cu 0 puncte**.
Line 285: Line 295:
 ===== Checker ===== ===== Checker =====
  
-**TBD** +Arhivă checker: {{:​sd-ca:​teme:​sfl_checker.zip|}} 
-</hidden>+ 
 +<​note>​ 
 +Pentru a utiliza checker-ul:​ 
 +    ​Dezarhivați fișierul .zip în folderul in care se află implementarea voastră. 
 +    ​Asigurați-vă că Makefile-ul vostru conține regulile ​**build**, **run_sfl** și **clean**. 
 +    * Rulați folosind comanda "​./​check"​. 
 +</note> 
 + 
 +Temele vor fi trimise pe Moodle.
  
 +Arhiva trebuie sa contina:
 +     * sursele **.c si .h**
 +     * fișier Makefile cu trei reguli:
 +       * regula **build**: în urma căreia se genereaza un executabil numit **sfl**
 +       * regula **run_sfl**:​ în urma căreia va rula executabilul **sfl**
 +       * regula **clean** care șterge executabilul și fișierele obiect
 +     * Compilarea trebuie să se realizeze cu flagurile **-Wall -Wextra -std=c99**
 +     * fișier **README** care să conțină detalii despre implementarea temei.
sd-ca/teme/tema1-2024.1710768510.txt.gz · Last modified: 2024/03/18 15:28 by maria.sfiraiala
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