
- •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.4. Процес і нитка як об'єкти
Підсистема управління процесами в Windows дозволяє розглядати процеси і нитки як об'єкти, над якими нитки різних процесів можуть виконати цілий ряд дій. Для цього потрібно мати хендл процесу або нитки. Як нам відомо, такі хендл повертаються як побічні результати роботи функцій CreateProcess і CreateThread. Це дозволяє процесу, що запустила інший процес або нитку, виконувати з ними необхідні дії. Однак у деяких випадках бажано дати можливість управляти процесом не процесові-«батьку», а іншому, зовсім сторонній процесу (наприклад, програмою адміністрування системи). Проблема при цьому в тому, що, як уже зазначалося, хендл в Windows має сенс тільки в межах того процесу, який викликав функцію Create і не може бути просто переданий іншому процесу.
Функція OpenProcess дозволяє одному процесу отримати хендл будь-якого іншого процесу, вказавши для цього два параметри: ідентифікатор цікавить процесу і маску, задаючу набір запитуваних прав по відношенню до цього процесу. Якщо підсистема безпеки Windows, звіривши маркер доступу запитувача процесу з дескриптором безпеки процесу-об'єкта (див. п. 3.8.4.1), вважатиме запит законним, то функція поверне необхідний хендл.
А про які, власне, права йдеться? Що саме один процес може зробити з іншим процесом? Основні права наступні:
· Запускати нову нитку процесу;
· Запитувати і змінювати клас пріоритету процесу;
· Читати і записувати дані в пам'яті процесу;
· Використовувати процес в якості об'єкта синхронізації;
· Примусово припиняти виконання процесу;
· Запитувати код завершення процесу.
Всі перераховані дії виконуються за допомогою відповідних API-функцій (наприклад, для припинення процесу викликається функція TerminateProcess), одним із параметрів яких вказується хендл відкритого процесу-об'єкта.
4.5.5. Синхронізація ниток
4.5.5.1. Способи синхронізації
Windows надає різноманітні можливості для синхронізації роботи ниток, тобто, інакше кажучи, для організації пасивного очікування ниткою деяких подій, пов'язаних з роботою інших ниток того ж процесу або інших процесів.
· Традиційною для Windows формою синхронізації є обмін повідомленнями (messages). При цьому, механізм повідомлень призначений не тільки для синхронізації, але і для обміну даними. Далі робота з повідомленнями буде розглянута докладно.
· Різноманітні умови очікування можуть бути реалізовані за допомогою об'єктів синхронізації і функцій очікування, які дозволяють заблокувати нитку до моменту переходу зазначеного об'єкта в сигнальний стан.
· Використання змінних типу CRITICAL_SECTION, на відміну від попередніх способів, можливо тільки для синхронізації ниток одного і того ж процесу, але зате реалізується більш ефективно за часом і пам'яті.
4.5.5.2. Об'єкти синхронізації та функції очікування
Об'єкти синхронізації являють собою окремий випадок об'єктів ядра Windows. Відмінною особливістю об'єктів синхронізації є можливість використовувати в якості аргументів функцій очікування.
Для створення об'єкта потрібно викликати функцію CreateXxx, де замість Xxx вказується назва конкретного типу об'єктів, наприклад, CreateMutex або CreateEvent.
Спільною рисою всіх об'єктів синхронізації є наявність двох станів, одне з яких називається сигнальним (signaled), а інше, відповідно, несигнальному. Сенс сигнального стану різний для різних типів об'єктів, загальним же є те, що стан очікування для нитки закінчується тоді, коли об'єкт переходить в сигнальний стан.
Для конкретних типів об'єктів замість терміна «сигнальний стан» може бути зручно використовувати як синоніми «вільно», «включено», «є», «відбулося» і т.п., а для несигнальному, відповідно, «зайнято», «виключене» , «ні» і т.п.
Оскільки об'єкти існують в системної пам'яті, процеси можуть отримати до них доступ тільки за допомогою хендл. Це вимагає витрат часу на перемикання контексту пам'яті при роботі з об'єктами, але зате дає можливість синхронізації ниток, що належать різним процесам. Для цього при створенні об'єктів ядра одним з параметрів функції CreateXxx може вказуватися ім'я цього об'єкта. Якщо після цього інший процес спробує створити об'єкт того ж типу і з тим же ім'ям, то він отримає хендл вже існуючого об'єкта. В результаті обидва процеси будуть працювати з одним і тим же об'єктом синхронізації.
До функцій очікування відносяться WaitForSingleObject (очікування одного об'єкту) і WaitForMultipleObjects (очікування декількох об'єктів). Розглянемо спочатку першу з них.
Функція WaitForSingleObject має два аргументи:
· Хендл якого об'єкта синхронізації;
· Тайм-аут очікування, тобто максимальний час очікування (у мілісекундах).
Ця функція - блокуюча: якщо в момент її виклику зазначений об'єкт знаходиться в несигнальному стані, то викликала нитка переводиться в стан очікування (зрозуміло, пасивного!). Очікування, як правило, завершується в одному з двох випадків: або об'єкт переходить в сигнальний стан, або закінчується заданий тайм-аут. Третій, особливий випадок завершення пов'язаний з поняттям «покинутий мьютекс», яке буде пояснено нижче. Значення, що повертається функцією, дозволяє дізнатися, яка з трьох причин пробудження нитки мала місце.
Якщо в момент виклику функції зазначений об'єкт вже знаходився в сигнальному стані, то очікування не відбувається, функція відразу ж повертає результат.
Якщо задана нульова величина тайм-ауту, то виконання функції зводиться до перевірки, чи знаходиться в даний момент об'єкт в сигнальному стані.
Якщо значення тайм-ауту одно константі INFINITE, то час очікування не обмежено, тобто нитка може пробудитися тільки по сигнальному станом об'єкта.
Функція WaitForMultipleObjects відрізняється тим, що замість єдиного хендл приймає в якості аргументів адреса масиву, що містить декілька хендл, і кількість цих хендл (розмір масиву). Як і в попередньому випадку, задається величина тайм-ауту. Додатковий, четвертий аргумент - булевський прапор режиму очікування. Значення FALSE означає очікування будь-якого об'єкта (достатньо, щоб хоч один з них перейшов в сигнальний стан), TRUE - очікування всіх об'єктів (очікування завершиться, тільки коли всі об'єкти опиняться в сигнальному стані).
Повертає значення дозволяє визначити причину пробудження:
· Перехід одного з заданих об'єктів в сигнальний стан, і якого саме об'єкту;
· Перехід одного з об'єктів-мьютекс в «занедбаний» стан (буде пояснено нижче), і якого саме об'єкту;
· Витікання тайм-ауту очікування.
Крім двох названих, є ще ряд функцій очікування. Функції WaitForSingleObjectEx і WaitForMultipleObjectsEx дозволяють також чекати завершення асинхронних операцій введення / виводу для зазначеного файлу. Функція MsgWaitForMultipleObjects дозволяє, поряд з об'єктами синхронізації, використовувати для пробудження поява повідомлень, що очікують обробки. Функція SignalObjectAndWait виконує рідкісний трюк: вона переводить один об'єкт в сигнальний стан і тут же починає чекати іншого об'єкта.