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()); }
public void ListaZajetychBlokow() { Console.Write("Lista zajetych blokow:\n"); BlokPamieci blok = _zajeteBlokiPamieci; while (blok != null) { Console.Write(blok); Console.Write("\n"); blok = blok.Nastepny; } }
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 } }
/// <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); }
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 } }
/// <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; }