Beispiel #1
0
    public override string ToString()
    {
        var s = new StringBuilder();

        s.Append("Lista zajetych blokow:\n");
        BlokPamieci blok = _zajeteBlokiPamieci;

        while (blok != null)
        {
            s.Append(blok);
            s.Append("\n");
            blok = blok.Nastepny;
        }

        s.Append("Strony pamieci:\n");
        foreach (var strona in _strony)
        {
            s.Append(strona);
            s.Append("\n");
        }

        s.Append("Pamiec fizyczna:\n");
        int komorkiNaLinie = 16;

        for (var row = 0; row < _pamiecFizyczna.Length / komorkiNaLinie; row++)
        {
            for (var col = 0; col < komorkiNaLinie; col++)
            {
                s.Append(string.Format("{0:000}", _pamiecFizyczna[row * komorkiNaLinie + col]));
                s.Append(" ");
            }
            s.Append("\n");
        }
        return(s.ToString());
    }
Beispiel #2
0
    public void ListaZajetychBlokow()
    {
        Console.Write("Lista zajetych blokow:\n");
        BlokPamieci blok = _zajeteBlokiPamieci;

        while (blok != null)
        {
            Console.Write(blok);
            Console.Write("\n");
            blok = blok.Nastepny;
        }
    }
Beispiel #3
0
    public void Zwolnij(int adresPoczatkowy)
    {
        int         numerStrony   = adresPoczatkowy / RozmiarBloku;
        BlokPamieci doZwolnienia  = null;
        BlokPamieci poprzedniBlok = null;       // Blok przed blokiem do zwolnienia

        // Szukamy strony zaczynajacej sie pod podanym adresem
        BlokPamieci lookup = _zajeteBlokiPamieci;

        while (lookup != null)
        {
            if (lookup.StronaPoczatkowa == numerStrony)
            {
                doZwolnienia = lookup;
                break;
            }
            poprzedniBlok = lookup;
            lookup        = lookup.Nastepny;
        }

        if (doZwolnienia == null)
        {
            // Dostalismy zly adres, albo blok zostal juz zwolniony
            // nie robimy nic
            return;
        }

        if (poprzedniBlok != null)
        {
            poprzedniBlok.Nastepny = doZwolnienia.Nastepny;
        }
        else
        {
            _zajeteBlokiPamieci = doZwolnienia.Nastepny;
        }

        for (int i = 0; i < doZwolnienia.Blokow; i++)
        {
            StronaPamieci stronaDoZwolnienia = _strony[doZwolnienia.StronaPoczatkowa + i];
            stronaDoZwolnienia.JestZmapowanaWPamieciFizycznej = false;
            stronaDoZwolnienia.JestNaDysku = false;
            // Strona pozostanie w swap i w pamięci fizycznej, ale zostanie wyczyszczona i nadpisana po nastepnym zapisie do niej
        }
    }
Beispiel #4
0
    /// <summary>
    ///     Alokuje pamiec metodą First-Fit.
    ///     Zaalokowane strony NIE SA natychmiast mapowane w pamieci fizycznej.
    /// </summary>
    /// <param name="iloscBlokow">
    ///     Ilość blokow do zaalokowania.
    ///     Kazdy blok ma rozmiar Pamiec.RozmiarBloku
    /// </param>
    /// <returns>
    ///     Adres poczatku zaalokowanego bloku w pamieci wirtualnej
    /// </returns>
    public int Zaalokuj(int iloscBlokow)
    {
        BlokPamieci nowyBlok;

        if (_zajeteBlokiPamieci == null)
        {
            nowyBlok            = new BlokPamieci(0, iloscBlokow);
            _zajeteBlokiPamieci = nowyBlok;
        }
        else
        {
            var lookup = _zajeteBlokiPamieci;
            // szukamy pierwszej przerwy miedzy blokami zajetego miejsca,
            // w ktora da sie zmiescic iloscBlokow

            while (lookup.Nastepny != null &&
                   lookup.Nastepny.StronaPoczatkowa - lookup.StronaPoczatkowa + lookup.Blokow > iloscBlokow)
            {
                lookup = lookup.Nastepny;
            }

            // dodajemy nowy blok po znalezionym
            nowyBlok = new BlokPamieci(lookup.StronaPoczatkowa + lookup.Blokow, iloscBlokow)
            {
                Nastepny = lookup.Nastepny
            };
            lookup.Nastepny = nowyBlok;
        }

        while (_strony.Count < nowyBlok.StronaPoczatkowa + nowyBlok.Blokow)
        {
            _strony.Add(new StronaPamieci());
        }

        return(nowyBlok.StronaPoczatkowa * RozmiarBloku);
    }
Beispiel #5
0
    public void Zwolnij(int adresPoczatkowy)
    {
        int numerStrony = adresPoczatkowy/RozmiarBloku;
            BlokPamieci doZwolnienia = null;
            BlokPamieci poprzedniBlok = null;   // Blok przed blokiem do zwolnienia

            // Szukamy strony zaczynajacej sie pod podanym adresem
            BlokPamieci lookup = _zajeteBlokiPamieci;
            while (lookup != null)
            {
                if (lookup.StronaPoczatkowa == numerStrony)
                {
                    doZwolnienia = lookup;
                    break;
                }
                poprzedniBlok = lookup;
                lookup = lookup.Nastepny;
            }

            if (doZwolnienia == null)
            {
                // Dostalismy zly adres, albo blok zostal juz zwolniony
                // nie robimy nic
                return;
            }

            if (poprzedniBlok != null) poprzedniBlok.Nastepny = doZwolnienia.Nastepny;
            else _zajeteBlokiPamieci = doZwolnienia.Nastepny;

            for (int i = 0; i < doZwolnienia.Blokow; i++)
            {
                StronaPamieci stronaDoZwolnienia = _strony[doZwolnienia.StronaPoczatkowa + i];
                stronaDoZwolnienia.JestZmapowanaWPamieciFizycznej = false;
                stronaDoZwolnienia.JestNaDysku = false;
                // Strona pozostanie w swap i w pamięci fizycznej, ale zostanie wyczyszczona i nadpisana po nastepnym zapisie do niej
            }
    }
Beispiel #6
0
    /// <summary>
    ///     Alokuje pamiec metodą First-Fit.
    ///     Zaalokowane strony NIE SA natychmiast mapowane w pamieci fizycznej.
    /// </summary>
    /// <param name="iloscBlokow">
    ///     Ilość blokow do zaalokowania.
    ///     Kazdy blok ma rozmiar Pamiec.RozmiarBloku
    /// </param>
    /// <returns>
    ///     Adres poczatku zaalokowanego bloku w pamieci wirtualnej
    /// </returns>
    public int Zaalokuj(int iloscBlokow)
    {
        BlokPamieci nowyBlok;
            if (_zajeteBlokiPamieci == null)
            {
                nowyBlok = new BlokPamieci(0, iloscBlokow);
                _zajeteBlokiPamieci = nowyBlok;
            }
            else
            {
                var lookup = _zajeteBlokiPamieci;
                // szukamy pierwszej przerwy miedzy blokami zajetego miejsca,
                // w ktora da sie zmiescic iloscBlokow

                while (lookup.Nastepny != null &&
                       lookup.Nastepny.StronaPoczatkowa - lookup.StronaPoczatkowa + lookup.Blokow > iloscBlokow)
                {
                    lookup = lookup.Nastepny;
                }

                // dodajemy nowy blok po znalezionym
                nowyBlok = new BlokPamieci(lookup.StronaPoczatkowa + lookup.Blokow, iloscBlokow)
                {
                    Nastepny = lookup.Nastepny
                };
                lookup.Nastepny = nowyBlok;
            }

            while (_strony.Count < nowyBlok.StronaPoczatkowa + nowyBlok.Blokow)
            {
                _strony.Add(new StronaPamieci());
            }

            return nowyBlok.StronaPoczatkowa * RozmiarBloku;
    }