- •1 Аналітична частина
- •1.1 Віртуальна пам’ять в Windows
- •1.2 Керування віртуальною пам’яттю
- •1.3 Структура віртуального адресного простору
- •1.4 Віртуальний адресний простір 32–бітних систем
- •1.5 Сторінковий файл
- •1.6 Апаратна підтримка
- •1.7 Сегментна організація пам’яті в реальному режимі роботи мікро процесорів x86
- •1.8 Базові адреси та формування лінійних адрес
- •1.9 Сегментація пам’яті в захищеному режимі
- •1.10 Функції системи управління пам’яттю
- •1.10.1 Найпростіші схеми управління пам’яттю
- •1.10.2 Схема з фіксованими розділами
- •1.10.3 Один процес в пам’яті
- •1.10.4 Оверлейна структура
- •1.10.5 Стопінг
- •1.10.6 Схема зі змінними розділами
- •1.10.7 Сторінкова пам’ять
- •1.11 Дескрипторні таблиці
- •1.11.1 Дескриптор
- •1.11.2 Глобальна дескрипторна таблиця
- •1.11.3 Дескрипторна таблиця переривань
- •1.11.4 Локальна дескрипторна таблиця
- •1.12 Стратегії управління сторінковою пам’яттю
- •1.13 Алгоритми заміщення сторінок
- •1.13.1 Алгоритм fifo. Виштовхування першої сторінки що прийшла
- •1.13.2 Аномалія Біледі (Belady)
- •1.13.3 Оптимальний алгоритм (opt)
- •1.13.4 Виштовхування сторінки що довше за все не використовувалася. Алгоритм lru
- •1.13.5 Виштовхування рідко використовуваної сторінки. Алгоритм nfu
- •1.14 Огляд способів і засобів вирішення поставлених задач
- •1.14.1 SoftPerfect ram Disk
- •1.15 Постановка задачі на розробку
- •1.16 Висновки
- •2 Аналіз вимог до програмного забезпечення створення засобів опису програми для побудови її автоматної моделі
- •2.1 Виділення первинних вимог
- •2.2 Виділення детальних вимог через uml–діаграми
- •2.2.1 Діаграма прецедентів
- •2.2.2 Діаграми діяльності
- •2.2.3 Діаграма станів
- •2.3 Висновки
- •3 Проектування програмного забезпечення створення засобів опису програми для побудови її автоматної моделі
- •3.1 Архітектурне проектування
- •3.1.1 Об’єктно орієнтована парадигма
- •3.1.2 Структурна ієрархія системи
- •3.1.3 Структурна схема системи
- •3.2 Детальне проектування
- •3.2.1 Діаграма класів
- •3.2.2 Діаграма послідовності
- •3.3 Висновки
- •4 Конструювання та тестування програмного забезпечення
- •4.1 Розробка інтерфейсу користувача
- •4.2 Кодування системи
- •4.2.1 Вибір мови програмування
- •4.2.2Опис розробки програмних компонентів
- •4.2.2.1 Модуль ядра
- •4.2.2.2 Модуль віджетів
- •4.2.2.3 Модуль алгоритмів заміщення
- •4.2.2.4 Модуль графічного інтерфейсу
- •4.3. Детальне тестування програмного засобу
- •4.4. Висновки
- •Висновки
- •Список використаних джерел
- •Текст програми
4.2.2.3 Модуль алгоритмів заміщення
Даний модуль складається із базового абстрактного класу алгоритму, екземпляр якого створити неможливо і який служить для наслідування конкретних реалізацій алгоритмів. Таким чином, він декларує інтерфейсну частину алгоритмів і дозволяє реалізувати поліморфну поведінку алгоритмів заміщення. Реалізація класу:
publicabstractclassReplacementAlgorithm
{
protectedMemoryManager Manager;
protected ReplacementAlgorithm(MemoryManager memoryManager)
{
this.Manager = memoryManager;
}
publicvoid OnAccessToPage(Page page )
{
var index = Manager.Ram.GetIndexByPage(page);
AccessToPage(page, index);
}
publicabstractvoid LoadPage(Page page, int index);
publicabstractvoid AccessToPage(Page page, int index);
publicabstractint GetRepacementIndex();
}
Як можна побачити, на вході клас отримує об’єкт менеджеру віртуальної пам’яті і записує даний екземпляр у внутрішній стан. Це необхідно для того, аби мати доступ до фізичної та зовнішньої пам’яті при формуванні стратегії заміщення. Також, клас містить загальний метод OnAccessToPage, який викликається при доступі до сторінки пам’яті, і в свою чергу викликає абстрактний метод AccessToPage. В кінці реалізації класу описані сигнатури абстрактних методів завантаження сторінки та доступу до неї, які викликаються в процесі роботи емуляції віртуальної пам’яті та змінюють внутрішній стан дочірніх класів алгоритмів. Основним методом, що повертає безпосередній результат роботи алгоритму, є GetReplacementIndex, що визначає, яку сторінку потрібно замістити у фізичній пам’яті, відповідно до стратегії заміщення конкретної реалізації алгоритму.
Реалізація алгоритму LRU:
publicclassLRUAlgorithm: ReplacementAlgorithm
{
privateint[] _used;
public LRUAlgorithm(MemoryManager memoryManager)
: base(memoryManager)
{
_used = Enumerable.Repeat(0, memoryManager.Ram.PagesCount).ToArray();
}
publicoverridevoid LoadPage(Page page, int index)
{
_used[index] = _used.Max();
}
publicoverridevoid AccessToPage(Page page, int index)
{
_used[index]++;
}
publicoverrideint GetRepacementIndex()
{
returnArray.IndexOf(_used, _used.Min());
}
publicoverridestring ToString()
{
return"LRU";
}
}
З даної реалізації видно, що клас цього алгоритму унаслідується від базовго класу ReplacemenAlgorithm. В ньому додано внутрішнє поле _used, що являє собою масив, індекс якого вказує на індекс сторінки у фізичній пам’яті, а значення вказує на кількість звертань до даної сторінки. Далі описані перегрузки абстрактних методів. При доступі до сторінки, кількість звертань збільшується на одиницю. При пошуку сторінки для заміщення, обирається сторінка, кількість доступу до якої, була найменшою.
4.2.2.4 Модуль графічного інтерфейсу
Модуль графічного інтерфейсу являє собою набір візуальних форм, що свою чергу представляють собою класи, що наслідуються від базових класів графічних форм та перевизначають поведінку. В основі функціонування даного модуля лежить механізм “підписник–видавець”, що являє собою архітектуру асинхронних подій.
Ініціалізація головної форми:
_view = newView(physicalMemory, hardMemory);
_view.OnAnimationStateChanged += OnChangeAnimationState;
_manager = MemoryManager.Instance;
_manager.InitializeManager(pageSize, ramSize);
selectAlgorithmBox.ItemsSource = _manager.Algorithms;
selectAlgorithmBox.SelectedIndex = 0;
selectSegmentBox.ItemsSource = _manager.ActiveSegments;
MessageManager.Instance.OnLoadSegmentToRam += OnLoadSegmentToRam;
Спочатку, створюється екземпляр класу віджетів, в який передаються візуальні компоненти, а саме контейнери фізичної та зовнішньої пам’яті. Далі створюється екземпляр класу менеджера віртуальної пам’яті, що приймає на вході розміри сторінки та фізичної пам’яті. Після цього, відбувається прив’язка контролу вибору алгоритмів до списку алгоритмів менеджера. В кінці, реалізована підписка на подію завантаження сторінки у фізичну пам’ять.
Додавання нового сегмену:
privatevoid addSegmentBtn_Click(object sender, RoutedEventArgs e)
{
var fm = newAddSegmentForm();
var res = fm.ShowDialog();
if (res == System.Windows.Forms.DialogResult.OK)
{
var clr = fm.CurrentColor;
var color = Color.FromArgb(clr.A, clr.R, clr.G, clr.B);
SegmentItem.colors[fm.CurrentSegment] = color;
_manager.AddSegment(fm.CurrentSegment);
SegmentItem.Update();
segmentsListBox.ItemsSource = SegmentItem.items;
}
}
Початковим кроком, є створення екземпляру діалогового вікна, де користувач вказує необхідні параметри нового сегменту. Після його завершення, йде перевірка, чи користувач натиснув ОК, і якщо так, то з діалогово вікна читаються необхідні параметри і відбувається додавання нового сегменту.
