
- •1.3. Короткий нарис історії ос
- •1.3.1. Передісторія ос
- •1.3.2. Пакетні ос
- •1.3.3. Ос з поділом часу
- •1.3.4. Однозадачние ос для пеом
- •1.3.5. Багатозадачні ос для пк з графічним інтерфейсом
- •1.4. Класифікація ос
- •1.5. Критерії оцінки ос
- •1.5.2. Ефективність
- •1.5.3. Зручність
- •1.5.4. Масштабованість
- •1.5.5. Здатність до розвитку
- •1.6. Основні функції і структура ос
- •1.7. Ос, що використовуються в подальшому викладі
- •1.7.2. Windows
- •1.7.3. Unix
- •2. Управління пристроями
- •2.1. Основні завдання управління пристроями
- •2.2. Класифікація периферійних пристроїв і їх архітектура
- •2.3. Переривання
- •2.4. Архітектура підсистеми вводу / виводу
- •2.5. Способи організації введення / виводу
- •2.5.1. Введення / висновок з опитування і по перериваннях
- •2.5.2. Активне і пасивне очікування
- •2.5.3. Синхронний і асинхронний ввід / вивід
- •2.6. Буферизація і кешування
- •2.6.1. Поняття буферизації
- •2.6.2. Згладжування нерівномірності швидкостей процесів
- •2.6.3. Розпаралелювання введення та обробки
- •2.6.4. Узгодження розмірів логічної та фізичної записи
- •2.6.5. Редагування при інтерактивному введенні
- •2.6.6. Кешування дисків
- •2.6.7. Випереджаюче читання.
- •2.7. Драйвери пристроїв
- •2.8. Управління пристроями в ms-dos
- •2.8.1. Рівні доступу до пристроїв
- •2.8.2. Драйвери пристроїв в ms-dos
- •2.8.3. Управління символьними пристроями
- •2.8.4. Управління блоковими пристроями
- •2.8.4.2. Розділи і логічні томи
- •2.8.4.3. Засоби доступу до дисків
- •2.9. Управління пристроями в Windows
- •2.9.1.1. Драйвери пристроїв в Windows
- •2.9.1.2. Доступ до пристроїв
- •2.10. Управління пристроями в unix
- •2.10.1. Драйвери пристроїв в unix
- •2.10.2. Пристрій як спеціальний файл
- •3. Управління даними
- •3.1. Основні завдання управління даними
- •3.2. Характеристики файлів та архітектура файлових систем
- •3.3. Розміщення файлів
- •3.4. Захист даних
- •3.6. Файлова система fat і управління даними в ms-dos
- •3.6.1. Загальна характеристика системи fat
- •3.6.2. Структури даних на диску
- •Структура записи каталога файловой системы fat
- •3.6.4. Робота з файлами в ms-dos
- •3.6.4.1. Системні функції
- •3.6.4.2. Доступ до даних
- •3.6.4.3. Структури даних у пам'яті
- •3.6.5. Нові версії системи fat
- •3.7. Файлові системи і управління даними в unix
- •3.7.1. Архітектура файлової системи unix
- •3.7.1.1. Жорсткі і символічні зв'язку
- •3.7.1.2. Монтовані томи
- •3.7.1.3. Типи і атрибути файлів
- •3.7.1.4. Управління доступом
- •3.7.2. Структури даних файлової системи unix
- •3.7.3. Доступ до даних в unix
- •3.7.4. Розвиток файлових систем unix
- •3.8. Файлова система ntfs і управління даними в Windows
- •3.8.1. Особливості файлової системи ntfs
- •3.8.2. Структури дискових даних
- •3.8.2.1. Головна таблиця файлів
- •3.8.2.2. Атрибути файлу
- •3.8.3. Доступ до даних
- •3.8.4. Захист даних
- •3.8.4.1. Аутентифікація користувача
- •3.8.4.2. Дескриптор захисту
- •4. Управління процесами
- •4.1. Основні завдання управління процесами
- •4.2. Реалізація багатозадачного режиму
- •4.2.1. Поняття процесу і ресурсу
- •4.2.2. Квазіпараллельний виконання процесів
- •4.2.3. Стану процесу
- •4.2.4. Невитісняючаі витісняюча багатозадачність
- •4.2.5. Дескриптор і контекст процесу
- •4.2.6. Реєнтерабельним системних функцій
- •4.2.7. Дисципліни диспетчеризації та пріоритети процесів
- •4.3. Проблеми взаємодії процесів
- •4.3.1. Ізоляція процесів та їх взаємодія
- •4.3.2. Проблема взаємного виключення процесів
- •4.3.3. Двійкові семафори Дейкстри
- •4.3.4. Засоби взаємодії процесів
- •4.3.4.1. Цілочисельні семафори
- •4.3.4.2. Семафори з множинним очікуванням
- •4.3.4.3. Сигнали
- •4.3.4.4. Повідомлення
- •4.3.4.5. Спільна пам'ять
- •4.3.4.6. Програмні канали
- •4.3.5. Проблема тупиків
- •4.4. Управління процесами в ms-dos
- •4.4.1. Процеси в ms-dos
- •4.4.2. Середа програми
- •4.4.3. Запуск програми
- •4.4.4. Завершення роботи програми
- •4.4.5. Перехоплення переривань і резидентні програми
- •4.5. Управління процесами в Windows
- •4.5.1. Поняття об'єкта у Windows
- •4.5.2. Процеси і нитки
- •4.5.3. Планувальник Windows
- •4.5.4. Процес і нитка як об'єкти
- •4.5.5.2. Об'єкти синхронізації та функції очікування
- •4.5.5.3. Типи об'єктів синхронізації
- •4.5.5.4. Критичні секції
- •4.5.6. Повідомлення
- •4.6. Управління процесами в unix
- •4.6.1. Життєвий цикл процесу
- •4.6.2. Групи процесів
- •4.6.3. Програмні канали
- •4.6.4. Сигнали
- •4.6.5. Засоби взаємодії процесів в стандарті posix
- •4.6.6. Планування процесів
- •4.6.6.1. Стану процесів в unix
- •4.6.6.2. Пріоритети процесів
- •4.6.7. Інтерпретатор команд shell
- •5. Управління пам'яттю
- •5.1. Основні завдання управління пам'яттю
- •5.2. Віртуальні й фізичні адреси
- •5.3.2. Розподіл з фіксованими розділами
- •5.3.3. Розподіл з динамічними розділами
- •5.4. Сегментна організація пам'яті
- •5.5. Сторінкова організація пам'яті
- •5.6. Порівняння сегментної і сторінкової організації
- •5.7. Управління пам'яттю в ms-dos
- •5.8. Управління пам'яттю в Windows
- •5.8.1. Структура адресного простору
- •5.8.3. Відображення виконуваних файлів
- •5.8.4. Файли, відображувані на пам'ять
- •5.8.5. Стеки і купи
- •5.9. Управління пам'яттю в unix
- •Література
4.5.5.3. Типи об'єктів синхронізації
Список об'єктів синхронізації включає такі типи об'єктів:
· Процеси;
· Нитки;
· Події (у вузькому сенсі);
· Мьютекс (двійкові семафори);
· Семафори (Недвійкова);
· Таймери;
· Повідомлення про зміни у каталозі;
· Консольне введення.
Розгляд об'єктів синхронізації найпростіше почати з процесів і ниток. Для тих і інших сигнальним станом є тільки стан завершення роботи. Іншими словами, можна змусити нитка одного процесу очікувати завершення роботи іншої нитки або процесу.
Найпростішим з об'єктів, призначених тільки для синхронізації, є подія (event). Він створюється за допомогою функції CreateEvent, яка вимагає вказати вид події (з автоскиданням або з ручним скиданням), а також його початковий стан - сигнальне або несигнальному. Перехід в сигнальний
стан виконується функцією SetEvent, а в несигнальному - ResetEvent. Функція PulseEvent як би поєднує обидві попередні: сигнальний стан включається, функція очікування, якщо вона була викликана раніше, завершується, але сигнальний стан тут же скидається.
Подія з автоскиданням означає, що функція очікування при завершенні очікування скидає то подія (або події), якого (яких) вона дочекалася. Якщо кілька ниток чекають одного і того ж події з автоскиданням, то розблокована буде тільки одна з них (Windows не гарантує, яка саме), оскільки іншим «події не дістанеться». Навпаки, подія з ручним скиданням залишається в сигнальному стані і може бути скинуто тільки функцією ResetEvent, а до тих пір воно може «нагодувати» скільки завгодно чекаючих ниток.
Можна сказати, що подія з ручним скиданням більше схоже не на подію, а на стан.
Наступний тип об'єктів - мьютекс (mutex). Це майже в чистому вигляді двійковий семафор в сенсі Дейкстри. Мьютекс може бути або вільний (це його сигнальний стан), або захоплений небудь ниткою. При створенні мьютекса в функції CreateMutex вказується його початковий стан. Допускається багаторазовий захоплення мьютекса однієї і тієї ж ниткою, але після цього нитка повинна стільки ж разів звільнити мьютекс, щоб він повернувся у вільний стан.
Для звільнення мьютекса нитка, що володіє їм, викликає функцію ReleaseMutex, яка є аналогом дейкстровской V (S). Ніяка інша нитка, крім власника, не може звільнити «чужий» мьютекс.
У спеціальній функції для захоплення мьютекса немає необхідності, оскільки роботу примітиву P (S) з успіхом виконують функції очікування.
Якщо нитка, яка володіє мьютекс, завершує свою роботу, не звільнивши мьютекс, то він переходить в «занедбаний» стан: тепер вже ніхто не може його звільнити. Таку ситуацію слід вважати ознакою неакуратного програмування, і вона може бути ознакою наявності у програмі більш серйозних помилок синхронізації.
Об'єкт типу семафор (semaphore) являє собою Недвійкова семафор, використовуваний зазвичай для управління розподілом обмеженого числа одиниць ресурсу. У функції CreateSemaphore вказуються два числа: максимальне значення лічильника, пов'язаного з семафором (скільки всього є одиниць ресурсу), та початкове значення цього лічильника (скільки одиниць вільно). Сигнальним є стан семафора з лічильником більше нуля. Функція очікування зменшує лічильник на 1, а функція ReleaseSemaphore збільшує його на задану кількість одиниць, але так, щоб результат не перевищував максимального значення.
На відміну від мьютекса, семафор не має власника, тобто можлива і цілком звичайна ситуація, коли одна нитка захоплює одиниці ресурсу, а інша звільняє їх.
Таймер «для очікування» (waitable timer) створюється за допомогою функції CreateWaitableTimer, після чого повинен ще бути встановлений функцією SetWaitableTimer. При створенні таймера вказується його вид: з ручним скиданням або з автоскиданням, аналогічно об'єкту «подія». При виклику SetWaitableTimer вказується час до переходу в сигнальний стан, в одиницях по 100 нс. Час можна вказати або абсолютно (коли «задзвонити»), або щодо поточного моменту (як довго чекати). Можна також вказати період (в мілісекундах), через який повинен повторюватися сигнал.
Таймер з ручним скиданням, перейшовши в сигнальний стан, залишається в ньому до виклику функції CancelWaitableTimer або повторного виклику SetWaitableTimer. Таймер з автоскиданням може бути також скинутий функціями очікування.
Корисно нагадати, що в Windows широко використовується й інший тип таймерів «для повідомлень», створюваний функцією SetTimer, але ці таймери не можуть взаємодіяти з функціями очікування і навіть не є об'єктами.
Об'єкт типу повідомлення про зміни створюється за допомогою функції FindFirstChangeNotification. При цьому вказуються такі аргументи:
· Каталог файлової системи, зміни в якому повинні відслідковуватися;
· Прапор, який вказує, чи повинні відслідковуватися зміни тільки в заданому каталозі або також у всіх вкладених підкаталогах;
· Фільтр відслідковуються змін.
Фільтр змін являє собою маску, в якій окремі біти задають такі події, як зміна списку імен файлів і каталогів (це включає їх створення, видалення і перейменування), зміна атрибутів файлу, розміру, дати зміни і атрибутів захисту.
Функція повертає хендл об'єкта, який переходить в сигнальний стан один раз, при першій появі одного з включених у фільтр змін. Якщо потрібно повторювати відстеження, слід викликати функцію FindNextChangeNotification, передаючи їй хендл. Для видалення об'єкта потрібно викликати функцію з диким ім'ям FindCloseChangeNotification.
Повідомлення про зміни дозволяють уникнути активного очікування для програм, які повинні відслідковувати і відображати стан каталогів в динаміці (як це роблять, наприклад, Провідник чи Far Manager). При цьому характер сталося зміни програма може з'ясувати, тільки перечитавши каталог, але зате достеменно відомо, що якась зміна було.
Хендл об'єкта типу консольне введення повертається функцією CreateFile, у якої замість імені файлу, що відкривається зазначено пристрій консольного вводу (CONIN $). Об'єкт в сигнальному стані, коли в буфері введення є непрочитані символи.