Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace K
- {
- class Program
- {
- // исходные данные
- const int memorySize = 5;
- const int pagesAmount = 16;
- static void Main(string[] args)
- {
- while (true)
- {
- Greeting();
- if (!shouldStart())
- return;
- var memory = new Memory(memorySize);
- int pageFaultsAmount = 0;
- for (int i = 0; i < pagesAmount; ++i)
- {
- Console.WriteLine($"Текущее состояние памяти:\n{memory.ToString()}");
- if (memory.RequestPage(GetPageNumber()))
- ++pageFaultsAmount;
- Console.Clear();
- }
- Console.WriteLine($"Итоговое состояние памяти:\n{memory.ToString()}");
- Console.WriteLine($"Количество страничных прерываний: {pageFaultsAmount}");
- if (!shouldRepeat())
- return;
- }
- }
- static void Greeting() =>
- Console.WriteLine("Эта программа создана Алиханом Темиркановым, студентом 474 группы, в рамках к/п по дисциплине ОС.\n" +
- "Она реализует модель алгоритма замены страниц - заменяется дольше всех неиспользовавшаяся страница.\n" +
- $"Исходные данные: объем области замещения памяти - {memorySize} страниц, количество страниц - {pagesAmount}");
- static bool shouldStart()
- {
- Console.WriteLine("\n[S]tart\t[Q]uit");
- while (true)
- {
- var cki = Console.ReadKey(true);
- switch (cki.Key)
- {
- case ConsoleKey.Q:
- return false;
- case ConsoleKey.S:
- Console.Clear();
- return true;
- }
- }
- }
- static bool shouldRepeat()
- {
- Console.WriteLine("\n[R]estart\t[Q]uit");
- while (true)
- {
- var cki = Console.ReadKey(true);
- switch (cki.Key)
- {
- case ConsoleKey.Q:
- return false;
- case ConsoleKey.R:
- Console.Clear();
- return true;
- }
- }
- }
- static int GetPageNumber()
- {
- while (true)
- {
- Console.Write("Введите номер запрашиваемой страницы: ");
- if (int.TryParse(Console.ReadLine(), out int number))
- return number;
- else
- Console.WriteLine("Некорректный ввод. Введите целое число.");
- }
- }
- }
- public class Memory
- {
- public Memory(int size)
- {
- PageAgePairs = new Dictionary<Page, int>();
- for (int i = 0; i < size; ++i)
- PageAgePairs.Add(new Page(i), 0);
- }
- public bool RequestPage(int number)
- {
- bool isFault = false;
- Page page = PageAgePairs.SingleOrDefault(pair => pair.Key.Number == number).Key;
- if (page is null)
- {
- isFault = true;
- PageAgePairs.Remove(PageAgePairs.OrderByDescending(pair => pair.Value).First().Key);
- page = new Page(number);
- PageAgePairs.Add(page, 0);
- }
- foreach (var key in PageAgePairs.Keys.ToList())
- if (key != page)
- ++PageAgePairs[key];
- else
- PageAgePairs[key] = 0;
- return isFault;
- }
- public override string ToString()
- {
- var sb = new StringBuilder();
- sb.AppendLine("Страница\tВозраст");
- foreach (var pair in PageAgePairs)
- {
- sb.Append(pair.Key.Number);
- sb.Append("\t\t");
- sb.Append(pair.Value);
- sb.Append('\n');
- }
- return sb.ToString();
- }
- public Dictionary<Page, int> PageAgePairs { get; }
- }
- public class Page
- {
- public Page(int number) => Number = number;
- public int Number { get; }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement