#import "@local/nure:0.1.0": *

#show: pz-lb.with(..yaml("doc.yaml"))

#v(-spacing)

== Мета роботи
Вивчити особливості захисту критичних даних, використання динамічної та кеш пам'яті.

== Хід роботи
#v(-spacing)
=== Порівняти алгоритми заміщення сторінок (оптимальний, годинник, LRU).
Заміщення сторінок - це процес, який використовується в операційних системах для керування віртуальною пам'яттю, коли фізичної пам'яті недостатньо. Коли потрібна сторінка, якої немає в оперативній пам'яті, операційна система вибирає одну зі сторінок, що вже знаходяться в пам'яті, і замінює її потрібною сторінкою.

Сучасні операційні системи використовують різні підходи для визначення сторінок, які можна замістити.

Розглянемо деякі алгоритми заміщення сторінок:
+ оптимальний алгоритм (також відомий як алгоритм Беладі) -- теоретичний алгоритм, який досягає найменшої кількості промахів сторінок. Він працює, замінюючи сторінку, яка не буде використовуватися найдовший період часу в майбутньому. Хоча цей алгоритм є оптимальним, він не може бути реалізований на практиці, оскільки вимагає знання майбутньої послідовності звернень до сторінок;
+ алгоритм годинник (також відомий як алгоритм "другого шансу") -- зберігає список сторінок у пам'яті, кожна з яких має біт використання. Коли відбувається промах сторінки і потрібно замінити сторінку, алгоритм перевіряє біт використання поточної сторінки, на яку вказує покажчик. Якщо біт використання дорівнює 1, він скидається до 0, і покажчик переміщується до наступної сторінки. Цей процес повторюється до тих пір, поки не буде знайдено сторінку з бітом використання, що дорівнює 0, яка і замінюється. Такий підхід надає "другий шанс" сторінкам, які нещодавно використовувалися, запобігаючи їхньому швидкому витісненню;
+ алгоритм LRU (Least Recently Used) -- замінює сторінку, яка найдовше не використовувалася. Він базується на припущенні, що сторінки, які використовувалися нещодавно, ймовірно, будуть використовуватися знову в найближчому майбутньому, а ті, що давно не використовувалися, мають меншу ймовірність повторного звернення. Для реалізації LRU необхідно відстежувати час останнього звернення до кожної сторінки в пам'яті. Коли виникає потреба у заміщенні, вибирається сторінка з найдавнішим часом останнього використання.

#figure(image("img/pages-optimal.png", width: 90%), caption: [Оптимальний алгоритм заміщення сторінок])
#figure(image("img/pages-clock.png", width: 100%), caption: [Алгоритм заміщення сторінок "Годинник"])
#figure(image("img/pages-lru.png", width: 80%), caption: [Алгоритм заміщення сторінок "LRU"])

Протестуємо всі алгоритми із однаковими тестовими даними.

#figure(image("img/pages-test.png", width: 80%), caption: [Код тестування алгоритмів])

#figure(image("img/pages-result.png"), caption: [Результати тестування])

Можемо побачити, що оптимальний алгоритм показує найкращі результати.

=== Реалізувати алгоритм LRU для роботи з кешем для стандартних параметрів кешу
Кешування - це техніка збереження часто використовуваних даних у швидшій пам'яті (кеші) для зменшення часу доступу. Оскільки кеш має обмежений розмір, при його заповненні виникає потреба у визначенні того, які дані слід видалити для звільнення місця для нових.

#figure(image("img/cache-lru.png", width: 87%), caption: [Алгоритм "LRU" для доступу до кешу])
#figure(image("img/cache-test.png", width: 90%), caption: [Код тестування])
#figure(image("img/cache-result.png", width: 45%), caption: [Результати тестування])

=== Реалізувати функції встановлення паролю та перевірки паролю. При складанні функцій забезпечте безпечне зберігання паролів.

Безпечність пароля можна визначити за часом, що потрібен для його зламу. Чим більше часу необхідно на злам, тим безпечніший пароль.
#figure(
  image("img/pass-table.png", width: 70%),
  caption: [Таблиця відповідності складності паролю до часу, що необхідний на злам],
)
Критерії надійності паролю зазначені в таблиці детально обговорюються в дослідженні Hive Systems, яке оновлюється кожен рік починаючи з 2020 (#link("https://www.hivesystems.com/blog/are-your-passwords-in-the-green"))
#figure(image("img/pass-check.png", width: 70%), caption: [Функція перевірки надійності пароля])

Для забезпечення безпеки пароля в пам'яті під час гешування було використано стандартні POSIX функції "mlock" та "munlock".
#figure(image("img/pass-lock.png", width: 74%), caption: [Функції блокування та розблокування пам'яті])

Для гешування паролю ми використали алгоритм "SHA256" із бібліотеки "openssl", яка є стандартним вибором для всього, що так чи інакше пов'язано із криптографією.
#figure(image("img/pass-hash.png", width: 74%), caption: [Функція гешування паролю])

== Висновки
Під час даної лабораторної роботи ми вивчили особливості захисту критичних даних, використання динамічної та кеш пам'яті.

#show: appendices_style
