- •2 Аналіз вимог до програмного забезпечення створення засобів опису програми для побудови її автоматної моделі
- •2.1 Виділення первинних вимог
- •2.2 Виділення детальних вимогчерез uml-діаграми
- •2.2.1 Діаграма прецедентів
- •2.2.2 Діаграми діяльності
- •2.2.4 Діаграма станів
- •3.1.1 Об’єктно орієнтована парадигма
- •2.4 Висновки
- •3 Проектування програмного забезпечення створення засобів опису програми для побудови її автоматної моделі
- •3.1 Архітектурне проектування
- •3.1.1 Структурна ієрархія системи
- •3.1.2Структурна схема системи
- •3.2 Детальне проектування
- •3.2.1 Діаграма класів
- •3.3.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Опис розробки програмних компонентів
4.2.2.1 Модуль ядра
Основним об’єктом модуля ядра є клас менеджера пам’яті, що є синглтон-об’єктом, тобто таким, екземпляр якого існує лише одинично. Реалізація шаблону синглтону:
privatestaticMemoryManager _instance;
publicstaticMemoryManager Instance
{
get
{
return _instance ?? (_instance = newMemoryManager());
}
}
#endregion
На рівні класу описано приватне статичне поле _instance, яке і є одиничним екземпляром класу. Також існує публічна статична властивість Instance, яке є інтерфейсним представленням і повертає вищезазначений екземпляр якщо він уже створений, інакше створює його і записує результат в _instance. Таким чином, екземпляр класу менеджера віртуальної пам’яті створюється лише один раз.
Ініціалізація класу менеджера віртуальної пам’яті відбувається в конструкторі:
publicvoid InitializeManager(int pageSize, int ramSize)
{
_messageManager = MessageManager.Instance;
Page.SetSize(pageSize);
Segments = newList<Segment>();
ActiveSegments = newList<Segment>();
CreatePhysicalMemory(ramSize);
HardDisk = newList<Page>();
InitAlgorithms();
}
Спочатку отримується об’єкт класу обміну повідомлень, що являє собою контейнер асинхронних подій та методів їх виклику і необхідний для обміну шару логіки системи та її представлення у вигляді графічного інтерфейсу користувача. Після цього, відбувається ініціалізація розміру сторінки, розмір якої встановлюється при старті системи. Наступним кроком, є створення контейнерів внутрішніх полів класу, а саме списку сегментів, списку активних сегментів, фізичної пам’яті та зовнішньої пам’яті. Останньою операцією є ініціалізація алгоритмів заміщення.
Реалізація завантаження сегменту у фізичну пам’ять:
publicvoid LoadSegmentToRam(Segment segment)
{
if ( segment == null || segment.IsLoaded)
return;
Array.ForEach(segment.Pages, v => LoadPageToRam(v));
segment.IsLoaded = true;
ActiveSegments.Add(segment);
_messageManager.LoadSegmentToRam(segment);
}
При вході в метод, перевіряється, чи екземпляр сегменту не нульовий і чи він ще не завантажений у фізичну пам’ять. Якщо так — відбувається вихід і операція переривається. Якщо ні — метод виконується далі. Наступним кроком є завантаження сторінок сегменту із зовнішньої пам’яті у фізичну. Після цього, сегмент відмічається як завантажений у фізичну пам’ять. Також він додається до списку активних сегментів. Останнім кроком є посилання асинхронного повідомлення про завантаження сегменту. Це потрібно для того, аби підписник цієї події, яким виступає графічний інтерфейс, міг відреагувати на зміну стану системи.
4.2.2.2 Модуль віджетів
Модуль віджетів представлений єдиним класом View, що містить всі необхідні методи для візуалізації роботи віртуальної пам’яті. Це стосується як і полів та методів на рівні екземпляру, так і множини статичних методів, які логічно згруповані та фізично знаходяться у різних файлах, хоча і представляють собою єдину структурну одиницю у вигляді класу.
Ініціалізація класу View:
public View(Grid physicalGrid, Grid hardGrid)
{
_physicalParent = physicalGrid;
_hardParent = hardGrid;
_physicalCount = 0;
_hddCount = 0;
MessageManager.Instance.OnLoadPageToHDD += LoadPageToHdd;
MessageManager.Instance.OnInitializeRam += IntializeRam;
MessageManager.Instance.OnLoadPageToRam += LoadPageToRam;
MessageManager.Instance.OnAccessToPage += AccessToPage;
MessageManager.Instance.OnReplacePage += OnReplacePage;
}
На вхід конструктора класу передаються два параметри, що представляють собою графічні компоненти, а саме батьківські контейнери панелей фізичної та зовнішньої пам’яті. Всі візуальні операції будуть проводитися з цими контейнерами, а саме динамічним створенням дочірніх компонент, зміною їх візуальних властивостей, анімацією, динамічним видаленням і т.д. Спочатку, ми зберігаємо посилання на ці компоненти у внутрішні поля класу, аби можна було їх використовувати в інших операціях. Після цього, відбувається онулення кількості сторінок фізичної та зовнішньої пам’яті. Останнім кроком, є підписування класом на події рівня ядра, для відповідного реагування на зміну внутрішнього стану системи, а саме візуального представлення таких змін.
Реалізація методу анімації завантаження сторінки із зовнішньої пам’яті у фізичну:
privatevoid LoadPageToRam(CoreLibrary.Page page, int ramIndex)
{
var fromNode = page.Data asLabel;
var animNode = CloneNode(fromNode);
var toNode = _ramNodes[ramIndex];
OnAnimationStateChanged(true);
LoadAnimation(fromNode, toNode, animNode, () => OnAnimationStateChanged(false));
}
Першим кроком є отримання візуальних віджетів сторінок джерела та цілі. Після цього, відбувається клонування віджету джерела, для проведення анімації. Потім, встановлюється стан системи, як початок анімації, що забороняє будь-які інші візуальні дії до завершення анімації. Завершується метод викликом статичного методу безпосередньої анімації завантаження сторінки. Зворотньою функцією цього методу, яка буде викликана після завершення анімації, є встановлення стану системи, як такого, що не виконує ніяких анімацій.
