Advertisement
kiraventom

Untitled

Jan 2nd, 2020
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.81 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace K
  7. {
  8.     class Program
  9.     {
  10.         // исходные данные
  11.         const int memorySize = 5;
  12.         const int pagesAmount = 16;
  13.  
  14.         static void Main(string[] args)
  15.         {
  16.             while (true)
  17.             {
  18.                 Greeting();
  19.                 if (!shouldStart())
  20.                     return;
  21.  
  22.                 var memory = new Memory(memorySize);
  23.                 int pageFaultsAmount = 0;
  24.  
  25.                 for (int i = 0; i < pagesAmount; ++i)
  26.                 {
  27.                     Console.WriteLine($"Текущее состояние памяти:\n{memory.ToString()}");
  28.                     if (memory.RequestPage(GetPageNumber()))
  29.                         ++pageFaultsAmount;
  30.                     Console.Clear();
  31.                 }
  32.  
  33.                 Console.WriteLine($"Итоговое состояние памяти:\n{memory.ToString()}");
  34.                 Console.WriteLine($"Количество страничных прерываний: {pageFaultsAmount}");
  35.  
  36.                 if (!shouldRepeat())
  37.                     return;
  38.             }
  39.         }
  40.  
  41.         static void Greeting() =>
  42.             Console.WriteLine("Эта программа создана Алиханом Темиркановым, студентом 474 группы, в рамках к/п по дисциплине ОС.\n" +
  43.                 "Она реализует модель алгоритма замены страниц - заменяется дольше всех неиспользовавшаяся страница.\n" +
  44.                 $"Исходные данные: объем области замещения памяти - {memorySize} страниц, количество страниц - {pagesAmount}");
  45.  
  46.         static bool shouldStart()
  47.         {
  48.             Console.WriteLine("\n[S]tart\t[Q]uit");
  49.             while (true)
  50.             {
  51.                 var cki = Console.ReadKey(true);
  52.                 switch (cki.Key)
  53.                 {
  54.                     case ConsoleKey.Q:
  55.                         return false;
  56.                     case ConsoleKey.S:
  57.                         Console.Clear();
  58.                         return true;
  59.                 }
  60.             }
  61.         }
  62.  
  63.         static bool shouldRepeat()
  64.         {
  65.             Console.WriteLine("\n[R]estart\t[Q]uit");
  66.             while (true)
  67.             {
  68.                 var cki = Console.ReadKey(true);
  69.                 switch (cki.Key)
  70.                 {
  71.                     case ConsoleKey.Q:
  72.                         return false;
  73.                     case ConsoleKey.R:
  74.                         Console.Clear();
  75.                         return true;
  76.                 }
  77.             }
  78.         }
  79.  
  80.         static int GetPageNumber()
  81.         {
  82.             while (true)
  83.             {
  84.                 Console.Write("Введите номер запрашиваемой страницы: ");
  85.                 if (int.TryParse(Console.ReadLine(), out int number))
  86.                     return number;
  87.                 else
  88.                     Console.WriteLine("Некорректный ввод. Введите целое число.");
  89.             }
  90.         }
  91.     }
  92.  
  93.     public class Memory
  94.     {
  95.         public Memory(int size)
  96.         {
  97.             PageAgePairs = new Dictionary<Page, int>();
  98.             for (int i = 0; i < size; ++i)
  99.                 PageAgePairs.Add(new Page(i), 0);
  100.         }
  101.  
  102.         public bool RequestPage(int number)
  103.         {
  104.             bool isFault = false;
  105.             Page page = PageAgePairs.SingleOrDefault(pair => pair.Key.Number == number).Key;
  106.  
  107.             if (page is null)
  108.             {
  109.                 isFault = true;
  110.                 PageAgePairs.Remove(PageAgePairs.OrderByDescending(pair => pair.Value).First().Key);
  111.                 page = new Page(number);
  112.                 PageAgePairs.Add(page, 0);
  113.             }
  114.  
  115.             foreach (var key in PageAgePairs.Keys.ToList())
  116.                 if (key != page)
  117.                     ++PageAgePairs[key];
  118.                 else
  119.                     PageAgePairs[key] = 0;
  120.  
  121.             return isFault;
  122.         }
  123.  
  124.         public override string ToString()
  125.         {
  126.             var sb = new StringBuilder();
  127.             sb.AppendLine("Страница\tВозраст");
  128.             foreach (var pair in PageAgePairs)
  129.             {
  130.                 sb.Append(pair.Key.Number);
  131.                 sb.Append("\t\t");
  132.                 sb.Append(pair.Value);
  133.                 sb.Append('\n');
  134.             }
  135.             return sb.ToString();
  136.         }
  137.  
  138.         public Dictionary<Page, int> PageAgePairs { get; }
  139.     }
  140.  
  141.     public class Page
  142.     {
  143.         public Page(int number) => Number = number;
  144.         public int Number { get; }
  145.     }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement