public void DisplayPageContent(int id, int number) { try { ProcessPages pages = ProcessPages.FirstOrDefault(x => x.Id == id); // ReSharper disable once PossibleNullReferenceException if (pages.IsPageInMemory(number)) { Console.WriteLine("Zawarość ramki nr " + number + ": "); Console.WriteLine(); _physicalMemory.GetFrame(pages.ReadFrameNumber(number)).ShowAllocationUnit(); } else { Console.WriteLine("Danej strony nie ma w pamięci."); } } catch (Exception) { Console.WriteLine("Nie ma danego procesu w pamieci."); } }
public void DisplayPageList(int id) { try { ProcessPages pages = ProcessPages.SingleOrDefault(x => x.Id == id); // ReSharper disable once PossibleNullReferenceException for (int i = 0; i < pages.PagesCount; i++) { if (pages.IsPageInMemory(i)) { Console.WriteLine("Strona " + i + " znajduje się w ramce nr " + pages.ReadFrameNumber(i)); } else { Console.WriteLine("Strona " + i + " nie ma przypisanej ramki."); } } } catch (NullReferenceException) { Console.WriteLine("Tego procesu nie ma w pamięci"); } }
public void AllocateMemory(PCB processData, string program) { //obliczenie ilosci stron int pages = (int)Math.Ceiling((double)program.Length / FramesSize); //przypisnie Stron procesu i delegatow do Listy stron i do PCB ProcessPages temp = new ProcessPages(processData.PID, pages); temp.GetChar = GetByte; temp.ChangeByteDel = ChangeByte; ProcessPages.Add(temp); processData.MemoryBlocks = temp; processData.MaxMemory = program.Length - 1; //uzupelnienie stron var frames = new List <AllocationUnit>(); for (int i = 0; i < pages; i++) { frames.Add(new AllocationUnit(FramesSize)); frames[i].WriteAllocationUnit(program.Select(x => x) .Skip(FramesSize * i) .Take((program.Length - FramesSize * i < FramesSize) ? program.Length - FramesSize * i : FramesSize) .ToArray()); } //Dodanie danych do pliku wymiany ExchangeFileProcess newProcess = new ExchangeFileProcess() { TakenProcessPages = temp, TakenFrames = frames }; _exchangeFile.PlaceIntoMemory(newProcess); //sprawdzenie czy mozna dodac pierwsza strone do pamieci if (_freeFramesList.FreeFramesCount >= 1) { //przypisanie indexu ramki do ktorej zostanie wprowadzona strona int index = _freeFramesList.RemoveFromList(); //dodanie numeru ramki do kolejki _fifoQueue.AddFrame(new FrameData() { FrameNumber = index, Id = processData.PID }); //wprowadzenie 0 strony do pamieci fizycznej _physicalMemory.SetFrame(index, frames[0].ReadAllocationUnit()); //wprowadzenie do tablicy stron ze strona 0 znajduje sie w danym miejscu foreach (ProcessPages process in ProcessPages) { if (process.Id == processData.PID) { process.AddFrame(0, index); } } } else { //zdjecie z kolejki ramki w ktorej znajduje sie najstarsza strona var indexprocessdata = _fifoQueue.RemoveFrame(); //wpisanie do tablicy stron ze dana strona zostala zdjeta RemoveFrame(indexprocessdata.Id, indexprocessdata.FrameNumber); //dodanie do listy wolnych ramek _freeFramesList.AddToList(indexprocessdata.FrameNumber); //zabranie ze listy wolnych ramek pierwszej wolnej ramki int index = _freeFramesList.RemoveFromList(); //dodanie strony do kolejki _fifoQueue.AddFrame(new FrameData() { FrameNumber = index, Id = processData.PID }); //wprowadzenie do pamieci fizycznej danej strony _physicalMemory.SetFrame(index, frames[0].ReadAllocationUnit()); //wpisanie do tablicy stron ze dana strona znajduje sie w pamieci foreach (var processPage in ProcessPages) { if (processPage.Id == processData.PID) { processPage.AddFrame(0, index); } } } }