Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicherverwaltung implementieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.11.2006, 18:29 Uhr
Getit



Ich hab hier so mein Problem mit dieser Aufgabenstellung:


Zitat:

Implementieren Sie eine Speicherverwaltung die einen zusammenhängenden Speicherblock eigenständig verwaltet. Ein Speicherblock von 20MB soll durch ein eigenes Heap Management aufgeteilt werden.



Die Aufgabenstellung geht noch weiter - Speicherblöcke belegen und dann jeden 2. wieder freigeben und dann die Fragmentierung testen.


Ich versteh jetzt einfach nicht, wie ich mir nen 20MB Speicherblock holen soll.
Die Verwaltung ist dann kein Problem. Aber wie bekomme ich den 20MB Block den ich verwalten soll???

Ich will keine Lösung, nur ne Idee wie ich an den Speicherblock komme
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.11.2006, 18:51 Uhr
Blubber2063



Entweder du legst dir nen entsprechend großen Bereich in deinem Programm an oder du holst ihn dir von dem Betriebssystem.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.11.2006, 19:09 Uhr
Getit




Zitat:

Entweder du legst dir nen entsprechend großen Bereich in deinem Programm an oder du holst ihn dir von dem Betriebssystem.



Schon klar, aber wie???

1.
Zitat:
großen Bereich in deinem Programm

Soll ich mir einfach nen entsprechend großes Array anlegen? Ich denke das kanns ja wohl nicht sein.

2.
Zitat:
holst ihn dir von dem Betriebssystem

Wie??? Kann ja schlecht sagen: Speicher *ptr = new 20MB;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.11.2006, 19:16 Uhr
(un)wissender
Niveauwart


doch genau dass kannst du

C++:
char * speicherblock = new char[20 * 1024 * 1024];


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.11.2006, 19:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


bzw direkt vom betriebsystem: sbrk und dann selbst verwalten. (hatten sowas in sos1 damals programmieren müssen, also komplettes "malloc, realloc, free, usw"
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.11.2006, 19:43 Uhr
Getit



Danke, euch allen


Aber ich glaube das ist alles nicht das was ich brauche, ich poste mal die gesammte Aufgabenstellung:

Zitat:

Listen arbeiten optimal mit Datenelementen unterschiedlicher Größe. Die Speicherverwaltung des C++ Heaps ist als Liste implementiert.

Implementieren Sie eine eigene Speicherverwaltung die einen zusammenhängenden Speicherblock eigenständig verwaltet. Ein Speicherblock von 20MB soll durch ein eigenes Heap Management aufgeteilt werden. Funktionen zum Belegen und freigeben von Speicher sind zu realisieren. Die Funktionalität soll durch eine Testroutine geprüft werden können, die die vorhandene Liste durchläuft und die Verwaltungsdaten der Blöcke ausgibt. Dabei sollen Fehler ausfindig gemacht werden können.
Die Speicherverwaltung ist durch eine Testroutine zu prüfen welche Speicher belegt und dessen Inhalt vollständig mit aufsteigenden ganzen Zahlen beschreibt. Dazu sind im Wechsel sind Blöcke zu belegen und freizugeben.
Jede Belegung im Testprogramm führt die Testroutine aus und deren Verwaltungsdaten sind auf der Konsole auszugeben. Die Verwaltungsdaten umfassen mindestens Blockgröße und die Belegt Information.
Testen Sie die Fragmentierung des Heaps, in dem Sie jeden zweiten Speicherblock freigeben und danach einen doppelt großen neuen Block belegen.


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.11.2006, 23:06 Uhr
Blubber2063



Doch natürlich, ich mein du kannst auch das machen was FloSoft gemacht hat und direkt die Speicherverwaltung für malloc bzw new schreiben, oder du nutzt genannt Methoden und holst dir den Speicher von dort zum verwalten, es ist völlig egal wo du den Speicher her hast, dir gehören 20 MB und die musst du verwalten, in dem du Operationen fürs belegen und freigeben Implementierst, danach iterierst du über deine Struktur um die Fragmentierung festzustellen. Die Aufgabenstellung ist doch eindeutig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.11.2006, 23:14 Uhr
Getit



Okay, danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.11.2006, 23:16 Uhr
Getit



Hallo, hab das jetzt so gemacht wie das "(un)wissender" vorgeschlagen hat.

Hab mir mit
void *ptrAuf20MB = new char[20*1024*1024];
nen 20MB Speicherblock geholt.

Und jetzt will ich meine Blöcke dem 20MB Block hinzufügen.
Als erstes wenn der Speicherblock initialisiert wird einfach nen Verwaltungsblock in den 20MB Block.
Allerdings weiß ich nicht ob das so korrekt ist:


C++:
#include <iostream>
#include <assert.h>
#include <crtdbg.h>
using namespace std;

struct Verwaltungsdaten
{
    int nummer;
    bool belegt;
    int groesse;
    Verwaltungsdaten *next;
};

void speicherInitialisieren(void *);


int main()
{
    char eingabe;
    void *zeigerAuf20MB = new char[20*1024*1024];

    cout << "Was wollen Sie jetzt tun?" << endl;
    cout << "Druecken Sie die gezeigte <Taste>+<Return>" << endl;
    cout << "\t<i> um Verwaltungsinformationen anzuzeigen" << endl;
    cout << "\t<a> um neuen Speicherblock anzufordern" << endl;
    cout << "\t<f> um einen Speicherblock freizugeben" << endl;
    cout << "\t<x> fuer Ende" << endl;

    cin >> eingabe;
    while (eingabe != 'x' && cin >> eingabe)
    {
        switch(eingabe)
        {
        case 'i':            
            break;
        case 'a':
            break;
        case 'f':
            break;
        default:
            break;
        }
    }

    _CrtDumpMemoryLeaks();
}

void speicherInitialisieren(void *ptrAuf20MB)
{
    struct Verwaltungsdaten *ptr = new struct Verwaltungsdaten;
    assert(ptr);
    ptr->nummer = 1;
    ptr->belegt = false;
    ptr->groesse = sizeof(ptrAuf20MB) - sizeof(struct Verwaltungsdaten);
    ptr->next = 0;
    ptrAuf20MB = ptr;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.12.2006, 22:13 Uhr
Getit



Also ich hab mir das jetzt so gedacht:

1. Ich alloziiere 20MB Speicher
char *ptrAuf20MB = new char[20*1024*1024];

2. Habe ich mir eine Struct geschreiben
struct Verwaltungsinfos
{
int nummer;
bool belegt;
Verwaltunsinfos *next;
};


Jetzt stehe ich aber vor folgendem Problem:
Wie passe ich den Struct in den alloziierten Speicher ein?

Oder hat jemand ne total andere Idee das zu Verwirklichen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: