Guest User

Untitled

a guest
Apr 19th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. // Blatt 05, Systemprogrammierung WS2011/2012
  2. // FH Bielefeld, FB Technik, Carsten Gips
  3. //
  4. #include <iostream>
  5.  
  6.  
  7. // Groesse des simulierten Heaps
  8. #define MEM_POOL_SIZE ((unsigned long)(100))  //(1024*1024))
  9. // "magischer" Wert
  10. #define MAGIC_VALUE 0xDEADBEAF
  11.  
  12. using namespace std;
  13.  
  14. // Verwaltungsstruktur
  15. struct MemBlock {
  16.     size_t size;
  17.     MemBlock *next;
  18. };
  19.  
  20.  
  21. // simulierter Heap
  22. static char memPool[MEM_POOL_SIZE];
  23. // Zeiger auf Freispeicherliste
  24. static MemBlock *freeMem = 0;
  25.  
  26.  
  27. // Deklaration der Speicherverwaltungsfunktionen
  28. // Diese Funktionen muessen Sie selbst implementieren!
  29. void *fbtMalloc(size_t size);
  30. void fbtFree(void *ptr);
  31. void init();
  32. void print();
  33.  
  34. // main
  35. int main(int argv, char* argc[])
  36. {
  37.  
  38.     float* f = (float*)fbtMalloc(sizeof(float));
  39.     print();
  40.    
  41.     return 0;
  42. }
  43.  
  44. void* fbtMalloc(size_t size)
  45. {
  46.     if (freeMem == 0)
  47.     {
  48.         init();
  49.     }
  50.  
  51.     // aktueller Speicherbereich
  52.     MemBlock* tmp = freeMem;
  53.     // vorheriger Speicherbereich
  54.     MemBlock* prev = 0;
  55.  
  56.     while(tmp)
  57.     {
  58.         // teile Speicherbereich auf und alloziere einen
  59.         if (tmp->size > size + 2*sizeof(MemBlock) + 8)
  60.         {
  61.             // naechster Speicherbereich
  62.             // und zu allozierender Speicherbereich
  63.             MemBlock* next = tmp->next;
  64.             MemBlock* ptr = tmp;
  65.  
  66.             // naechster/neuer Speicherbereich
  67.             // und aktuallisiere Groesse vom neuen Speicherbereich
  68.             tmp += (size + sizeof(MemBlock));
  69.             tmp->size = ptr->size - (size + sizeof(MemBlock));
  70.  
  71.             // aktuallisiere Groesse vom zu allozierenden Speicherbereich
  72.             // und markiere zu allozierenden Speicherbereich
  73.             ptr->size = size;
  74.             ptr->next = (MemBlock*)MAGIC_VALUE;
  75.  
  76.             // verkette naechsten Speicherbereich
  77.             tmp->next = next;
  78.  
  79.             // verkette vorherigen Speicherbereich, falls vorhanden
  80.             // ansonsten verschiebe Pointer von freeMem auf neuen Speicherbereich
  81.             if (prev)
  82.                 prev->next = tmp;
  83.             else
  84.                 freeMem = tmp;
  85.  
  86.             // gebe allozierten Speicherbereich zurueck
  87.             return (void*)ptr;
  88.         }
  89.         // alloziere Speicherbereich
  90.         else if (tmp->size > size)
  91.         {
  92.             MemBlock* ptr = tmp;
  93.             tmp = tmp->next;
  94.             ptr->size = size;
  95.             ptr->next = (MemBlock*)MAGIC_VALUE;
  96.  
  97.             if (prev)
  98.                 prev->next = tmp;
  99.             else
  100.                 freeMem = tmp;
  101.  
  102.             return (void*)ptr;
  103.         }
  104.         prev = tmp;
  105.         tmp = tmp->next;
  106.     }
  107.  
  108.     return 0;
  109. }
  110.  
  111. void fbtFree(void* ptr)
  112. {  
  113.     MemBlock* tmp = (MemBlock*)ptr;
  114.     if (tmp->next == (MemBlock*)MAGIC_VALUE)
  115.     {
  116.         tmp->next = freeMem;
  117.         freeMem = tmp;
  118.     }
  119.     else
  120.     {
  121.         cout << "Fehler: Speicherbereich ist nicht alloziert." << endl;
  122.     }
  123. }
  124.  
  125. void init()
  126. {
  127.     freeMem = (MemBlock*)memPool;
  128.     freeMem->size = MEM_POOL_SIZE;
  129.     freeMem->next = 0;
  130. }
  131.  
  132. void print()
  133. {
  134.     MemBlock* tmp = freeMem;
  135.    
  136.     while(tmp)
  137.     {
  138.         cout << "freier Speicherbereich: " << tmp->size << ", Adresse: " << tmp << endl;
  139.         tmp = tmp->next;
  140.     }
  141. }
Add Comment
Please, Sign In to add comment