- •6.080401 “Інформаційні управляючі системи та технології”
- •6.080402 “Інформаційні технології проектування”
- •6.080401 “Інформаційні управляючі системи та технології” 1
- •Розділ 1 Основні концепції операційних систем
- •1.1 Поняття операційної системи, ії призначення та функції
- •1.1.1 Поняття операційної системи
- •1.1.2 Призначення операційної системи
- •1.1.3 Операційна система як розширена машина
- •1.1.4 Операційна система як розподілювач ресурсів
- •1.2 Класифікація сучасних операційних систем
- •1.3 Функціональні компоненти операційних систем
- •1.3.1 Керування процесами і потоками
- •1.3.2 Керування пам’яттю
- •1.3.3 Керування введенням-виведенням
- •1.3.4 Керування файлами та файлові системи
- •1.3.5 Мережна підтримка
- •1.3.6 Безпека даних
- •1.3.7 Інтерфейс користувача
- •Розділ 2 Архітектура операційних систем
- •2.1 Базові поняття архітектури операційних систем
- •2.1.1 Ядро системи. Привілейований режим і режим користувача
- •2.2 Реалізація архітектури операційних систем
- •2.2.1 Монолітні системи
- •2.2.2 Багаторівневі системи
- •2.2.3 Системи з мікроядром
- •2.2.4 Концепція віртуальних машин
- •2.3 Особливості архітектури: unix і Linux
- •2.3.1 Базова архітектура unix
- •2.3.2 Архітектура Linux
- •Розділ 3 Керування процесами і потоками
- •3.1 Базові поняття процесів і потоків
- •3.1.1 Процеси і потоки в сучасних ос
- •3.1.2 Моделі процесів і потоків
- •3.1.3 Складові елементи процесів і потоків
- •3.2 Стани процесів і потоків
- •3.3 Опис процесів і потоків
- •3.3.1 Керуючи блоки процесів і потоків
- •3.3.2 Образи процесу і потоку
- •3.4 Створення і завершення процесів і потоків
- •3.4.1 Створення процесів
- •3.4.2 Керування адресним простором під час створення процесів
- •3.4.3 Особливості завершення процесів
- •3.4.4 Синхронне й асинхронне виконання процесів
- •3.4.5 Створення і завершення потоків
- •3. 5 Керування процесами в unix і Linux
- •3. 5. 1 Образ процесу
- •3. 5. 2 Ідентифікаційна інформація та атрибути безпеки процесу
- •3. 5.3 Керуючий блок процесу
- •3. 5. 4Створення процесу
- •3. 5. 5 Завершення процесу
- •3. 5. 6 Очікування завершення процесу
- •3. 5. 7 Сигнали
- •3.6 Керування потоками в Linux
- •3. 6. 1 Базова підтримка багатопотоковості
- •3. 6. 2 Потоки ядра Linux
- •3. 6. 2 Програмний інтерфейс керування потоками Створення потоків
- •Очікування завершення виконання потоків
- •Висновки
- •Розділ 4 Планування процесів і потоків
- •4. 1 Загальні принципи планування
- •4. 1. 1 Особливості виконання потоків
- •4. 1.2 Механізми і політика планування
- •4. 1. 3 Застовність принципів планування
- •4. 2 Види планування
- •4. 2. 1 Довготермінове планування
- •4. 2. 2 Середньотермінове планування
- •4. 2. 3 Короткотермінове планування
- •4. 3 Стратегії планування. Витісняльна і невитісняльна багатозадачність
- •4. 4 Алгоритми планування
- •4. 4. 1 Планування за принципом fifo
- •4. 4. 2 Кругове планування
- •4. 4. 3 Планування із приоритетами
- •4. 4. 4 Планування на підставі характеристик подальшого виконання
- •4. 4. 5 Багаторівневі черги зі зворотним зв’язком
- •4. 4. 6 Лотерейне планування
- •4. 5 Реалізація планування в Linux
- •4. 5. 1 Планування процесів реального часу в ядрі
- •4. 5. 2 Традиційний алгоритм планування
- •Умови виклику процедури планування
- •Процедура планування
- •Початок нової епохи
- •Розрахунок динамічного пріоритету
- •Перерахування кванта під час створення нового процесу
- •4. 5. 3 Сучасні підходи до реалізації планування
- •4. 5. 4 Програмний інтерфейс планування
- •Висновки
- •Розділ 5 Взаємодія потоків
- •5. 1 Основні принципи взаємодії потоків
- •5. 2 Основні проблеми взаємодії потоків
- •5. 2. 1 Проблема змагання
- •5. 2. 2 Критичні секції та блокування Поняття критичної секції
- •Блокування
- •Проблеми із реалізацією блокувань
- •5. 3 Базові механізми синхронізації потоків
- •5. 3. 1 Семафори
- •Особливості використання семафорів
- •Реалязація задачі виробників-споживачів за допомогою семафорів
- •5. 3. 2 М’ютекси
- •Висновки
- •Розділ 6 Міжпроцесова взаємодія
- •6. 1 Види міжпроцесової взаємодії
- •6. 1. 1 Технологія відображуваної пам’яті (mapped memory)
- •Розділ 7 Керування оперативною пам’яттю
- •7. 1 Основи технології віртуальної пам’яті
- •7. 1. 1. Поняття віртуальної пам’яті
- •7. 1. 2. Проблеми реалізації віртуальної пам’яті. Фрагментація пам’яті
- •7. 1. 3. Логічна і фізична адресація пам’яті
- •7. 1. 4 Підхід базового і межового регістрів
- •7. 2 Сегментація пам’яті
- •7.2. 1. Особливості сегментації пам’яті
- •7.2.2. Реалізація сегментації в архітектурі іа-32
- •7. 3 Сторінкова організація пам’яті
- •7.3.1. Базові принципи сторінкової організації пам’яті
- •7.3.2. Порівняльний аналіз сторінкової організації пам’яті та сегментації
- •7.3.3. Багаторівневі таблиці сторінок
- •7.3.4. Реалізація таблиць сторінок в архітектурі іа-32
- •7.3.5. Асоціативна пам’ять
- •7. 4. Сторінково-сегментна організація пам’яті
- •7. 5. Реалізація керування основною пам’яттю: Linux
- •7.5.1. Використання сегментації в Linux. Формування логічних адрес
- •7.5.2. Сторінкова адресація в Linux
- •7.5.3. Розташування ядра у фізичній пам’яті
- •7.5.4. Особливості адресації процесів і ядра
- •7.5.5. Використання асоціативної пам’яті
- •Розділ 8 Логічна організація файлових систем
- •8. 1. Поняття файла і файлової системи
- •8.1.1. Поняття файла
- •8.1.2. Поняття файлової системи
- •8.1.3. Типи файлів
- •8.1.4. Імена файлів
- •8. 2. Організація інформації у файловій системі
- •8.2.1. Розділи
- •8.2.2. Каталоги
- •8.2.3. Зв’язок розділів і структури каталогів
- •Єдине дерево каталогів. Монтування файлових систем
- •8. 3. Зв’язки
- •8. 3. 1. Жорсткі зв’язки
- •8. 3. 2. Символічні зв’язки
- •Підтримка символічних зв’язків на рівні системних викликів
- •8. 4. Атрибути файлів
- •8. 5. Операції над файлами і каталогами
- •8. 5. 1. Підходи до використання файлів процесами
- •8. 5. 2. Загальні відомості про файлові операції
- •8. 5. 3. Файлові операції posix
- •Література
5. 2. 2 Критичні секції та блокування Поняття критичної секції
Розглянемо використання простішої ідеї для вирішення проблеми змагань.
Неважко помітити, як джерелом нашої помилки є те, що зовні найпростіша операція покладання грошей на рахунок насправді розпадається на кілька операцій, при цьому завжди залишається шанс втручання між ними якогось іншого потоку. У цьому випадку кажуть, що операція не є атомарною.
Звідси випливає, що розв’язанням проблеми змагання є перетворення фрагменту коду, який спричиняє проблему, в атомарну операцію, тобто в таку, котра гарантовано виконуватиметься цілковито без втручання інших потоків. Такий фрагмент коду називають критичною секцією (critical section):
//початок критичної секції
total_amount=total_amount+new_amount;
//кінець критичної секції
Тепер, коли два потоки візьмуться виконувати код критичної секції одночасно, той з них, що почав першим, виконає весь її код цілком до того, як другий почне своє виконання (другий потоік чекатиме, поки перший не закінчить виконання коду критичної секції). У результаті підсумку гарантовано матимемо в нашій програмі послідовність подій за варіантом 2, і змагання не відбудеться ніколи.
Розглянемо властивості, які повинна мати критична секція.
Взаємного виключення (mutual exlusion): у конкретний момент часу код критичної секції може виконувати тільки один потік.
Прогесу: якщо кілька потоків запрсили вхід у критичну секцію, один із них повинен обов’язково у неї ввійти (вони не можуть всі заблокувати один одного).
Обмеженості очікування: процес, що намагається ввійти у критичну секцію, рано чи пізно обов’язково в неї ввійде.
Залишається відповісти на далеко не просте запитання: “Як нам змусити ситему сприймати кілька операцій як одну атомарну операцію?”
Найпростішим розв’язанням такої задачі було б заборонити переривання на час виконання критичної секції. Такий підхід, хоча й розв’язує задачу в принципі, на практиці не може бути застосовуваний, оскільки внаслідок зациклення аьо авірії програми у критичній секції вся система може залишитися із заблокованими перериваннями, а отже, у непрацездатному стані.
Блокування
Раціональнішим розв’язанням є використання блокувань (locks). Блокування – це механізм, який не дозволяє більш як одному потокові виконувати код критичної секції. Використання блокування зводиться до двох дій: запрвадження (заблокування, функція acquire_lock()) і зняття блокування (розблокування, функція release_lock()). У разі заблокування перевіряють, чи не було воно вже зроблено іншим потоком, і якщо це так, цей потік переходить у стан очікування, інакше він запрваджує блокування і входить у критичну секцію. Після виходу із критичної секції потік знімає блокування.
acquire_lock(lock);
//критична секція
release_lock(lock);
Так реалізовують властивість взаємного виключення, звідси походить інша назва для блокування – м’ютекс (mutex, скорочення від mutual exclusion).
Проблеми із реалізацією блокувань
Розглянемо наївну реалізацію критичної секції із використанням змінних блокування. З кожною критичною секцією пов’язують цілочислову змінну, якій присвоюють одиницю під час заблокування і нуль – після разблокування. Ось який приблизно вигляд має код такої реалізації:
int lock=0;
void aquire_lock(int lock)
{
//якщо блокування не має (lock==0), запровалити його (задати lock=1)
//і вийти – ми ввійшли у критичну секцію
//інакше чекати, поки блокування не знімуть
while(lock!=0); //(1)
lock=1; //(2)
}
void release_lock(int lock)
{
//зняти блокування
lock=0;
}
Головна проблема цієї реалізації полягає в тому, що що перевірка значення змінної блокування (1) та її зміна (2) не є частинами однієї атомарної операції. Коли інший потоік перевірить значення змінної між цима двома операціями і виявить, що вона дорівнює 0, два потоки можуть опинитися у критичній секції одночасно.