Системне програмне забезпечення
Тема 1: Вступ. Мета та задачі курсу.
System Software – означає програми та комплекси програм, які є спільними для всіх, хто використовує технічні засоби комп’ютера і які застосовуються, як для автоматизації розробки (створення) нових програм, так і для організації виконання існуючих програм. З цих позицій системне програмне забезпечення (СПЗ ) може бути розділене на такі групи:
1. Операційні системи.
2. Системи програмування.
3. Утиліти.
SHAPE \* MERGEFORMAT Узагальнена структура програмного забезпечення обчислювальної системи
Апаратні засоби ЕОМ

Під ОС звичайно розуміють комплекс керуючих та обробляючих програм, який з одного боку виступає як інтерфейс між апаратурою комп’ютера та користувачем з його задачами, а з другого боку – призначений для найбільш ефективного використання ресурсів комп’ютера (або ширше – обчислювано системи) та організації надійних обчислень.
Довільний з компонентів прикладного програмування обов’язково працює під керуванням ОС. Жодна з компонент програмного забезпечення, за виключенням ОС не має безпосереднього доступу до апаратури комп’ютера. Навіть користувачі взаємодіють із своїми програмами через інтерфейс ОС. Довільні команди, перш ніж попасти у прикладу програму, спочатку проходять через ОС.
Системи програмування включають в себе перш за все такі компоненти як транслятори з мов програмування, бібліотеки підпрограм, редактори, компановщики та відлагоджувачі. Зовсім самостійних, тобто відірваних від конкретної ОС систем програмування не буває. Довільна система програмування може працювати тільки під відповідною ОС, під яку вона і створена. Але система програмування може давати можливість розробляти програмне забезпечення і під інші ОС. У такому випадку, коли програми, що створюється, повинні працювати на іншій апаратній базі, маємо крос – систему.
Утиліти. Це спеціальні системні програми за допомогою яких можна як обслуговувати саму ОС, так і готувати для роботи носії даних, виконувати перекодування даних, оптимізацію розміщення даних на носії та виконувати деякі інші роботи, пов’язані із обслуговуванням обчислювальних систем. Зрозуміло, що утиліти можуть працювати тільки під відповідною операційною системою.
Таким чином, типова структура СПЗ має такий вигляд (Рис. __)
SHAPE \* MERGEFORMAT СПЗ
Типова структура системного програмного забезпечення (СПЗ)
Системи програмування
Утиліти
Керуючі програми ОС
Мови програмування
Обробляючі програми
Підсистема керування процесами
Підсистема керування даними
Підсистема керування ресурсами
Файлова система
Сервісні програми
Проблемні програми
Транслятори

Основними функціями ОС є:
1. Сприймання від користувача (або від оператора системи) завдань або команд у вигляді директив (або команд) оператора, а також у вигляді вказівок від маніпуляторів (наприклад, миші) та їх обробка.
2. Завантаження, запуск, призупинення, зупинка програм.
Керування файловими системами та системами управління базами даних.
3. Забезпечення режиму мультипрограмування, тобто виконання двох та більше програм на одному процесорі.
4. Забезпечення функцій з організації та керування усіма операціями вводу/виводу.
5. Забезпечення виконання обмежень на час відповіді в режимі реального часу (для ОС відповідного типу).
6. Розподіл пам’яті (як основної, так і зовнішньої), та організація віртуальної пам’яті.
7. Планування та диспетчеризація задач у відповідності із заданими стратегією та дисципліною обслуговування.
8. Організація механізмів обміну повідомленнями і даними між програмами, що виконуються, а також захист одної програми від впливу інших.
9. Забезпечення роботи систем програмування.
Таким чином, ОС виконує функції керування обчислювальними процесами в комп’ютерній системі, розподіляє ресурси комп’ютерної системи між різними обчислювальними процесами і створює програмне середовище, в якому виконуються прикладні програми користувачів. Таке середовище називається операційним середовищем або операційним оточенням.
Взаємодія користувача з комп’ютерною системою відбувається через інтерфейс користувача, який підтримується ОС. Надалі приймається, що функції ОС реалізуються тільки програмним способом. Але деякі з них можуть бути представлені програмно-апаратними засобами (firmware) у вигляді постійних запам’ятовуючих пристроїв (BIOS).
Операційна система складається з деякої множини стандартних сервісних програм, які можуть бути використані в процесі виконання задачі і які надають засоби для керування ресурсами обчислювальної системи, виділяючи їх користувачам по потребі.
Наприклад: користування вводом/виводом.
Операційне оточення разом з реальною машиною (апаратурою комп’ютера) створюють розширену машину, яка і використовується під час виконання програм. Завдяки операційному оточенню кожна програма (тобто завдання для ОС) виконується ніби на окремій розширеній машині, хоча в дійсності ресурси реальної машини можуть розподілятись між багатьма користувачами.
Типи операційних систем
Не завжди можна досягнути повної ясності у визначенні типів ОС, які можуть підпадати більш ніж під одну категорію класифікації.
1. Класифікація, за кількістю користувачів, які одночасно обслуговуються ОС:
Одно програмна — забезпечує роботу одної задачі одного користувача.
Мульти (багато) програмна — дозволяє одночасно виконувати декілька програм одного користувача.
Багатокористувацька — багато задач багатьох користувачів, поділяється на мульти-процесорну та мульти-машинну (мережева ОС).
Основна мета мультипрограмування — підвищення продуктивності обчислювальної системи за рахунок розподілення її ресурсів між декількома завданнями.
2. Класифікація за типами доступу, який надається інтерфейсом користувача.
Сиситеми пакетної обробки – обробляють потік завдань. Все керування з читання та виконання завданнями бере на себе ОС. Зараз втратили актуальність.
Діалоговий або інтерактивний доступ – забезпечується для деякої кількості користувачів одночасно системами розподілу часу.
ОС виконує директиви користувачів в темпі надходження та намагається дати відповідь на кожну команду користувача за найкоротший час.
Для обробки зовнішніх сигналів, які надходять, наприклад, з різних давачів, і швидкої відповіді на них використовуються ОС реального часу. Такі ОС працюють на комп’ютерах, для яких час є критичним параметром. Вони повинні забезпечувати гарантований час реакції на зовнішні події.
Досить часто всі ознаки класифікації реалізуються в одній системі.
На рівні функцій та послуг, що надаються операційцним оточенням, є багато спільного між ОС, які на рівні інтерфейсу користувача зовсім різні (і навпаки).
Операційне оточення може включати декілька інтерфейсів: користувацькі і програмні:
Linux – має інтерфейс командного рядка (shell);
інтерфейс Midnight Commander (типу NC);
графічні інтерфейси – Х-Window з різними менеджерами вікон (KDE, Gnome)
Програмні інтерфейси – в Linux програми можуть звертатись як до ОС за відповідними сервісами і функціями, так і до графічної підсистеми (якщо вона використовується).
З точки зору процесора комп’ютера, як і всього комп’ютера в цілому, двійкова програма, створена для роботи в середовищі Linux, використовує ті самі команди і формати даних, що і програма, створена для роботи в середовищі Windows NT.
Але в першому випадку ми маємо звертання до одного операційного середовища, а в другому випадку – а в другому випадку – до другого. Програма, створена під Windows безпосередньо, не буде виконуватись в Linux. Але якщо в ОС Linux створити повноцінне операційне середовище Windows, то Windows-програма може бути виконана.
Таким чином операційне середовище – це системне програмне оточення, в якому можуть виконуватись програми, створені за правилами роботи цього середовища.
Тема 2: Процеси.
Керування процесами
Поняття „обчислювальний процес” є одним із основних при вивченні операційних систем. Притримуємось такого визначення: Процес (або задача) – це програма під час виконання на процесорі із послідовним виконанням команд. Сам процесор розглядається в двох аспектах:
1. Він є носієм даних;
2. Виконує операції, пов’язані з обробкою цих даних.
Процесом може бути:
- виконання утиліти;
- виконання прикладної програми;
- трансляція вихідної програми (одної програми – один процес, іншої програми – інший процес).
Розглядаємо комп’ютер з одним центральним процесором, але всі подальші міркування справедливі і для багатопроцесорних систем.
SHAPE \* MERGEFORMAT Стан „Виконання”
Стан „Готовності”
Стан „Блокований”
Блокування
Розблокування
Пуск
Завершення кванту часу
Основні стани процесу

За період свого існування процес приймає ряд дискретних станів. Зміну станів процесу можуть викликати різні події.
Процес знаходиться в стані виконання, якщо в біжучий момент йому надається центральний процесор (CPU).
Процес знаходиться в стані готовності, якщо він міг би одразу використати CPU, який знаходиться в його розпорядженні.
Процес знаходиться в стані блокування, якщо він очікує на деяку подію (наприклад, завершення операції вводу/виводу) для того, щоби отримати можливість продовжити виконання.
В одно-процесорному комп’ютері в кожний конкретний момент часу може виконуватись тільки один процес, але декілька можуть знаходитись в стані готовності, а деякі – бути заблокованими.
Тому створюються:
- список процесів, готових до виконання;
- список заблокованих процесів.
Перший список впорядкований за пріоритетом. Таким чином наступний процес, що отримує в своє розпорядження CPU, буде першим з цього списку.
Другий список не впорядкований. Не передбачається ніякого пріоритетного порядку розблокування процесів (тобто їх переводу в стан готовності). Розблокування відбувається в тому порядку, в якому відбуваються події, які очікуються заблокованими процесами.
В ОС, як правило, процес з’являється при запуску довільної програми. Коли процес створено, він займає місце в кінці списку готових процесів. Він поступово просувається до початку списку – у відповідності з тим, як завершується виконання попередніх процесів.
Коли процес буде першим у списку готових процесів, і коли звільниться CPU, цьому процесу виділяється CPU і кажуть, що відбувається зміна станів процесу. Він переходить від стану готовності до стану виконання.
Вибір процесу для виконання називається „Пуском”, і це виконується за допомогою програми ОС, яка називається диспетчером.
В мультипрограмних системах для того, щоби запобігти випадковому або навмисному захопленню ресурсів комп’ютерної системи одним довільним процесом, ОС встановлює в спеціальному апаратному таймері переривань деяке значення, яке визначає часовий інтервал або квант часу, на протязі якого, біжучому процесу користувача дозволяється утримувати CPU в своєму розпорядженні.
Після закінчення кванту часу таймер виробить сигнал переривання, за яким керування буде передано ОС.
Після цього ОС переводить процес, що перед цим виконувався, в стан готовності, а перший процес із списку готових – в стан виконання.
Якщо процес, що виконується, ще до закінчення кванту часу генерує операцію вводу/виводу, він тим самим сам звільнює ЦП (тобто сам себе блокує на час закінчення операції вводу/виводу).
В системі з трьома активними станами процесу, можлива ще одна зміна станів – після завершення операцій вводу/виводу. Процес переходить із заблокованого стану в стан готовності.
Таким чином маємо чотири можливі зміни станів процесу. Єдина зміна станів, що викликається самим процесом користувача – блокування. Інші три зміни викликаються об’єктами, що є зовнішніми по відношенню до біжучого процесу.
Процес із пасивного стану може перейти в стан готовності в таких випадках:
1. За командою користувача. Це має місце в тих інтерактивних (діалогових) ОС, де програма може мати статус задачі, а не просто бути файлом виконання. І тільки на час виконання вона може отримувати статус задачі, тобто процесу.
2. При виборі з черги планувальником процесів.
3. За викликом із іншої задачі (один процес може створити, ініціювати, призупинити, зупинити, знищити інший процес).
4. За перериванням від зовнішнього пристрою (сигнал від виконання деякої події може запустити відповідну задачу).
5. При надходженні запланованого часу запуску програми.
Із стану виконання процес може вийти з таких причин:
1. Процес завершується, при цьому він передає керування ОС і повідомляє про своє завершення. В результаті процес або переходить в пасивний стан, або знищується. Знищується не сама програма, а саме активний процес, який відповідав виконанню деякої програми. В пасивний стан процес може бути переведений примусово за командою оператора.
2. Процес переводиться ОС в стан готовності у зв’язку з виникненням задачі з вищим пріоритетом або через завершення виділеного кванту часу.
3. Процес блокується або через запит операції вводу/виводу, або через те, що йому неможливо надати ресурс, на який виник запит, або за командою оператора на призупинення задачі. З початком відповідної події процес деблокується і переводиться в стан готовності до виконання.
Таким чином, силою, яка міняє стани процесів, є події. Один із основних видів подій - переривання.
Блок керування процесом
Для того, щоби ОС могла керувати процесами, вона повинна володіти всією необхідною інформацією. Для цього для кожного процесу створюється спеціальна інформаційна структура, яка називається – блоком керування процесом (Program Control Block, PCB), або дескриптором процесу, або описувачем задачі. В загальному випадку РСВ вміщує таку інформацію:
1. Ідентифікатор процесу (PID – process identifier).
2. Тип (або клас) процесу, який визначає для ОС деякі правила надання ресурсів.
3. Пріоритет процесу, відповідно до якого ОС надає ресурси. В рамках одного класу процесів у першу чергу обслуговуються процеси з вищим пріоритетом.
4. Змінну стану, яка визначає, в якому стані знаходиться процес (стані готовності, стані виконання, стані блокування).
5. Адресу захищеної ділянки пам’яті, в якій зберігаються біжучі значення регістрів процесора, якщо процес призупиняється (або переривається) не завершивши роботи. Ця інформація називається контекстом задачі.
6. Інформація про ресурси, якими володіє процес або має право користуватись.
7. Адреса місця для організації спілкування з іншими процесами.
8. Параметри часу запуску (момент часу, коли процес повинен активізуватись та періодичність цієї процедури).
9. Для диск–резидентних задач, які постійно знаходяться у зовнішній пам’яті і завантажуються в основну пам’ять тільки на час виконання зберігається адреса задачі на диску в її вихідному стані.
РСВ, як правило, з метою пришвидшення роботи ОС постійно розташовані в основній пам’яті. ОС організовує їх у черги, в залежності від змінної стану переносить процеси з черги в чергу. Для кожного стану ОС підтримує список процесів, що знаходяться в цьому стані.
Таким чином, РСВ – це об’єкт, який визначає процес для ОС.
Операції над процесами
Підсистема керування процесами повинна виконувати наступні операції над ними:
- створення;
- знищення;
- відновлення;
- зміна пріоритету;
- блокування;
- розблокування;
- запуск (або вибір).
Створення процесу. При створенні процесу передбачаються наступні дії:
- присвоєння процесові імені;
- включення цього імені в список імен процесів, що відомі системі;
- визначення початкового пріоритету процесу;
- формування блоку керування процесом (PCB);
- виділення процесові початкових ресурсів.
Кожен процес може породжувати інші процеси. У таких випадках він вважається батьківським процесом а породжені ним – дочірніми або згенерованими процесами.При такому підході створюється ієрархічна структура процесів, у якій в згенерованого процесу є тільки один породжуючий процес, але у кожного породжую чого процесу може бути багато згенерованих.
Знищення процесу. Вилучення процесу зі системи. Ресурси, що були виділені процесові звільняються та повертаються системі. Ім’я процесу витирається в системних списках та таблицях. Блок PCB, знищується.
Призупинення та відновлення процесу. Призупинення процесу використовується для короткочасного вивільнення певних ресурсів в періоди пікового навантаження. У випадку довготривалого призупинення процесу його ресурси можуть бути вивільнені. Рішення про вивільнення певних ресурсів у значній мірі залежить від природи цих ресурсів. Наприклад, основна пам’ять звільняється негайно; зовнішній запам’ятовуючий пристрій у випадку короткочасної призупинки процесу може бути збережений за ним.
SHAPE \* MERGEFORMAT
Виконання
Готовність
Блокування
Станпризупиненй блокований
Станпризупиненй готовий
Блокування
Розблокування
Пуск
Призупинення
Відновлення
Призупинення
Призупинення
Відновлення
Настання події (завершення вводу/виводу)
Настання події (завершення вводу/виводу)
Завершення часу

З врахуванням призупинення та відновлення діаграма станів процесів має наступний вигляд показаний на рис. __.
Призупинка та відновлення процесу відіграють важливу роль з декількох причин:
1. Якщо система працює ненадійно, та є ознаки, що вона може відмовити, то біжучі процеси можна призупинити для того, щоб знову активізувати при відновленні працездатності системи;
2. Користувач, у якого окремі проміжні результати роботи програми викликали сумніви, може призупинити (а не припинити) її виконання для уточнення достовірності роботи програми (процесу);
3. Деякі процеси можна призупинити в моменти короткочасних пікових навантажень системи з тим, щоб потім відновити їх виконання, коли навантаження повернеться до звичайного рівня.
Виникає питання, чи переводити заблокований процес в стан призупинення?
Завершення операції вводу/виводу, або подія, що очікується, може ніколи не відбутися, або затриматися на невизначений час. Тому ОС в процесі розблокування виникає вибір:
- або припинити заблокований процес;
- або передбачити механізм, який дозволяв би переводити процес зі стану блокування в стан призупинення до завершення операції вводу/виводу, або до виникнення очікуваної події.
Так як, призупинення є операцією з найвищим пріоритетом, вона виконується негайно.
Обробка переривань
В обчислювальній техніці під перериванням розуміють подію, при якій міняється нормальна послідовність виконання команд, що визначена програмою. Переривання, є механізмом, що дозволяє координувати паралельне функціонування окремих пристроїв комп’ютерної системи та реагувати на особливі стани, що виникають при роботі процесора. Тобто, переривання, це примусова передача керування від програми, що виконується, до ОС, а через неї до відповідної програми обробки переривань. Ця передача відбувається при виникненні певної події.
Механізм переривань реалізується апаратно програмним забезпеченням. Структура систем переривань може бути різноманітною (в залежності від архітектури апаратного забезпечення), але всі вони реалізують одну ідею – переривається звичайний порядок виконання команд процесором.
SHAPE \* MERGEFORMAT Переривання
Програма,що виконується
Програма,обробки переривань
- відключення переривань;
- збереження контексту перерваної програми;
- встановлення режиму роботи системи переривань.
Тіло програми обробки переривань
- відновлення контексту перерваної програми;
- відновлення режиму роботи системи переривань.

Перехід від перерваної програми до обробника переривань повинен виконуватися якомога швидше. Одним з методів, що реалізуються цей механізм переходу, є організація таблиць, що містять всі допустимі в системі переривання та адреси їх обробників.
Для коректного повернення з переривання до перерваної програми перед передачею керування обробнику система запам’ятовує вміст регістрів процесора або у пам’яті з прямим доступом, або у системному стеку. (system stack).
Таким чином, якщо відбулося переривання:
1. Керування передається ОС;
2. ОС запам’ятовує стан перерваного процесу, як правило, ця інформація запам’ятовується в його блоці керування процесом (PCB);
3. ОС аналізує тип переривання та передає керування відповідному обробнику.
Переривання, що виникають при роботі обчислювальної системи, можна поділити на такі основні групи:
1. Зовнішні (або асинхронні). Викликаються асинхронними подіями, які відбуваються поза процесом, що виконується і відповідно переривається:
- переривання від таймера;
- переривання від зовнішніх пристроїв;
- переривання при збоях у живлення;
- переривання з пульта оператора обчислювальної системи;
- переривання від іншого процесора або обчислювальної системи.
2. Внутрішні. Викликаються подіями, що пов’язані з роботою процесу, що виконується і є синхронними з його операціями. Такі переривання виникають:
- при неправильній адресації (в адресній частині команди вказано заборонену або неіснуючу адресу, звертання до відсутнього сегменту або сторінки віртуальної пам’яті);
- при наявності в полі коду операції, неіснуючої команди;
- при діленні на нуль;
- при переповненні, або пропаданні порядку в числах з плаваючою крапкою;
- при виявленні порушення паритету парності, а також помилок в роботі різних пристроїв апаратури комп’ютера засобами контролю;
- переривання за звертаннями до супервізора. У деяких комп’ютерах існують привілейовані команди, які може виконувати тільки ОС, а не програми користувачів. Відповідно в апаратурі передбачено різні режими роботи. При спробі виконати таку команду заборонену в даному режимі, відбувається внутрішнє переривання і керування передається супервізору ОС.
3. Програмні переривання. Викликаються відповідними командами переривання. За такими командами процесор виконує практично такі самі дії, що й при внутрішній перериваннях.
За рінями пріоритету переривання розподіляються наступним чином:
SHAPE \* MERGEFORMAT Засоби контролю процесора
Зовнішніпристрої
Низький пріоритет
Системний монітор
Магнітні диски
Мережене обладнання
Програмні переривання
Термінали

Оскільки переривання виникають у довільні моменти часу та при їх виникненні вже можуть існувати декілька сигналів переривань, що повинні оброблятися тільки послідовно, то щоби обробити їх в деякому логічному порядку перериванням присвоюють пріоритети. Переривання з більш високим пріоритетом обробляється позачергово, обробка інших переривань відкладається. Отже переривання з високим пріоритетом може перевати обробку переривання з нижчим пріоритетом.
Перемикання контексту. Для обробки кожного з видів переривань в складі ОС передбачені програми, що називаються обробниками переривань (IH – Interrupt Handler). Коли відбувається переривання, ОС запам’ятовує стан перерваних процесів та передає керування відповідним обробникам переривань. Ця процедура називається перемиканням контексту. При її реалізації використовуються слова стану програми (Program Status Word, PSW), які керують напрямком виконання команд і містять різну інформацію про відносно стану процесу.
Існує три типи PSW: біжуче, нове та старе.
SHAPE \* MERGEFORMAT Нові PSW
1. Виклик супервізора
2. Ввід - вивід
3. Внутрішні
4. Контроль програм
5. Контроль машин
6. Рестарт
2. Ввід - вивід
Старі PSW
1. Виклик супервізора
2. Ввід - вивід
3. Внутрішні
4. Контроль програм
5. Контроль машин
6. Рестарт
Біжуче PSW
B
D

Адреса наступної команди, що має виконуватися, міститься в біжучому PSW, у ньому вказані також типи переривань, що дозволені заборонені на даний час.
CPU реагує на дозволені переривання. Обробка заборонених переривань або відкладається, або ігнорується. Процесору не можна заборонити реагувати на переривання супервізора, з рестарту та на деякі види програмних переривань.
В одно процесорній машині є тільки одне біжуче PSW, але N нових та N старих (по одному на кожен тип переривань).
Нове PSW для переривання біжучого типу містить постійну адресу, за якою резидентно міститься обробник переривань цього типу. Коли відбувається переривання і якщо процесору не заборонено обробляти переривання цього типу, відбувається автоматичне (виконується апаратурою) перемикання PSW за схемою:
1) Біжуче PSW стає старим PSW для переривань цього типу;
2) Нове PSW для переривань цього типу стає біжучим PSW.
Коли обробку переривання завершено, ЦП починає обслуговувати або той процес, який виконувався в момент переривання, або готовий процес з найвищим пріоритетом. Це залежить від того, чи дозволяє перерваний процес перехоплення ЦП, чи ні. Якщо ні, то перерваний процес знову отримує у своє розпорядження ЦП. Якщо дозволяє, то він отримає доступ до ЦП тільки у випадку, якщо нема інших процесів готових до виконання.
Лекція 4:
Ядро операційної системи
Усі операції, що пов’язані з процесами, виконуються під керуванням ядра. Ядро – невелика частина ОС, але вона відноситься до найбільш інтенсивно використовуваних компонентів ОС.
З цієї причини ядро, зазвичай, резидентно розміщено в оперативній пам’яті, в той час як інші частини ОС переміщаються у зовнішню пам’ять та назад за необхідністю.
Одною з найважливіших операцій ядра є обробка переривань. У великих, багато абонентських системах у процесор надходить постійний потік переривань. Коли ядро обробляє біжуче переривання, воно заблоковує інші переривання і дозволяє їх знову тільки після завершення обробки біжучого переривання. При постійному потоці переривань може скластися, ситуація, що ядро блокуватиме переривання протягом тривалого часу, тоді система не буде мати можливості ефективно реагувати на переривання. Тому, ядро розробляється таким чином, щоб воно виконувало тільки мінімально можливу попередню обробку кожного переривання, а потім передавало це переривання на подальшу обробку відповідному системному процесові. Після передачі обробки переривання іншому процесові, ядро може дозволити наступні переривання. Таким чином, середня швидкість реакції системи суттєво зростає.
Основні функції ядра
Ядро, як правило, містить програми для реалізації наступних функцій:
- обробка переривань;
- створення та знищення процесів;
- перемикання процесів зі стану в стан;
- диспетчеризація;
- припинення та активізація процесів;
- синхронізація процесів;
- організація взаємодії між процесами;
- маніпуляція блоками керування процесами (PCB);
- підтримка операцій вводу-виводу;
- підтримка розподілу та перерозподілу пам’яті;
- підтримка механізму виклику-повернення при звертанні до процедур;
- підтримка функцій з обліку роботи машини.
Функції, що реалізовані в ядрі є примітивними.
В останній час намітилася чітка тенденція, коли розробники систем значну частину функцій ядра реалізують на рівні мікропрограм у ПЗУ BIOS. Це ефективний спосіб захисту ядра. Причому ретельна реалізація мікропрограм, дозволяє забезпечити високу ефективність виконання ядром своїх функцій.
В ієрархічних системних структурах, ядро розташоване на рівні безпосередньо над базовим рівнем апаратури ЕОМ. На вищих рівнях розташовані процеси системи та процеси користувачів. Практика показує, що ієрархічні структури простіше піддаються відлагодженню, модифікації та тестуванню.
Асинхронні паралельні процеси
Процеси називаються паралельними, якщо вини існують (працюють) одночасно.
Зменшення габаритів та вартості апаратури комп’ютерів сприяють подальшому розвитку багато процесорних систем і, як кінцевий результат, реалізацію максимального паралелізму на всіх рівнях. Якщо певні операції можна виконувати паралельно, то комп’ютери наступних генерацій будуть фізично виконувати їх паралельно.
Паралельні процеси можуть бути повністю незалежними або взаємодіючими. Останні можуть бути конкуруючими, або такими, що сумісно виконують спільну роботу.
Як правило, найчастіше маємо справу з паралельними процесами, яким необхідно час від часу синхронізуватися та взаємодіяти. Усі подібні паралельні процеси називаються асинхронними.
Керуючі конструкції організації паралелізму.
У багатьох сучасних мовах програмування передбачено спеціальні конструкції для організації паралелізму, зокрема в „Ада”, це пара операторів parbegin / parend. Як правило, це парні оператори:
- Перший оператор, показує, що послідовність команд у програмі може бути розділена на декілька послідовностей, що виконуються паралельно;
- Другий оператор, вказує, що зазначені послідовності, що виконувалися паралельно, повинні злитися в один потік і повинно відновитися послідовне виконання команд.
Приклад розпаралелювання виконання команд.
Пари операторів, що забезпечують розпаралелення на рівні алгоритму:
parbegin / parend – початок – завершення блоку паралельного виконання;
cobegin / coend – початок – завершення блоку суміщеного виконання;
Приклад. Обчислити вираз x := (-b + (b ** 2 - 4 * a * c) ** 0.5) / (2 * a).
Цей вираз обчислюється за допомогою послідовного процесора наступним чином:
1 b ** 2
2 4 * a
3 (4 * a) * c
4 (b ** 2) – (4 * a * c)
5 (b ** 2 – 4 * a * c) ** 0.5
6 -b
7 (-b) + ((b ** 2 – 4 * a * c) ** 0.5)
8 2 * a
9 (-b + (b ** 2 – 4 * a * c) ** 0.5) / (2 * a).
Кожен з цих операторів виконується послідовно, що визначається прийнятими у системі правилами кодування операторів.
У системі з паралельною обробкою, матимемо:
1 parbegin
temp1 := -b
temp2 := b ** 2
temp3 := 4 * a
temp4 := 2 * a
parnd
2 temp5 := temp3 * c
3 temp5 := temp2 – temp5
4 temp5 := temp5 ** 0.5
5 temp5 := temp1 + temp5
6 x := temp5 / temp4
Операції першого оператора виконуються паралельно, решта операторів виконується послідовно. У загальному час обчислення виразу скорочується.
Взаємо-виключення
Спосіб взаємодії між процесами, при якому підчас звертання одного із процесів до даних які спільно використовуються (розділяються), усім іншим процесам звертання до цих даних заборонено, називається взаємо-виключенням.
Якщо процес звертається до даних, що розділяються, то цей процес знаходиться у своїй критичній ділянці коду (або в критичній секції). Для всіх інших процесів, що розділяють дані, можливість входу в критичні ділянки повинна виключаться.
Процес повинен проходити свою критичну ділянку якнайшвидше. Він не повинен блокуватися у критичній ділянці. Критичні ділянки треба програмувати найбільш ретельно, щоби виключити, наприклад, зациклювання.
Для прикладу розглянемо задачу.
Програма друкування файлів. Програма повинна надрукувати всі файли, імена яких послідовно (у порядку надходження) розміщені у загальнодоступному файлі „замовлень”, іншими програмами.
Спеціальна ,загальнодоступна, змінна Next містить номер першої вільної, доступної для запису позиції файлу замовлень. Процеси-клієнти читають цю змінну, записують у вказану позицію файлу „замовлень” назву свого файлу та нарощують значення Next на одиницю.
Припустимо, що в деякий момент процес R вирішив роздрукувати свій файл. (Див. Рис. __). Для цього він прочитав значення змінної Next (допустимо, що воно рівне 4). Процес запам’ятав це значення, але розмістити імені файлу не встиг, так як його виконання було перерване (вичерпався квант часу).
SHAPE \* MERGEFORMAT Процес-клієнт R
Прочитати Next
Розмістити ім’я файлу RFile
Збільшити Next
R1
R2
R3

R4
Процес-клієнт S
Прочитати Next
Розмістити ім’я файлу SFile
Збільшити Next
S1
S2
S3

S4
Alpha
Beta
Gamma
Next
Файл „замовлень”
Процес-сервер
Друк файлу зі списку „замовлень”
Ресурс спільного користування
S
R
R1
S1
S2
S3
R2
R3
S…
t
Ефект „перегонів”

Рис. __
Черговий процес S, який хоче роздрукувати свій файл, прочитав те саме значення змінної , розмістив свій файл у вказаній позиції (4) та наростив значення змінної на одиницю.
Коли керування буде передано процесові R, то він продовжить своє виконання з розміщення імені свого файлу в позицію 4 файлу „замовлень”, так як цю позицію він запам’ятав підчас попереднього кванту часу, підмінивши таким чином назву файлу, що записана процесом S.
Таким чином процес S ніколи не побачить свого файлу роздрукованим.
Складність проблеми синхронізації полягає в нерегулярності ситуацій, що виникають. Усе визначається взаємними швидкостями виконання процесів та моментами їх переривання. Тому відлагодження процесів, що взаємодіють є складною задачею. Ситуація, подібна тій, що розглянута у прикладі, коли два чи більше процесів обробляють спільні дані (ті, що розділяються) а кінцевий результат залежить від співвідношення швидкостей цих процесів, називається перегонами.
Для вирішення проблеми, що описана прикладом друкування файлів, необхідно реалізувати задачу із взаємо-виключення із забезпеченням наступних чотирьох обмежень:
1. Задача повинна розв’язуватися чисто програмним способом на машині без спеціальних команд взаємо-виключення.
Причому: - кожна машинна команда виконується як операція, що не може бути поділена;
- при одночасній спробі декількох процесів звернутися до того ж самого елементу даних спрацьовує апаратна схема захисного блокування пам’яті (будується черга, що дозволяє виконувати тільки одне звертання в кожен певний момент часу);
2. Не повинно бути ніяких припущень щодо відносних швидкостей виконання асинхронних паралельних процесів.
3. Процеси, що знаходяться поза своїми критичними секціями, не можуть заважати іншим процесам заходити у свої власні критичні ділянки.
4. Не повинно бути безмежного відкладання часу входу процесів у свої критичні ділянки.
Програмну реалізації цієї задачі запропонував голландський математик Дейкстра.
Алгоритм Дейкстри.
Процес 1. (П1). Процес 2. (П2).
program Алгоритм Дейкстри
var вибранийпроцес : цілий; { перший, другий }
П1хочезайти, П2хочезайти: логічний;
procedure Процес1
begin
while правда do begin
П1хочезайти := правда;
while П2хочезайти do begin { зовнішній цикл очікування }
if вибранийпроцес = другий then begin
П1хочезайти := неправда;
while вибранийпроцес = другий do
П1хочезайти := правда; { внутрішній цикл очікування }
end;
end;
{ початок критичної ділянки П1}
вибранийпроцес := другий;
П1хочезайти := неправда;
... { оператори критичної ділянки П1}
{ кінець критичної ділянки П1}
end;
end;
procedure Процес2
begin
while правда do begin
П2хочезайти := правда;
while П1хочезайти do begin { зовнішній цикл очікування }
if вибранийпроцес = другий then begin
П2хочезайти := неправда;
while вибранийпроцес = перший do
П2хочезайти := правда; { внутрішній цикл очікування }
end;
end;
{ початок критичної ділянки П2}
вибранийпроцес := перший;
П2хочезайти := неправда;
... { оператори критичної ділянки П2}
{ кінець критичної ділянки П2}
end;
end;
{ основна програма }
begin
П1хочезайти := неправда;
П2хочезайти := неправда;
вибранийпроцес := перший;
parbegin
Процес1;
Процес2;
parend
end;
1. Процес П1 повідомляє про бажання увійти в свою критичну ділянку. Встановлює свій прапорець.
2. Процес П1 переходить до циклу, в якому перевіряє чи процес П2 не хоче також увійти у свою критичну ділянку коду.
3. Якщо, прапорець процесу П2 не встановлений, то П1 пропускає тіло циклу очікування та заходить у свою критичну ділянку.
4. Допускаємо, що П1 при виконанні циклу перевірки виявив, що прапорець П2 встановлено. Це примушує П1 увійти в тіло циклу очікування.
5. Аналізується значення змінної „вибраний процес”, яка використовується для вирішення конфліктів, які виникають у випадку, коли два процеси хочуть одночасно увійти в свої критичні ділянки.
6. Якщо, „вибраний процес” – П1, то він повторно виконує тіло свого циклу очікування моменту коли П2 скине свій прапорець.
7. Якщо, процес П1 виявляє, що „вибраний процес” (має право переваги) – П2, то він заходить у тіло свого циклу та скидає власний прапорець, а потім блокується у циклі доти, поки „вибраним процесом” залишається П2. Скидаючи свій прапорець П1 дає можливість П2 зайти у свою критичну ділянку.
8. З часом П2 вийде із своєї критичної ділянки і виконає оператор „вихід із взаємо-виключення”. Цей оператор забезпечує повернення права переваги процесу П1 і скидання прапорця П2.
9. Тепер у П1 з’являється можливість вийти із внутрішнього циклу очікування і встановити власний прапорець. Потім П1 виконує зовнішній цикл перевірки. Якщо, прапорець П2 (який, тільки що був скинутий) і далі скинутий, то П1 заходить у свою критичну ділянку.
10. Якщо П2 одразу ж намагається знову увійти в критичну ділянку, то його прапорець буде встановлений і П1 знову необхідно буде увійти в тіло зовнішнього циклу.
11. Але у цьому випадку керування вже знаходиться в П1, оскільки зараз саме він є „вибраним процесом”. Зауважимо, що П1 виходячи зі своєї критичної ділянки присвоїв змінній „вибраний процес” значення 1. Тому, П1 тіло конструкції if та виконує зовнішній цикл перевірки, доки П2 не скине власний прапорець, дозволивши П1 зайти у свою критичну ділянку.
Розглянемо цікаву деталь. Коли, П1 виходить із внутрішнього циклу активного очікування, він може втратити центральний процесор, а П2 в той час пройде свій цикл і знову буде намагатися увійти в свою критичну ділянку. При цьому П2 першим встановить свій прапорець і знову увійде в свою критичну ділянку.
Коли, П1 знову отримає у своє розпорядження процесор, він встановить свій прапорець. Оскільки зараз буде черга процесу П1, то П2 (якщо він знову буде намагатися увійти в свою критичну ділянку) буде вимушений скинути свій прапорець і перейти на внутрішній цикл активного очікування. Так що, П1отримає можливість входу в свою критичну ділянку.
У такий спосіб вирішується проблема безмежного відкладення.
Програмне вирішення проблеми реалізації примітивів взаємо-виключення для N процесів вдосконалив Д.Кнут, виключивши можливість безмежного відкладення процесів. Ейзенберг та Макчаєр запропонували рішення яке гарантує, що процес заходитиме у свою критичну ділянку не більше ніж за N – 1 спробу.
Семафори
Усі найважливіші поняття, що мають відношення до взаємо-виключень Дейкстра об’єднав у концепції семафорів.
Семафор – це захищена змінна, значення якої можна читати та змінювати тільки за допомогою операцій P та V, а також операції ініціалізації.
Двійкові семафори можуть приймати тільки значення 0 та 1. Рахункові семафори приймають невід’ємні цілі значення.
Операція P над семафором S записується як P(S) і виконується наступним чином:
якщо S > 0 то S := 0; інакше чекакати_S();
Операція V над семафором S записується як V(S) і виконується так:
якщо процеси_чекають_S() то дозволити_одному_них_роботу(); інакше S := S + 1;
Узагальнений зміст примітиву P(S) (P – Proberen - перевірити) полягає в перевірці біжучого значення семафору S, та якщо воно не менше 0, виконується перехід до наступної за примітивом операції. Інакше процес знімається на деякий час з виконання і переводиться у стан „пасивного очікування”. Знаходячись у списку заблокованих, процес, що очікує, не перевіряє семафор безперервно, як у випадку активного очікування. Замість нього на процесорі може виконуватися інший процес, який реально виконує корисну роботу.
Операція V(S) (V – Verhogen – збільшити) пов’язана зі збільшенням значення семафору S на одиницю та переведення одного або декількох процесів у стан готовності.
Операції P та V виконуються в ОС у відповідь на запит виданий деяким процесом та ім’я семафору як параметр.
Для роботи із семафорами необхідна ще операція ініціалізації самого семафору, тобто операцію присвоєння йому початкового значення.
Семафори можна використовувати для реалізації механізму синхронізації процесів шляхом блокування / деблокування:
- один процес блокує себе (виконуючи операцію P(S) з початковим значенням S = 0) для того щоб очікувати настання деякої події;
- інший процес виявляє, що очікувана подія відбулася та відновлює заблокований процес (за допомогою операції V(S)).
Рахункові семафори особливо корисні у випадках, коли деякий ресурс виділяється з множиною ідентичних ресурсів. Кожна P – операція показує, що ресурс виділяється деякому процесові, а V – операція, що ресурс повертається в загальну множину.
Операції над семафорами можна реалізувати з використанням режиму активного очікування, але це може привести до втрати ефективності. Щоб цього уникнути, потрібні операції реалізовуються в ядрі ОС.
Розглянуті засоби взаємо-виключення мають суттєві недоліки. Вони настільки елементарні, що не дозволяють ефективно описувати розв’язання порівняно складних проблем паралельних обчислень. Їх використання ускладнює доведення коректності програм паралельних обчислень. Неправильне використання таких примітивів може привести до порушення працездатності систем паралельної обробки.
Тому для реалізації взаємо-виключень треба було шукати механізми більш високого рівня, які б:
- спрощували опис розв’язку складних проблем паралельних обчислень;
- спрощували доведення коректності програм;
- було важко (якщо не неможливо) зіпсувати або неправильно використати.
Одним з рішень цієї проблеми є монітори.
Монітор
Монітор - це високорівневий засіб синхронізації, механізм організації паралелізму, який містить як дані, так і процедури, що необхідні для реалізації динамічного розподілу загального ресурсу або групи загальних ресурсів.
Потреба увійти в монітор у різні моменти часу може виникати у багатьох процесів. Але вхід у монітор знаходиться під жорстким контролем – тут виконується взаємо-виключення процесів, так що в кожен момент часу тільки одному процесові дозволяється увійти в монітор. Процеси, що хочуть увійти в монітор коли він вже зайнятий, будуть очікувати його звільнення. Режимом очікування автоматично керує сам монітор. Механізм монітору гарантує взаємо-виключення.
Внутрішні дані монітору можуть бути або глобальними (відносяться до усіх процедур монітору) або локальними (відносяться тільки до однієї певної процедури). До всіх цих даних є доступ тільки зсередини монітору. Процеси, що знаходяться поза монітором не можуть отримати доступ до даних монітору.
Якщо процес звертається до деякої процедури монітору і виявляється, що відповідний ресурс вже зайнято, то ця процедура видає команду очікування Wait. Процес міг би залишатися у середині монітору, але це привело б до порушення принципу взаємо-виключення (завадило б іншому процесові увійти в монітор). Тому процес, який переводиться в режим очікування, повинен чекати настання події (звільнення ресурсу) поза монітором.
З часом процес, що утримував деякий ресурс, звертається до монітору, щоб повернути ресурс системі. Відповідна процедура монітору при цьому може просто прийняти повідомлення про повернення ресурсу, а потім чекати доки не надійде запит на цей ресурс від іншого процесу. Але може виявитися, що вже є процеси які очікують цей ресурс. Тоді монітор виконує примітив сигналізація Signal, для того, щоб повідомити один з процесів, що очікує про можливість використання ресурсу. Процес, що очікує, завжди має вищий пріоритет, ніж процес, що тільки намагається зайти в монітор. Такий підхід захищає від безконечного відкладання доступу до ресурсу.
Фактично у процесів може виникнути необхідність очікувати звільнення ресурсу поза монітором з багатьох причин. Тому вводиться поняття змінна-умова. Для кожної з причин, за якою процес переводиться в стан очікування, призначається своя умова. У зв’язку з цим команди Wait та Signal модифікуються на Wait(ім’я_умови) та Signal(ім’я_умови).
Коли оголошується така змінна, створюється черга. Процес, що видав команду очікування, включається у цю чергу, а процес, щ видав команду синхронізації, дозволяє тим самим процесу, що очікує вийти з черги та зайти в монітор. Дисципліна обслуговування черги може бути „першим прийшов – першим обслуговується” або інша пріоритетна схема.
Простий розподіл ресурсів за допомогою монітору. Припустимо, що декільком процесам необхідний доступ до певного ресурсу. Він може бути використаний в певний момент часу тільки одним процесом.
Монітор:
monitor Розподілу_ресурсів;
var ресурс_зайнято : логічний;
ресурс_звільнено : логічний; {умова}
procedure Захопити_ресурс;
begin
if ресурс_зайнято then
wait(ресурс_звільнено);
ресурс_звільнено := правда;
end;
procedure Звільнити_ресурс;
begin
ресурс_зайнято := неправда;
signal(ресурс_звільнено);
end;
begin
ресурс_зайнято := неправда;
end;
Перевага такого монітору в тому, що він може працювати за аналогією до двійкового семафору:
„захопити ресурс” = P – оператор;
„звільнити ресурс” = V – оператор.
Тому монітори, як мінімум, мають таку ж логічну потужність, як і семафори.
Сучасні операційні системи будуються, як правило у вигляді множини асинхронних паралельних процесів, які працюють під керуванням ядра.
Процеси, що організовують паралельні роботи, виконуються незалежно, але вимагають періодичної взаємодії. Тому необхідні засоби для обміну даними між процесами. Одним із таких засобів є кільцевий буфер. Він застосовується в тих випадках, коли процес-виконавець повинен передати дані процесу-споживачу.
Кільцевий буфер
Кільцевий буфер це структура даних для буферизації обміну інформацією між процесами.
Виконавцю іноді потрібно передати дані в той час як споживач ще неготовий їх прийняти. Споживач іноді намагається отримати дані які виконавець ще не передав. Тому необхідно мати відповідні засоби синхронізації процесу-виконавця та процесу-споживача.
За допомогою монітору процес виконавець, виявивши, що буфер заповнено очікує спорожнення буфера, викликавши функцію Wait(буфер_не_заповнений), процес-споживач виявивши, що буфер порожній викликає функцію очікування Wait(буфер_не_порожній). Виконавець після розміщення даних в буфері видає повідомлення Signal(буфер_не_порожній), а споживач вибравши дані з буферу встановлює сигнал Signal(буфер_не_заповнений).
В ОС часто передбачається виділення деякої фіксованої кількості комірок пам’яті дляристання в ролі буферу. Цей буфер можна представити у вигляді масиву заданого розміру. Процес-виконавець розміщує дані, що передаються в послідовні елементи цього масиву. Процес споживач читає дані в тому порядку, в якому вони розміщувалися. З часом коли заповниться останній елемент ділянки пам’яті, то буфер продовжується заповнятися з перших елементів масиву. При цьому приймається до уваги, що споживач уже вибрав дані з цих елементів. Такий процес утворює замкнуте кільце, тому і називається кільцевим буфером.
Виконавець може випереджати споживача, тоді з часом він заповнить увесь буфер. У такому випадку процесу-виконавцю необхідно зачекати доки процес-споживач звільнить хоча б один або декілька елементів масиву. Для очікування можна використати монітор.
Механізм кільцевого буферу зручний для реалізації керування спулінгом в ОС.
Спулінг – буферизація вхідних та вихідних потоків.
Перший процес записує дані в буфер-спулер. Другий процес, який читає дані з кільцевого буферу і видає їх, наприклад, на друк, називається деспулером. Він може працювати зі значно меншою швидкістю. Тому кільцевий буфер повинен бути достатньо великого розміру, щоб узгодити швидкості спулера та деспулера.
Кільцевий буфер може розміщатися в основній пам’яті, але частіше його розміщують у зовнішній пам’яті.
Конвеєр (програмний канал)
Конвеєр (pipe – програмний канал, транспортер) є засобом, за допомогою якого можна виконувати обмін даними між процесами. Тобто конвеєр це потік даних між двома або більше процесами. Задачі (процеси), що передають/приймають дані в конвеєр, діють так ніби обмін інформацією здійснюється через файл.
Конвеєри це не файли на диску, а буферна пам’ять, яка працює за принципом FIFO, тобто за принципом звичайної черги. Конвеєр має певний розмір і працює як циклічний кільцевий) буфер. Він складається з ділянки пам’яті та двох покажчиків head – вказує на перший елемент даних, tail – на останній.
SHAPE \* MERGEFORMAT Head
Tail
Head
Tail

Рис. __
В початковий момент часу покажчики рівні нулю. Коли в конвеєр додається елемент, то він записується в масив за зміщенням на яке вказує покажчик tail, а сам покажчик збільшується на 1. Кожне додавання елементу к конвеєр приводить до збільшення цього покажчика. Коли з конвеєра вичитуються інформація, то дані беруться з позиції на яку вказує покажчик head, після він також збільшується на 1. В результаті виконання операцій запису (додавання) та читання (вилучення) елементів, покажчики будуть прямувати до кінця масиву. Після досягнення кожним з покажчиків кінця масиву він перевстановлюється на початковий елемент. Тобто масив замикається у кільце шляхом відслідковування покажчиків голови (head) та хвоста (tail) черги.
Канал описується ідентифікатором, розміром та двома покажчиками. Конвеєр – це системний ресурс. Щоб почати роботу з конвеєром, процес повинен на нього в ОС і отримати у своє розпорядження його ідентифікатор. Тільки процеси, що знають ідентифікатор конвеєра можуть обмінюватися через нього даними.
Черги повідомлень (Queue)
Це складніший, в порівнянні з каналами, метод зв’язку між процесами. За допомогою черг можна організувати такий обмін, коли декілька процесів поставляють повідомлення деякій задачі-приймачу. При цьому тільки процес-приймач може читати та вилучати повідомлення з черги, а процеси-клієнти мають право тільки розміщати в чергу свої повідомлення. Таким чином черга працює тільки в одному напрямку. Якщо необхідний двосторонній зв’язок, то потрібно створити дві черги.
Черга та конвеєр мають наступні відмінності:
1) Черги повідомлень дають можливість реалізувати декілька дисциплін обробки:
FIFO – записано першим, прочитано першим;
LIFO – записано останнім, прочитано першим;
пріоритетний – повідомлення вичитуються з врахуванням їх пріоритетів;
довільний – повідомлення можна вичитувати в довільному порядку.
Канал забезпечує тільки дисципліну FIFO.
2) Прочитане з конвеєра повідомлення, вилучається з нього. При читанні з черги, повідомлення автоматично не вилучається з неї, тому при необхідності, може бути прочитане декілька разів.
3) У чергах знаходяться не самі повідомлення, тільки їх адреси в пам’яті та розмір. Ця інформація розміщується в загальному сегменті пам’яті доступній всім задачам, що спілкуються за допомогою черги.
Кожний процес, який використовує чергу, повинен попередньо отримати дозвіл на використання спільного сегменту пам’яті. Черга – це також системний ресурс.
Під час читання з черги задача-приймач користується наступною інформацією:
- ідентифікатором процесу (PID) передавача повідомлення;
- адресою та довжиною повідомлення;
- ознакою очікування, коли черга порожня;
- пріоритетом повідомлення;
- номером семафору, який звільняється коли повідомлення поміщається в чергу.
Рандеву
Механізм „рандеву” – є одним із нових методів синхронізації та обміну даними між процесами (Ада).
Задача, що ініціює передачу даних, може звернутися до довільного входу задачі, якій ці дані передаються. Для цього задача адресат виконує команду Accert(задача_адресат), таким чином дає зрозуміти, що готова прийняти виклик по одному із своїх входів. Коли виклик приймається, то відбувається „рандеву”.
Процес, що викликає, передає дані пресові адресату як параметр виклику. Результати обробки також повертаються як параметр виклику. Доки програма адресат опрацьовує дані, програму, що ініціювала передачу перебуває в режимі очікування.
В „Аді” реалізовано спеціальний механізм для забезпечення гнучкого керування порядком обробки викликів. Він має наступний формат:
select
when умова_1 => accept вхід_1
послідовність операторів;

or when умова_2 => accept вхід_2
послідовність операторів;

or …

else
послідовність операторів;

end select;
Відповідно до цього оператора, відбувається перевірка кожної з умов. Якщо умова задовольняється, то послідовність команд, що слідує за нею вважається відкритою. Якщо, перед послідовністю команд умови нема, то вони вважаються завжди відкритими.
Серед відкритих та вибраних входів вибирається один та відбувається „рандеву”. Якщо, жоден з відкритих входів не готовий до рандеву, виконується розділ else. Якщо такого розділу нема, то задача чекає нових викликів.
Особливість „рандеву” полягає в тому, що задача яка викликає на „рандеву” повинна знати про існування задачі, що викликається та кількість її входів. У той же час задача, що викликається, можу приймати виклики від довільної задачі. Причому таких задач може бути багато. Таким чином механізм „рандеву” несиметричний.
Синхронізація задач в процесі „рандеву” відбувається неявно. Після завершення „рандеву”, задачі, що чекають своєї черги обслуговуються за принципом FIFO.
Тупики
У багатопрограмній системі процес знаходиться в стані тупику, дідлоку (deadlock) або клінчу (clinch), якщо він очікує деякої події, яка ніколи не відбудеться.
Системна тупикова ситуація, чи „зависання” системи – це ситуація, коли один чи кілька процесів знаходяться у стані тупику (клінчу).
Одна із основних функцій ОС – розподілення ресурсів. Коли ресурси розподіляються поміж багатьма користувачами, кожному з яких надається право виключного керування виділеними йому ресурсами, можливе виникнення тупиків, які не дають процесам деяких користувачів хоч коли-небудь завершитися.
У більшості випадків в ОС тупики виникають у результаті звичайної конкуренції за право мати в розпорядженні певні ресурси (як правило, це ресурси послідовного використання).
Розглянемо таку ситуацію. Двом процесам, що працюють в багато-задачній системі, для виконання своєї роботи потрібні два ресурси, наприклад Друкарка та Диск.
SHAPE \* MERGEFORMAT Процес A

Захопити Друкарку

Захопити Диск

Звільнити Друкарку

Звільнити Диск

A1
A2
A3
A4
Процес B

Захопити Диск

Захопити Друкарку

Звільнити Диск

Звільнити Друкарку

B1
B2
B3
B4

Нехай після того як процес А захопив Друкарку (встановив блокуючи змінну) він був перерваний. Керування отримав процес В, який спочатку захопив Диск, але при виконанні наступної команди (захоплення Друкарки) був заблокований, так як Друкарка вже захоплена процесом А. Керування знову повертається процесу А, який пробує захопити Диск та блокується, оскільки Диск вже виділений процесу В. І в такому стані процеси А та В можуть знаходитися безмежно довго.
SHAPE \* MERGEFORMAT B
A
A1
A2
t
Взаємне блокування
Переривання процесу А
Блокування процесу B
Блокування процесу А
B1
B2

Можливі такі варіанти уникнення тупику:
SHAPE \* MERGEFORMAT B
A
A1
A3
t
Переривання процесу А
Блокування процесу B
B1
B1
A2
A4
Переривання процесу А
B2
B3
Розділення ресурсів до яких утворюється черга

SHAPE \* MERGEFORMAT B
A
A1
A3
t
Переривання процесу А
B1
A2
A4
B2
B3
Незалежне використання ресурсів
B4

Тупикові ситуації треба відрізняти від звичайних черг, хоча і ті і інші виникають при сумісному використанні ресурсів і зовні виглядають подібно: процес призупиняється та очікує звільнення ресурсу. Але черга – це нормальне явище, ознака високого коефіцієнту використання ресурсів при випадковому надходженні запитів. Вона виникає тоді, коли ресурс є недоступним у біжучий момент, але через деякий час він звільниться і процес продовжить своє виконання.
Тупик, навпаки, в деякому розумінні є ситуацією, що не розв’язується. Звичайна тупикова ситуація. Кожен з процесів утримує ресурс, якого потребує інший процес. Причому ні один з процесів не хоче звільнити ресурс, що належить йому. Кожен з процесів очікує звільнення ресурсу іншим процесом.
Для виникнення тупику необхідні наступні умови:
1) процеси вимагають надання їм права монопольного керування ресурсами, що їм виділяються (умова взаємо-виключення);
2) процеси утримують за собою ресурси, які їм виділені, очікуючи в той же час виділення додаткових ресурсів (умова очікування ресурсів);
3) ресурси неможливо відібрати у процесів (які їх утримують) доки ці ресурси не будуть використані для завершення роботи (умова неможливості перерозподілу);
4) існує кільцевий ланцюг процесів, у якому кожен процес утримує за собою один чи декілька ресурсів, що погрібні наступному процесові з ланцюжка (умова кільцевого очікування);
Виникнення тупику неможливе, коли не виконується хоча б одна із перелічених чотирьох умов. Стратегія боротьби з тупиками полягає в тому, щоб усунути хоча б одну із зазначених умов існування тупику.
Алгоритми планування процесів
Планування процесів включає в себе розв’язок наступних задач:
1) Вибір моменту часу для заміни процесу, що виконується.
2) Вибір процесу на виконання з черги готових процесів.
3) Переключення контекстів „старих” і „нових” процесів.
1) та 2) розв’язуються програмними засобами, а 3) в значній мірі апаратно.
Існує багато різних алгоритмів планування процесів, які по різному розв’язують ці три задачі. Найчастіше зустрічаються такі дві групи алгоритмів:
- побудовані на принципі квантування;
- побудовані на принципі пріоритетів.
В першому випадку зміна активного процесу відбувається, якщо:
- процес закінчився і покинув систему;
- процес перейшов в стан Очікування;
- закінчився квант процесорного часу, відведений даному процесові.
Процес, для якого закінчився його квант, переводиться в стан Готовність і очікує, коли йому буде надано новий квант процесорного часу, а на виконання у відповідності з певним правилом вибирається новий процес з черги готових. Жодний процес не захоплює процесор надовго, тому квантування широко використовується в системах розподілу часу.
Кванти, що виділяються процесам, можуть бути однаковими для всіх процесів, або різними. Кванти для одного процесу можуть бути фіксованої величини або змінюватись в різні періоди життя процесу. Процеси, які не повністю використали виділений їм квант (наприклад через переривання на ввід/вивід), можуть отримати або не отримати компенсацію у вигляді привілеїв при наступному обслуговуванні. По-різному може бути організована черга готових процесів:
- циклічно;
- FIFO (перший прийшов — перший обслуговується);
- LIFO (останній прийшов — перший обслуговується ).
SHAPE \* MERGEFORMAT
Виконання
Готовність
Очікування
Граф станів першої групи алгоритмів планування

В другому випадку використовується поняття ”пріоритет”. Пріоритет — це число, яке характеризує ступінь привілейованості процесу при використанні ресурсів комп’ютеру, зокрема, процесорного часу. Чим вище пріоритет, тим вище привілеї, тим менше часу він буде проводити в чергах.
Пріоритетами можуть призначатьсь адміністратором системи в залежності від важливості роботи, або внесеної плати, або обчислюватись самою ОС за певними правилами. Він може залишатись фіксованим на протязі всього життя процесу або мінятись в часі у відповідності з деяким законом. В останньому випадку пріоритети називають динамічними.
Є алгоритми які використовують:
- відносні пріоритети;
- абсолютні пріоритети.
Але вибір процесу на виконання з черги готових виконується однаково: вибирається процес, що має найвищий пріоритет.
Інакше розв’язується проблема визначення моменту зміни активного процесу.
У системах з відносними пріоритетами активний процес виконується доти, доки він сам не покине процесор, виконавши перехід в стан Очікування (або ж виникне помилка, або процес завершиться).
SHAPE \* MERGEFORMAT
Виконання
Готовність
Очікування
Граф станів процесів у системах з відносними пріоритетами

У системах з абсолютними пріоритетами виконання активного процесу переривається ще й при умові: якщо в черзі готових процесів з’явився процес, пріоритет якого вище пріоритету активного процесу. В цьому випадку перерваний процес переходить в стан готовності.
SHAPE \* MERGEFORMAT
Виконання
Готовність
Очікування
Граф станів процесів у системах з абсолютними пріоритетами

У багатьох ОС алгоритми планування побудовані з використанням як квантування, так і пріоритетів. Наприклад, в основі планування лежить квантування, але величина кванту так/або порядок вибору процесу з черги готових визначається пріоритетами процесів.
Витісняючі та невитісняючі алгоритми планування
Існує два основні типи процедур планування процесів — витісняючі (preemptive) та невитісняючі (non-preemptive — cooperative).
Non-preemptive multitasking — невитісняюча багатозадачність — це спосіб планування процесів, при якому активний процес виконується до того часу, доки він сам, за власною ініціативою, не віддасть керування планувальнику ОС для того, щоби той вибрав з черги інший, готовий до виконання процес.
Preemptive multitasking — витісняючи багатозадачність — це такий спосіб, при якому рішення про переключання процесора з виконання одного процесу на виконання іншого процесу приймається планувальником ОС, а не самою активною задачею.
Типи багатозадачності — це більш широкі поняття ніж типи пріоритетності. Пріоритети задач можуть використовуватись або не використовуватись, як при витісняючих так і невитісняючих способах планування.
Основна відмінність між preemptive та non-preemptive — це ступінь централізації механізму планування задач.
У першому випадку механізм планування задач повністю зосереджено в ОС і програміст пише прикладну програму, не піклуючись про те, що вона буде виконуватись паралельно з іншими задачами. У цьому випадку ОС виконує такі функції:
1. Визначає час, коли знімається з виконання активна задача.
2. Запам’ятовує її контекст.
3. Вибирає з черги готових задач наступну.
4. Запускає вибрану задачу на виконання, завантажуючи її контекст.
У другому випадку механізм планування розподілено між ОС і прикладними програмами. Прикладна програма, отримавши керування від ОС сама визначає момент завершення своєї чергової ітерації і передає керування ОС за допомогою системного виклику. ОС формує черги задач і вибирає у відповідності з деяким алгоритмом (наприклад, із врахуванням пріоритетів) наступну задачу на виконання. Такий механізм досить складний як для користувачів, так і для розробників.
Програміст повинен забезпечити „дружнє” відношення своєї програми до інших, що виконуються одночасно. Тобто досить часто віддаючи їм керування.
Але такий підхід дає можливість розробнику прикладних програм самому проектувати алгоритм планування, який найбільш підходить для даного фіксованого набору задач. Також суттєва перевага — більш висока швидкість переключення з задачі на задачу.
Файл-сервер NetWare — висока швидкість виконання файлових операцій. Менш ефективно в ОС Windows 3.ХХ
Але зараз практично в усіх ОС-preemptive — (UNIX Windows NT/95/98, OS/2). Можливо, саме тому витісняючу багатозадачність часто називають істинною, справжньою багатозадачністю.
Нитки, потоки (Thread)
Багатозадачність — найважливіша властивість ОС. Для підтримки цієї властивості ОС визначає і створює для себе ті внутрішні одиниці роботи, між якими і буде розділятись процесор і інші ресурси комп’ютера.
ОС підтримує відокремленість процесів. У кожного процесу є свій віртуальний адресний простір, кожному процесу призначаються свої ресурси: файли, вікна, семафори і т.ін. це для того, щоби захистити один процес від іншого.
При мультипрограмуванні підвищується пропускна здатність системи в цілому, але окремий процес ніколи не може бути виконаний швидше, ніж у випадку його виконання в одно програмному режимі (йде час на очікування ресурсу, що розділяється).
Але задачі, яка розв’язується в рамках одного процесу, може бути притаманний внутрішній паралелізм, який в принципі дозволяє прискорити її розв’язок. Наприклад, в ході виконання задачі відбувається звертання до зовнішнього пристрою і на час цієї операції можна не блокувати повністю виконання процесу, а продовжити виконання іншої „гілки” процесу.
Для цього пропонується механізм багато-ниткової обробки (multithreading). Вводиться нове поняття „нитка” (thread). Мультипрограмування тепер реалізується на рівні ниток. Наприклад: якщо електронна таблиця була розроблена з врахуванням можливостей багато-ниткової обробки, то користувач може запросити перерахунок своєї таблиці і одночасно продовжувати її заповнювати. Багато-нитковий сервер може паралельно виконувати запити одразу декількох клієнтів.
Оскільки всі нитки одного процесу завжди належать одній прикладній програмі, між ними досить легко організувати тісну взаємодію. Програміст може завчасно продумати роботу множини ниток процесу таким чином, щоби вони могли взаємодіяти, а не боротись за ресурси.
Нитки в багатьох відношеннях потрібні процесам, але в рамках одного процесу не є такими незалежними, як процедури:
- всі нитки мають один адресний простір;
- вони розділяють одні і ті самі глобальні змінні;
- кожна нитка має доступ до довільної віртуальної адреси, але одна нитка може використовувати стек іншої;
- між нитками немає повного захисту, всі нитки розділяють один набір відкритих файлів, таймерів, сигналів і т. ін.
Таким чином нитки мають власні:
- програмний лічильник;
- стек;
- регістри;
- нитки-нащадки;
- стани.
Нитки розділяють:
- адресний простір;
- глобальні змінні;
- відкриті файли;
- таймери;
- семафори;
- статистичну інформацію.
Приклад. Керування сигналами, наприклад, переривання з клавіатури (delete або break).
Замість обробки сигналу переривання одна нитка призначається для постійного очікування надходження сигналів. Таким чином, нитки можуть скоротити необхідність в перериваннях рівня користувача.
Висновки.
Головне, що забезпечують нитки, це можливість паралельно виконувати декілька видів операцій в одній прикладній програмі. Паралельні обчислення, а значить і більш ефективне використання ресурсів CPU та менший сумарний час виконання задач, тепер вже реалізується на рівні ниток. Програма, побудована у вигляді ниток в рамках одного процесу, може бути виконана швидше.
Наприклад: Текстовий процесор з врахуванням багато-ниткової (багато-потокової) обробки. Користувач може запросити об’єднання двох документів і одночасно відкривати для редагування наступний документ.
Об’єкт „процес” припускає, що при диспетчеризації треба враховувати всі ресурси, що закріплені за процесом. А при роботі з нитками можна міняти тільки контекст задачі, якщо ми переключаємось з однієї нитки на іншу в рамках одного процесу. Всі інші обчислювальні ресурси при цьому не торкаються. Кожний процес складається, як мінімум, з однієї нитки і тільки якщо є внутрішній паралелізм, програміст може розщепити його на декілька паралельних ниток.
В багатопроцесорних системах зі спільною пам’яттю нитки вже просто необхідні, оскільки вони дозволяють завантажити всі процесорні елементи роботою. Але зауважимо, що бажано зменшити взаємодію ниток між собою, оскільки прискорення від одночасного виконання паралельних потоків може бути зведено до мінімуму через затримки синхронізації і обмін даними.
Для того, щоби можна було ефективно організувати паралельне виконання як процесів, так і ниток, в архітектуру сучасних процесорів включається можливість працювати із спеціальною інформаційною структурою, яка описує або процес або нитку. Для цього на рівні архітектури мікропроцесора використовується поняття „задача” — task. Воно об’єднує в собі як процес, так і нитку.
Це поняття і інформаційна структура, яка підтримується для нього на рівні апаратури, дозволяє в подальшому побудувати відповідні дескриптори. Вони будуть відрізнятись перш за все тим, що:
- дескриптор нитки може зберігати тільки контекст призупиненого обчислювального процесу;
- дескриптор процесу повинен вміщувати поля, які описують всі ресурси, які виділені цьому процесові.
Лекція 5
Керування ресурсами
Найважливіші ресурси — це пам’ять та процесор (тобто процесорний час).
Керування пам’яттю
Організація та керування основною, або первинною, або фізичною (реальною) пам’яттю комп’ютера — один з найважливіших факторів, що визначає побудову операційних систем.
Для безпосереднього виконання програм або звертання до даних необхідно, щоб вони розміщались в основній пам’яті. Вторинна, або зовнішня пам’ять — це, як правило, накопичувачі на магнітних дисках, магнітних стрічках — мають значно більшу ємність, і дозволяють зберігати велику кількість програм і даних, готових до обробки.
Ієрархія пам’яті
Поки що розглядаємо фізичну або реальну пам’ять, а далі — віртуальну пам’ять.
Під організацією пам’яті ми розуміємо те яким чином представляється та використовується основна пам’ять. При цьому виникають такі питання:
1) розміщаємо в основній пам’яті тільки одну програму користувача або декілька програм одночасно;
2) при розміщенні в основній пам’яті декількох програм користувачів відразу, їм надається однакова кількість комірок, чи вона розбивається на розділи різних розмірів.
3) пам’ять розбивається на розділи жорстко певним чином на досить довгий період часу, або передбачено більш динамічне розбиття, яке дозволяє комп’ютеру швидко реагувати на зміну потреб програм у ресурсах;
4) програми користувачів будуть будуватися таким чином, щоб вони виконувались тільки в конкретному розділі, або буде передбачатись можливість виконання програми в довільних розділах;
5) програма користувача буде розміщатися в одному неперервному, суцільному блоці пам’яті, або є можливість розбиття програм на окремі блоки, які розміщаються в яких завгодно вільних ділянках (дірках) основної пам’яті.
При цьому виникають такі можливості:
1) одно-програмні (одно-абонентні) системи;
2) багатопрограмні системи з фіксованими розділами, з трансляцією та завантаженням модулів в абсолютних адресах;
3) багатопрограмні системи з фіксованими розділами пам’яті, з трансляцією та завантаженням модулів, що переміщаються;
4) багатопрограмні системи із змінними розділами;
5) система із свопінгом (підкачкою, сторінковим обміном).
Існують системи, побудовані з орієнтацією на кожну з таких схем.
Незалежно від того, яку схему організації пам’яті ми приймемо для конкретної системи, необхідно вирішити, які стратегії треба застосувати для досягнення оптимальних характеристик використання пам’яті.
Стратегії керування пам’яттю визначають яким чином буде працювати пам’ять конкретної системи при різних підходах до вирішення таких питань:
1) коли треба розміщувати нову програму в пам’яті;
2) будемо ми розміщувати нову програму в пам’яті тоді, коли система буде сама про це просити, чи будемо намагатись випередити запити системи;
3) в яке місце основної пам’яті ми будемо розміщати чергову програму для виконання;
4) чи будемо ми розміщати програми як можна більш щільно, щоб звести до мінімуму втрати пам’яті, чи будемо прагнути до найшвидшого розміщення програм, щоб звести до мінімуму втрати машинного часу;
5) якщо в основну пам’ять необхідно розмістити нову програму, а основна пам’ять в біжучий момент вже заповнена, то яку з інших програм треба вивести з пам’яті (ті, що знаходились в пам’яті довше, ніж інші, або ті, що використовувались найменш часто, або ті, які довше всіх не використовувались).
Існують системи, що орієнтовані на використання кожної з таких стратегій керування пам’яттю.
SHAPE \* MERGEFORMAT Сучасна ієрархія пам’яті
Кеш-пам’ять
Основна
(первинна)
пам’ять
Зовнішня
(вторинна)
пам’ять
Час доступу до пам’ятізменшується.
Швидкість доступу до пам’ятіросте.
Вартість пам’яті з розрахунку на біт зменшується.
Ємність пам’ятіросте.
Центральний процесор має прямий доступ до даних, що зберігаються у цій пам’яті.
Для доступу центрального процесора до даних, що зберігаються у цій пам’яті, їх необхідно переписати в основну пам’ять.

Як було вже сказано, стратегії керування пам’яттю направлені на те, щоб забезпечити найкраще можливе використання ресурсів основної пам’яті. Стратегії керування пам’яттю поділяються на такі категорії:
1. Стратегії вибірки:
а) вибірка за запитом;
б) випереджуюча вибірка;
2. Стратегії розміщення.
3. Стратегії заміщення.
Перші. Мають своїм призначенням визначати, коли треба „вштовхнути” черговий блок програми або даних в основну пам’ять:
- при вибірці за запитом черговий блок програми або даних завантажується в основну пам’ять, коли є на неї запит від працюючої програми;
- при випереджуючій вибірці виникають додаткові затримки, зв’язані з приготуванням подальшого ходу програми.
Другі. Визначають, в яке місце основної пам’яті треба розмістити програму, яка надходить.
Треті. Визначають, який блок програми, або даних треба вивести „виштовхнути” з основної пам’яті, щоб звільнити місце для запиту поступаючи програм або даних.
Розподіл пам’яті
В перших комп’ютерах було реалізовано зв’язний розподіл пам’яті — в одному неперервному блоці комірок пам’яті. Тільки після того, як з’явилось мультипрограмування з розділами змінного розміру стало зрозумілим, що значно більш ефективним може бути незв’язний розподіл.
При незв’язаному розподілі пам’яті, програми розбиваються на декілька блоків або сегментів, які розміщуються в основній пам’яті в ділянках які не обов’язково розташовані поряд.
ОС набагато складніше забезпечити незв’язаний розподіл пам’яті, але подібний підхід має важливу перевагу: якщо основна пам’ять має декілька невеликих вільних ділянок замість одного великого, то ОС все ж таки може завантажити та виконати програму, якій в іншому випадку треба було б чекати.
Зв’язний розподіл пам’яті для одного користувача
Кожному користувачу виділяється неперервний сегмент пам’яті. Розмір програм у звичайному випадку обмежується ємністю основної пам’яті, але існує можливість виконання програм, які перевищують за розміром основну пам’ять. Це досягається за допомогою концепції оверлейних сегментів. На рисунку приведено розподіл пам’яті для програми користувача, якій необхідно виділити більший об’єм пам’яті, ніж існуюча ємність ОП.
SHAPE \* MERGEFORMAT Перекриття (overlay)
Оверлейна ділянка
Розподіл пам’яті з перекриттям
ОС
Резидентначастинапрограми
0
a
b
c
Вільна пам’ять
Модуль ініціалізацій
Модуль обробки
Модуль виводу результатів
1
2
3
b
b
b

Мультипрограмування з фіксованими розділами
При розподілі пам’яті при мультипрограмуванні розглядають завантаження програм за абсолютними та змінними адресами.
При використанні абсолютних адрес, у кожному розділі розміщується одне завдання. ЦП швидко переключається з завдання на завдання, створюючи ілюзію одночасного їх виконання.
Трансляція завдань виконується за допомогою асемблерів та компіляторів в абсолютних адресах з розрахунком на виконання тільки в конкретному розділі. Якщо завдання було готове для виконання, а його розділ в цей час був зайнятий, то завдання буде очікувати не дивлячись на те, що інші розділи були вільні.
Переміщаючі компілятори асемблери та завантажувачі створюють модулі, що можуть працювати в довільному розділі.
В таких системах захист пам’яті частіше всього реалізується за допомогою декількох граничних регістрів. Два регістри дозволяють вказувати верхню та нижню межу розділу користувача, або одну з меж та розмір розділу.
Схема розподілу пам’яті при використанні фіксованих розділів приведена на рис. __.
SHAPE \* MERGEFORMAT Розподіл пам’яті з фіксованими розділами
ОС
Задача А
Вільна пам’ять
Розділ 0
Задача В
Вільна пам’ять
Задача С
Вільна пам’ять
Вільна пам’ять
Розділ 1
Розділ 2
Розділ 3
Розділ N
. . .

Мультипрограмування із змінними розділами
Коли треба дозволити завданням займати стільки місця (в межах фізичної пам’яті) скільки їм необхідно, тоді межі розділів не фіксуються.
Але яка завгодно схема організації пам’яті дає певні втрати. В цій схемі втрати виникають тоді, коли завдання починають закінчуватись, а в основній пам’яті залишаються вільні ділянки, або „дірки”. Ці „дірки” можна використовувати для розміщення інших завдань, але „дірки” все одно будуть, тільки меншого розміру в які вже неможливо завантажити іншу задачу. В таких випадках використовують об’єднання „дірок” в пам’яті.
Часто буває так, що в усій основній пам’яті залишаються розкиданими окремі „дірки”, які складають значний об’єм пам’яті. Проблема вирішується ущільненням пам’яті.
ОС обирає всі блоки в роботі разом, залишаючи вільну пам’ять у вигляді одної великої ділянки.
При реалізації цього методу керування пам’яттю ОС вирішує такі задачі.
1. Підтримка таблиць вільних і зайнятих областей, в яких вказуються початкові адреси і розміри ділянок пам’яті.
2. При надходженні нової задачі — аналіз запиту, перегляд таблиці вільних областей та вибір розділу пам’яті, розмір якого достатній для розміщення задачі, що надійшла.
3. Завантаження задачі в виділений їй розділ та коректування таблиць вільних та зайнятих областей.
4. Після завершення задачі знову коректування таблиць вільних і зайнятих областей.
SHAPE \* MERGEFORMAT Розподіл пам’яті з розділами змінної довжини
ОС
Задача А
Розділ 0
Задача В
Задача С
Вільна пам’ять
Розділ 1
Розділ 2
Розділ 3
ОС
Задача А
Розділ 0
Задача С
Вільна пам’ять
Розділ 1
Розділ 2
Розділ 3
Вільна пам’ять
Задача D

Боротьба з фрагментацією
Фрагментація — наявність великої кількості несуміжних ділянок вільної основної пам’яті невеликого розміру (фрагментів). Фрагменти настільки малі, що жодна з програм, що надходить в систему, не може розміститись ні в одній з ділянок, хоча сумарний об’єм фрагментів досить великий.
Розділи, що переміщаються. Це один з методів боротьби з фрагментацією, коли всі заняті ділянки переміщуються або в сторону молодших адрес, або старших адрес, так, щоби вся вільна пам’ять створювала єдину вільну область.
Тобто ОС ще повинна час від часу копіювати вміст розділів з одного місця пам’яті в інше, коректуючи таблиці вільних і зайнятих областей. Це процедура „стискання”. Стискання може виконуватись або при кожному завершенні задачі, або тільки тоді, коли для нової задачі нема вільного розділу достатнього розміру.
В першому випадку треба меншої обчислювальної роботи при коректуванні таблиць, а в другому — не так часто виконується процедура стискання. Оскільки програми переміщуються по основній пам’яті під час свого виконання, то перетворення адрес повинно виконуватись динамічним способом.
Хоча процедура стискання і приводить до більш ефективного використання пам’яті, вона може вимагати значного часу, що часто в результаті не дає бажаних переваг.
Стратегії розміщення інформації в пам’яті
1. Стратегія найбільш відповідного (підходящого). Завдання розміщається в тій вільній ділянці, в якій йому найбільш „тісно”, так що залишається мінімально можливий простір, що не використовується.
2. Стратегія першого відповідного. Завдання розміщується в першу ліпшу вільну ділянку основної пам’яті достатнього розмір. (Швидкість).
3. Стратегія найменш відповідного. Завдання розміщується у вільну ділянку, що має найбільш далекий розмір, тобто максимально вільну ділянку.
Третя стратегія має наступне обґрунтування. Після розміщення програми в найбільш вільну ділянку, вільна ділянка, що залишається теж буде великою і в ньому можна розмістити відносно велику нову програму.
Всі системи, що розглядалися, припускають, що програми користувача залишаються в основній пам’яті до моменту звернення.
Схема, що називається „стопінг”, не накладає такого обмеження.
SHAPE \* MERGEFORMAT Розподіл пам’яті зі „стопінгом”
ОС
Задача B
Ділянка „стопінгу”
Вільна пам’ять
Задача А
Задача С
Задача D
Образи задач, що зберігаються у постійній пам’яті

Всю ОП в кожний біжучий момент часу займає одне завдання. Це завдання виконується доти, доки не вийде певний час, а потім звільнюється як пам’ять, так і ЦП для наступного завдання.
Така програма працює до того часу, доки не відбудеться одна з таких подій:
- видали запит на ввід/вивід;
- з’явиться сигнал таймера;
- програма закінчилась.
Область свопінгу для цієї програми копіюється в зовнішню пам’ять. Образ ОП для наступної програми завантажується в область свопінгу. Програма виконується до того часу, доки не відбудеться одна з подій.
Системи з розподілом часу. Сторінкова організація пам’яті.Концепція віртуальної (уявної) пам’яті.
Суть концепції віртуальної пам’яті полягає в тому, що адреси, до яких звертається процес, який виконується, відокремлюються від адрес, що реально існують в первинній пам’яті.
Ті адреси, на які робить посилання процес, що виконується, називаються віртуальними адресами, а ті, що існують в первинній пам’яті, - називаються реальними (або фізичними) адресами. Діапазон віртуальних адрес, до яких може звернутися працюючий процес, називаються простором віртуальних адрес (V) цього процесу.
Діапазон реальних адрес, що існують в конкретному комп’ютері, називаються простором реальних адрес (R) цього комп’ютера.
Незважаючи на те, що процеси звертаються тільки до віртуальних адрес, в дійсності вони повинні працювати з реальною пам’яттю. Тому, під час виконання процесу, віртуальні адреси необхідно перетворювати в реальні, причому це потрібно робити швидко, тому що в іншому випадку ефективність машини буде знижуватись, а ефективність віртуальної пам’яті падати.
Віртуальним називаються ресурс, якому в уяві користувача (програміста) або з точки зору програми користувача, притаманні якості, яких у нього в дійсності нема.
Так користувачу може бути надана в розпорядження віртуальна основна пам’ять, розмір якої перевищує всю реальну основну пам’ять, що є в системі. Програміст пише програми так, нібито в його розпорядженні є однорідна оперативна пам’ять великого об’єму, але в дійсності всі дані, що використовуються програмою, зберігаються на одному або декількох різнорідних запам’ятовуючих пристроях (звикло на дисках), і при необхідності частинами відображаються в реальну пам’ять.
Таким чином, віртуальна пам’ять – це сукупність програмно – апаратних засобів, що дозволяють програмістам писати програми, розмір яких перевищує реальну основну пам’ять. Для цього віртуальна пам’ять повинна розв’язувати такі задачі:
1. Розміщувати дані в запам’ятовуючих пристроях різного типу (ОП, диск)
2. Переміщувати дані при необхідності між запам’ятовуючими пристроями різного типу.
3. Перетворювати віртуальні адреси у фізичні.
Всі ці дії виконуються автоматично, без участі програміста. Тобто механізм віртуальної пам’яті є прозорим по відношенню до користувача.
Є різні механізми, наприклад: динамічного перетворення адрес (ДАТ) під час виконання процесів.
Суміжні адреси віртуального адресного простору не обов’язково будуть суміжними в реальній пам’яті. Таким чином, користувач звільнюється від необхідності враховувати розміщення своїх процедур і даних в реальній пам’яті Він пише програми найбільш природним чином.
Комп’ютер розглядається тільки як логічний засіб, що забезпечує реалізацію необхідних алгоритмів, а не фізична машина з унікальними характеристиками.
SHAPE \* MERGEFORMAT Організація віртуальної пам’яті
Суміжні комірки (блоки) віртуальної пам’яті

Віртуальна пам’ять
Фізичнапам’ять
Механізм відображення адрес

Стратегії керування віртуальною пам’яттю поділяються на три категорії:
Стратегія вштовхування – мета – визначити, коли треба переписати чергову сторінку або сегмент в основну пам’ять.
Стратегія розміщення – мета – визначити, в яке місце первинної пам’яті розміщати чергову сторінку або сегмент.
Стратегія виштовхування – визначає, яку сторінку або сегмент треба замінити, щоб звільнити місце для чергової сторінки або сегмента, коли первинна пам’ять повністю зайнята.
Способи організації пам’яті

Принцип кешування даних
Як було вже сказано, пам’ять комп’ютера є ієрархічною системою запам’ятовуючих пристроїв, що відрізняються середнім часом доступу та вартістю збереження даних в розрахунку на один біт. Користувач хоче мати недорогу і швидку пам’ять. Кеш-пам’ять є деяким компромісом у цій проблемі.
SHAPE \* MERGEFORMAT Ієрархія пам’яті
Зовнішня пам’ять
Основна пам’ять
Над оперативний ЗП
Регістри
Кешування
Ціна одного біту
Час доступу

Кеш-пам’ять – це спосіб організації сумісного функціонування двох типів запам’ятовуючих пристроїв, що відрізняються часом доступу і вартістю збереження даних, який дозволяє зменшити середній час доступу до даних за рахунок динамічного копіювання у „швидкий ЗП” тої інформації з „повільного ЗП”, яка найбільш часто використовується.
Часто кеш-пам’яттю називають „швидкий ЗП”. Його вартість більша, і він має порівняно невеликий об’єм. Механізм кеш-пам’яті прозорий (тобто програміст його не бачить). Програміст не повинен повідомляти ніякої інформації по інтенсивність використання даних і не повинен приймати участі у переміщенні даних з ЗП одного типу у ЗП іншого типу. Все це робиться автоматично системними засобами.
Розглянемо окремий випадок використання кеш-пам’яті для зменшення середнього часу доступу до даних, що зберігаються в основній пам’яті. Для цього між процесором і оперативною пам’яттю розміщується швидкий ЗП, який називаємо просто кеш-пам’яттю.
SHAPE \* MERGEFORMAT Призначення кеш-пам’яті
Кеш-пам’ять
Основна пам’ять
ЦП
„Повільна” відповідь
„Швидка” відповідь
Запит

Вміст кеш-пам’яті є сукупністю записів про всі елементи даних , що в неї завантажені. Кожний запис про елемент даних включає в себе адресу, яку цей елемент даних має в основній пам’яті, і керуючу інформацію:
- ознаку модифікації;
- ознаку звертання до даних за деякий останній період часу.
Структура кеш-пам’яті
В системах з кеш-пам’яттю кожний запит до основної пам’яті виконується в такий спосіб:
1) Перегляд вмісту кеш-пам’яті з метою визначення, чи не знаходяться вже потрібні дані в кеш-пам’яті. Кеш-пам’ять не є адресованою, тому пошук потрібних даних виконується за вмістом значення поля “адреси в оперативній пам’яті”, яке береться із запиту.
2) Якщо дані є в кеш-пам’яті, то вони читаються з неї і результат передається в процесор.
3) Якщо потрібних даних в кеш-пам’яті нема, то вони разом із своєю адресою копіюються з основної пам’яті в кеш-пам’ять і результат виконання запиту передається в процесор.
При копіюванні даних може виявитись, що в кеш-пам’яті нема вільного місця, тоді вибираються дані, до яких в останній період було найменше звертань, і вони вилучаються з кеш-пам’яті. Якщо дані, що вилучаються, були модифіковані за час знаходження в кеш-пам’яті, то вони переписуються в основну пам’ять. Якщо ж модифікації не було, то їх місце в кеш-пам’яті оголошується вільним.
На практиці в кеш-пам’ять зчитується не один елемент даних, до якого відбулося звертання, а цілий блок даних. Це збільшує ймовірність так званого ”попадання в кеш”, тобто знаходження потрібних даних в кеш-пам’яті.
Покажемо, що середній час доступу до даних залежить від ймовірності “попадання в кеш”. Припустимо, що маємо основний запам’ятовуючий пристрій із середнім часом доступу до даних t1 та кеш-пам’ять, з середнім часом доступу t2, зрозуміло, що t2 < t1.
Позначимо через t середній час доступу до даних в систем із кеш-пам’яттю, а через p – ймовірність попадання в кеш. За формулою повної ймовірності маємо:
t = t1 (1 - p) + t2 (p).
Бачимо, що середній час доступу до даних в системі із кеш-пам’яттю лінійно залежить від ймовірності попадання в кеш і міняється від середнього часу доступу в основний ЗП (при р = 0) до середнього часу доступу безпосередньо в кеш-пам’ять (при р = 1).
В реальних системах ймовірність попадання в кеш складає приблизно 0,9. Таке велике значення ймовірності знаходження даних в кеш-пам’яті пов’язано з наявністю у даних об’єктивних властивостей:
- просторова локальність;
- часова локальність.
Просторова локальність - якщо відбулося звертання за деякою адресою, то з високим степенем ймовірності в найближчий час відбудеться звертання до сусідніх адрес.
Часова локальність - якщо відбулося звертання за деякою адресою, то наступне звертання за тою ж адресою з великою ймовірністю відбудеться в найближчий час.
Всі ці міркування справедливі і для інших пар запам’ятовуючих пристроїв. Наприклад, для основної пам’яті і зовнішньої пам’яті. В цьому випадку зменшується середній час доступу до даних, розташованих на диску, а роль кеш-пам’яті виконує буфер в основній пам’яті.
Керування процесорами
Процеси отримують можливість виконувати конкретну роботу, коли в їх розпорядження надаються фізичні процесори. Розподіл процесорів по процесам – це складна задача, яку вирішують операційні системи. Визначення того, коли слід виділяти процесори і яким саме процесам - називається плануванням.
Планування на верхньому рівні або планування завдань. Засоби цього рівня визначають, яким завданням буде дозволено активно конкурувати за захоплення ресурсів системи. Цей вид планування іноді називають також плануванням допуску, оскільки на цьому рівні визначається, які завдання будуть допущені в систему.
Планування на проміжному рівні. Засоби цього рівня визначають, яким процесам буде дозволено змагатись за захоплення ЦП. Планувальник проміжного рівня оперативно реагує на біжучі зміни системного навантаження, короткочасно припиняючи і знову активізуючи процеси, що забезпечує рівномірну роботу системи й допомагає досягненню певних глобальних цільових характеристик швидкості. Таким чином, планувальник проміжного рівня виконує функції буферу між засобами допуску завдань в систему та засобами надання ЦП для виконання цих завдань.
Планування на нижньому рівні. Засоби цього рівня визначають, якому з процесів, що готові до виконання, буде надаватись ЦП, який звільнився. Вони (ці засоби) фактично надають ЦП такому процесу (тобто виконують диспетчерські функції). Планування на нижньому рівні виконується так званим диспетчером, який працює з великою частотою й тому завжди повинен розташовуватись в основній пам’яті.
Планування повинно:
1) бути справедливим, тобто однаково відноситись до всіх процесів.
2) забезпечувати максимальну пропускну здатність системи.
3) забезпечувати максимальній кількості користувачів допустимий час відповіді.
4) забезпечувати передбачуваність, мінімальні накладні витрати, збалансоване використання ресурсів.
5) виключати нескінчене відкладання процесів;
6) враховувати пріоритети;
7) і т.д.
Багато з цих вимог вступають в протиріччя одне до одного, що робить планування вельми складною проблемою.
SHAPE \* MERGEFORMAT Рівні планування завантаження процесорів
Активніпроцеси
Завдання,що чекаютьна ввід в систему
Ввід завдань
Завдання,що чекаютьна запуск
Запуск завдань
Припинені процеси, що чекають на активізацію
Припинення
Активізація
Процеси,що виконуються
Запуск потоку
Зупинка потоку
Процеси,що завершилися
Завершення
Плануванняверхнього рівня
Плануванняпроміжного рівня
Плануваннянижнього рівня(диспетчеризація)

Планування з переключення та без переключення
Якщо після надання ЦП в розпорядження деякого процесу, відібрати ЦП у нього не можна, то має місце дисципліна планування без переключення. Інакше має місце дисципліна з переключенням.
Планування з переключенням необхідно в системах, в яких процеси високого пріоритету вимагають негайної уваги.
Наприклад: Якщо в системах реального часу пропаде хоча б один важливий сигнал переривання, це може привести до катастрофічних наслідків.
В системах без переключення, коротким завданням треба більше чекати через виконання тривалих завдань, але для всіх завдань створюються ніби-то рівні умови. Час відповіді тут легше передбачити, оскільки завдання високого пріоритету, що надходять, не можуть відтіснити завдання, що вже чекають.
Процес працює, якщо в біжучий момент процесор є в його розпорядженні. Якщо мова йде про процес ОС, то це означає, що в біжучий момент працює ОС, причому вона може приймати рішення, що впливають на функціонування всієї машини. Для того, щоб не допустити монополізації системи користувачем, в ОС передбачаються механізми, які дозволяють відбирати ЦП у користувача.
а) Інтервальний таймер
ОС встановлює годинник або інтервальний таймер, який генерує сигнал переривання в деякий конкретний момент часу в майбутньому. Після переривання ЦП передається наступному процесу. Який, зберігає за собою керування ЦП, доки не закінчиться або не перерветься.
Таймер гарантує можливий час відповіді для користувачів в діалоговому режимі, не допускає „зависання” системи з причини за-циклювання. А також дозволяє процесам відповідним чином реагувати на події, що залежать від часу.
б) Пріоритети
Статичні пріоритети. Призначаються один раз. Для їх реалізації необхідні незначні витрати, але вони не реагують на зміни в середовищі, які можуть вимагати корекції пріоритетів.
Динамічні пріоритети. Реагують на зміни в ситуації. Вимагають більших витрат. Але система стає більш реактивною, краще використовує ресурси.
Пріоритети, що купуються. Система повинна надавати привілейоване обслуговування для тих ситуацій, коли якому-небудь користувачеві це потрібно. Користувач, якому необхідно терміново виконати своє завдання, може піти на додаткові витрати (платню) за більш високий рівень обслуговування. Якби не бралась більш висока платня за привілеї, то всі користувачі хотіли б більш високий рівень обслуговування.
в) Планування за терміном завершення
Організується таким чином, що певні процеси закінчувались в визначені терміни. Таке планування – складна проблема, особливо в умовах, коли в проміжок між моментом початку виконання процесу та запланованим строком його завершення в систему можуть поступати додаткові завдання.
г) Планування за принципом FIFO
Це дисципліна планування без переключення, при якій процесам надається ЦП у відповідності з часом їх надходження у список готових до виконання.
Таке планування найчастіше застосовується в системах пакетної обробки, але воно не дозволяє гарантувати можливий (допустимий) час відповіді для інтерактивних користувачів.
SHAPE \* MERGEFORMAT Планування за принципом FIFO
ЦП
С
Готові процеси
В
А
Завершення

д) Циклічне планування (RR)
SHAPE \* MERGEFORMAT Циклічне планування (RR)
ЦП
С
Готові процеси
В
А
Завершення
А
Перемикання

Циклічне, або кругове (round robin, RR). Диспетчеризація виконується за принципом FIFO, але кожний раз процесу надається обмежена кількість часу ЦП, що називається квантом. Процес, у якого був перехоплений ЦП, переходить в кінець списку готових до виконання процесів. Така дисципліна (RR) ефективна для роботи з розподілом часу, коли система повинна гарантувати можливий час відповіді для всіх інтерактивних користувачів.
Визначення оптимального розміру кванту – складна задача. Як правило, його вибирають настільки великим, що більшість тривіальних пересічних запитів можна було б повністю обслужити в рамках одного кванту.
е) Планування за принципом SIF (“найкоротше завдання - перший”)
Планування без переключень застосовується перш за все для планування пакетних завдань. Воно забезпечує мінімальний середній час очікування для завдань, але для тривалих завдань час очікування може виявитись великим.
Надається перевага коротким завданням за рахунок більш тривалих. Чергове завдання вибирається таким чином, щоб воно завершувало свою роботу та виходило з системи як можна швидше. В результаті ця дисципліна дозволяє звести до мінімуму середній час очікування для завдань, що проходять через систему.
Проблема: треба точно знати, скільки часу вимагає завдання або процес.
Можна “консервувати” процеси. Не застосовується в системах розподілу часу, де необхідно гарантувати можливий час відповіді.
є) Принцип SRT (“за найменшим часом, що залишається”)
Аналог SIF, але з переключенням. Завжди виконується процес, який має мінімальний за оцінками час до завершення, причому з врахуванням нових процесів, що надходять. Треба, щоб враховувався час на обслуговування, що минув, а це приводить до збільшення накладних витрат.
ж) Принцип HRN (“за найбільшим відносним часом відповіді”)
Це планування без переключення, при якому в деякій мірі коректуються деякі недоліки SIF, зокрема перебільшене ігнорування довгих завдань та надання переваги коротким новим завданням.
SHAPE \* MERGEFORMAT Планування зі застосуванням багаторівневих черг зі зворотними зв’язками
ВикористанняЦП
К
Рівень 1, FIFO
В
А
Завершення
. . .
ВикористанняЦП
К
Рівень 2, FIFO
В
А
Завершення
. . .
. . .
ВикористанняЦП
К
Рівень N, RR
В
А
Завершення
. . .
Перемикання

з) Багаторівневі черги зі зворотними зв’язками
Це найбільш досконалий механізм планування. Це система планування з переключенням, яка найбільш ефективна для систем, де виконується суміш різнорідних завдань.
Нові процеси надходять в мережу черг з дуже високим початковим пріоритетом і швидко обслуговуються, якщо вони або інтерактивні, або залежать від вводу/виводу. Процеси, що лімітуються ЦП, повністю використовують виділений їм квант часу, а потім переходять в кінець черги наступного, більш низького пріоритетного рівня. Чим довше такий процес займає ЦП, тим нижче робиться його пріоритет, доки процес не спускається в чергу найнижчого пріоритету, яка реалізує принцип циклічного обслуговування (RR) і в якій він циркулює до того часу, доки не завершиться. Як правило, квант часу, що надається процесу, збільшується з переходом процесу в кожну наступну чергу.
Така дисципліна – це приклад адаптивного механізму планування, який реагує на зміну поведінки системи, що ним контролюється.
Керування даними. Файлова система
Файл – сукупність даних, що має своє ім’я. Звичайно розміщується на пристрої зовнішньої пам’яті, наприклад на магнітному диску чи стрічці. З файлом можна виконувати маніпуляції як з одним цілим компонентом за допомогою таких операторів:
відкрити (open) – підготовляє файл до звертання;
закрити (close) – забороняє подальше звертання до файлу, доки він не буде знову відкритий;
створити (create) – забезпечує формування нового файлу;
знищити (destroy, kill) – руйнує файл;
копіювати (copy) – створює ще один екземпляр існуючого файлу з новим іменем;
перейменувати (rename) – змінити ім’я файла;
вивести (list) – забезпечує друк лістингу або відтворення вмісту файла на екрані.
Маніпуляції з індивідуальними елементами даних в рамках файлу можна виконувати за допомогою таких операторів:
прочитати (read) – забезпечує ввід елемента даних з файла в процес;
записати (write) – забезпечує вивід елементу даних з процесу в файл;
обновити (update) – забезпечує модифікацію існуючого елементу даних;
вставити (insert) – забезпечує додавання нового елемента даних;
виключити (delete) – виключає елемент даних з файла.
Файлова система – це частина загальної системи керування пам’яттю, що відповідає переважно за керування файлами, які зберігаються на зовнішній пам’яті. Вона відповідає також за забезпечення можливості зберігати особисту (приватну) інформацію та за контрольоване розділення інформації між багатьма користувачами.
Функції файлової системи
Розглянемо деякі функції, які, як звичайно вважається, повинні реалізувати файлові системи.
1. Користувачу повинна надаватись можливість створювати, модифікувати та знищувати файли.
2. Користувачам повинна надаватись можливість розділяти, тобто колективно користуватись, файли один від одного під ретельним контролем, з тим, щоб вони могли ефективно взаємодіяти при виконанні спільної роботи.
3. Механізм для розділення (колективного користування) файлів повинен передбачати різні варіанти контрольованого доступу: доступ для читання; доступ для запису; доступ для виконання; або різних комбінацій зазначених видів доступу.
4. Користувачам надається можливість створювати зручні для прикладних програм структури файлів.
5. Надається можливість керування передачами інформації між файлами.
6. В системі повинні бути передбачені засоби збереження та відновлення, які виключають або випадкову втрату, або навмисне руйнування інформації.
7. Користувач може звертатись до своїх файлів за допомогою символічних імен, а не через імена фізичних пристроїв (тобто файли повинні бути незалежними від пристроїв).
8. У системах, пов’язаних з обробкою персональної, конфіденційної та таємної інформації, яку необхідно захищати від несанкціонованого доступу (системи передачі грошових засобів; системах міліції; медичних системах, де зберігаються історії хвороб і т.п.) файлова система може також передбачати шифрування та дешифрування даних. Для доступу потрібно мати ключі дешифрування.
9. І найважливіше. Файлова система повинна мати „дружній” інтерфейс з користувачем. Вона повинна дозволяти користувачам працювати тільки з логічним представленням своїх даних і тих операцій, які повинні з ними виконуватись, а не з фізичним представленням.
Необхідно, щоб користувачу не треба було думати про конкретні фізичні пристрої, на яких зберігаються його дані, про формати даних чи про фізичні засоби обміну даними з цими пристроями.
Ієрархія даних
Всі дані в комп’ютерах складаються з бітів 0, 1. Об’єднуючи окремі біти в групи отримуємо можливість задавати бітові комбінації (n бітів – 2n комбінацій) і з їх допомогою представляти практично довільні елементи даних, що обробляються в комп’ютерах.
Наступний рівень – байти –– це символи, що мають фіксовану довжину в бітах. Зараз найбільш розповсюджений варіант байту – 8 бітів. 28 – 256 символів.
Наприклад:
- цифрові символи: ‘0’…’9’;
- алфавітні символи: ‘A’…’Z’, ‘a’…’z’;
- спеціальні символи: ‘.’, ‘,’, ‘/’, ‘*’, ‘$’, …
Розподіл бітових комбінацій за символами, що ними представляються, називаються – символьними наборами.
ASCII – американський стандартний код для обміну інформацією, застосовується в системах передачі даних.
EBCDIC – розширений двійково–кодований десятковий код для обміну інформацією, застосовується для внутрішнього представлення.
В багатьох системах є механізми, що забезпечують використання обох кодів та взаємне представлення одного коду в інший.
Група взаємозв’язаних символів називається – полем. Поля бувають – числові, алфавітні, алфавітно–цифрові. Спеціальні символи – символьне поле.
Група взаємозв’язаних полів – це запис.
Ключ запису – це керуюче поле, яке однозначно ідентифікує даний запис.
Група взаємозв’язаних записів – це файл.
Найвищий рівень ієрархії даних часто називають – базою даних. База даних складається з групи взаємозв’язаних файлів.
Об’єднання в блоки та буферизація
Фізичний запис або блок – це одиниця інформації, яка реально читається з пристрою, або записується на нього.
Логічний запис – це сукупність даних, яка розглядається як одне ціле.
Якщо кожний фізичний запис вміщує тільки один логічний запис, то такий файл складається із не зблокованих записів.
Якщо кожний фізичний запис може вміщувати декілька логічних, то такий файл складається з записів, об’єднаних в блоки, або зблокованих записів.
У файлі з записами фіксованої довжини, всі записи мають однакову довжину, а розмір блоку звичайно є цілим кратним розміру запису.
У файлі з записами змінної довжини записи можуть мінятися за розміром до розміру блоку.
Формати записів
SHAPE \* MERGEFORMAT Фіксована довжина, не зблокований
Лічильник
ААА
Запис ааа
Ключ
Дані

SHAPE \* MERGEFORMAT Фіксована довжина, зблокований
Лічильник
FFF
Запис ааа
Ключ
Дані
AAA
Запис ccc
CCC
Запис fff
FFF

SHAPE \* MERGEFORMAT Змінна довжина, не зблокований
Лічильник
AAA
Запис ааа
Ключ
Дані
BL
RL

SHAPE \* MERGEFORMAT Змінна довжина, зблокований
Лічильник
AAA
Запис ааа
Ключ
Дані
BL
RL
AAA
Запис ccc
RL
CCC

BL – довжина блоку; RL – довжина запису; Поля лічильників вміщають різноманітну керуючу інформацію: номер циліндра; номер головки; номер запису; довжина поля даних; контрольні байти.
Буферування – дозволяє виконувати обчислення одночасно з операціями вводу–виводу.
В основній пам’яті виділяються певні ділянки, де можна розташувати декілька фізичних блоків файлу одразу. Кожна з таких ділянок називається буфером.
Найбільш поширена схема буферизації – називається подвійною буферизацією і працює таким чином.
Розглянемо на прикладі виводу даних.
Існує два буфери.
- Спочатку записи, що формуються працюючим процесом, розміщуються в першому буфері, доки він не заповниться.
- Після цього ініціюється передача блоку даних з першого буферу в зовнішню пам’ять.
- Під час виконання цієї передачі процес продовжує формувати записи, які тепер розміщуються в другому буфері.
- Коли другий буфер заповниться та закінчиться передача даних з першого буферу, ініціюється передача даних з другого буферу.
- Процес продовжує роботу та формує записи, які тепер знову розміщуються в перший буфер.
Таке перемикання з буферу на буфер дозволяє виконувати операції вводу–виводу паралельно з обчисленнями.
Організація файлів
Під організацією файлів розуміється спосіб розміщення записів файла в зовнішній пам’яті. Зараз найбільш відомі такі види організації файлів:
1. Послідовна. Записи розташовуються у фізичному порядку. „Наступний” запис – це запис, який фізично іде слідом за попереднім. Така організація застосовується для файлів, що зберігаються на магнітній стрічці, виводяться на друк, перфокарти, перфострічки і т.п., тому що вони в принципі є послідовними носіями даних. Файли на дисках також можуть мати послідовну організацію.
2. Індексно–послідовна. Записи розташовуються в логічній послідовності у відповідності із значенням ключів, які є в кожному записі. В системі маємо спеціальний системний індекс, де вказані фізичні адреси певних головних записів. Доступ до індексно–послідовних записів може відбуватись послідовно відповідно до зростання (зменшення) значення ключа, або безпосередньо за ключем, шляхом пошуку за системним індексом. Такі файли звичайно зберігаються на дисках.
3. Пряма. Доступ до записів відбувається прямо (довільно) за їх фізичними адресами на запам’ятовуючому пристрої прямого доступу (ЗППД). Прикладна програма розміщує записи на ЗППД в довільному (зручному) неї порядку. Файли прямої організації вимагають, щоб користувач мав детальне представлення про фізичні особливості зовнішніх ЗП, на яких зберігаються файли.
SHAPE \* MERGEFORMAT Бібліотечний набір даних
Запис каталогу
Стаття для запису А
Стаття для запису В
Стаття для запису К
Стаття для запису С
...
Запис С
Вільна ділянкадля нових записів
після вилучення запису
Місце, що залишилося
Запис В
... запис К ...
Запис К ...
... запис К
Запис А ...
... запис А

4. Бібліотечна. Це файл, який складається з послідовних підфайлів. Кожний послідовний підфайл називається елементом або геном файлу. Початкова адреса кожного такого елементу зберігається в директорії файлу. Такі файли часто використовуються для зберігання програмних бібліотек.
Ці види організації файлів мають багато варіантів, які застосовуються в реальних системах.
Носій записів, який використовується в кожному конкретному зовнішньому ЗП називається томом.
Методи доступу
В ОС, як правило, реалізуються декілька методів доступу. Метод доступу(access method) – це сукупність угод та засобів, за допомогою яких реалізується заданий спосіб обміну фізичними записами файла.
Виділяють дві категорії МД:
- метод доступу з чергами (queued access method, QAM);
- базисні методи доступу.(basic access method, BAM).
Перший застосовується в тих випадках, коли послідовність обробки записів можна передбачити. Наприклад, при послідовній та індексно–послідовній організації файлів. У них передбачається випереджуюча буферизація та планування операцій вводу–виводу, т.п. Ці засоби, направлені на те, щоб, по можливості, до кінця обробки одного запису наступний запис був готовий до обробки. В оперативній пам’яті в кожний конкретний момент часу знаходиться більше одного запису. Це дозволяє суміщати обробку записів та виконання операцій вводу–виводу.
Ці методи доступу забезпечують також автоматичне блокування та деблокування записів, так що користувач може про це не думати.
Базисні методи доступу застосовуються звичайно у випадках, коли послідовність обробки записів передбачити не можливо. Кожна процедура обміну даними викликається, відповідним оператором вводу–виводу в програмі, що виконується. ОС не забезпечує автоматичне блокування, деблокування, попередню буферизацію та синхронізацію операцій обміну з обробкою.
Ці методи застосовуються в ситуаціях, коли прикладним програмам користувача треба керувати доступом до записів, але без небажаних накладних витрат, що властиво методам доступу чергами.
Базисними методами читаються та записуються фізичні блоки. Блокування та деблокування (якщо вони необхідні в конкретному випадку) виконує сам користувач.
Характеристики файлів
Для файлів, як правило, вказують такі характеристики:
1. Змінність. Ця характеристика пов’язана з тим, як часто заносяться у файл нові записи, та вилучаються старі. Коли ця частота мала, файл називається статичним, велика – динамічним або змінним файлом.
2. Активність. Визначається процентом записів файлів, що обробляються за час якогось періоду роботи з пам’яттю.
3. Розмір. Визначає кількість інформації, що зберігається у файлі.
Файлова система
Як вже відзначалося, файлова система – це важливий компонент ОС. Вона вміщує, як правило, такі засоби:
1. Методи доступу. Визначають конкретну організацію доступу до даних, що зберігаються у файлах.
2. Засоби керування файлами. Забезпечують зберігання файлів, звертання до них, колективне керування та захист.
3. Засоби керування зовнішньою пам’яттю. Забезпечують розподіл простору зовнішньої пам’яті для розміщення файлів.
4. Засоби забезпечення цілісності файлів. Вони покликані гарантувати збереження інформації файлу.
Гарантована цілісність файлу означає, що у файлі завжди буде зберігатись лише та інформація, яка в ньому повинна бути, тобто та, яку визначає користувач.
Головне завдання файлової системи – це розподіл простору зовнішньої пам’яті та керування її роботою, зокрема, роботою дискової пам’яті.
Розглянемо приклад:
Маємо велику обчислювальну систему, що працює в режимі розподілу часу та обслуговує до 100 терміналів, до яких може мати доступ декілька тисяч користувачів. Кожний із, користувачів може мати в обчислювальній системі декілька рахунків, за допомогою яких виконується облік робіт, що виконується за різними проектами. Із кожною роботою може бути пов’язана велика кількість файлів.
У великих системах розподілу часу на кожну роботу припадає 10..100 файлів. Таким чином в дисковій пам’яті системи може знаходитись до 100 тисяч файлів.
Необхідно мати можливість швидкого доступу до цих файлів, щоб забезпечити малий час відповіді на запит користувачів.
Файлова система в цьому випадку може бути організована таким чином (рис.)
SHAPE \* MERGEFORMAT Дворівнева файлова система
Каталоги користувачів
Кореневий каталог
Користувач1
...
Файли користувачів
Користувач2
...
КористувачN
...
...
...

Кореневий вузол показує, в якому місці дискової пам’яті починається кореневий каталог, в якому в свою чергу вміщуються адреси різних каталогів користувачів. Каталог користувача вміщує по одному запису для кожного з файлів користувача. Кожний запис показує в якому місці дискової пам’яті зберігається відповідний файл.
Імена файлів повинні бути унікальними тільки в рамках певного каталогу користувача. В той же час системне ім’я файла повинно бути унікальним в рамках файлової системи. В файлових системах з ієрархічною структурою системне ім’я файлу звичайно формується як ім’я шляху від кореневої директорії до цього файлу.
Виділення та звільнення місця в пам’яті
Проблема виділення та звільнення місця в дисковій пам’яті в дечому нагадує проблему розподілення основної пам’яті при мультипрограмуванні із змінними розділами.
Якщо бажано розміщувати файли в сусідніх ділянках дискової пам’яті, то ці ділянки необхідно зібрати разом. Але, оскільки, в процесі роботи системи файли спотворюються і знищуються, з часом простір дискової пам’яті звичайно робиться все більш фрагментованим. У зв’язку з цим при розміщенні наступних файлів вони розміщуються розкиданими блоками.
Один із можливих способів розв’язку цієї проблеми полягає в тому, щоб періодично виконувати ущільнення вмісту пам’яті – „збирання сміття.” Файли можна реорганізувати таким чином, щоб вони займали сусідні ділянки дискової пам’яті, а вільні ділянки можна зібрати в єдиний блок або групу великих блоків. Деякі системи передбачають динамічне збирання сміття в процесі роботи (як правило, в не робочий час). Система може вибирати для реорганізації файли тих користувачів, які в біжучий момент не працюють, або файли, до яких не було звертання на протязі довгого часу.
При створені ефективної файлової системи необхідно чітко уявляти собі, який контингент користувачів вона буде обслуговувати. Зокрема, треба знати кількість користувачів, середню кількість файлів на одного користувача, характер задач, що розв’язуються, та інше. Ці файли необхідно ретельно аналізувати, для того, щоб визначити найбільш раціональні форми організації файлів і їх директорій.
Зв’язаний розподіл пам’яті
При такому розподілі кожному файлу відводиться одна неперервна ділянка зовнішньої пам’яті. Користувач завчасно вказує розмір ділянки, необхідної для розміщення створюваного файла. Якщо потрібної за розміром неперервної вільної області нема, файл створити не можливо.
Позитивним в такому розподілі є те, що послідовні логічні записи розміщуються, як правило, фізично поруч. Це підвищує швидкість доступу.
Каталоги файлів у системах із зв’язаним розподілом розміщаються досить просто. Для кожного файлу необхідно зберігати тільки початкову адресу та довжину файла.
Зв’язаний розподіл має і певні недоліки. Коли файли знищуються, простір, який вони займають, повертається в список вільних ресурсів. Цей простір надається для розміщення нових файлів, які повинні за розміром відповідати вільним ділянкам. Таким чином, сусідні вільні області зовнішньої пам’яті необхідно об’єднувати, може бути періодичне ущільнення пам’яті, для того, щоб створювались великі вільні ділянки для розміщення нових файлів. При умові, коли розміри файлів з часом міняються, зв’язаний розподіл може бути нераціональним.
Незв’язаний розподіл пам’яті
Його поширення викликано тим, що файли з часом або збільшуються, або зменшуються, а користувач, як правило, завчасно не знає, якого розміру будуть його файли.
1) Розподіл за допомогою списків секторів
Дискова пам’ять розглядається як набір індивідуальних секторів. Файли складаються з секторів, які можуть знаходитись в різних місцях дискової пам’яті. Сектори, що належать одному файлу, вміщують посилки–покажчики один на одного, які створюють список. У списку вільного простору вміщуються всі вільні сектори дискової пам’яті.
Коли з’являється необхідність збільшити розмір файлу, відповідний процес робить запит на додаткову кількість секторів з числа вільних. Файли, розмір яких зменшується, повертають сектори, що вивільнилися у список вільного простору. Проблеми ущільнення пам’яті не виникає.
Цей метод має певні недоліки:
1. Оскільки записи файлу можуть розміщуватись в різних місцях дискової пам’яті, вибірка логічно суміжних записів може бути пов’язана з довготривалими пошуками.
2. Також маємо накладні витрати машинного часу для обробки посилок–покажчиків.
3. Зберігання покажчиків в елементах списків веде до зменшення об’єму пам’яті, що надається для зберігання даних.
2) Поблочний розподіл
Існує схема, що забезпечує більш ефективне керування зовнішньою пам’яттю і при цьому зменшує витрати машинного часу. Вона об’єднує методи зв’язаного та незв’язаного розподілу.
В цій схемі пам’ять розподіляється не індивідуальними секторами, а блоками суміжних секторів (екстентами). При виділенні нових блоків, система намагається вибрати вільні блоки як можна ближче до вже існуючих блоків файла. При кожному звертанні до файла спочатку визначається відповідний блок, а потім відповідний сектор в рамках цього блоку.
Існує декілька способів реалізації систем поблочного розподілення: за допомогою:
- ланцюжків блоків;
- ланцюжків індексних блоків;
- таблиць відображення.
а) Схема з ланцюжками блоків.
Рядок в каталогу користувача вказує на перший блок файлу. Кожний з блоків фіксованої довжини, що входить до складу файлу, вміщує дві частини: блок даних та покажчик на наступний блок. Мінімальна одиниця пам’яті, що виділяється –– це блок фіксованого розміру, який включає, як правило, багато секторів. Звичайно, розмір блоку вибирається рівним повній доріжці дискового накопичувача. Для знаходження конкретного запису необхідно продивитися ланцюжок блоків, знайти відповідний блок, а потім проглянути цей блок, доки не буде знайдений відповідний запис.
SHAPE \* MERGEFORMAT Схема з ланцюжками блоків
Файл
Каталог користувача
Дані
Розташування
Дані
Дані
Дані
Дані
Дані

Перегляд ланцюжка блоків необхідно починати з самого початку. А оскільки блоки розкидані по всьому диску, то процес перегляду може займати багато часу, який втрачається на переміщення головок диску.
При такому підході виконувати вставки та виключення блоків досить легко – це робиться шляхом модифікації покажчиків попереднього блоку. В деяких системах для прискорення перегляду та пошуку необхідних записів в списках застосовується подвійне зв’язування, тобто формуються як прямі, так і зворотні посилки між блоками. Перегляд може відбуватись в довільному напрямі.
б) Схема з ланцюжками індексів.
Покажчики розміщуються в окремі індексні блоки. Кожний індексний блок вміщує фіксовану кількість елементів. Кожний рядок – стаття, вміщує ідентифікатор запису та покажчик на цей запис. Якщо для опису файла необхідно більш ніж один індексний блок, то організується ланцюжок індексних блоків.
Основна перевага ланцюжків індексних блоків у порівнянні з звичайними ланцюжками блоків полягає в тому, що для пошуку потрібного блоку досить продивитися тільки самі індексні блоки.
Для скорочення часу пошуку індексні блоки можна розташувати поряд один одного в зовнішній пам’яті. Якщо вимагається дуже швидкий пошук, індексні блоки можуть зберігатись в основній пам'яті.
Після того, як за допомогою індексних блоків виявлено місцезнаходження відповідного запису, блок даних, що вміщує цей запис, переписується в основну пам’ять.
SHAPE \* MERGEFORMAT Схема з ланцюжками індексів
Файл
Каталог користувача
Розташування
Дані
Дані
Дані
Дані
Індексний блок
Продовження індексного блоку
Дані
Дані
Дані

Основний недолік такої схеми полягає в тому, що для встановлення додаткових записів може бути необхідною повна перебудова структури індексних блоків.
в) Схема з таблицями поблочного відображення.
Замість покажчиків використовуються номери блоків. Звичайно ці номери легко перетворюються у фактичні адреси блоків з врахуванням геометрії диска. Маємо таблицю відображення фактів, в якій вміщується по одному рядку на кожний блок диску.
Рядок в каталогу користувача вказує на рядок таблиці відображення, що відповідає першому блоку даного файлу. Кожний рядок таблиці відображення містить номер наступного блоку даного файлу. Таким чином, всі блоки файлу можемо знайти, послідовно проглядаючи рядки таблиці відображення файлів.
В тих рядках таблиці відображення файлів, які відповідають останнім блокам файлів, звичайно записується деяке граничне значення, наприклад “Nil”, яке позначає, що цим блоком завершується даний файл.
У деяких рядках таблиці відображення записується ознака “Вільний”, яка позначає, що цей блок може бути виділений при черговому запису. Система може або проглядати таблицю відображення файлів, для того, щоб знайти вільний блок, або може просто вести список вільних блоків.
Представлену таблицю відображення файлів можна модифікувати, якщо включити в неї ідентифікатори записів для того, щоб при пошуку потрібного запису в більшості випадків можна було б обмежитись переглядом тільки таблиці відображення файлів.
Основна перевага такої схеми полягає в тому, що за таблицею відображення можна зробити висновок про фізичне сусідство блоків, що розташовані на диску.
SHAPE \* MERGEFORMAT Схема з таблицями поблочного відображення
Файл
Каталог користувача
Розташування
В
6
А
8
С
2
22
Таблиця відображення файлів
0
Блок 0
В(4)
Фізичні блоки зовнішньої пам’яті
Блок 1
В(10)
Блок 2
С(1)
Блок 3
А(4)
Блок 4
В(8)
Блок 5
С(2)
Блок 6
В(1)
Блок 7
Вільний
Блок 8
А(1)
Блок 9
В(9)
Блок 10
В(2)
Блок 11
Вільний
Блок 12
А(3)
Блок 13
В(7)
Блок 14
В(3)
Блок 15
Вільний
Блок 16
Вільний
Блок 17
А(2)
Блок 18
В(6)
Блок 19
С(5)
Блок 20
С(3)
Блок 21
Вільний
Блок 22
В(5)
Блок 23
С(4)
Блок 24
Вільний
Блок 25
Вільний
Блок 26
А(5)
Блок 27
Вільний
Nil
1
5
2
26
3
9
4
20
5
10
6
Вільний
7
17
8
1
9
14
10
Вільний
11
3
12
4
13
0
14
Вільний
15
Вільний
16
12
14
13
18
Nil
19
23
20
Вільний
21
18
22
19
23
Вільний
24
Вільний
25
Nil
26
Вільний
27

Коли з’являється необхідність виділення нового блоку, відносно легко знайти вільний блок пам’яті, який знаходиться досить близько від інших блоків даного файлу.
Ця схема спрощує операції по установці та вилученню записів.
Дескриптор файлу (file descriptor)
Дескриптор файлу або блок керування файлом – це керуючий блок, який вміщує інформацію, необхідну системі для виконання різних операцій з файлом. Це структура, яка сильно залежить від конкретної системи. Як правило, дескриптор містить наступну інформацію:
- символічне ім.’я файлe;
- розміщення файлу в зовнішній пам’яті;
- тип організації файлу (послідовна, індексно- послідовна і т.п.);
- тип пристрою;
- дані для керування доступом;
- тип файлу (дані, об’єктна програма, вихідна програма на конкретній мові і т.п.);
- диспозиція (постійний або тимчасовий робочий файл);
- дата та час створення файлу;
- дата знищення;
- дата і час останньої модифікації;
- лічильники активності доступу (наприклад, кількість звертань по читанню).
Як правило, дескриптори файлів зберігаються в зовнішній пам’яті. Вони передаються в основну пам’ять тільки після відкриття відповідного файлу. Дескриптором файлу керує файлова система – користувач не може безпосередньо до нього звертатись.
Матриця керування доступом
Один з можливих способів керування доступом до файлів полягає в тому, щоб створити двомірну матрицю керування доступом, в якій показані всі файли системи.
Елемент Ai j приймає значення 1, якщо користувачу і дозволяється доступ до файлу j; в протилежному випадку Ai j = 0.
У системі з великою кількістю користувачів та файлів ця матриця може виявитись дуже великою і при тому дуже розрідженою. Надання одному користувачу права доступу до файлів другого користувача це скоріше виняток, ніж правило.
Щоб така матриця керування доступом була корисна для реальних систем, доцільно використовувати спеціальні коди для різних прав доступу, таких як:
“тільки для читання”;
“тільки для записів”;
“тільки для виконання”;
“для читання – записів”,
і т.п.
Керування доступом в залежності від класів користувачів
Матриця може бути такою великою, що реалізувати її практично неможливо. Існує спосіб, що вимагає значно менше місця в пам'яті системи – це керування доступом до файлів в залежності від класів користувачів. Звичайна класифікація передбачає такі категорії:
“Власник” – це користувач, який створив даний файл;
“Вказаний, допущений користувач” - власник файлу вказує, що з його файлом може працювати інша людина;
“Група” або “Проект”. Користувачі часто є членами групи, що разом працюють над конкретним проектом. В такому випадку всім членам такої групи надається доступ до певних файлів.
“Загальнодоступний” - доступ дозволяється для якого завгодно користувача даної системи. Поняття “загальнодоступний” означає, що користувачам дозволяється читати або використовувати файл, а робити записи в ньому забороняється.
Копіювання та відновлення інформації
ОС взагалі та файлові системи зокрема повинні розроблятися з врахуванням можливості руйнування інформації.
Найбільш розповсюджений спосіб – періодичне копіювання. Але це не виключає можливості втратити всіх змін у файлі з моменту його останнього копіювання.
Ще один спосіб – реєстрація, протоколювання всіх змін у файлі. Така надлишковість може бути досить дорогою, але дозволяє реконструювати всю роботу. При умові, звичайно, що диск реєстрування (журнальний) не виявився також зіпсованим.
Не існує ніяких засобів, що гарантують абсолютну безпечність файлів.
Схема періодичного копіювання має декілька недоліків:
- на час копіювання може виникнути необхідність закрити систему для звичайних користувачів;
- розміри файлових систем можуть бути дуже великі і дублювання може вимагати багато машинного часу;
- відновити інформацію можна тільки до стану останньої копії.
Перевага періодичного копіювання – дозволяє реорганізувати файлову систему таким чином, щоб блоки файлів користувачів, що розкинуті по дисковій пам’яті, можна розмістити більш компактно, поруч один з одним. Це звичайно, дає можливість більш швидкого доступу до файлів користувачів.
Періодичне копіювання не влаштовує, якщо відновлення треба робити швидко, за останнім станом системи. Для цього є ефективніший спосіб – „інкрементний”, або покроковий „дампінг”. Всі файли, вміст яких обновлюється під час роботи з терміналом, починаються спеціальними ознаками. Коли користувач відключається від системи, список усіх цих файлів, передається певному системному процесу, який виконує їх копіювання. Недолік – він не допоможе, коли в момент збою користувач знаходиться ближче до кінця довготривалого сеансу роботи з терміналом.
Для систем, в яких втрата результатів навіть мінімальної кількості робіт є недопустимою, більш підходить спосіб протоколювання (занесення в журнал) звертань. Тут кожна зміна дублюється в той же час, коли вона відбулася. Таку інтенсивність дублювання легше забезпечити для інтерактивних систем, де загальний об’єм робіт обмежується відносно низькими швидкостями відповіді людини.
Планування роботи з дисковою пам’яттю
Для того, щоб отримати можливість доступу до конкретного запису даних, що розташований на диску з головками, що переміщаються, в загальному випадку необхідно виконати декілька операцій (Рис. __).
SHAPE \* MERGEFORMAT Фази читання/запису даних на дисковий носій
Час запису
Час очікування запису
Час пошуку циліндру
Каретка

Рис. __
Група доріжок, що знаходиться під всіма головками читання-запису в конкретному положення каретки, створює вертикальний циліндр.
Час, що витрачається на переміщення ділянки поверхні з біжучого положення в положення під головкою читання, називається часом очікування.
Таким чином, для пошуку конкретного запису даних треба:
- перш за все каретку треба встановити на відповідний циліндр (це пошук циліндру);
- потім треба чекати, коли під головкою опиниться точка на диску, що обертається, з якої починається запис (це пошук запису або пошук на доріжці, з яким зв’язаний час очікування).
- потім сам запис, який в принципі може мати довільний розмір (до повного кола), повинен пройти під головкою читання-запису (час передачі).
Кожна з цих операцій зв’язана з механічним рухом, тому загальний час доступу до конкретного запису (досяжність) ? 0,01 сек., що досить багато в порівняні з роботою ЦП.
Призначення планування
В багатопрограмних обчислювальних системах одночасно виконується багато процесів, які можуть генерувати запити на звертання до дисків.
Оскільки ці процеси роблять запити значно швидше, ніж їх обслуговують дискові пристрої, в яких головки переміщаються, то до кожного пристрою формується черга запитів.
В деяких обчислювальних системах ці запити обслуговуються в порядку надходження, тобто за принципом FCFS (First Come First Served, перший, що прийшов, обслуговується першим).
Це справедливий метод надання послуг, але при підвищенні частоти запитів, тобто навантаження, він може приводити до дуже великих затримок.
Для методу FCFS характерним є випадковість пошуку, при якому запити, що надходять послідовно, можуть викликати досить довгі в часі підводи головок від самих зовнішніх до самих внутрішніх циліндрів.
Щоб звести до мінімуму час пошуку, доцільно навести порядок в запитах, за яким –небудь іншим принципом, ніж FCFS. Цей порядок і називається плануванням роботи з диском.
SHAPE \* MERGEFORMAT Випадкових характер пошуку циліндрів при FCFS
Каретка
2
4
1
3

Рис. __
Планування вимагає ретельного аналізу запитів, що очікуютьв черзі для того, щоб визначити найбільш ефективний порядок їх обслуговування. Планувальник дискової пам’яті аналізує позиційні взаємозв’язки між запитами, що очікують. Після чого черга запитів перебудовується таким чином, щоб їх виконання відбувалось при мінімальних механічних переміщеннях.
Маємо два найбільш поширених види планування:
- оптимізація (за часом) пошуку циліндра;
- оптимізація (за часом) очікування запису.
Оскільки час пошуку циліндрів перевищує час очікування записів, як правило, на порядок, більшість алгоритмів планування ставить за мету мінімізацію часу пошуку циліндрів для деякої множини запитів.
Мінімізація часу очікування дає якийсь ефект тільки при дуже великих навантаженнях.
В умовах малих навантажень (тобто при невеликій середній довжині черги запитів) принцип FCFS можна вважати найбільш прийнятною дисципліною обслуговування запитів.
Але при середніх і більших навантаженнях планування може забезпечити значно кращі швидкісні характеристики, ніж простий метод FCFS.
Цільові характеристики принципів планування
Для розділення принципів планування на категорії існують і деякі інші критерії:
1) Пропускна здатність.
2) Середній час відповіді.
3) Розкид, або дисперсія відповіді в часі (тобто передбачуваність).
Ці критерії направлені на покращення загальних швидкісних характеристик, можливо і за рахунок деяких індивідуальних запитів. Плануванння часто поліпшує загальну картину, хоча і дещо знижує швидкість обслуговування певних запитів.
Одним з важливих кількісних показників для оцінки цього явища може служити розкид, або дисперсія відповідей в часі.
Дисперсія – це міра того, наскільки далеко значення індивідуальних елементів може відхилятись від середнього значення цих елементів.
В зв’язку з чим ми використовуємо дисперсію, як показник передбачуваності – чим менша дисперсія, тим більша передбачуваність.
Нам необхідна така стратегія планування, яка б мінімізувала дисперсію. Інакше може статися таке, що час обслуговування певних запитів просто не можна буде передбачити. (Неприпустимо, наприклад, в системі резервування авіаквитків). Якби стратегія планування була направлена тільки на досягнення максимальної пропускної здатності без одночасної мінімізації дисперсії, система обробляла би тільки зручні для обслуговування запити, а деякі ігнорувала би повністю.
Оптимізація пошуку циліндру
Найбільш поширені стратегії оптимізації.
1. FCFS – запити обслуговуються в порядку надходження.
2. SSTF – (Shortest Seek Time First) („з найменшим часом пошуку - першим”).
При позиціонуванні каретки з магнітними головками наступним вибирається запит, для якого необхідне мінімальне переміщення каретки. Першим обслуговується запит з найменшим часом пошуку циліндра, якщо навіть цей запит не є першим в черзі.
Має місце різка дискримінація певних запитів. Звернення до диску виявляють тенденцію концентруватись, в результаті запити до самих внутрішніх, або самих зовнішніх доріжок можуть обслуговуватись значно гірше, ніж до середніх доріжок.
SHAPE \* MERGEFORMAT Характер пошуку циліндрів при SSFT
Каретка
2
4
1
3

Рис. __
Краща пропускна здатність, ніж FCFS, і найкращий середній час відповіді при помірних навантаженнях.
Велика дисперсія, тобто погана передбачуваність, не підходить для інтегрованих систем, але добра в пакетних системах, де основне – пропускна здатність.
3. SCAN (сканування). Каретка з головками рухається туди і назад над поверхнею, обслуговуючи всі запити, що зустрічаються на шляху. Каретка змінює напрям руху, якщо в біжучому напрямку більше немає запитів для обслуговування.
SHAPE \* MERGEFORMAT Характер пошуку циліндрів при плануванні SCAN
Каретка
Прямий хід каретки
Зворотний хід каретки

Рис. __
Стратегія розроблена для зменшення дискримінації крайніх доріжок.
Аналогічна SSTF за винятком того, що вона вибирає для обслуговування той запит, для якого є характерною мінімальна відстань пошуку в привілейованому напрямку.
Цей принцип (SCAN) є основою більшості практично реалізованих стратегій планування роботи з дисковою пам’яттю.
На крайніх доріжках головки бувають не так часто, як на середніх, але це краще, ніж дискримінація в SSTF.
4. N-Step SCAN (N - крокове сканування). Модифікація SCAN.
Каретка з головками рухається туди і назад, але всі запити, що поступають під час ходу в одному напрямку, групуються та перешиковуються таким чином, щоб їх можна було найбільш ефективно обслуговувати під час зворотнього ходу.
SHAPE \* MERGEFORMAT Характер пошуку циліндрів при плануванні N- Step SCAN
Каретка
Прямий хід каретки
Зворотний хід каретки
Запити, що надійшли після початку прямого ходу

Рис. __
Найважливіша риса - невелика дисперсія часу відповіді в порівнянні з принципом SSTF або звичайним варіантом SCAN.
Ця стратегія виключає можливість безмежного відкладання, яке звичайно виникає у випадку надходження великої кількості запитів на звертання до біжучого циліндра. Вона передбачає запам’ятовування тих запитів, що надійшли при зворотному ході каретки.
5. С-SCAN (циклічне сканування).
Каретка рухається в напрямку до внутрішньої доріжки. Якщо попереду більше нема запитів для обслуговування, каретка стрибком повертає до початку, обслуговує запит, найближчий до зовнішньої доріжки, а потім обслуговує рух до середини.
SHAPE \* MERGEFORMAT Характер пошуку циліндрів при плануванні C-SCAN
Каретка
Прямий хід каретки
Стрибок на запит зі самим зовнішнім циліндром
Запити, що надійшли після початку прямого ходу
Наступний прямий хід

Рис. __
Ця стратегія виключає дискримінацію у відношенні до внутрішніх або зовнішніх циліндрів. При просуванні від зовнішнього циліндру до внутрішнього, обслуговування запитів виконується за найкоротшим часу пошуку.
Запити, що надходять під час біжучого прямого ходу, обслуговується при наступному проході. Маємо дуже малу дисперсію відповідей в часі.
Найбільш ефективна стратегія планування роботи дискової пам’яті мала б мати два режими:
- при малих навантаженнях – SCAN;
- при середніх і великих і навантаженнях - С-SCAN.
С-SCAN з оптимізацією за часом очікування записів найбільш ефективна при дуже великих навантаженнях.
6. Схема Еменбака.
Каретка рухається циклічно, як в способі С-SCAN. Але при обслуговуванні кожного циліндру виконується доступ тільки до одної повної доріжки інформації незалежно від наявності іще запитів для цього циліндра.
Передбачається перешиковування запитів для обслування в рамках одного циліндру з врахуванням кутового положення записів, але якщо два запити відносяться до секторів одного циліндру, що перекриваються, то тільки один з них обслуговується при біжучому ході каретки.
Схема С-SCAN з оптимізацією за часом очікування запитів більш ефективна в умовах дуже великих навантажень.
Оптимізація за часом очікування запитів
В умовах великих навантажень ймовірність декількох одночасних звертань до певного циліндру зростає, що робить доцільним виконувати оптимізацію не тільки за пошуком циліндрів, але і за часом очікування записів.
SHAPE \* MERGEFORMAT Обслуговування запитів за стратегією SLTF
Каретка
1
2
3

Рис. __
Аналогом SSTF але в застосуванні до оптимізації за часом очікування записів, є стратегія SLTF (Shortest Latency Time - First) (з найменшим часом очікування – першим).
Коли каретка підводиться на певний циліндр може виявитись, що багато запитів очікують звертання до різних доріжок чи секторів цього циліндру. SLTF- аналізує всі ці запити і першим обслуговує запит з мінімальним очікуванням запису. Ця стратегія досить близька до теоретично оптимальної, причому її відносно легко реалізувати.
Запити будуть обслуговуватись у вказаній на рис. __ послідовності незалежно від порядку їх надходження.
Архітектура сучасних файлових систем
SHAPE \* MERGEFORMAT Узагальнена структура файлової системи
Перемикач файлових систем
Драйвери файлових систем
ФС1
ФС1
ФС1
ФСN

Підсистема вводу/виводу
Ієрархія драйверів пристроїв

Рис. __
Розробники нових операційних систем прагнуть забезпечити користувача можливістю працювати одразу з декількома файловими системами. В такому випадку узагальнена файлова система має багаторівневу структуру, на верхньому рівні якої розташований перемикач файлової системи (в Win 9х це „встановлюваний” диспетчер файлової системи - Installable File System manager - IFS). Він забезпечує інтерфейс між запитами прикладної системи та конкретною файловою системою, до якої виконується звертання. Перемикач перетворює запити у формат, який сприймається наступним рівнем - рівнем файлових систем.
Кожний компонент рівня файлових систем виконаний у вигляді драйвера відповідної файлової системи і підтримує певну організацію файлової системи. Перемикач – це єдиний модуль, який може звертатись до драйвера файлової системи. Прикладна система не може звертатись до нього напряму. Кожний драйвер файлової системи в процесі власної ініціалізації реєструється у перемикача, передаючи йому таблицю точок входу, які будуть використовуватись при наступних звертаннях до файлової системи.
Для виконання своїх функцій драйвери файлових систем звертаються до підсистеми вводу-виводу. Ця підсистема – це складова частина файлової системи, яка відповідає за завантаження, ініціалізацію, та керування усіма модулями нижчих рівнів файлової системи. Звичайно ці модулі представляють собою драйвери портів, які безпосередньо працюють з апаратними засобами. Підсистема вводу-виводу повинна постійно знаходитись в основній пам’яті та організовувати сумісну роботу ієрархії драйверів пристроїв.
Велика кількість рівнів архітектури файлової системи забезпечує більшу гнучкість: драйвер може отримати керування на довільному етапі виконання запиту – від виклику прикладною програмою функції, яка працює з файлами, до того моменту, коли працюючий на самому низькому рівні драйвер пристрою починає проглядати регістри відповідного контролера.
Інтерфейс прикладного програмування API(application program interface)
АРІ – призначений для використання прикладними програмами системних ресурсів ОС і функцій, які ОС реалізуються.
АРІ – описує сукупність функцій і процедур, які належать ядру або надбудовам ОС. Тобто АРІ – це набір функцій, які надаються системою програмування розробнику прикладної програми і які орієнтовані на організацію взаємодії результуючої прикладної програми із сукупністю програмних та апаратних засобів, в оточенні яких виконується результуюча програма. Сама результуюча програма породжується системою програмування, ґрунтуючись на коді вихідної програми, створеної програмістом, а також об’єктних модулів і бібліотек, які входять до складу системи програмування.
АРІ використовується не тільки прикладними, а також і системними програмами як в складі ОС, так і в складі системи програмування.
Функції АРІ дозволяють розробнику будувати результуючу прикладну програму таким чином, щоби використати засоби обчислювальної системи для виконання типових операцій. При цьому розробник програми не повинен створювати вихідний код для виконання цих операцій.
Програмний інтерфейс АРІ включає в себе не тільки самі функції, але і домовленості про їх використання, які регламентуються ОС, архітектурою обчислювальної системи і системою.
Існує декілька варіантів реалізації АРІ:
1. Реалізація на рівні ОС.
2. Реалізація на рівні системи програмування.
3. Реалізація на рівні зовнішньої бібліотеки процедур і функцій.
В кожному з цих варіантів розробнику надаються засоби для підключення функцій АРІ до вихідного коду програми і організації їх викликів. Об’єктний код функцій АРІ підключається до результуючої програми компонувальником при необхідності.
Перший варіант реалізації
За виконання функцій АРІ відповідальність несе ОС. Об’єктний код, який виконує функції, або безпосередньо входить до складу ОС (або навіть ядра ОС), або входить до складу бібліотек, які динамічно завантажуються, і які розроблені для даної ОС. Система програмування відповідає тільки за організацію інтерфейсу для виклику цього коду.
В цьому варіанті результуюча програма звертається безпосередньо до ОС. Тому досягається найбільша ефективність виконання функцій АРІ у порівнянні з усіма іншими варіантами реалізації АРІ.
Недолік: відсутність можливості переносу не тільки коду результуючої програми, але і коду вихідної програми. Програма, створена для одної архітектури обчислювальної системи, не зможе виконуватись на обчислювальній системі іншої архітектури навіть після того, якщо її об’єктний код буде повністю перебудовано.
Частіше за все система програмування не зможе виконати перебудову вихідного коду для нової архітектури обчислювальної системи.
Можна уніфікувати функції АРІ в різних ОС. Але є корпоративні інтереси.
Приклад: Для ОС Microsoft Windows – WinAPI.
Але навіть всередині цього корпоративного АРІ існує певна невідповідність, яка дещо обмежує переносимість програм між різними ОС типу Windows.
Приклад: АРІ – набір сервісних функцій ОС для MS-DOS, який реалізовано у вигляді набору підпрограм обслуговування програмних переривань.
Другий варіант реалізації
В цьому випадку функції АРІ надаються користувачу у вигляді бібліотеки функцій відповідної мови програмування. Система програмування надає користувачу бібліотеку відповідної мови програмування і забезпечує підключення до відповідної програми об’єктного коду, що відповідає за виконання цих функцій.
Ефективність АРІ буде нижче, ніж у попередньому варіанті. Це тому, що для виконання багатьох функцій АРІ бібліотека мови програмування повинна все одно виконати звертання до функцій ОС.
Але переносимість буде самою високою, оскільки синтаксис і семантика всіх функцій будуть строго регламентовані в стандарті мови. Вони залежать від мови і не залежать від архітектури обчислювальної системи. Тому для виконання прикладної програми на новій архітектурі обчислювальної системи досить заново побудувати код результуючої програми за допомогою відповідної системи програмування.
Але є нестандартні бібліотеки.
Третій варіант реалізації
В цьому випадку функції АРІ надаються користувачу у вигляді бібліотеки процедур і функцій, яка може бути створена стороннім розробником.
Система програмування відповідала тільки за те, щоби підключити об’єктний код бібліотеки до результуючої програми, причому зовнішня бібліотека може бути і такою, що динамічно завантажується (тобто завантажується під час виконання програми).
З точки зору ефективності цей метод найгірший, оскільки зовнішня бібліотека звертається як до функцій ОС, так і до функцій мови програмування.
З точки зору переносимості, то тут тільки одна вимога – зовнішня бібліотека, яка використовується, повинна бути допустимою в довільній з архітектур обчислювальних систем, на які орієнтована прикладна програма. Це можливо, якщо бібліотека відповідає деякому прийнятому стандарту, а система програмування підтримує цей стандарт.
Бібліотека графічного інтерфейсу XLib підтримує стандарт графічного середовища XWindow:
MFC (Microsoft foundation classes) (OC Windows);
VCL (Visual controls library), „Borland”;
CLX, „Borland” (OC Linux, OC Windows).
Як правило АРІ не стандартизовані. В кожному конкретному випадку набір викликів АРІ визначається, перш за все, архітектурою ОС та її призначенням.
Робляться спроби стандартизувати деякий базовий набір функцій, оскільки це суттєво полегшує перенос програм з одної ОС на іншу.
Приклад: стандарт POSIX. В ньому перераховано великий набір функцій, їх параметрів та значень, що повертаються. Стандартизуються не тільки звертання до АРІ, але і файлова система, організація доступу до зовнішніх пристроїв, набір системних команд.
Приклад: Внутрішній корпоративний стандарт Microsoft, WinAPI.
Win16, Win32S, Win32, WinCE. З точки зору WinAPI, базова задача – вікно. Тобто він орієнтований на роботу в графічному середовищі.
Основи організації MS-DOS
Всю систему можна розділити на шість основних частин:
1. Система BIOS в ПЗП. Поставляється разом з машиною і може використовуватись будь-якою операційною системою. Функція BIOS полягає в обслуговуванні основних та найбільш фундаментальних операцій комп’ютера.
2. “Завантажуючий запис” диску. “Завантажуючий запис” – це дуже коротка і проста програма, що знаходиться на гнучкому диску або активному розділі HDD. Функція цієї програми полягає в запуску процесу завантаження ОС після включення або перезапуску комп’ютера. “Завантажуючий запис” зчитує ще два модулі ОС в пам’ять і вони завершують процес завантаження DOS.
3. Дисковий файл IBMBIO.COM завантажується в пам’ять завантажуючим записом і залишається в пам’яті під час роботи DOS. Це змінне доповнення до системи BIOS в ПЗП. IO.SYS (MSDOS) – модуль розширення базової системи вводу-виводу. Незалежні драйвери пристроїв – фізичний рівень DOS.
4. Дисковий файл IBMDOS.COM реалізує основні послуги DOS. Це “логічний” рівень вводу/виводу ОС. MSDOS.SYS (MSDOS) – модуль обробки переривань. Ці обидва файли є “прихованими” системними файлами. Імена цих файлів не включаються в заголовок диску, що викликається командою DIR.
5. Дисковий файл COMMAND.COM. Головна його функція – обробка команд, що вводяться користувачем. Команди DOS, які вважаються внутрішніми, реалізуються програмою COMMAND.COM. Вони поділяються на дві частини. Частина входить до IBMDOS.COM (MSDOS.SYS) інша до Процесора додаткових команд.
6. Всі зовнішні команди. Функції зовнішніх команд різні і програми, що їх реалізують, завантажуються в пам’ять тільки у випадку необхідності.
Зовнішні команди – це нерезидентні частини DOS, так як вони не знаходяться в пам’яті постійно. Файли IBMDOS.COM (IO.SYS), IBMDOS.COM (MSDOS.SYS) і драйвери пристроїв знаходяться в пам’яті постійно і утворюють резидентну частину ДОС.
Файли COMMAND.COM можна виділити в окрему категорію як напіврезидентну складову ДОС. “Завантажуючий запис” використовується тільки тимчасово і тому не є резидентною частиною ДОС.
Будова та функції основних складових ДОС
1. BIOS в ПЗП.
Базова система вводу-виводу в постійній пам’яті. Забезпечує найбільш прості та універсальні послуги ОС, пов’язані зі здійсненням вводу-виводу.
Змінюється тільки в тому випадку, коли змінам підлягає апаратна реалізація системи.
Система BIOS складається з кількох частин, більшість з яких є програми, а інші – це важливі таблиці даних.
Програма системи BIOS, яка виконується першою, є тестом функціонування. Вона перевіряє пам’ять і зовнішні пристрої, під’єднані до IBM/PC, як тільки буде увімкнено живлення комп’ютера. Чим більший об’єм пам’яті ЕОМ, тим довше йде тест. Тільки після цього може завантажитись ДОС.
Модуль ініціалізації BIOS читає Master Boot Record – головний завантажуючий запис.
Наступна частина BIOS, яка повинна виконуватись як програма запуску ОС – це програма виклику завантажувача ОС. Ця програма перевіряє, чи під’єднаний дисковід з гнучкими дисками і зчитує з дискети “завантажуючий запис”. Після зчитування “завантажуючого запису” програма запуску передає їй керування, щоб вона зчитала частини ОС, що залишились.
В ПЗП міститься багато інших програм. Сюди входять програми обслуговування всього стандартного периферійного устаткування IBM/PC (керування клавіатурою, дисплеєм, дискетами, асинхронним адаптером зв’язку, пристроєм друку та ін.)
SHAPE \* MERGEFORMAT Увімкнення ЕОМ або Reset (Ctrl+Alt+Del)
Завантаження Boot Record Program
Є IO.SYS, MSDOS.SYS
Завантаження IO.SYS та MSDOS.SYS
Так
Ні
MSDOS.SYS. Завантаження та ініціалізація керуючих таблиць, встановлення векторів переривань (20-27) та префіксу сегмента для COMMAND.COM
Завантаження процесора команд COMMAND.COM
IO.SYS. Завантаження та ініціалізація пристроїв вводу/виводу, драйверів, встановлення векторів переривань (1-19), на лаштування адрес програми MSDOS.SYS
COMMAND.COM. Ініціалізація процесора команд, завантаження системного командного файлу AUTOEXEC.BAT
Виконання команд з файлу AUTOEXEC.BAT, налаштування оточення системи
Встановлення запрошення c:\>Очікування введення команд.
Повідомленняпро помилку
Схема завантаження ОС DOS

2. Початкове завантаження – завантажуючий запис.
“Завантажуючий запис” необхідний для завантаження ДОС, він містить мінімум необхідних команд для зчитування і запуску основних частин ОС. Його основне призначення полягає просто в завантаженні файлів IO.SYS i MSDOS.SYS. “Завантажуючий запис” має розмір стандартного сектора на диску, 512 байтів. Для спрощення його роботи обидва файли розміщуються в визначених постійних місцях на диску. Це позбавляє програму завантаження від необхідності шукати їх в довіднику дискети. (Цим відрізняється “системна” дискета від звичайної).
3. Додаткові операції з пристроями: IO.SYS.
Цей файл призначений для доповнення функцій системи BIOS в ПЗП. Займається обслуговуванням операцій вводу-виводу або обслуговуванням пристроїв, що те ж саме. Це включає обробку різних подробиць, пов’язаних з функціонуванням пристроїв вводу-виводу, а також виявлення помилок та їх виправлення. Програми цього файлу можна легко змінити.
IO.SYS призначений для вирішення трьох задач, які не може вирішити BIOS ПЗП.
1) Налаштування на потреби конкретної системи, ДОС.
2) Виправлення будь-яких помилок в BIOS в ПЗП, якщо в цьому виявиться необхідність.
3) Обслуговування нових периферійних пристроїв. Коли під’єднується новий пристрій, програма-драйвер, що його обслуговує, повинна включатись в файл IO.SYS.
4. Основа ДОС: MSDOS.SYS.
Файл реалізує службові процедури ДОС, які поділяються на ті, які викликаються за допомогою власних переривань, і ті, які поділяють загальні переривання.
В ДОС перша група – переривання ДОС, друга група – виклики функцій. В обох випадках для їх виклику використовуються програмні переривання.
Програми обслуговування переривань – включають читання і запис секторів дискети, доступ до контролю за помилками ДОС і операціями клавіатури.
SHAPE \* MERGEFORMAT Інтерфейс користувача DOS
MSDOS.SYS
COMMAND.COM
IO.SYS
BIOS(Базова система вводу/виводу)
Обладнання ЕОМ(апаратура)
Стректурна схема DOS
Зовнішнідрайвери
MS-DOSShell
Інструмент-тальнізасоби
Утиліти
Програмний інтерфейс ЕОМ
Програмний інтерфейс DOSнижнього рівня
Програмний інтерфейсDOS
Програмний інтерфейс DOSверхнього рівня
Системи програмуванняРедактори
Зовнішні командиСервісні послуги

Виклики функцій ДОС – забезпечують, в основному, проміжний рівень обслуговування операцій вводу-виводу (ввід з клавіатури, вивід на екран дисплея, ввід/вивід по асинхронній лінії зв’язку і вивід на друк). Передбачені також логічні операції для дискет – відкриття та закриття файлів, пошук в довіднику файлів, видалення та створення файлів, читання та запис даних.
Ці процедури забезпечують практично всі елементарні операції, які можуть бути потрібні програмі для роботи з файлами та даними, що зберігаються в файлі, так щоб програмі не доводилось самостійно розшифровувати дані довідників, таблиць розміщення файлів і інше.
Більша частина цих службових процедур ДОС інтенсивно використовується програмами більш високого рівня ДОС.
5. Файл COMMAND.COM і внутрішні команди.
Файл має декілька функцій:
1. „Процесор команд”, що означає покладені на нього функції вводу команди, що набирається на клавіатурі, і визначення подальших дій. Щоб розпізнати внутрішні команди, COMMAND.COM містить таблицю імен команд. Якщо команди немає в таблиці внутрішніх команд, значить мається на увазі зовнішня команда, яку СOMMAND.COM буде шукати в зовнішньому файлі.
2. Друга частина COMMAND.COM (ініціатор процесору команд) використовується тільки тимчасово: при запуску системи вона здійснює пошук пакетного файлу AUTOEXEC.BAT і, якщо він знайдений, його виконання. Після виконання цієї функції, дана частина COMMAND.COM вже не потрібна.
3. Напіврезидентна. Включає інтерпретатор команд і програми, що реалізують внутрішні команди ДОС.
Інтерпретатор команд достатньо велика програма. Для швидкодії вигідно її мати в ОЗП, але небажано, щоб він займав місце в пам’яті постійно.
В MS/DOS ця проблема вирішена так. Ця частина COMMAND.COM розміщається в верхніх адресах пам’яті і дозволено іншим програмам витирати цю область пам’яті.
Коли виникає необхідність використовувати інтерпретатор команд, резидентна частина COMMAND.COM спочатку перевіряє, чи знаходиться інтерпретатор команд в пам’яті. Для цього вираховується контрольна сума тих комірок пам’яті, в яких він повинен знаходитись. Якщо сума не співпадає з очікуваною, то COMMAND.COM перезавантажується.
Програма завантаження і виконання зовнішніх команд, що знаходяться в файлах з розширенням імен .COM i .EXE викликається функцією ЕХЕС для завантаження вказаних програм в область користувача.
6. Зовнішні команди (транзитна частина DOS).
Ці команди називаються зовнішніми, тому що вони не включені до складу ДОС і не є резидентними в пам’яті ІВМ/РС. Замість цього, зовнішні команди зберігаються в програмних файлах на дискетах.
З одної точки зору, зовнішні команди це всього-навсього допоміжні програмні утиліти, які є корисними, але не є ОС.
Створення та включення нових програм таке ж як команд. Фактично це нові команди. В зв’язку з цим MS-DOS – відкрита система.
Керування пам’яттю
Керування пам’яттю – це забезпечення доступу до неї, її облік та розподілення між програмами. Функції керування пам’яттю відносяться до ОС. В DOS вбудовані тільки мінімальні засоби по керуванню пам’яттю. Всі інші засоби реалізовані як зовнішні драйвери і тому їх треба підключати до системи явно. DOS також підтримує певні команди, які мають безпосереднє відношення до керування пам’яттю.
SHAPE \* MERGEFORMAT Стандартнапам’ять
Логічна структура адресного простору
0
eXtended Memory Area (EMA)
640 К
Відеопам’ять
Постійна пам’ять (BIOS)
Розширенапам’ять
HMA
1 М
Upper Memory Area (UMA)Верхня пам’ять
Conventional Memory Area (CMA)
CMA
UMA
XMA
UB

У верхній області пам’яті логічно знаходяться відеопам’ять та постійна пам’ять з BIOS, а також можуть розміщуватись додаткові модулі постійної та оперативної пам’яті, які конструктивно знаходяться в адаптерах ПУ. Реально використовується невелика частина UMA. Це зарезервована пам’ять або область старших адрес DOS.
ХМА – 1М – UB–1; UB – кількість комірок (байтів) в адресному просторі мікропроцесора (або самого комп’ютера).
8088/86 – ША = 20 розрядів; UB = 1М; (ХМА ними не підтримується).
80286 – 80386SX – ША = 24 розряди; UB=16М;
80386/486 – ША = 32 розряди; UB=4Tбайта;
Якщо адресний простір допускає ХМА, то в ньому логічно може знаходитись розширена пам’ять (extended memory). (Як правило, стандартна АТ, включала всього 384Кбайт такої пам’яті. Разом 1Мбайт і сюди не входили модулі пам’яті з UMA).
DOS без додаткових драйверів може адресувати тільки 1Мбайт адресного простору. (Оскільки вона розглядалась для 8088/86.) Більш сучасні мікропроцесори вимушені емулювати цей простір із усіма обмеженнями. Це реальний режим. В захищеному режимі використовуються всі можливості сучасних МП. Але в цей режим переключитись не просто, ще складніше повернутися з нього в реальний режим без втрати даних.
Вільні фрагменти UMA адресуються безпосередньо. В ОС, в яких використовується захищений режим роботи МП (DOS/Windows, Windows NT, ОS/2, UNIX та ін.) розширена пам’ять доступна так само як і стандартна. Але між двома областями однорідної пам’яті залишається UMA. Тобто не виключається фрагментація оперативної пам’яті. Недоліки концепції: UMA необхідно включити в СМА!!! Але зміни приведуть до несумісності.
Пам’ять розподіляється блоками. Блок – неперервний фрагмент. Перші 16байт кожного блоку пам’яті відводиться під блок керування пам’яттю МСВ – Memory Control Block – описує розмір блоку пам’яті та вказує програму, якій виділений цей блок, а також забезпечує зв’язок з наступним блоком пам’яті. Таким чином, всі МСВ, тобто блоки пам’яті, зв’язуються у ланцюжок, що забезпечує можливість керування пам’яттю (виділення та звільнення).
Коли DOS запускає програму, вона, тобто DOS, спочатку виділяє блок пам’яті для копії свого оточення (Environment), яка передається програмі, а потім весь залишок пам’яті виділяється для самої програми.
SHAPE \* MERGEFORMAT Ланцюжок блоків пам’яті
Копія оточення ОСдля програми
Початковий MCB
. . .
MCB
Кодпрограми
. . .
MCB
. . .

Сформовані блоки для одної програми не обов’язково мають бути суміжними. Блоки пам’яті завжди виділяються на початку її вільної області, тому, якщо пам’ять не фрагментована, блок з оточенням та блок з кодом програми будуть суміжними. Разом з оточенням програмі, яка виконується, передається повна специфікація програмного файлу, яка доточується в кінець оточення і заміняє відповідний рядок для батьківського процесу. Тому розмір копії оточення, як правило, не співпадає за розміром оригіналом.
Програма при виконанні може зменшити розмір виділеного під її код блоку, а резидентна програма зобов’язана це зробити (інакше не виконуються інші програми). Після завершення нерезидентної програми зайняті нею блоки пам’яті звільнюються. Але, якщо програма має залишитись резидентною, блоки з її оточенням і кодом залишаються у пам’яті. Вони будуть звільнені тільки при явному вивантаженні програми.
Для вилучення резидентної програми з пам’яті можна використати спеціальні програмні засоби. Але якісна програма повинна уміти сама себе вивантажити, тобто самоліквідуватись.
DOS забезпечує можливість динамічного керування пам’яттю для розміщення інформаційних об’єктів програми, яка використовується. Програма може зробити запит на:
- визначення розміру найбільшого блоку, який можна виділити програмі;
- виділення блоку пам’яті заданого розміру;
- звільнення блоку пам’яті;
- зміну розміру вже виділеного блоку пам’яті як в сторону збільшення, так і в сторону зменшення.
Відображена пам’ять
Концепція розширеної пам’яті (Expanded memory) належить фірмам Lotus, Intel, Microsoft (LIM).
LIM-EMS – Специфікація відображеної пам’яті (Expanded memory Specification).
Використовується як правило для збереження даних.
ЕМS 3.2 – до 8Мбайт.
ЕМS 4.0 –до 32Мбайт. Допускає сторінки нестандартного розміру (більші або менші 16 Кбайтів, але такі, щоб в одній нестандартній сторінці вміщувалось ціле число стандартних, або щоб в одній стандартній було ціле число нестандартних).
У ХТ, АТ використовується спеціальна плата пам’яті, що відповідає вимогам EMS і програмний драйвер, який керує відображеною пам’яттю. Драйвер відображеної пам’яті – ЕММ (Expanded Memory Manager).
На комп’ютерах з мікропроцесором 386 відображена пам’ять емулюється за допомогою драйверу ЕММ386.ЕХЕ (набір функцій, що доступні через переривання 21h).
Як і стандартна, розширена пам’ять також виділяється блоками. Блок виділяється за запитом від програми, яка вказує число потрібних сторінок. Програма, яка видала запит, отримує в своє розпорядження обробник (handle) або маніпулятор виділеного блоку. Цей обробник використовується у всіх операціях читання з блоку та запису в нього.
Обробник – невелика інформаційна структура, яка зберігає всі необхідні дані про блок.
Таким чином, обмін даними між стандартною та відображеною пам’яттю на логічному рівні реалізується аналогічно обміну між стандартною та зовнішньою пам’яттю.
Перший блок відображеної пам’яті завжди використовується самим ЕММ для себе.
Розширена пам’ять
Microsoft, Lotus, Intel та AST – розробили специфікацію розширеної пам’яті – XMS – eXtended Memory Specification.
Ця специфікація визначила правила доступу як до самої розширеної пам’яті, так і до додаткової пам’яті інших типів, які створюються за її рахунок.
Програмний драйвер, який реалізує специфікацію XMS, дозволяє пересилати дані із стандартної пам’яті у розширену і назад.
Цей драйвер – адміністратор розширеної пам’яті – ХММ, один з найбільш відомих HIMEM.SYS.
Виділення розширеної пам’яті виконується блоками ЕМВ – Extended Memory Block, - та за спеціальним запитом від програм. Програма, яка зробила запит на блок розширеної пам’яті, отримує в своє розпорядження обробник і користується ним при доступі до блоку пам’яті.
Розширена пам’ять – це така, керування якою узгоджене з XMS – XMS-пам’ять, оскільки сама розширена пам’ять може використовуватись і за іншими правилами (! Базова розширена пам’ять це не XMS).
Звертання через переривання 15h замість специфікації XMS.
Висока пам’ять
У процесорі 80286 ША – 24 розрядів. Тоді стає можливою адресація сегменту пам’яті – 64 Кбайт, який починається з останнього значення параграфу UMA. Таким чином адресується до 64Кбайт розширеної пам’яті мінус16 байтів, що входять в останній параграф UMA.
Від 1 Мбайту до 1 Мбуйту + 64 Кбатів – 16 байтів. Область високої пам’яті НМА – (High Memory Area).
Метод доступу до цього сегменту реалізований в драйвері HIMEM.SYS (враховано в XMS).
Розширену пам’ять, що попадає в цю область, називають високою пам’яттю (High Memory). Використовується безпосередньо, без переключення режимів роботи мікропроцесору. Але XMS дозволяє її використовувати тільки одній програмі. Частіше це DOS, частина її резидентного коду, звільняє тим самим стандартну пам’ять.
Верхня пам’ять
Верхня пам’ять (Upper Memory Area) займає адресний простір, що міститься безпосередньо над стандартною пам’яттю, вище 640 Кбайтів. На цей адресний простір відображено відео-пам’ять та BIOS. Частина адресного простору, що залишилася, може бути розподілена між іншими програмами. Вона розбивається на фрагменти розміром 64 Кбайти, що отримили назву “вікна” відображуваної пам’яті. Їх можна заповнити розширеною пам’яттю, якщо забезпечити відображення їх адрес на фізичні адреса, більші 1 Мбайту. Це можна робити на МП 80386, оскільки ці процесори реалізують перетворення одних адрес (логічних) в інші адреси (фізичні). Ця можливість використовується аналогічно тому, як емулюється відображення пам’яті з використанням розширеної, але:
1. Неможливо використати пам’ять, яка перевищує розміри “вікна” (не підтримується механізм перемикання сторінок).
2. У заповнені пам’яттю “вікна” можна завантажувати не тільки дані, але й драйвери та резидентні програми (що вивільнює стандартну пам’ять).
Пам’ять, що заповнює “вікна” в UMA, або UMB-пам’ять (Upper Memory Blocks – блоки верхньої пам’яті), складається з декількох фрагментів – регіонів. Деякі функції керування зафіксовані в XMS і реалізуються в HIMEM.SYS, але повна підтримка забезпечується тільки драйвером ЕММ386.ЕХЕ.
Пам’ять такого типу – це програмна пам’ять, оскільки вона формується програмними засобами при наявності відповідної апаратної підтримки.
Деякі моделі ПК різних класів мають апаратну верхню пам’ять, тобто оперативну пам’ять розміром 384 Кбайти в UMA. В такому випадку ці регіони доступні з самого початку.
Завантаженням в верхню пам’ять повністю керує DOS.
Для підтримки повної структури пам’яті мікропроцесорами типу 386, 486 та Pentium необхідно в командному файлі CONFIG.SYS:
1) підключити драйвер HIMEM.SYS (перед усіма іншими підключеннями);
2) підключити драйвер EMM386.EXE з параметром RAM;
3) встановити команду DOS = HIGH, UMB – для завантаження резидентних модулів DOS у високу пам’ять;
4) встановити команду DEVICEHIGH – для завантаження зовнішніх драйверів в верхню пам’ять;
У командному файлі AUTOEXEC.BAT за допомогою команди LOADHIGH завантажити резидентні програми у верхню пам’ять.
Драйвери верхньої та розширеної пам’яті
Драйвер HIMEM.SYS – призначений для керування розширеною і високою пам’яттю за специфікацією XMS3.0.
Завантажується у систему командою DEVICE=C:\DOS\HIMEM.SYS. Це менеджер розширеної пам’яті (ХММ) – що забезпечує безконфліктне сумісне використання розширеної пам’яті декількома програмами і драйверами так, щоб вони не могли одночасно використати один і той самий блок.
Драйвер ЕММ386.ЕХЕ – призначений для емуляції відображеної за специфікацією EMS4.0) та керування верхньою пам’яттю.
Може виділити одну частину XMS-пам’яті для доступу по EMS, а другу частину – під верхню пам’ять. Сам може виконувати сканування UMA для пошуку “вікон”.
Виконує дві функції. Це одночасно як ЕММ, так і адміністратор верхньої пам’яті. Це так, тому що технічна реалізація підтримки відображеної пам’яті аналогічна підтримці верхньої пам’яті.
Додатково виконує ще три функції:
1) Підтримує співпроцесор з плаваючою комою Weitek.
2) Реалізується стандарт VCPI – (Virtual Control Program Interface) – віртуальний керуючий програмний інтерфейс (розширення специфікації EMS для виключення програмних конфліктів).
3) Забезпечує формування тіньової пам’яті.
Завантажувані модулі COM та EXE – файли
Програми, що призначені для виконання в середовищі операційної системи DOS називаються завантажуваними модулями та містяться у файлах, що мають розширення COM або EXE.
Файли COM – програми, що завантажуються безпосередньо. Для них не потрібно фактично ніякої підготовки для запуску їх після завантаження в ОЗП засобами DOS. Проводиться лише формування спеціальної сегмент-приставки, необхідної для всіх програм, що завантажуються ОС, і встановлення регістрів сегментів МП (їм присвоюються стандартні значення), після чого керування передається програмі, що завантажена в ОЗП. Файли типу СОМ завантажуються в ОЗП відразу ж після системної області (в нижню частину доступної пам’яті).
При завантаженні файлів ЕХЕ в ОС, необхідно провести спеціальну підготовку. Основа підготовки – переміщення, яке здійснюється завантажувачем командного процесора і заключається в налагодженні адрес в програмі в залежності від місця її завантаження в ОЗП. Інформація, необхідна для переміщення, зберігається в файлі типу ЕХЕ починаються дво-байтовою міткою (її значення 4D5AH).
Формат програм в файлах типу СОМ компактніший та простіший.
СОМ-файл – вміщує тільки машинні команди та дані, без заголовку, таблиці переадресації або відлагоджувальної інформації. Максимальний розмір файлу – 64 Кбайти.
Завантажувач працює з СОМ-файлом таким чином:
- відводить максимально можливий блок вільної пам’яті, будує префікс програмного сегменту (Program Segment Prefix - PSP) на початку блоку;
- читає СОМ-файл в пам’ять відразу за PSP і передає керування на перший байт програми.
Формат СОМ-файла скопіювали з формату виконуваних модулів ОС СР/М Digital Research для 8080, 880. тому вони незахищені. Можна присвоїти довільному файлу розширення СОМ і з командного рядка завантажити його в DOS.
ЕХЕ-файл – складається з трьох основних компонентів:
- заголовок файлу,
- таблиця переадресацій,
- власне код та дані програми.
Заголовок – містить кілька інформаційних блоків:
- двобайтну сигнатуру MZ (Марк Збиковськи);
- розміри заголовку, таблиці переадресації і файлу в цілому;
- початкові значення CS:IP і SS:SP в момент запуску програми;
- контрольна сума;
- деякі вказівки з розподілу пам’яті для завантажувача DOS.
Максимальний розмір ЕХЕ-файлу не обмежений. До його складу можна включити відлагоджувальну інформацію, дописавши цю інформацію в кінець файлу та залишивши без змін його розмір, вказаний в заголовку. Завантажувач DOS цю інформацію проігнорує.
Головний недолік ЕХЕ-файлів – вони не зберігають інформацію про окремі сегменти програми; коли компоновщик (linker) формує ЕХЕ-файл, він збирає всі заявлені у вихідному тексті сегменти в один величезний об’єм із спільною таблицею переадресації.
Системний завантажувач не в змозі визначити, яка частина програми є кодом, що виконується, яка – статичні дані (рядкові та числові константи), а яка – змінні дані. Тому завантажувач не має можливості відвести для зберігання кожного з цих компонентів окремі блоки пам’яті та незалежно маніпулювати сегментами.
Створюючи Windows, розробники Microsoft зрозуміли, що 640 Кбайтів реального режиму DOS сильно обмежує. Вихід у ретельній сегментації програм. Треба мати можливість залишати у пам’яті тільки ту частину, конкретної програми, яка забезпечує її подальше виконання та заміщувати, або виводити на диск фрагменти, які не використовуються у біжучий момент.
SHAPE \* MERGEFORMAT Структура EXE-файлу старого типу
Початок файлу
Розмір таблиці переадресування
Таблицяпереадресування
Сигнатура EXE-файлу “MZ”
Заголовокфайлу
Кодтаданіпрограми
Розмір файлу
Розмір заголовку файлу
Min додаткової пам’яті
Max додаткової пам’яті
SS:SP при вході в програму
Контрольна сума файлу
CS:IP при вході в програму
Зміщення першого рядка таблиці переадресування
Кінець файлу
SS – сегмент стеку
SP – покажчик стеку;
CS – код сегменту;
IP – покажчик команд.

Було прийнято рішення ввести нову структуру файлів, що виконуються – нові ЕХЕ-файли. Був створений новий завантажувач для таких файлів під систему Windows. Під час роботи Windows він перехоплює звертання прикладних програм до функції DOS EXEC (функція 4Bh переривання 21h) і правильно завантажує як “нові”, так і “старі” ЕХЕ-файли.
Структуру файлу можна розглядати на декількох рівнях абстракції. На найвищому рівні дві частини:
- старий ЕХЕ-файл;
- новий ЕХЕ-файл.
“Стара” частина вміщує повний заголовок старого ЕХЕ-файла, таблицю переадресації і власне програму. Якщо новий ЕХЕ-файл чомусь буде запущений із командного рядка DOS, завантажувач DOS розпізнає заголовок старого ЕХЕ-файла та запустить програму – для WINDOWS – програми це просто повідомлення “This program requires Microsoft Windows” і повертається керування DOS.
Якщо новий ЕХЕ-файл запускається через модуль керування Program Manager або File Manager оболонки Windows, “стара” частина ЕХЕ-файла ігнорується.
“Нова” частина нового ЕХЕ-файла вміщує елементи, які розпадаються на три класи.
1. Заголовок та різні таблиці, які визначають розмір, розташування та характеристики всіх інших частин файла. Вони використовуються системним завантажувачем та “невидимі” для самої програми під час її виконання.
2. Сегменти коду та даних програми, кожна із своєю таблицею переадресації.
3. Ресурс – це статична порція даних. Наприклад: таблиці для побудови графічних елементів керування, символьні рядки для підказок та системи допомоги, курсори, іконки.
Кожний ресурс у файлі розпізнається за іменем та типом. Він завантажується у пам’ять системою за вимогою прикладної програми.
Версії OS/2 та різні розширювачі DOS також користуються форматом нового ЕХЕ-файлу.
SHAPE \* MERGEFORMAT Структура EXE-файлу нового типу
Початок файлу
Покажчик на таблицю входів
Таблицяпереадресування
Сигнатура нового EXE-файлу “NE”
Заголовокстарого EXE-файлу
Код та даніпрограми
Номер версії компонувальника
32-бітовий контрольний код файлу (CRC)
Прапорці модуля
Номер сегменту DGROUP
Розмір „купи”
Розмір стеку
CS:IP при вході в програму
СтарийEXE-файл
НовийEXE-файл
Кінець файлу
Заголовокнового EXE-файлу
РізніТаблиці
Сегмент № 1та таблицяпереадресування
. . .
Сегмент № nта таблицяпереадресування
Ресурси
SS:SP при вході в програму
Розмір одиниці вирівнювання
Кількість ресурсів
Операційна система, що необхідна
Прапорець використання режиму захисту
Таблиця сегментів
Таблиця ресурсів
Таблиця резидентних імен
Таблиця імен, що імпортуються
Таблиця посилань модуля
Таблиця входів

Логічна структура диску в MS-DOS
За своєю внутрішньою структурою логічний диск повністю відповідає дискеті, тому спочатку розглядаємо логічну структуру жорсткого диску, а потім деякі зауваження відносно гнучких дискет.
Розбиття фізичного диску на декілька логічних корисно з таких точок зору:
1. У випадку пошкодження логічного диску пропадає тільки та інформація, яка знаходилась на цьому логічному диску.
2. Реорганізація та вивантаження диску малого розміру простіше і швидше ніж великого.
3. Можливе розділення дискового простору між окремими користувачами комп’ютеру.
4. При використанні спеціальних утиліт для розділення диску на частини (менеджерів), можлива установка для окремих логічних дисків захисту від запису. На такі диски можна записувати інформацію, що не міняється. Шкода від програм-вірусів буде менша – вірус не зможе записати себе на захищений диск.
5. Один фізичний диск може вміщувати декілька різних ОС, розташованих в різних логічних розділах диску. Під час початкового завантаження можна вказати розділи диску, з якого повинна виконуватись завантаження ОС.
Перший сектор жорсткого диску (сектор 1, доріжка 0, головка 0) вміщує так званий головний завантажувальний запис (Master But Record). Цей запис призначений для завантаження операційної системи.
Сам по собі головний завантажувальний запис – це програма. Вона під час початкового завантаження ОС з жорсткого диску розміщується за фіксованою адресою в оперативній пам’яті (7С00:0000), після чого, їй передається керування. Завантажувальний запис продовжує процес завантаження ОС.
В кінці першого сектору жорсткого диску розташовується таблиця розділів диску (Partition Table). Ця таблиця вміщує чотири елементи, що описує максимально чотири розділи диску. В останніх двох байтах сектора знаходиться число 55АА. Це ознака таблиці розділів.
Для перегляду та зміни вмісту таблиці розділів жорсткого диску використовується утиліта FDISK, або аналогічна утиліта іншої ОС.
Елемент таблиці розділів диску - це структура розміром 16 байтів, що описує частину диску, яка називається розділом. В структурі описані межі розділів в термінах номерів сектора, доріжки та головки, там розміщується інформація про розміри розділу в секторах та про призначення розділу.
Розділи диску можуть бути активними, активний розділ може бути використаний для завантаження ОС. Диск може вміщувати одночасно декілька активних розділів, які можуть належати різним ОС.
Формат самого першого сектору жорсткого диску
У першому секторі активного розділу розташований запис завантаження (Boot Record Program), який не треба плутати з головним завантажувальним записом (Master Boot Record). Запис завантаження читається в оперативну пам’ять головним завантажувальним записом, після чого першому передається керування для подальшого завантаження певної (вибраної) операційної системи.
SHAPE \* MERGEFORMAT Структура диску ОС DOS
Первинний розділ DOS
Головний завантажувальний запис
Елемент 1
Елемент 2
Елемент 3
Елемент 4
Логічний диск
Розширений розділ DOS
Логічний диск
Елемент 1
Елемент 2
Логічний диск
Елемент 1
Елемент 2
Логічний диск
Елемент 1
Елемент 2
Сектор головного завантажувального запису,сектор 1доріжка 0головка 0
Диск C:
Сектор таблиці логічних дисків
Диск D:
Сектор таблиці логічних дисків
Диск E:
Сектор таблиці логічних дисків
Диск F:

Таким чином, завантаження ОС з жорсткого диску – двохступеневий процес. Спочатку модулі ініціалізації BIOS читають головний завантажувальний запис в пам’ять за адресою 7С00:0000 і йому передається керування. Цей запис проглядає таблицю розділів і знаходить активний розділ. Якщо активних розділів декілька, на консоль виводиться повідомлення про необхідність вибору активного розділу для продовження завантаження.
Після того, як активний розділ знайдено, головний завантажувальний запис читає самий перший сектор розділу в ОП. Цей сектор вміщує запис завантаження, якому і передається управління.
Запис завантаження активного розділу виконує завантаження тої ОС, що знаходиться в активному розділі. Такий двохступеневий спосіб завантаження ОС необхідний тому, що спосіб завантаження залежить від самої ОС, тому кожна ОС має свій власний завантажувач. Фіксованим є тільки розташування запису завантаження – самий перший сектор активного розділу.
Формат елементів таблиці розділів
Розглянемо докладніше деякі поля елементу таблиці розділу диску.
Байт із зміщенням 0 – це прапорець активного розділу і може приймати одне із двох значень: 0h або 80h відповідно для неактивного і активного розділів диску.
Двобайтове слово, що розташоване із зміщенням 8 містить відносний номер першого сектору розділу. Він вираховується наступним чином. Значення 0 відповідає доріжці 0, головці 0, сектору 1. Першим збільшується відносний номер сектору на доріжці, потім номер головки і, нарешті, номер доріжки. Для обчислення відносного номера сектору можна використати таку формулу
RelSect = (Cyl ? Sect ? Head) + (Head ? Sect) + (Sect - 1)
де Cyl – номер доріжки, Sect – номер сектора на доріжці, Head – номер головки.
Звичайно розділи починаються з парних номерів доріжок, за виключенням самого першого розділу. Цей розділ може починатись з сектору 2 нульової доріжки (головка 0), тому що самий перший сектор диска зайнятий головним завантажувальним записом.
Байт із зміщенням 4 – це код системи, що використовує розділ диска. Для DOS зарезервовані 0, 1, 4, 5.
0 – невикористаний розділ диску;
1 або 4 – розділ використовується DOS як первинний (Primary Partition). Цей первинний розділ використовується DOS як логічний диск. Він зазвичай активний і з нього виконується завантаження ОС. В залежності від того, який код використовується (1 або 4) міняється одна з характеристик логічного диска – розмір елемента таблиці розміщення файлів (FAT) – File Allocation Table. 1 – 12-бітний FAT. 4 – 16-бітний FAT.
5 – позначає розширений розділ DOS (Extended DOS Partition).
Неважко зауважити, що навіть використовуючи всі елементи таблиці розділів для створення логічних дисків неможливо створити більше чотири логічних диски.
Використання розширеного розділу DOS дозволяє створювати довільну кількість логічних дисків. Всі ці диски будуть розташовані в межах одного розширеного розділу.
Якщо код системи 5 в елементі таблиці розділів, то на початку розділу, вказаному в цьому елементі, розташовується сектор, що вміщує таблицю логічних дисків. Якщо код елемента 5, то він знову вказує на наступну таблицю логічних дисків. Таким чином, таблиці логічних дисків зв’язані у список, на початок цього списку вказує елемент таблиці розділів диску з кодом системи, рівним 5.
Для таблиці логічних дисків маємо відмінність в використанні полів (границь) меж логічних дисків: якщо код системи рівний 1 або 4, ці межі обчислюються відносно початку розширеного розділу; для елемента з кодом 5 використовується абсолютна адресація (відносно фізичного початку диска).
На малюнку приклад:
На диску два розділи – первинний та розширений. Первинний використовується для завантаження MS-DOS (диск С:). Розширений вміщує логічні диски D:,E:,F:.
Запис завантаження (BOOT)
Перший сектор логічного диску (а також перший сектор на системній дискеті) займає запис завантаження (Boot Record Program). Цей запис читається з активного розділу диску програмою головного запису завантаження (Master Boot Record) та запускається на виконання. Задача запису завантаження – виконати завантаження ОС. Кожний тип ОС має свій запис завантаження. Навіть для різних версій одної ОС програма завантаження може виконувати різні дії.
Крім програми початкового завантаження ОС в запису завантаження знаходяться параметри, що описують характеристики даного логічного диску. Всі ці параметри розташовуються на самому початку сектору, в області, що називається „форматованою областю”.
Варіант формату завантажувального запису ОС DOS
Запис завантаження (BOOT)
Перший сектор логічного диску (а також перший сектор на системній дискеті) займає запис завантаження (Boot Record Program). Цей запис читається з активного розділу диску програмою головного запису завантаження (Master Boot Record) та запускається на виконання. Задача запису завантаження – виконати завантаження ОС. Кожний тип ОС має свій запис завантаження. Навіть для різних версій одної ОС програма завантаження може виконувати різні дії.
Крім програми початкового завантаження ОС в запису завантаження знаходяться параметри, що описують характеристики даного логічного диску. Всі ці параметри розташовуються на самому початку сектору, в області, що називається „форматованою областю”.
Варіант формату завантажувального запису ОС DOS
(+0) – команда переходу в середині сегменту JMPxxxx. Вона необхідна для обходу фор матованої зони сектору та передачі керування програмі завантаження.
(+11) – містить деякі характеристики логічного диску, що використовуються драйвером диску. Це звичайний (BPB) та розширений блоки параметрів BIOS.
Формат звичайного та розширеного блоків параметрів BIOS
Невидимі сектори не належать жодному логічному диску. Вони можуть містити основну або вторинну таблиці розділів диску.
Байт – описувач носія даних – служить для ідентифікації носія та містить значення, що характеризують носій за числом сторін та числом секторів на доріжці, наприклад:
FFh – 2 сторони, 8 секторів на доріжці;
FEh – 1 сторони, 8 секторів на доріжці;
EDh – 2 сторони, 9 секторів на доріжці;
FCh – 1 сторони, 9 секторів на доріжці;
F9h – 2 сторони, 15 секторів на доріжці;
F8h – жорсткий диск.
Використання BOOT-сектору
DOS надає програмі можливість працювати з так званими логічними номерами секторів. Це номери секторів в середині логічного диску. Для адресації сектору при допомозі функцій BIOS необхідно вказувати номер доріжки, номер головки та номер сектора на доріжці. DOS організує „наскрізну” нумерацію секторів, при якій кожному сектору логічного диску присвоюється свій унікальний номер. Порядок нумерації вибраний таким, що при послідовному збільшенні номера сектора спочатку збільшується номер головки, потім номер доріжки. Це зроблено для скорочення переміщень блоку головок при звертанні до послідовних логічних номерів секторів.
Наприклад: Для дискети з 9-а секторами на доріжці. Сектор з логічним номер 1 розташований на нульовій доріжці і для звернення до нього використовується нульова головка. Це самий перший сектор на доріжці. В термінах BIOS він має номер 1. Наступний сектор на нульовій доріжці має логічний номер 2, останній сектор на нульовій доріжці має логічний номер 9. Сектор з логічним номером 10 розташований також на нульовій доріжці. Це також самий перший сектор на доріжці, а для доступу до нього використовується головка з номером 1. І так далі, при збільшенні логічного номеру сектора змінюються номера головки та доріжок.
Для роботи з логічним диском (або дискетою) на рівні логічних номерів секторів, DOS надає програмам два переривання: INT25h – читання сектору за його логічним номером, INT26h – запис сектору за його логічним номером.
Вміст BOOT-сектору може бути використаний для визначення загальної кількості секторів на логічному диску (наприклад, в програмах перевірки секторів диску на читання), для роботи з таблицею розміщення файлів FAT та інше.
Таблиця розміщення файлів
Одразу після сектору завантаження на логічному диску знаходяться сектори, що містять таблицю розміщення файлів FAT (File Allocation Table).
Згадаємо, як організовано зберігання інформації на диску. Доступ до цієї інформації може виконуватись як для послідовного, так і для прямого методом доступу. Прямий метод дозволяє встановлювати головки зразу потрібний файл (або на потрібний запис файлу). Наприклад, ми можемо задати номер сектору на певній доріжці та номер головки. (Є ще послідовний метод доступу).
Але метод доступу – це ще не все. Важливе значення має спосіб розподілу місця на диску для файлів.
В MS-DOS (UNIX, OS/2) при створенні файлу для нього не задається початковий розподіл пам’яті в доріжках або секторах. Із збільшенням розміру файлу ОС виділяє цьому файлу сектори з тих що є вільними (не використовуються іншими файлами). При цьому файл розміщується не обов’язково в суміжних областях диску, він може бути розкиданий по різним доріжкам та секторам. В такому випадку ОС повинна вести облік ділянок диску, що використовуються. Для кожного файла вона повинна зберігати інформацію якому файлові які ділянки диску виділені. В MS-DOS для цього використовується FAT.
Весь логічний диск розбивається ОС на ділянки однакового розміру, що називаються кластерами. Кластер може вміщувати декілька секторів. Для кожного кластера FAT має свою індивідуальну комірку, в якій зберігається інформація про використання даного кластеру. Іншими словами FAT – це масив, що містить інформацію про кластери. Розмір цього масиву визначається загальною кількістю кластерів на логічному диску (саме кластерів, а не секторів).
Усі вільні кластери помічені нулями. Якщо файл розташований в декількох кластерах, то ці кластери зв’язані у список. Для зв’язаних у список кластерів елементи таблиці FAT вміщують номери наступних кластерів, що використовуються даним файлом. Кінець списку відмічається в таблиці спеціальним значенням. Номер першого кластера, що належить файлу, зберігається в елементі каталогу, що описує цей файл.
Утиліти ОС та деякі спеціальні утиліти перевіряють диск на предмет наявності дефектних областей. Кластери, що знаходяться в цих дефектних областях, відмічаються в FAT як погані (bad) та не використовуються ОС.
Таким чином FAT – це масив інформації про використання кластерів диску – вміщує однозв’язні списки кластерів, що виділені файлам. Номера початкових кластерів файлів зберігаються в каталогах.
SHAPE \* MERGEFORMAT Ланцюжки кластерів файлів
AUTOEXEC BAT
COFIG SYS
11 12
Номер першого кластеру
. . .
. . .
11
27
. . .
12 13
13 14
14 15
15 16
16 17
17 FF
18 0
27 28
28 51
51 52
52 77
77 FF
19 0
. . .
. . .
. . .
. . .
. . .

На цьому малюнку показані фрагменти кореневого каталога диску С: та елементи FAT для файлів AUTOEXEC.BAT та CONFIG.SYS. FAT в комірці 11 вміщує число 12 – номер наступного кластера, що виділений файлу AUTOEXEC.BAT, комірка з номером 12 вміщує число 13 і т.д. Остання комірка, що відповідає останньому кластеру цього файлу, вміщує значення FF. Кластери можуть і не розташовуватись один за одним, наприклад ланцюжок кластерів, що виділений для файлу CONFIG.SYS.
Існує два формати FAT – 12-бітовий та 16-бітовий. 12-бітовий – зручний для дискет з невеликою кількістю секторів. В цьому випадку вся FAT розміщується цілком в одному секторі. Якщо диск такий, що для представлення всіх секторів 12 розрядів недостатньо, можна збільшити розмір кластера, наприклад до 8 секторів. Але більший розмір кластера приводить до неефективного використання дискового простору. Це тому, що мінімальний елемент, який виділяється файлу – кластер, має занадто великий розмір. Навіть для файлу, що має довжину 1 байт виділяється повний кластер. Таким чином, якщо розмір кластера 8 секторів, то для зберігання 1 байта буде використано 4 Кбайти дискової пам’яті.
При використанні 16-бітного FAT ОС може працювати з логічним диском, який має розмір більший 32 Мбайти. DOS при 16-бітному FAT, та кластером на 4 сектори може працювати з розділами, що досягають 134 Мбайтів.
Визначення формату FAT
Для DOS, сектор запису завантаження (BOOT-сектор) диску в полі із зміщенням 36h вміщує 8-байтовий рядок, що ідентифікує формат FAT. „FAT12” або ” FAT16”.
Якщо розділи на жорсткому диску створювались утилітою FDISK, формат FAT можна визначити, аналізуючи вміст поля SYS головного завантажую чого запису (Master Boot Record). Якщо це поле вміщує значення:
1 – 12-бітовий формат,
4 – 16-бітовий формат.
Але диски після обробки деякими диск-менеджерами можуть мати нестандартний для DOS формат таблиці розділів диску (Partition Table) та в полі SYS можуть бути інші величини, відмінні від 1 та 4.
Формат FAT
1-й байт FAT „Описувач середовища” (Media Descriptor) або байт ID ідентифікації FAT. Він має таке ж значення, як і байт-описувач середовища, що знаходиться в завантажувальному записі. Наступні 5 байтів – для 12-бітового формату та 7 байтів – для 16-бітового формату завжди містять значення 0FFh.
Інша частина FAT складається з 12-бітових або 16-бітових комірок, кожна комірка відповідає одному кластеру диску. Ці комірки можуть вміщувати такі значення:
Безпосередній доступ до FAT може бути необхідний для організації сканування каталогів для пошуку необхідних файлів, для читання каталогів як файлів, для організації захисту інформації від несанкціонованого копіювання.
Файли та каталоги
Відомо, що файлова система MS-DOS має деревоподібну структуру. В кореневому каталозі розміщуються 32-бітні елементи, які вміщують інформацію про файли та інші директорії. Для читання кореневої директорії необхідно визначити його розташування та розмір.
Коренева директорія знаходиться зразу за останньою копією FAT. Кількість секторів, що займає одна копія FAT, знаходиться в BOOT-секторі в полі із зміщенням 11. кількість копій FAT в тому ж полі (в блоці ВРВ – блок параметрів BIOS). Таким чином, перед кореневим каталогом знаходиться один BOOT-сектор та декілька секторів таблиці розміщення файлів FAT.
Розмір кореневого каталогу можна визначити, виходячи із значення поля rootsize (блок ВРВ). У цьому полі при формуванні диску записується максимальна кількість файлів та каталогів, які можуть знаходитись в кореневому каталозі. Для кожного елемента в каталозі відводиться 32 байта, тому кореневий катал має довжину (32*rootsize) байт.
Кореневий каталог займає неперервну область фіксованого розміру. Розмір кореневого каталогу задається при форматуванні та визначає максимальну кількість файлів та каталогів, що може бути описана в кореневому каталозі. Для визначення кількості секторів, що займає кореневий каталог, можна скористатись такою формулою:
RootSecs = 32 ? rootsize / sectsize,
де rootsize – максимальне число дескрипторів файлів, що може міститися в кореневому каталозі диску; sectsize – розмір сектору в байтах, він може бути отриманий з відповідного поля BOOT-сектору.
Після кореневого каталогу на логічному диску знаходиться область файлів та підкаталогів кореневого каталогу.
Область даних розбита на кластери, причому нумерація кластерів починається з числа 2. Кластеру з номером 2 відповідають перші сектори області даних. Приведемо формулу, яка дозволить зв’язати номер кластеру з номерами секторів які він займає на логічному диску:
SectNu = DataStart + (ClustNu - 2)  clustsize,
DataStart = ressecs + fatsize ? fatcnt + 32 ? rootsize / sectsize,
де SectNu – номер першого сектора, розподіленого кластеру з номером ClustNu; ClustNu – номер кластера, для якого необхідно визначити номер першого сектора; Clustsize – кількість секторів, що займається кластером, знаходиться в блоці параметрів BIOS (блок ВРВ BOOT-сектора).
SHAPE \* MERGEFORMAT Структура логічного диску ОС DOS
Завантажувальний записта зарезервовані сектори
Перша копія FAT
Кореневий каталог
Область даних
Ділянка логічного диску
0
Друга копія FAT
Зміщення початкового сектору
ressect + fatsize
ressect – число резервних секторів
ressect + fatsize ? fatcnt
ressect + fatsize ? fatcnt + 32 ? rootsize / sectsize

Довільний каталог містить 32-байтні елементи – дескриптори, що описують файли та інші каталоги.
Формат дескриптора
Байт атрибутів є у кожного файлу. Біти цього байту мають наступні значення:
0 – файл тільки для читання, в цей файл не можна писати і його не можна стирати;
1 – захований (hidden) файл, цей файл не з’являється у списку файлів;
2 – системний файл; цей біт встановлюється у файлах, що є складовою частиною ОС;
3 – цей дескриптор описує мітку диска; для цього дескриптора поля імені файла та розширення імені файла мають розглядатись як поле довжиною 11 байт; це поле вміщує містку диска;
4 – дескриптор описує файл, що є підкаталогом поданого каталогу;
5 – прапорець архівації; якщо цей біт встановлено в 1, то це означає, що даний файл не був завантажений утилітою архівації (наприклад, програмою BACK UP);
6-7 – зарезервовані.
Приклади.
Звичайно файли мають такі комбінації бітів в байті атрибутів:
00000000 – звичайні файли (тексти програм, модуль завантаження, пакетні файли).
00000111 – тільки файли, що читаються заховані системні файли. Така комбінація у файлах.
00001000 – мітка поля; дескриптор мітки поля може знаходитись тільки в кореневому каталозі логічного диску.
00010000 – (10h) дескриптор, що описує каталог.
00100000 – (20h) звичайний файл, який не був завантажений утилітами BACK або XCOPY.
У довільному каталозі, окрім кореневого, два перших дескриптора мають спеціальне призначення:
Перший дескриптор вміщує в полі імені рядок ”.”. Цей дескриптор вказує на каталог в який його вміщено, тобто каталог вказує має сама на себе. Другий спеціальний дескриптор вміщує в полі імені рядок ”. .”. Цей дескриптор вказує на каталог вищого рівня. Якщо в полі номера першого кластера дескриптора з іменем ”. .” знаходиться нуль, то це означає, що цей каталог розташований в кореневому каталозі.
Таким чином, в деревоподібній структурі каталогів маємо посилання як в прямому, так і в зворотному напрямках. Ці посилання можна використовувати для перевірки цілісності структури каталогів файлової системи.
При знищенні файла перший байт його імені заміняється на байт E5h (символ ’X’). Всі кластери, виділені файлу, відмічаються у FAT як вільні. Якщо файл вилучили тільки що, то його ще можна відновити, тому що в дескрипторі збереглися всі поля, крім першого байта імені файлу. Але, якщо на диск записані нові файли, то вміст кластерів вилученого файла буде змінено і відновлення стане неможливим.
Зупинимось докладніше на полях часу та дати створення або останньої модифікації файлу. DOS оновляє вміст цих полів після довільної операції, що змінює вміст файлу (створення, перезапис вмісту, додавання даних, оновлення вмісту). Після оновлення файлу DOS встановлює біт архівації байта атрибутів в 1.
SHAPE \* MERGEFORMAT Формат поля часу
Години (0 ~ 24)
15
11
Секунди (0 ~ 29)
Хвилини (0 ~ 59)
10
5
4
0

Старші 5 бітів вміщують значення години модифікації файла, шість бітів з номерами 5-10 вміщують значення години модифікації файла, в молодших 5 бітах зберігається значення секунд, полене на 2. Для того, щоб час оновлення файла вмістився в 16 бітах, треба було знизити точність часу до двох секунд.
Для того, щоб отримати значення року оновлення файла, необхідно добавити до величини, що зберігається в старших семи бітах, значення 1980. поля для місяця та дня якихось особливостей не мають, вони повністю відповідають календарній даті.
SHAPE \* MERGEFORMAT Формат поля дати
Рік (0 ~ 119)
15
9
День (0 ~ 31)
Місяць (0 ~ 12)
8
5
4
0

Поле довжини в дескрипторі вміщує точну довжину файла в байтах. Для каталогів у полі довжини записано нульове значення. Працювати з каталогом як зі звичайним файлом засобами DOS неможливо. Єдиний спосіб прочитати каталог як файл – використати FAT для визначення ланцюжка кластерів, що займає цей каталог та прочитати сектори, що відповідають цим кластерам за допомогою переривання DOS INT 25h.
Ще раз повернемось до програми FDISK та диск-менеджерів. Як відомо, утиліта FDISK дозволяє створити розділи диску. В DOS 4.0 та вищих нема обмежень на розміри розділів та логічних дисків. Але при використанні FDISK не можна організувати захист логічних дисків від запису або від несанкціонованого доступу. Програми диск-менеджерів такі, як ADM або Speed Star, в деякій мірі розв’язують питання захисту від запису та несанкціонованого доступу. Але з’являються нові проблеми.
Диск-менеджери використовують свій власний механізм розбиття диска на розділи і тому логічна структура диску, підготовлена програмами диск-менеджерів, відрізняється від стандартної для MS-DOS. Перш за все це стосується таблиці розділів диску (Partition Table). Елементи таблиці розділів мають код системи відмінний від того, що використовується в MS-DOS. Цей код залежить від конкретної програми диск-менеджера.
Якщо диск підготовлений програмою Speed Star то всі елементи таблиці розділів будуть зайняті (MS-DOS залишає два елементи невикористаними).
Для того, щоб встановити на цей же диск іншу ОС треба вивантажити вміст всього диску на дискети, вилучити всі розділи Speed Star, створити розділи іншої ОС, а вже потім розділи MS-DOS.
Якщо диск підготовлено утилітою FDISK, то зарезервувавши заздалегідь місце для іншої ОС, можна без проблем використати два елементи таблиці розділів, що залишилися.
У таблиці розділів диску, що підготовлений програмою FDISK, знаходиться інформація про формат таблиці розміщення файлів FAT, що використовується. Можна скористуватись цією інформацією, але тільки в тому випадку, якщо диск підготовлений утилітою FDISK.
Недоліки MS-DOS
Творці MS-DOS в певній мірі пішли шляхом найменшого опору, створивши ОС, яка пропонує мінімальне операційне оточення для програм користувача. Як правило, програми, які працюють в MS-DOS, крім файлової системи, не використовують практично нічого з стандартного СПЗ.
За думкою творців MS-DOS програміст, який хоче вивести, наприклад, символ на екран монітору, повинен скористатися або системою вводу-виводу консолі оператора DOS або відповідною функцією BIOS. Те ж відноситься до програмування всієї іншої апаратури.
Але відомо, що на практиці функції DOS та BIOS часто ігноруються (обходяться) і пристрої програмуються напряму. Практично всі графічні програми працюють безпосередньо з відео пам’яттю, часто самостійно підтримують клавіатуру і інше.
Винятком є файлова система MS-DOS, яка також іноді ігнорується (наприклад, при організації захисту від копіювання).
Такий, на перший погляд дивний підхід обумовлено декількома об’єктивними причинами. Найбільш суттєвою є та, що відповідне програмне забезпечення MS-DOS недостатньо ефективне і не реалізує всі потенційні можливості комп’ютера. Так вивід пікселу на екран за допомогою відповідної функції BIOS відбувається на два порядки повільніше, ніж при безпосередньому звертанні до відео-пам’яті. Тому обхід MS-DOS дуже поширений. На це впливає також повна відкритість IBM PC, що дає можливість реалізувати програмісту свої задуми.
SHAPE \* MERGEFORMAT Диски
Взаємодія програми під MS-DOS з програмно-апаратним забезпеченням
Програма MS-DOS
Дисплей,клавіатура,порт RS-232,таймер,маніпулятор миша,друкарка,звукогенератор
Підсистеми MS-DOS:
1. Файлова система
2. Система керування пам’яттю
3. Система керування програмами
4. Система зв’язку з драйверами
5. Система обробки помилок
6. Служба часу
7. Система вводу-виводу консолі
Апаратура
Драйвери
BIOS

Але звідси великий мінус – значні терміни розробки програмних продуктів. Для комерційних програм найважливіший фактор – час розробки та програмно-апаратна сумісність.
Етапи, які повинен пройти розробник програми для MS-DOS:
1. Постановка задачі (технічне завдання).
2. Розробка інтерфейсу, тобто створення сукупності несуперечливих домовленостей та правил, які дозволяють користувачу:
а) швидко та без зайвих зусиль (на інтуїції) навчитись працювати з продуктом;
б) забезпечити швидкий доступ (мах за 3-4 кроки) до довільної команди системи;
в) інтерфейс повинен бути зручним і для розробника (легко міняти та доповнювати меню, вікна, вибір команд та опцій і використовувати цю ідеологію у всіх своїх розробках). (Особиста технологія створення меню).
3. Розв’язати проблеми з графікою, тобто створити власну, або скористатися хорошою універсальною графічною бібліотекою (таких нема). Як правило проблеми сумісності не розв’язуються.
4. Програмування зовнішніх пристроїв – клавіатури, миші, портів, таймера. Бажано забезпечити максимальну універсальність роботи з пристроями, щоб не переробляти програму під кожний новий комп’ютер. Тобто треба створити власні бібліотеки.
5. Якщо програма досить велика, треба подумати про підтримку оверлейної структури і взагалі про керування пам’яттю (не всі на Асемблері).
6. Почати реалізовувати конкретний проект, розв’язуючи одночасно проблеми сумісності із вже написаними раніше різними бібліотеками, переробляти які нема часу та можливості.
Тобто треба спочатку стати системним програмістом IBM PC, тобто мати чіткі та глибокі знання як операційної системи, так і апаратного забезпечення.
І знову ж таки нема гарантії, що ваш продукт буде працювати на тому комп’ютері, на якому ви його не тестували.
Всі ці складності витікають з ідеології та структури MS-DOS (це найпростіша однозадачна однокористувацька ОС). Але програмісту доступно практично все – нема такого ресурсу комп’ютера, який він би не отримував в своє повне розпорядження.
З точки зору користувача MS-DOS це: ідея спілкування – командний рядок; ”подумай та надрукуй”. Користувач повинен знати якусь множину команд MS-DOS. Вміти розв’язувати проблеми з мінімальними засобами діагностики. Згодом спілкування перейшло на рівень файлових систем, а потім – операційних оболонок. Ідея такого спілкування полягає в переході на новий більш природний понятійний рівень – роботу в відкритому та дружньому середовищі, яке наочно представляє предметну область, пропонує широкий набір доступних засобів і пробачає людські помилки. Ця ідея пізніше перейшла в Windows – надбудову над операційною системою MS-DOS.
Переваги які надає користувачам Windows
1. Універсальна графіка. Ключова ідея – забезпечення повної незалежності програм від апаратури. Як користувачу, так і програмісту, який створює програми під Windows, надаються універсальні засоби, які знімають проблему забезпечення сумісності з конкретною апаратурою (апаратурна сумісність) та програмним забезпеченням (програмна сумісність).
2. Єдиний інтерфейс. Ретельно продуманий уніфікований єдиний графічний інтерфейс з користувачем полегшує вивчення нових програмних продуктів. Інтерфейс Windows звільняє від необхідності організовувати меню, роботу з клавіатурою та мишею (є стандартні засоби). Не виникає проблеми типу ”як мені організувати виклик команди з меню по виділеній букві”. Інтерфейс з користувачем Windows є повним і цільним (розв’язані не тільки проблеми організації меню – все спілкування з користувачем виконується стандартними засобами). Програмуючи під Windows не потрібно обслуговувати клавіатуру або драйвер миші. Взагалі не потрібно писати службові команди, а зразу розв’язувати конкретні предметні задачі.
3. Обмін даними між програмами. Один із засобів, забезпечуючи програмну сумісність є механізм обміну даними між різними програмами. ”Поштова скринька” (Clipboard) дозволяє користувачу переносити інформацію з одної програми в іншу, не думаючи про її формат та представлення. Це робиться просто та наглядно для користувача.
Механізм обміну даних між програмами – життєво важлива якість багатозадачного середовища. Крім Clipboard є вже інші механізми:
DDE – Dynamic Data Exchange – програмним шляхом можна встановити прямий зв’язок між задачами, наприклад, приймати дані з послідовного порту, автоматично розміщати їх в комірки електронної таблиці, засобами якої виконувати їх обробку в реальному масштабі часу.
OLE – Object Linking and Embedding – вбудований об’єктний зв’язок. Дозволяє переносити з одної програми в іншу різнорідні дані. Це нестандартний засіб для Windows, але реалізація OLE стала можливою тільки в Windows.
4. Сумісність з існуючим програмним забезпеченням. Не тільки дозволяє працювати із звичними програмними продуктами, але і пропонує додаткові можливості (запуск декількох програм одночасно, швидке перемикання з одної програми на іншу, обмін даними між ними і т. п.). Забезпечена можливість роботи з усіма прикладними програмами MS-DOS.
5. Повне використання апаратних ресурсів. При інсталяції Windows аналізує наявні апаратні ресурси та автоматично встановлює режим який найбільш повно використовує можливості апаратури. Дозволяється користуватись всією встановленою на комп’ютері пам’яттю.
6. Багатозадачність. Windows дозволяє запускати одночасно декілька програм (можна одну і ту саму програму декілька разів) з можливістю миттєвого переключення з одної програми на іншу. Це дозволяє ініціювати тривалий процес (друк, сортування даних, копіювання даних) і взятись за іншу роботу.
7. Засоби програмування. Нові ідеї вимагають нової технології програмування. SDK – Software Development Kit – нагадує роботу з одною із відомих спеціальних бібліотек. (стандартна технологія Microsoft). Borland C++ (об’єктно-орієнтований підхід + стандартна технологія).
SDK – набір бібліотек, спеціальних засобів та зразків програм, створених для того, щоб допомогти писати прикладні програми для Windows.
Windows повністю міняє ідеологію програмування, переводить на зовсім відмінні від MS-DOS концепції взаємодії програм, операційного середовища та апаратних ресурсів.
Програмування для Windows складніше ніж для MS-DOS, але ця складність не надлишкова, а визначається тільки тим, що при створенні програм для Windows програміст отримує доступ до нових засобів, недоступних в MS-DOS.
Windows як операційна оболонка
Windows запускається на виконання як звичайна програма MS-DOS. Але, після завантаження в основну пам’ять, вона бере на себе майже всі функції керування ОС:
- пам’яттю;
- програмами, що виконуються;
- процесами;
- дисплеєм;
- клавіатурою;
- мишею;
- принтером;
- послідовними портами.
Windows це не ОС оскільки апаратура IBM PC обслуговується як MS-DOS, так і Windows. MS-DOS керує файловою системою. Все інше робить Windows. (Міняючи файлову систему дуже важко було б забезпечити сумісність з існуючим програмним забезпеченням).
SHAPE \* MERGEFORMAT Дисплей
Взаємодія програми під Windows з Windows, MS-DOS та апаратним забезпеченням
Програма під Windows
Апаратура
Драйвери
BIOS
Магнітні диски
Друкарка
Порт RS-232
Звукогенератор
Таймер
Клавіатура
Маніпулятор миша
Оперативна пам’ять
Файлова система
MS-DOS переривання 21h
display.drv
printer.drv
comm.drv
Драйвери пристроїв Windows
mouse.drv
keyboard.drv
system.drv
sound.drv
Windows
gdi.exe
user.exe
kernel.exe

Програма в Windows не має права звертатись до пристроїв напряму, а повинна використовувати для цього внутрішні функції Windows (їх > 600).
Це обмеження природне для багатозадачної операційної оболонки, коли всі ресурси комп’ютера розділяються.
Основні функції Windows виконують три системних модуля – kernel.exe, gdi.exe та user.exe. їх функції чітко розділені:
kernel.exe – керує пам’яттю, завантаженням та виконанням програм, а також виконує інші системні функції.
gti.exe – Graphics Devise Interface - інтерфейс з графічними пристроями, відповідає за графіку.
user.exe – робить все інше.
Модулі user.exe та gdi.exe взаємодіють з апаратною IBM PC через драйвери пристроїв Windows. Майже всі драйвери пристроїв Windows фактично виконують функції ROM BIOS MS-DOS, працюючи з пристроями напряму. Виключення – драйвер принтера printer.drv, який звертається до свого пристрою через процедури ROM BIOS. На схемі дещо спрощено.
Модуль gdi.exe та деякі драйвери також можуть викликати функції ядра (kernel.exe), а програми Windows можуть в принципі безпосередньо звернутись до драйвера (на відміну від MS-DOS, де не можна звернутись до драйвера пристрою повз ОС).
Взаємодія програм Windows з MS-DOS (тобто з функціями DOS). Хоча в програмах Windows можна використати багато функцій стандартної бібліотеки ”С”, насправді відбувається звертання не безпосередньо до DOS, а до Windows (точніше до модуля kernel.exe), який відслідковує всі звертання до переривань DOS та BIOS. При звертанні до дозволених функцій DOS середовище Windows забезпечує сумісність виклику DOS з чужою організацією основної пам’яті, а в деяких випадках (при звертаннях до функцій exec, або до функцій роботи з пам’яттю) повністю заміняє виклик на відповідне звертання до пристрою.
Якщо програма Windows викликає невідоме Windows переривання система ”висне”.
Таким чином в Windows зв’язки між програмою користувача, системою і апаратурою чітко визначені. Програма взаємодіє з Windows, Windows викликає драйвери пристроїв, які, в свою чергу, звертаються до апаратури. Розглянута схема відображає тільки загальну структуру.
Обмін даними в Windows
Для користувачів DOS комп’ютер – це деякий ”склад” програмних продуктів, які зовсім не зв’язані один з одним. Дуже часто користувач використовує окремо текстовий та графічний редактори. Альтернатива – це робота громіздких пакетах, які суміщають в собі текстові та графічні можливості. Особливо неприємним в DOS є перевантаження даних з одного продукту в інший. Не дивлячись на існування деяких стандартів, велика кількість DOS-програм зберігає дані в тому вигляді, в якому це захотілося автору. Існують сотні драйверів, які перетворюють дані в різні формати.
На відміну від DOS, Windows, як багатозадачне середовище, з самого початку була розрахована на високий ступінь інтеграції її компонентів. Один з найважливіших елементів такої інтеграції є можливість ефективного обміну даними між різними продуктами.
Clipboard
Буфер проміжного зберігання даних (вбудований). При роботі Windows - Clipboard постійно активний. Він доступний всім Windows-програмам. Обмін даними через Clipboard виконується таким чином.
В продукті-джерелі його власними засобами виділяється необхідні дані. Командою Copy (Ctrl + C) виділений фрагмент заноситься до Clipboard.
Можливе також використання команди Cut (Ctrl + X). Те саме, що Copy, а з тою різницею, що дані вилучаються з оригіналу. Потім переходимо до продукту-приймача і розміщуємо курсор у те місце, куди потрібно встановити дані з Clipboard. Після цього виконується команда Paste (Ctrl + V). Обмін закінчено. Комбінації Ctrl + C, Ctrl + X, Ctrl + V є універсальним стандартом Windows. Команди Cut, Copy, Paste є практично у всіх Windows-продуктах в меню Edit.
Механізм, що забезпечує обмін даними між різними продуктами називається –динамічний обмін даними (DDE – Dynamic Data Exchange).
SHAPE \* MERGEFORMAT Динамічний обмін даними (DDE – Dynamic Data Exchange)
Copy
Продукт-приймач
Образ фрагменту
Clipboard
Образ фрагменту
Продукт-джерело
Фрагмент
Ctrl+C
Paste
Ctrl+V

Той самий порядок дій забезпечує обмін даними і в рамках одного продукту. Тому відпадає необхідність вбудовувати в продукти внутрішні засоби копіювання та переміщення об’єктів при програмування під Windows.
Недолік – неможливість накопичення даних у буфері проміжного зберігання. При розміщенні в Clipboard нового фрагменту, старий автоматично вилучається. Тому, наприклад, при копіюванні трьох об’єктів із різних місць одного документа в одне місце в іншому, треба три рази переключитись між джерелом та приймачем. Є обмеження – десять сторінок тексту або одне повно екранне кольорове графічне зображення (є обмеження за об’ємом).
SHAPE \* MERGEFORMAT Динамічний обмін даними зі зв’язуванням
Copy
Продукт-приймач
Образ фрагменту
Clipboard
Образ фрагменту
Продукт-джерело
Фрагмент
Ctrl+C
PasteLink
Продукт-приймач
Образ фрагменту
Зв’язок
Зв’язок
PasteLink

Головна перевага обміну даними через Clipboard – це можливість об’єднання в одному документі об’єктів з різних продуктів та автоматичне перетворення форматів. Для всіх Windows-продуктів було встановлено ряд стандартів, в яких можуть представлятися дані. Для цих стандартів представлення даних виконується при операціях з Clipboard автоматично і непомітно для користувача.
Наприклад програма Viewer забезпечує:
- перегляд даних в Clipboard в різних форматах;
- запис вмісту Clipboard в файл;
- читання даних в Clipboard з файлу;
- очистку Clipboard.
Додатково у Windows реалізовано механізм динамічного обміну даними зі зв’язуванням. Суть його полягає в тому, що об’єкт який вставляється через Clipboard зберігає свій зв’язок з оригіналом і при внесенні змін в оригінал може автоматично обновлятись.
Наприклад, в Microsoft Excel створимо невелику таблицю і запишемо її в деякому файлі. Потім включимо Write, відкриємо в ньому довільний текстовий документ і спробуємо встановити туди цю таблицю за методом DDE. Для цього виділимо цю таблицю в Microsoft Excel і розмістимо її в Clipboard командою Copy. Потім переключимось на Write, але виконаємо не команду Paste, а команду Paste Link із меню Edit. В тексті у вікні редактора Write з’явиться зображення таблиці. Тепер, якщо перейти знову до Microsoft Excel і внести деякі зміни, то виявиться, що ці ж зміни відбудуться і в копії цієї таблиці в редакторі Write. Цей зв’язок зберігається і після закриття продукту. Тобто в довільний момент, коли вносяться зміни в оригінал, можна бути впевненим в тому, що ці зміни відбудуться у всіх документах, пов’язаних з оригіналом.
З одним оригіналом можна зв’язати довільну кількість документів (”зіркоподібний” тип зв’язку). Це дає нові можливості, такі як автоматичне оновлення копій.
Окрім ”зіркоподібного” зв’язку можливе зв’язування ”за ланцюжком”, коли джерелом для наступного зв’язку буде не оригінал, а раніше зв’язаний об’єкт. В цьому випадку не Paste Link, а просто команда Paste.
Команда Links дозволяє проглянути всі зв’язки для даного документа, розірвати зв’язок, ”переключити” зв’язок з одного об’єкту на інший і встановити режим ручної активації зв’язків, коли оновлення інформації в документі із зміною оригіналу відбувається не автоматично, а тільки після виконання відповідної команди.
Але користувач хотів би пересувати ланцюжки на екрані так само легко, як це робиться в реальному житті.
Зв’язування та вбудовування об’єктів (Object Linking & Embedding, OLE1)
Для користувачів основне нововведення технології OLE – можливість активації вбудованих об’єктів.
За попередніми технологіями встановлений об’єкт був складовою частиною документа, в якому він розташовувався, відображався в ньому, але внести зміни в цей об’єкт було досить складно. Для цього потрібно запустити продукт, в якому він був створений, відкрити файл даного об’єкту, змінити його певним чином і записати на диск. Потім через Clipboard виправлений об’єкт копіювався на своє місце, а стару версію в документі потрібно було знищити. (При DDE дві останні операції не потрібні ).
SHAPE \* MERGEFORMAT OLE, динамічне вбудовування об’єкту
Copy
Ctrl+C
Paste
Ctrl+V
Продукт-джерело
Об’єкт
Clipboard
Об’єкт
Продукт-приймач
Об’єкт

Для роботи за технологією OLE необхідна така сама послідовність операцій, як і раніше, при цьому, якщо продукт підтримує OLE, то він сам виконує обмін даними вже за цією технологією. Документ з вбудованими OLE-об’єктами виглядає так само, як і з фрагментами, що встановлені через Clipboard. Але тепер при подвійному натисканні на мишу в полі об’єкту він активується:
- запускається продукт, який породив цей об’єкт;
- об’єкт передається у вікно продукту для редагування, запису і інших операцій, які доступні батьківській програмі.
SHAPE \* MERGEFORMAT OLE, динамічне вбудовування об’єкту зі зв’язуванням
Copy
Ctrl+C
PasteLink
PasteLink
Продукт-джерело
Об’єкт
Clipboard
Об’єкт
Продукт-приймач
Об’єкт та шлях до нього
Продукт-приймач
Об’єкт та шлях до нього

Після завершення роботи з об’єктом батьківська програма закривається, а змінений об’єкт автоматично передається назад в документ, звідки він був викликаний. Таким чином, відпадає необхідність запам’ятовувати імена батьківського продукту та файла, в якому міститься встановлений об’єкт, Windows все пам’ятає.
В OLE ”об’єкт” це нове поняття. Раніше об’єкт – це довільний фрагмент, який переноситься з одного продукту в інший. Насправді переносився не сам фрагмент, а тільки його ”екранний образ”, продукт-джерело перетворювало дані із свого внутрішнього формату в один із стандартів Windows і в такому вигляді фрагмент вставлявся в продукт-приймач.
В OLE – ”об’єкт” це комплекс, який складається із даних у внутрішньому форматі батьківського продукту, представленому в одному із стандартних форматів Windows, і інформації про програму яка його створила, розмір, час створення та інше.
В такому вигляді – об’єкт це деяка закінчена структура. При його перенесенні із одного документа в інший він зберігає всі свої особливості незалежно від типу документа, в якому в біжучий момент знаходиться.
Якщо DDE дозволяє вставляти зв’язування тільки об’єкти, які є файловими, то в OLE цього обмеження немає.
Зв’язування чи вбудовування
Зв’язування. Оскільки при зв’язуванні друга копія об’єкту не створюється, воно більш економно з точки зору дискового простору. При внесенні змін у зв’язаний об’єкт ці зміни відбуваються у всіх документах, з якими об’єкт був зв’язаний.
Вбудовування. Забезпечується можливість коректувати встановлений об’єкт, не вносячи змін в оригінал. Також краще, коли існує необхідність переносити файли із машини на машину.
Оскільки при зв’язуванні запам’ятовується шлях до оригіналу і при переході на інший комп’ютер необхідно переписати всі файли об’єктів, включених в даний документ із збереженням всіх структури всіх каталогів. При вбудовуванні вся інформація зберігається в одному файлі.
В OLE замість операції копіювання через Clipboard застосовується метод Drag-and-Drop (перетягнути та відпустити), і робить процес обміну даними більш наочним не тільки для об’єктів.
Але є три недоліки:
1. Деякі процедури надто складні.
2. Низька ефективність зберігання та обробки даних.
3. Складна внутрішня логіка перетворення даних створює великі проблеми для розробників програмного забезпечення, що підтримує OLE-1.
OLE-2
Нове – можливість місцевої активації об’єкту. В OLE-1 при активації об’єкту завантажувалась батьківська програма і об’єкт передавався для редагування в її вікно. В OLE-2 об’єкт обводиться штриховою рамкою що позначає активність, і залишається на місці. А заголовок вікна міняється на заголовок обслуговуючого продукту, що викликається (меню буде деякою комбінацією із меню ”старого” та ”нового” продуктів). Після виконання відповідних дій з об’єктом для повернення в перший продукт досить клацнути мишею поза об’єктом.
Drag-and-drop дозволяє міжвіконне переміщення об’єктів та їх частин.
Якщо в OLE-1 при переміщенні файлe зв’язок з об’єктами автоматично втрачався, то в OLE-2 він відслідковується.
Можливий доступ безпосередньо до об’єкта – тобто до частини дискового файлу без читання файла повністю.
Технології DDE, OLE-1, OLE-2 – сумісні зверху донизу. Це означає що продукт-джерело і продукт-приймач обмінюються даними по найбільш новій технології, яка доступна їм обом.
Наприклад: продукт-джерело підтримує DDЕ. При роботі в OLE об’єкт буде встановлено, Але можливість його активації із документа приймача втрачається.
При роботі з продуктами, які підтримують OLE-2, відпадає необхідність у великих пакетах типу Microsoft Excel (Office). Документ буде збиратись як із цеглин з об’єктів, створених в невеликих спеціалізованих продуктах. Тобто з усіх створених продуктів Windows сама створює деякий ”інтегрований пакет”.
Але чим простіший зовнішній інтерфейс, тим складніше логічні закони програмування, які його реалізують. Тобто необхідні нові автоматизовані системи розробки OLE-продуктів (Microsoft Visual Basic, Word Perfect).
Первинність повідомлень: механізм повідомлень
В об’єктно-орієнтованому програмуванні, як і в Windows, керуючі дані називаються ”повідомленнями”. Модель даних, що керують об’єктами, реалізується за допомогою спеціального механізму повідомлень. Більшість повідомлень, які отримує об’єкт ”вікно”, виникають в результаті дій користувача.
Але ідея повідомлень значно глибша. Повідомлення – це потужний (і єдиний) засіб зв’язку вікна (і всього продукту) з самою операційною оболонкою Windows. Через повідомлення „вікно” отримує інформацію про всі події в системі Windows, які мають відношення до самого вікна. Всі зовнішні у відношенні до програмного продукту події кодуються та у вигляді повідомлень направляються у чергу повідомлень.
Повідомлення мають єдиний формат, який за кількістю інформації, що надається набагато перевершує інші операційні оболонки. За допомогою повідомлень продукт отримує інформацію від таймера, про натискання клавіші, про пристрій, з якого отримано повідомлення і інше.
Наприклад: прихід сигналу від таймера керується повідомленням WM-TIMER; при збільшенні користувачем області „вікна” на екрані Windows надсилає продукту повідомлення WM-PAINT, яке повідомляє про те, що треба перемалювати область вікна і інше.
Саме цей механізм дозволяє в рамках однозадачної ОС емулювати багатозадачне, багатовіконне операційне середовище.
Розглянемо, як взаємодіють Windows та програмний продукт при обробці, наприклад, натискання клавіші.
SHAPE \* MERGEFORMAT
WinMain()
Взаємодія Windows-продукту з Windows при введенні даних
Windows – продукт
keyboard.drv
Циклобробкиповідомлень
WndProc()
Системна чергаповідомлень
Windows
Черга повідомленьпродукту
WM_CHAR
Вікнопродукту
TextOut
Вивід тексту
Натискання клавіші

При надходженні сигналу апаратура комп’ютера формує асинхронні переривання, які обробляються драйвером keyboard.drv. Драйвер викликає процедуру в модулі user.exe, який формує відповідне повідомлення. Це повідомлення, яке вміщує повну інформацію про подію, розміщається в системну чергу.
Системна черга в Windows одна. Повідомлення, які розміщаються в системній черзі, розподіляються потім між продуктами. Для кожного продукту Windows створює і підтримує окрему чергу повідомлень продукту. Розподіл полягає в тому, що повідомлення беруться з системної черги, визначається, якому „вікну” належить дане повідомлення і це повідомлення розміщується в чергу повідомлень продукту, якому належить вікно. Цю роботу виконує модуль user.exe.
Обробку черги повідомлень продукту виконує вже сам продукт. Для цього існує так званий цикл обробки повідомлень продукту, який бере повідомлення з черги, переводить їх в повідомлення ANSI (WM_CHAR) і направляє їх у відповідну функцію вікна продукту. Конкретні дії за даним повідомленням робляться вже функцією вікна.
Наприклад: якщо необхідно відобразити символ в області користувача вікна продукту, то це робить функція вікна продукту за допомогою бібліотечної процедури TextOut.
Клавіатура це ресурс, що розділяється Windows – її повідомлення можуть перенаправлятися довільному продукту.
Як Windows визначає, якому продукту направити повідомлення? Не дивлячись на те, що це багатозадачна оболонка, в якій може працювати декілька програм одночасно, ясно, що один користувач в кожний момент часу може працювати тільки з однією програмою. Кажуть, що продукт, в який попадають повідомлення від клавіатури в момент вводу, має фокус вводу. Фокус вводу може бути змінений користувачем за допомогою списку задач (task list), або за допомогою миші. Повідомлення від миші обробляється по іншому: вони передаються новому продукту, на полі вікна якого знаходиться курсор миші. Зрозуміло, чому повідомлення миші і клавіатури розміщуються спочатку в системну чергу і тільки потім надходять в чергу продукту – тому що багато повідомлень керують фокусом вводу, тому система повинна визначити якому продукту вони належать. Системна черга повідомлень, таким чином є засобом розподілення повідомлень між продуктами. Якщо наперед відомо, якому продукту належить те або інше повідомлення, то воно зразу розміщується в чергу продукту, повз системну чергу.
Так при роботі з таймером ми явно вказуємо, якому продуктові направляти повідомлення після закінченню певного часового інтервалу. Тому повідомлення таймера не треба розміщати в системну чергу, вони передаються безпосередньо в чергу продукту.
Механізм повідомлень – це засіб сумісного керування вікном продукту з боку Windows і з боку самого продукту. Продукт може створити декілька вікон, але ні одне із них не може підтримуватись тільки продуктом без Windows.
Наявність механізму повідомлень у багатозадачному середовищі дає цікавий наслідок:
- з одної сторони асинхронність подій знімається з операційної оболонки, оскільки послідовність подій прозора, всі повідомлення надходять в чергу продукту де є чітка черговість;
- з другої сторони, ця асинхронність переноситься на рівень задач, оскільки в кожний конкретний момент часу продукт не може знати про те, яке повідомлення він буде обробляти, далі в результаті дій користувача повідомлення може надійти в інший продукт.
Якщо звичайна DOS – програма отримує керування при завантаженні (або при виникненні певної події – обробка переривання) і передає його ОС тільки по закінченні роботи, то Windows – програма – де певна сукупність реакцій на зовнішні події, це об’єкт, який обробляє інформацію. Цей об’єкт значно масивніший ніж DOS – програма.
Модель програмування Windows в реалізовує одну з основний ідей об’єктно-орієнтованого програмування: дані (повідомлення) керують об’єктами (вікнами Windows).
Windows – програма, створивши вікно і підготувавши середовище програми, передає керування Windows і надалі, до завершення роботи, програма отримує керування від Windows тільки після надходження повідомлень, які належать даній програмі.
Створивши вікно продукту, WinMain() організує цикл повідомлень. Основне призначення цього циклу – обробка черги повідомлень даного продукту, яка створюється і підтримується Windows. Повідомлення, які Windows розміщує в чергу повідомлень продукту, беруться з неї циклом обробки повідомлень і направляються (не напряму а через Windows) в функцію керування відповідним вікном продукту.
З технічної точки зору отримання вікном повідомлення реалізовано як виклик функції вікна з операційної оболонки Windows. При цьому саме повідомлення виступає як набір параметрів спеціального формату, що передається функції вікна. Функція вікна не викликається напряму, тому що це суперечить прийнятій ідеології Windows – об’єкти спілкуються між собою тільки шляхом повідомлень.
Повідомлення можуть посилатися як Windows, так і іншим продуктами. Сам продукт може надсилати повідомлення сам собі через Windows. Це вимагається (і це єдиний спосіб) в тому випадку, коли треба передавати інформацію від одного вікна продукту до іншого. У Windows визначено велику кількість стандартних повідомлень. Створити і відправити своє власне повідомлення користуватись механізмом повідомлень, досить легко і зручно. Таким чином, після виконання WinMain() так званих “організаційних” дій, виклик функцій вікон можливий тільки передачею повідомлень (Див. рис __).
Цикл повідомлень (message loop) тільки вибирає повідомлення з черги повідомлень і направляє в функцію вікна, яку прийнято називати WndProc(). Саме вона формує команди, які виконують реальні дії:
– виконання команд меню;
– виконання виводу у вікно графіки, тексту;
– інші дії, які відносяться власне до продукту.
Не всі повідомлення попадають у функцію вікна продукту через цикл обробки повідомлень. Повідомлення підтримки вікна передаються Windows безпосередньо у функцію вікна продукту.
Наприклад: Якщо користувач закриває вікно, то після виконання відповідних операцій формується повідомлення WM_DESTROY, яке одразу направляється в функцію вікна продукту. Після виконання необхідних операцій (звільнення пам’яті, вилучення об’єктів і ін.) функція вікна продукту WndProc() повинна повідомити головній функції WinMain() про те, що вікно закрито і продукт повинен завершити свою роботу. Для цього WndProc() формує повідомлення WM_QUIT, яке розміщується в чергу повідомлень продукту.
SHAPE \* MERGEFORMAT
WinMain()
Взаємодія Windows-продукту з Windows
Windows – продукт
Вхід
Циклобробкиповідомлень
WndProc()
Системна чергаповідомлень
Windows
Черга повідомленьпродукту
Register Class
Create Window
Show Window
Вікнопродукту

Коли цикл обробки повідомлень бере з черги продукту повідомлення WM_QUIT, відбувається вихід з циклу повідомлень і продукт завершує роботу.
Windows – продукт не звертається до буферу клавіатури. Всі символи, що вводяться з клавіатури, Windows розміщує в системну чергу.
Перенаправлення вводу продукту відбувається шляхом копіюванням введених символів із системної черги в чергу продукту. Продукт, таким чином, бере весь ввід із своєї черги, яка також автоматично підтримується Windows. При цьому клавіші кодуються універсальними “віртуальними” кодами, які не залежать від типу клавіатури. Через системну чергу проходять не тільки натискання клавіш, але також всі натискання і переміщення миші. Крім того спілкування із самою системою Windows також відбувається через системну чергу і чергу продукту. Таким чином у Windows не треба створювати цикл опитування клавіатури, або створювати свій обробник переривання миші. При запуску продукту Windows автоматично створить ще одну чергу повідомлень через яку направлятимуться всі повідомлення призначені для цього продукту – як ввід користувача так і системні виклики.
Повідомлення Windows дуже різноманітні. Вони можуть бути (правда дуже умовно) розділені на класи за функціональними ознакам:
- системні повідомлення (WM_SYSCOMMAND, WM_SYSCHAR, …);
- повідомлення керування вікнами(WM_CREATE, WM_DESTROY, …);
- повідомлення багато віконного інтерфейсу MDI (WM_MDIGETACTIVE, WM_MDIDESTROY, …);
- повідомлення миші і клавіатури, біля 15 різновидів.
Завдяки багатозадачності Windows, можна одним продуктом стежити за повідомленнями, які Windows розміщує в черзі іншого продукту. (Це корисно при відлагодженні програми).
Повідомлення Windows не рівноправні і утворюють складну ієрархію. Старші повідомлення можуть породжувати одне або декілька молодих. І на кожному етапі вони, з одного боку, повністю доступні продукту, а з другого – утворюють, в принципі, ієрархію подій з безмежним числом рівнів.
В залежності від конкретної ситуації одне повідомлення може викликати цілий інформаційний вибух з двадцяти і більше повідомлень, які породжуються продуктами при їх взаємодії.
Таким чином механізм повідомлень виводить інформацію з–під підпорядкуванням програмам. Інформаційні повідомлення в Windows первинні, вони живуть своїм складним життям і не тільки не залежать від сегментів коду, але і керують ними.
Windows 98
Це інтегрована ОС, що ґрунтується на сучасній 32–розрядній технології та допускає вбудовану підтримку мережі.
На відміну від Windows 3.x, Windows 98 більше не потребує MS–DOS і бере всі функції на себе. Оскільки обмежень DOS більше нема, Windows 98 забезпечує незалежну (preemptive) багатозадачність для 32–розрядних продуктів, що підвищує надійність ОС. Але збережена сумісність з існуючими DOS– та Windows – продуктами.
Основні переваги Windows 98 у порівнянні з Windows 3.x, такі:
1. Повністю інтегрована 32–розрядна ОС захищеного режиму, що не потребує MSDOS.
2. Незалежна (preemptive) багатозадачність та підтримка множинних потоків кодів (multithreading) підвищують ефективність операцій вводу–виводу та виконання задач у фоновому режимі.
3. Абсолютно нова 32–розрядна файлова система підтримує довгі імена файлів та перепризначення мережених ресурсів, окрім того, архітектура файлової системи відкрита для подальшого розвитку.
4. 32–розрядні драйвери пристроїв, включенні в систему, підвищують швидкодію, а механізм динамічного завантаження цих драйверів, забезпечує ефективне використання пам’яті.
5. Повністю 32–розрядне ядро системи забезпечує більш швидке та ефективне керування пам’яттю та процесами.
6. Покращене “звільнення” пам’яті після нормального завершення роботи продуктів або їх аварійного завершення.
7. Вдосконалений розподіл системних ресурсів та керування ними.
Незалежна (preemptive) багатозадачність
У Windows 3.1 – спільна (cooperative) багатозадачність. довільний Windows– продукт повинен був час від часу відмічати в черзі повідомлень (message queue) для того щоб ОС могла передати керування іншому продукту. Продукти, які не відмічаються в черзі повідомлень досить часто, монополізували весь процесорний час і фактично припиняли виконання інших задач.
У Windows 98 при роботі 32–розрядних продуктів використовується механізм незалежної багатозадачності. ОС сама визначає час, який відводиться кожному з працюючих продуктів та після його закінчення передає керування іншій задачі. Таким чином, 32–розрядні продукти більше не повинні віддавати керування – тепер сама ОС відбирає його в потрібний час.
Але 16–розрядні продукти для сумісності продовжують працювати в режимі cooperative.
Preemptive окрім всього пропонує також multithreading – багатопотоковий механізм, який полегшує розробку складних продуктів з паралельною функціональністю.
Запущений 32–розрядний продукт – це процес. Довільний процес складається, як мінімум, з одного ланцюжка виконання, тобто послідовності кодів, які виконуються один за одним. Саме такі ланцюжки і складають елементарну задачу з точки зору ОС і отримують від неї певні кванти часу.
Але 32–розрядний продукт може складатись і з декількох ланцюжків коду, що виконують різні задачі в рамках одного процесу.
Наприклад: текстовий редактор може використовувати один ланцюжок коду для вводу символів з клавіатури, другий – для перевірки орфографії і третій – для одночасного друку документа.
Такий розподіл дозволяє покращити ввід команд, забезпечити обробку даних у фоновому режимі.
Windows 98 підтримує багатотоковість рівні ОС.
Продукти, що реалізують багатотоковий механізм, можуть ефективно використовувати декілька процесорів у багатопроцесорній системі (наприклад Windows NT), шляхом запуску потоку із ланцюжків коду на своєму процесорі.
Взаємодія 32– та 16–розрядних кодів
Використання 32–розрядного, або 16–розрядного коду в тому або іншому місці Windows 98 визначається міркуваннями сумісності з існуючими продуктами, зменшенням робочої частини ОС і загальним підвищенням продуктивності.
Windows 98 застосовує 32–розрядний код скрізь, де це дозволяє суттєво покращити продуктивність без втрати сумісності. 16–розрядний код Windows 3.Х зберігається там, де потрібна сумісність з існуючими продуктами і там, де впровадження 32–розрядного коду суттєво збільшувало б вимоги до пам’яті без значного підвищення продуктивності.
Всі функції нижнього рівня – ядро ОС, менеджер пам’яті і всі підсистеми вводу/виводу та драйвери пристроїв (в тому числі, драйвери мережі та файлова система) – реалізовані у вигляді 32–розрядного коду.
Більшість 16–розрядного коду Windows 98 написано на асемблері, на самому низькому рівні і тому забезпечує продуктивність, що може бути порівняна з 32–розрядними програмами.
Багато функцій із модуля GDI (Graphics Device Interface) Windows 3.1 (система друку, система роботи із шрифтами) були переписані у 32–розрядний формат.
В той же час, більшість функцій керування вікнами із модуля User.exe залишені 16розрядними для збереження сумісності.
SHAPE \* MERGEFORMAT Win32продукт
Інтегрована архітектура Windows,взаємодія Windows 98, MS-DOS, 16- та 32-розрядних з Windows-продуктів
Ring 1Системна віртуальна машина (VM)
Менеджер VM:Scheduler, DPMI, Server
Ядрографічногокеруваннявікнами
Ring 2 Віртуальнамашина (VM)MS-DOS
Win32продукт
Win32продукт
Win16продукт
Win16продукт
Ring 3 Віртуальнамашина (VM)MS-DOS
Файлова система захищеного режиму: VFAT, CDFS, SCST, Network
Ring 0

Компоненти системи розподілені між чотирма рівнями (Ring 0 .. Ring 3), які пропонують різний ступінь системного захисту. Захист рівня Ring 3 виконується внутрішніми засобами архітектури процесора Intel. Найменш захищений рівень Ring 0 вміщує код найвищого рівня (файлова система і менеджер віртуальних машин).
Робота з 16–розрядними продуктами
У Windows 98 16–розрядні продукти працюють в загальному адресному просторі в режимі cooperative, як і в Windows 3.1. Але вони можуть використовувати переваги 32–розрядності та незалежної багатозадачності інших системних елементів Windows 98 при друці та мереженому обміні, і тому виграють від деяких покращень в надійності ядра системи.
У Windows 98 некоректний 16–розрядний продукт не може заподіяти ніякої шкоди 32–розрядним продуктам, або DOS– продуктам, які працюють паралельно. В найгіршому випадку може вплинути на інші 16–розрядні продукти.
Більше того тепер ОС слідкує за ресурсами, які виділяються кожному продукту, і автоматично звільнює їх у випадку, якщо продукт завершує свою роботу (нормально або аномально). Тому при “зависанні” довільного продукту система може коректно очистити і повернути собі всі ресурси виділені програмі, що “зависла”. Окрім того Windows 98 зможе відновитися і в тому випадку, якщо через помилку розробника довільні ресурси не повертаються системі при нормальному завершені роботи продукту.
Робота з DOS–продуктами
У Windows 98 було зроблено багато вдосконалень, що покращують взаємодію системи з DOS–продуктами, драйверами пристроїв реального режиму та резидентними програмами. Ці покращення особливо важливі для роботи продуктів, які інтенсивно використовують периферію (наприклад ігри).
Кожний DOS–продукт працює в окремій віртуальній машині (VM). VM повністю ізольовані одна від одної а також від інших 32–розрядних та 16–розрядних Windows-продуктів. При спробі DOS–продукту звернутися до області пам’яті поза виділеними йому ресурсами, система видає відповідне повідомлення і завершує некоректний продукт.
При роботі з DOS–продуктами переваги Windows 98 перед Windows 3.1, такі:
1) реалізація багатьох елементів системи в захищеному режимі звільнює для DOS–продуктів додатковий об’єм звичайної пам’яті.
Оскільки більшість 16–розрядних системних елементів реального режиму замінено на відповідні 32–розрядні елементи захищеного режиму, ті самі функції реалізуються в системі з більшою продуктивністю та з мінімальними вимогами до основної (фізичної) пам’яті
2) Покращено підтримку ігор, в тому числі і у віконному режимі.
Для DOS–продуктів, які взагалі не працювали під Windows 3.1 існує спеціальний режим зовнішнього запуску DOS, який не вимагає виходу з Windows 98. Для роботи з продуктами, які вимагають 100%–го доступу до системних компонентів і ресурсів, в Windows 98 існує режим „Single MS–DOS application mode”, що еквівалентний запуску програми з DOS при відсутності Windows.
Для DOS–продуктів, які повинні працювати в Windows 98, необхідно встановити відповідну опцію у вікні якостей (property sheet). При запуску такого продукту, Windows 98 попередньо спитавши у користувача дозволу завершити всі працюючі продукти, вивантажується з пам’яті, залишаючи резидентною тільки невелику частину свого коду. Після завершення роботи DOS–продукту, цей код забезпечує завантаження Windows 98 та відновлення параметрів системи. Таким чином, процес майже повністю еквівалентний виходу з Windows3.1, запуску продукту та поверненню в Windows3.1 після його завершенню, за винятком того, що все це робиться автоматично.
3) Покращено установки за замовчуванням для DOS–продуктів.
У Windows3.1 за замовчуванням DOS–продукти запускаються у повноекранному режимі і забороняється виконувати їх як фонову задачу. Для зміни цих установок треба було створювати свій службовий файл (PIF–файл) для кожного конкретного продукту.
У Windows 98 за замовчуванням DOS–програми запускається у вікні і їм дозволяється виконуватись у фоновому режимі. Користувач звільнюється тим самим від необхідності перелагоджувати систему вручну.
4) Введена спеціальна лінійка інструментів, доступна при запуску DOS–продуктів у вікні.
При бажанні ця лінійка демонструється для DOS–продукту, працюючого у вікні. Вона надає доступ до таких операцій:
а) Cut, Copy та Paste; ці функції дозволяють тісніше інтегрувати в Windows DOS–продукти, як текстового, так і графічного режимів.
б) переключення між повноекранним та віконним режимами.
в) доступ до вікна властивостей (property sheet) для даного DOS–продукту.
г) доступ до опцій вибору шрифту для текстового режиму DOS.
5) Масштабованісь вікон DOS завдяки використанню в DOS–продуктах шрифтів TrueType.
При роботі у вікні DOS–продукти можуть користуватися шрифтами TrueType для виводу тексту, що дозволяє змінювати розмір вікна DOS довільним чином. Якщо встановлено розмір шрифту Auto, то величина шрифту автоматично міняється так, щоб розмістити вікно DOS у вказану користувачем область.
Робота 32–розрядних Windows–продуктів
Оновне завдання Windows 98 – робота з 32–розрядними продуктами. Кожний такий продукт працює у своєму власному, повністю захищеному адресному просторі. Ніякий інший продукт (32, 16, DOS) не зможе вплинути на нього у випадку аномальної роботи або зависання. У випадку некоректної поведінки 32–розрядного продукту система (Windows 98) може повністю відновитись, завершивши виконання цього продукту, повернути собі всі ресурси і продовжувати виконання всіх решти задач.
32–розрядне ядро Windows 98 забезпечує такі переваги:
- preemptive - багатозадачність;
- 32–розрядний API (Application Programming Interface);
- підтримку довгих імен файлів;
- окремі черги повідомлень;
- уніфікований адресний простір;
- вдосконалений механізм захисту пам’яті.
Кожний з 32–розрядних продуктів в Windows 98 має свою власну чергу повідомлень, в якій ОС розміщує всю інформацію про події, які відбуваються в системі. Тому, якщо навіть довільна інша програма працює ненормально, 32–розрядний продукт продовжує виконуватись зовсім незалежно і отримувати вхідні повідомлення і системну інформацію.
MS–DOS та Windows 3.1 завдяки 16–розрядній природі використовують механізм сегментів для доступу до пам’яті. Архітектура Intel забезпечує механізм, який розбиває всю доступну пам’ять на сегменти, розміром 64 Кбайти (216). Для звернення до комірки пам’яті треба вказати два 16–розрядних числа:
xxxx : yyyy,
де xxxx - адреса сегменту, yyyy - зміщення в сегменті.
А це знижує ефективність системи через необхідність проведення додаткових операцій для відображення логічної структури сегмент/зміщення на фізичну пам’ять.
Windows 98 дозволяє відмовитись від цього механізму шляхом вводу уніфікованої логічної структури пам’яті, в якій фізична комірка визначається одним 32–розрядним двійковим числом. Тоді забезпечується доступ до 4 Гбайтів (232) пам’яті одночасно.
Драйвери віртуальних пристроїв
Використання VxD дозволяє продуктам, які не розраховані для роботи в багатозадачному середовищі, сумісно використовувати встановлене обладнання. При цьому кожний, з продуктів вважає, що віртуальний пристрій знаходиться в його повному розпорядженні.
VxD у Windows 98 (VDD–драйвери дисплея; VPD–принтера) – це 32–розрядний драйвер захищеного режиму, який керує системним ресурсом, таким чином, що декілька продуктів можуть отримати до нього одночасний доступ. VxD застосовується в Windows з метою забезпечення підтримки багатозадачності для DOS–продуктів.
VxD підтримують всі стандартні пристрої комп’ютеру. Такий драйвер потрібний для довільного пристрою, який має режим роботи, що встановлюється програмно, або може зберігати дані. Кожний продукт може міняти стан такого пристрою і тому потрібен спеціальний механізм, який при передачі керування новому продукту відновлював би стан пристрою таким яким він був під час попередньої сесії.
Більшість VxD керують обладнанням, але деякі з них керують і програмним забезпеченням, наприклад драйвером пристрою або резидентною програмою.
Використання в Windows 98 VxD дозволяє збільшити продуктивність ОС. Сучасні процесори можуть виконувати 32–розрядний код в захищеному режимі більш ефективно, ніж 16–розрядний код драйвера DOS або резидентної програми в реальному режимі. Окрім того, продуктивність підвищується за рахунок виключення переключень між захищеним і реальним режимами, що необхідно при обслуговуванні 16–розрядними драйверами реального режиму а 32–розрядного продукту захищеного режиму. При використанні VxD система може постійно знаходитись в захищеному режимі.
Нові функції ОС, що реалізовані в Windows 98 у вигляді VxD включають:
- файлову систему FAT;
- Smart Drive;
- файлову систему CD–ROM;
- мережений сервер та транспортні протоколи;
- драйвер миші;
- резидентну утиліту SHARE.EXE (з MS–DOS);
- драйвери дискових пристроїв (включаючи SCSI).
VxD у Windows 98 відслідковують ресурси, що виділяються їм окремо для кожного потоку коду (thread), тому система може коректно звільнити ресурси, що виділені драйвером потокові, який аномально завершився, та відмінити операції, які вимагалися цим потоком і очікували черги на виконання.
Вдосконалення розділу системних ресурсів
У Windows 3.1 часто з’являються повідомлення при роботі з декількома продуктами: „Out of Memory” (недостатньо пам’яті) не дивлячись на те, що сотні Кбайтів RAM вільні. Насправді ОС просто не може виділити функції Windows API, що викликається пам’ять в спеціальній області стеку.
Windows 3.1 підтримує стеки (heaps) GDI та USER (по 64 Кб), які використовуються для зберігання інформації про об’єкти, що виділяються при викликах функцій Windows API. Саме кількість вільного місця у цих стеках фігурує під іменем “вільних системних ресурсів” у вікнах (Program Manager/Help/About). Якщо довільний з цих блоків заповнюється, повідомлення „Out of Memory” буде виникати навіть при значній кількості вільної основної пам’яті. Для того, щоб обійти це штучне обмеження системних ресурсів, ряд структур, що розміщуються Windows 3.1 в 16–розрядних стеках GDI та USER, в Windows 98 переміщені у 32–розрядні стеки. Таким чином, вивільнити додаткове місце для створення нових структур.
Всі дані не були виключені з 16–розрядні стеки тільки тому, що в такому випадку була би втрачена сумісність з деякими Windows–продуктами, які для підвищення продуктивності маніпулюють вмістом стеків напряму, обходячи механізм Windows API.
Так дескриптори меню і вікон були переміщені у 32–розрядний стек USER, що дозволило збільшити максимально можливу кількість таких структур з 200 у Windows 3.1 до 32767 дескрипторів меню та 32767 дескрипторів вікон на кожний процес у Windows 98.
VCACHE – 32–розрядний дисковий кеш
У Windows 98 32–розрядний дисковий кеш VCACHE заміняє 16–розрядний Smart Drive, що поставляється разом з Windows 3.1 та MS–DOS. Windows 98 пропонує більш розумний алгоритм для обміну інформацією з диском, що дає кращі показники кешування при читанні. Також забезпечується кешування інформації для дисків CD–ROM та мережених дисків.
Значна перевага VCACHE в порівнянні з Smart Drive в тому, що розмір RAM, що захоплюється кешем, міняється динамічно, в залежності від кількості вільної пам’яті в системі. Користувачам більше не треба відводити певну ділянку RAM під кеш, Windows 98 автоматично виділяє або віднімає пам’ять у кешу на підставі системних міркувань.
Покращена організація віртуальної пам’яті
У Windows 3.1 користувачам треба було використовувати велику кількість опцій при організації віртуальної пам’яті і файлу підкачки (swap file). Їм треба було вибирати між тимчасовим і постійним файлом, задавати розмір цього файла і вирішувати чи варто використовувати 32–розрядний доступ до диску. Позитивним у тимчасовому файлі було те, що Windows створювала його в момент свого завантаження і знищувала його після виходу із системи. Таким чином, користувачі могли економити місце на диску. Навпаки, постійний файл підкачки весь час займав місце на диску і окрім того повинен був складатись із неперервного ланцюжка кластерів, але він забезпечував більш високу продуктивність.
Реалізація механізму віртуальної пам’яті в Windows 98 не тільки значно спрощує для користувача задачу конфігурування, але і суміщає в собі позитивні сторони тимчасового та постійного файлів підкачки. Тепер цей файл динамічний, тобто він може міняти свій розмір в залежності від потреб ОС. Крім того 32–розрядна файлова система Windows 98 дозволяє використовувати фрагментований дисковий простір для файлу підкачки практично без втрат у продуктивності.
База реєстрації даних
Центр де Windows 98 зберігає потрібну інформацію називається – база реєстрації даних (системним реєстром). Це мозок пам’яті Windows 98. За його допомогою ОС керує інформацією про апаратні та програмні засоби, про користувачів та про процеси інсталяції.
До складу системного програмного забезпечення Windows 98 входить програма Regedit.exe за допомогою якої редагується база реєстрації даних. Windows 98 вона завантажує файли SYSTEM.DAT та USER.DAT із Windows–каталогу та представляє їх вміст у загальному вікні. Ці файли вміщують інформацію про інстальовані апаратні та програмні засоби, а також драйвери зовнішніх пристроїв і системні установки. Тому ці файли є центральними блоками конфігурацій керування Windows 98.
В вікні програми Regedit.exe відображаються основні ключі системного реєстру. До найважливіших відносяться: HKEY_LOKAL_MASHINE та HKEY_USERS – головні реєстраційні ключі. Інші чотири, які знаходяться на одному каталоговому рівні, тільки посилаються на деякі важливі області в середині обох головних ключів.
Реєстраційні ключі можуть розгалужуватись на підключі, які також можуть розгалужуватись. Тому файлова структура Бази реєстраційних даних задається досить складно. Але вона структурована і логічно завершена.
SHAPE \* MERGEFORMAT Структура системного реєстру Windows 98
Базареєстраціїданих
ЯдросистемиWindows 98
Процесзавантаження
Користувач N.
Користувач 2.
Інформація прокористувачів.Користувач 1.
Інсталяція
Налаштуваннясистемногокерування
Компонентиапаратнихзасобів
Опціїресурси,конфігурація
Версії таконфігурація
Особистіналаштування

Ключі що бачимо в головному вікні програми Regedit, розділяються на два головних ключа і на файли SYSTEM.DAT та USER.DAT.
SHAPE \* MERGEFORMAT Основні ключі та файли системного реєстру Windows 98
Базареєстрації даних
SYSTEM.DAT
HKEY_LOCAL_MASHINE
HKEY_CLASS_ROOT
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
HKEY_USERS
HKEY_CURRENT_USERS
USER.DAT

Для безпеки Windows 98 створює при кожному успішному запуску системи резервні копії DAT–файлів SYSTEM.DA0 і USER.DA0. Вони з атрибутом “hidden” і знаходяться в каталозі Windows. Без інформації, що міститься в БРД Windows 98 навіть не запуститься. Якщо випадково будуть знищені або зіпсовані файли SYSTEM.DAT та USER.DAT, то систему можна відновити використати резервні копії файлів. Для відновлення системного реєстру Windows 98 запускається в режимі DOS або із стартової дискети та перейменовуються файли:
SYSTEM.DA0 > SYSTEM.DAT та USER.DA0 > USER.DAT.
Для відновлення в Windows 98 є спеціальна програма ERU.EXE (Emergency Recovery Unit) – модуль аварійного відновлення. Ця програма заново створює БРД з останніх збережених файлів. Перед використанням програми ERU.EXE необхідно зберегти на дискеті файли з розширенням: DAT, SYS, INI та autoexec.bat.
Основні реєстраційні ключі
HKEY_LOCAL_MASHINE – містить всі дані про інстальовані апаратні засоби, їх налаштування, системні установки і інше. Ця інформація дійсна для всіх користувачів комп’ютеру.
HKEY_CLASS_ROOT – містить OLE–записи, зв’язки, програми, що відповідають типам файлів і іншу інформацію.
HKEY_CURRENT_CONFIG – посилається на ключ HKEY_LOCAL_MASHINE_CONFIG. Тут знаходиться інформація про конфігурацію апаратних засобів комп’ютера.
HKEY_USERS – головний ключ для всієї інформації, що специфічна для користувачів, такої як установка робочої поверхні (Desktop), інформація про користувача і та ін. Для кожного користувача існує власний підключ і різноманітна інформація про нього.
Hkey_Dyn_Data – вміщує інформацію про інстальовані пристрої, включаючи повідомлення про проблеми і стани інсталяції.
Windows XP
Це перша кардинально змінена ОС після Windows 95. Побудована на основі ядра Windows 2000 з метою підвищення стійкості, оскільки вона краще протидіє збоям при одночасному виконанні декількох складних задач.
Мінімальні системні вимоги: Процесор Intel Pentium II (або сумісні) ? 300МГц; 128Мбайт ? RAM ? 4Гбайт; SVGA PnP монітор; миша; накопичувач CD–ROM або DVDROM ? 12Х; мережений адаптер (для реалізації мережених функцій); доступ в Internet.
Оптимальні результати на машинах ? 500 МГц. Зміни в Windows XP такі ж глибокі, як і при переході від Windows 3.1 до Windows 95.
Варіанти модифікацій ОС Windows XP
Windows XP Professional – орієнтований на малі компанії і корпорації. Сюди входять:  додаткові мережеві можливості; – захист корпоративних даних шляхом авторизації доменів; – засоби групової роботи; – вдосконалені функції для мобільних ПК та керування файлами; – одночасна робота на двох моніторах; – підтримка двохпроцесорних комп’ютерів.
Корпоративний користувач – орієнтований на підвищення ефективності праці в невеликих корпораціях. Забезпечує:  автоматичне відновлення системи;  кращі правила групової роботи;  брандмауер Internet Connection Firewall;  Remote Desktop;  мобільні профілі користувачів;  Windows NetMeeting3.
Співпрацівник малого офісу – орієнтований на налагодження зв’язку з мережею. Забезпечується:  динамічною модернізацією;  “Майстром” організації допоміжних мереж;  “Майстром” з’єднань з Internet;  “Майстром” переходу до нової версії;  “Майстром” фотодруку;  “Майстром” публікацій та збереження даних в Web.
Домашній користувач – орієнтований для розваг та домашнього використання. Має реалізовані:  покращені ТВ–технології;  вдосконалену платформу для ігор;  сумісне використання з’єднань з Internet (Internet Connection Sharing–ICS);  вбудований Microsoft Internet Explorer;  вбудовані функції запису CD;  Windows Media Player 8.
Нові характеристики реалізовані в Windows XP
1. Інструкція / інтерфейс: - “майстер” інсталяції/міграції; - “майстер” для роботи з апаратними засобами; - декілька записів обміну користувачів; - швидке переключення користувача; - новий вигляд піктограми та меню.
2. Сумісність/модернізація: - автоматична модернізація; - режим програмної сумісності; - покращена сумісність з апаратними пристроями; - стійка архітектура ядра; - помічник пошуку.
3. Зв’язок: - “майстер” організації домашньої мережі; - Internet Connection Sharing (ICS); - мережевий міст; - безпека IP; - правила групової роботи.
4 Для корпоративних користувачів: - дистанційний доступ; - робота з декількома моніторами; - мережевий монітор; - динамічний диск; - сумісність з декількома мовами.
5. Адміністративні функції: - робота з віддаленими комп’ютерами; - відновлення системи; - повернення до попередньої версії драйвера; - звіти про помилки; - довідково–консультаційна служба.
6. Інтернет: - попередження про сторонні файли; - брандмауер Internet Connection Firewall; - “майстер” публікації в Web; - нові способи роботи і зовнішній вигляд.
7. Розваги: - Media Player 8; - Movie Maker; - вдосконалена платформа для ігор;   вбудована функція запису CD; - вдосконалені ТВ-служби.
Режим Fast User Switching забезпечує одночасно декілька сеансів зв’язку (але для кожного запису обліку – 64 Мбайт) Кожний користувач має права доступу до власних даних. Записи обліку можуть бути захищені паролем.
Network Bridge може побудувати мережу на базі різних технологій.
Compatibility Mode забезпечує виконання старих програм в новій ОС. Windows XP імітує Windows 95/98, 2000, NT 4.0 в залежності від цільового набору драйверів прикладної програми. Параметри Compatibility Mode можна зберегти, щоби кожний раз запускати програми в потрібному режимі.
Device Driver Rollback – функція повернення до початкової конфігурації, вона виконує повторну інсталяцію заздалегідь працеспроможного драйвера пристрою, якщо новий драйвер не працює.
Функція Automatic Update – перевіряє комп’ютер, а потім вміщує у Web нові драйвери і навіть забезпечує успішну інсталяцію Windows XP. Користувач, зберігаючи повний контроль за процесом, може прийняти або відкинути модернізацію, або відкласти її. Якщо користувач згоден із змінами, то завантаження із мережі відбувається у фоновому режимі, в низькопріорітетному потоці і процес обновлення не впливає на виконання прикладних програм.
Розробники Windows XP повністю відмовились від старого програмного коду DOS, 16–розрядних Windows та Windows 95, який був частиною кожної орієнтованої та масового споживача версії Windows (аж до Windows ME). Windows XP створено на базі ядра Windows 2000.
Це перша єдина ОС, як для масового споживача, так і для корпоративного застосування.
Найважливіша зміна – перероблений інтерфейс користувача.
Продуктивність
Не так часто відбуваються збої, швидше виконуються процедури початкового завантаження, відновлення роботи і запуску прикладних програм, інтелектуальні засоби і само настройки переміщають програмні файли для досягнення оптимальної швидкодії.
Windows XP – ОС із функціями само настройки. Вона адаптується, як до кожного користувача та і до його програм і файлів. У періоди очікування ОС динамічно переміщає файли програм для їх оптимального розміщення на жорсткому диску і тим самим скорочує затримки при доступі до них. Такий підхід міг би зменшити час завантаження прикладних програм і відкриття файлів (теоретично).
ОС UNIX
Початок розробки 1965 рік Multics. 1971 році UNIX на PDP-11 в 1973 році переписана на Ci. На початку 1984 року інстальована приблизно на 100 000 комп’ютерах. (BSD – Berkeley Software Distribution; SCO – Santa-Cruz Operation; Linux). Переваги та популярність пояснюються такими фактами:
1. Система написана на мові високого рівня Ci, завдяки цьому її легко читати, розуміти, модифікувати, переносити.
2. Наявність досить простого інтерфейсу користувача, який має можливість надавати користувачу всі необхідні послуги (зараз є інтерфейс аналогічний Windows 98, X-Windows та інше).
3. Є досить прості засоби, які дозволяють створювати складні програми з простіших.
4. Наявність ієрархічної файлової системи, яка легка у використанні та ефективна в роботі.
5. Забезпечується узгодження форматів у файлах, робота з послідовним потоком байтів, завдяки чому отримуємо більш легке читання прикладних програм.
6. Наявність простого інтерфейсу з периферійними пристроями.
7. Система є багатокористувацькою, багатозадачною, кожний користувач може одночасно виконувати декілька процесів. (Працює в одно-процесорному, багатопроцесорному та багатомашинному режимах).
8. Архітектура комп’ютера закрита від користувача який працює під UNIX, що полегшує процес написання програми, що працюють на різних конфігураціях апаратних засобів.
9. UNIX підтримує довільну мову програмування, для якої є транслятор та забезпечується системний інтерфейс, що встановлює відповідність між користувацькими запитами та набором запитів, що прийняті в UNIX.
Ядро ОС UNIX
Ядро UNIX виконує функцію головного організатора її роботи. Воно виконує:
- керує послідовністю виконання процесів;
- резервує основну пам’ять та простір на дискетах;
- керує обміном даними між основною пам’яттю та периферійними пристроями;
- приймає від процесів запити на обслуговування.
Ядро – резидентна, в основній пам’яті, частина ОС. Ядро UNIX реалізує відносно обмежений набір функцій. Воно не реалізує жодної функції, яка безпосередньо служить користувачу. Для цього існують утиліти, які є посередниками між користувачем та ядром. Розробляти, експлуатувати та адаптувати програми – утиліти набагато простіше, ніж ядро системи. Ядро UNIX реалізовано приблизно на 10 000 операторах мови Ci та 1 000 операторах на мові Асемблеру (Основна ідея – мобільність). Ядро складається з двох секцій:
1) керування процесами;
2) керування ресурсами (пристроями).
Перші, резервують ресурси, визначають послідовність виконання процесів та приймаються і обслуговуються запити від них. Другі, контролюють передачу даних між основною пам’яттю та периферією.
Мобільність полягає в тому, що на різних типах комп’ютерів можуть використовуватись практично ідентичні секції керування процесами.
Секція керування пристроями, що призначена для роботи на конкретному комп’ютері, вміщує по одному модулю на кожний периферійний пристрій, підключений до комп’ютера (модуль – драйвер). При підключенні пристрою нового типу треба додавати новий драйвер.
Генерування ОС
Генерування ОС – це процес формування конфігурації ОС UNIX, що відповідає деякому заданому набору периферійних пристроїв та деякому комплексу можливостей, що вибираються по замовленню. Основна робота, що виконується при генерації – це створення списку, що вміщує точний опис апаратних та програмних засобів.
Ядро UNIX – це не проста послідовна програма. Воно вміщує декілька важливих таблиць, які використовуються для координації взаємопов’язаних потоків, що повинні виконуватися. Це є приклад програми структура якої визначена даними, тому її вивчення слід починати з інформаційних таблиць. Більша частина роботи ядра – це пошук в таблицях і їх модифікація.
У довільний момент часу комп’ютер виконує або програму користувача (процес), або процес ОС. Деякі механізми ОС можуть виконувати запит на переключення з режиму користувача в режим ядра.
1. Системний годинник. Періодично формується переривання, тобто сигнал, що переключає комп’ютер на виконання спеціальної службової програми. Ця програма, обслуговування системного годинника, виконує переоцінку пріоритетів процесів і таким чином може відбутися зміна процесу, що виконується.
2. Системний виклик. Якщо у програми користувача виникає необхідність в послугах ОС, вона генерує системний виклик. Як наслідок – перехід з режиму користувача в режим ядра. Системні виклики, що виконують операції вводу/виводу, досить часто приводять до зупинки процесу, який ініціював виклик, на час передачі даних. Під час паузи може виконуватись інший процес користувача. Часто ініціюють роботу механізму розподілення часу.
3. Обслуговування периферійних пристроїв вводу/виводу. Для нормального продовження роботи процесу, що запустив операцію вводу/виводу, після закінчення передачі інформації виробляється переривання. Воно звичайно приводить до змін стану різних елементів, в таблицях і може ініціювати наступний обмін.
ОС UNIX підтримує у користувача дві ілюзії:
1. Файлова система розміщена в конкретному місці носія.
2. Процес “живе” своїм життям.
Процеси
Ядро UNIX існує для виконання потреб процесів. З точки зору процесів, ядро це витрати, з якими треба миритись. З точки зору ядра, процеси – це каталогізовані структури даних, над якими за певними правилами виконуються маніпуляції.
Процес – це програма під час виконання в деякий момент часу довільної програми може відповідати один або декілька процесів, або не відповідати жодний. Процес – це об’єкт, що враховується в спеціальній таблиці ядра системи.
Найбільш важлива інформація про процес зберігається в двох місцях:
- в таблиці процесів;
- в таблиці користувача (контекст процесу).
Перша – завжди знаходиться в пам’яті і містить на кожний процес по одному елементу, в якому відображається точний стан процесу:
– розташування процесу (адреса в пам’яті або адреса свопінгу);
– розмір;
– ідентифікатори процесу;
– ідентифікатори користувача що запустив процес.
Менш актуальна інформація про процес зберігається в таблиці користувача. Така таблиця існує для кожного активного процесу і тільки до неї можуть безпосередньо звертатись програми ядра. При всіх ситуаціях, що виникають при виконанні процесу, відбувається звертання до його таблиці. Створення процесу включає ініціалізацію відповідного контексту та сегмента таблиці процесів а також формування даних та тексту цього процесу. Зміна стану (виконання, очікування, повернення в пам’ять та інше) та отримання стану від паралельного процесу – все це фіксується в таблиці процесів.
SHAPE \* MERGEFORMAT Структури даних для керування процесами
Активний процес
Адресний простір ядра
Область даних користувача(дані та команди)
Контекст процесу(таблиця користувача)
Адресний простір користувача
Таблиця процесів
Резидентна частина
Частина свопінгу

Якщо процес складається з чистих машинних кодів (дані існують окремо), то структура даних буде наступна.
SHAPE \* MERGEFORMAT Структури даних для керування процесами з чистим кодом
Активний процес
Адресний простір ядра
Область данихкористувача(чисті дані)
Контекст процесу(таблиця користувача)
Адресний простір користувача
Таблиця процесів
Резидентна частина
Частина свопінгу
Таблиця тексту
Область чистоготексту(команди)

Після завершення деякого процесу відповідний елемент таблиці звільняється для того, щоби потім його використовували для інших процесів.
Таблиця процесів резидентна в основній пам’яті, що забезпечує ядру можливість реагувати на зміни стану процесу, що тимчасово зберігається на диску. Справа в тому, що деякі події, що стосуються процесу, можуть відбуватися в той час, коли він пасивний. Наприклад, процес може “спати” в очікуванні вводу/виводу. Завершення процедури обміну приводить до того, що процес “прокидається” і виконується відмітка про його готовність до виконання. Вся інформація, необхідна для керування “прокиданням” процесу, знаходиться в таблиці процесів.
Ядро резервує по одному контексту на кожний активний процес. В цій таблиці інформація, що необхідна під час виконання процесу. Якщо процес призупинено, контекст стає недоступним та не модифікованим. Окрім того, оскільки ця структура даних є складовою частиною області даних кожного процесу, то при виконанні свопінгу переписується на диск разом з усім образом процесу.
Біжуча інформація про процес в основному вміщується в його контексті. Сюди записуються:
– ідентифікаційні номера користувача і групи, що призначені для визначення привілеїв доступу до файлів;
– посилання на системну таблицю файлів для всіх відкритих процесом файлів;
– покажчик на індексний дескриптор біжучого каталогу в таблиці індексних дескрипторів;
– список реакцій на різні сигнали.
Для створення нових, існуючі процеси використовують два основних механізми:
Fork – системний виклик (команда) для створення процесом своєї власної копії; це єдиний спосіб для збільшення числа процесів; після його виконання є два процеси, породжуючий (батьківський, джерело) та породжений (дочірній, приймач). Основна відмінність між ними в тому, що вони мають різні власні ідентифікатори та ідентифікатори батьківських процесів. Обидва процеси розділяють між собою відкриті файли і кожен з них може визначити чи він є батьківським чи дочірнім.
Exec – для перетворення процесу, що ініціював цей системний виклик. У цьому випадку міняється не кількість процесів, а їх якість. Тобто після виклику exec процес, що ініціював цей виклик, замінюється деяким іншим. Ідентифікатор процесу та відкриті файли при цьому залишаються незмінними.
Звичайно для створення дочірнього процесу з новим ідентифікатором послідовно викликають fork, а потім exec. Саме в такий спосіб запускаються інтерпретатори shell та довільна викликана програма. Пара fork–exec, як правило, працює разом із системним викликом wait. Wait дозволяє процесу–батьку дочекатись завершення породженого ним процесу.
Початкове завантаження. Процеси 0 та 1
Завантаження ядра системи в основну пам’ять та її запуск називають початковим завантаженням. Ця процедура виконується при:
1. Увімкненні комп’ютера.
2. Якщо відбувся крах системи.
3. Система була свідомо зупинена.
Початкове завантаження відбувається в декілька етапів.
1–й етап. Спочатку з диску апаратно читається в пам’ять вміст першого блоку. Перший блок файлової системи резервується для запису спеціальної короткої програми, що виконує початкове завантаження. Після зчитування ця програма виконується. При виконанні ця коротка програма–завантажувач шукає та читає в пам’яті файл з іменем “unix”, що знаходиться в кореневому каталозі (”/unix”). Цей файл містить ядро ОС в машинних командах. Він створений шляхом компіляції та зв’язку файлів, що включають вхідні коди ОС.
2–й етап. Другий етап початкового завершення починається з читання та наступного виконання файлу “/unix”. Перша функція ядра – ініціалізація декількох апаратних інтерфейсів. Це стосується системного годинника та диспетчера пам’яті. Ядро формує також початкові значення декількох структур даних в тому числі набори буферів блоків, списки символів, буфери індексних дескрипторів та змінну, що показує розмір основної пам’яті.
Після завершення цих операцій ядро починає ініціалізувати процес 0. Процес 0, на відміну від інших процесів, що ініціалізуються функцією fork, створюється ядром шляхом резервування пам’яті для його контексту та занесення відповідних посилань в перший елемент таблиці процесів.
Процес 0 є унікальним з таких причин:
1. Він не має кодового сегменту і складається тільки з контексту. Всі інші процеси містять код, який виконує певні функції. Вони є певними образами, отриманими в результаті компіляції та наступного виконання деякої програми. Процес 0 не є образом, це просто структура даних, що використовується ядром.
2. Процес 0 існує на протязі всього періоду роботи системи.
3. Процес 0 – це дійсно системний процес, він є активним виключно в той час, коли процесор знаходиться в режимі ядра.
4. Процес 0 називається процесом виключно тому, що він є каталогізованим в таблиці процесів, але це тільки структура даних ядра.
Після створення процесу 0 система копіює його і створює процес 1. При цьому виконуються ті ж процедури, що і при виконанні користувачем системного виклику fork. Алгоритм створення процесу 1 в значній степені нагадує стандартну процедуру створення процесів, але дещо спрощену. Спочатку процес 1 є точною копією процесу 0, у нього немає області коду. Після створення процесу 1 відразу збільшується його розмір. Це створюється тими самими підпрограмами, що і при обробці системного виклику break (збільшення розміру виділеної пам’яті).
До цього моменту обидва процеси: 0 та 1 тільки повинні бути в майбутньому виконані.
Далі процесу 1 надається життєздатність, тобто у тільки що створену область копіюється дуже проста програма. Ця програма складається з машинних кодів, що реалізують системний виклик exec, необхідний для виконання програми “/etc/init”.
Таким чином, ініціалізація процесів 0 та 1 завершена. Процес 0 – це структура даних користувача, за допомогою якої ядро організує мультипрограмування та керує процесами. Процес 1 дуже подібний на реальний образ процесу, отриманого в результаті компіляції деякої програми, хоча насправді вона спеціальним чином створена ядром. Після ініціалізації 0 та 1 UNIX переходить до виконання програми диспетчера.
На цьому ініціалізація ядра завершається. Але ініціалізація системи в цілому тільки починається.
Програма – диспетчер відповідає за прийняття рішень про те, який процес повинен бути виконаний, для якого потрібен стопінг на диск, а для якого – свопінг з диску. При першому виклику диспетчера прийняти рішення неважко, тому що свопінга немає і тільки один процес повинен виконуватись – процес 1.
Робота процесу 1 приводить до негайної видачі системного виклику exec, який замінить команди процесу 1 кодом, що знаходиться у файлі ”/etc/init”. Тепер, коли цей процес отримав свою остаточну форму він має ім’я init.
Процес init настроює структури процесів системи UNIX. Звичайно він може створювати як мінімум два типи обчислювального середовища: однокористувацький та багатокористувацький. Цей процес починає свою роботу з підключення інтерпретатора команд ОС shell до системної консолі та присвоєння shell статусу привілейованого користувача. Такий режим часто називають однокористувацьким. Консоль (дисплей, клавіатура, периферія) автоматично реєструється як користувач, що зайшов з кореневими привілеями і ні по жодні лінії зв’язку вхід більше не можливий. Такий однокористувацький режим застосовується для перевірки та відновлення файлових систем, для виконання основних функцій тестування і інших дій, що вимагають монопольного використання комп’ютера.
SHAPE \* MERGEFORMAT Послідовність змін процесу 1
Контекст процесу
Етап 1
Розширено для включення даних користувачів
Контекст процесу
Дані користувачів
Створення контексту процесу 0(область даних користувачів відсутня)
Етап 2
Коротка програма на машинній мові копіюється в область даних користувачів
Контекст процесу
Дані користувачів
Етап 3
Завершується ініціалізація ядра і воно починає керувати процесами. В цій точці існує тільки процес 1
Контекст процесу
Дані користувачів
Етап 4
Процес 1 виконує exec для програми „etc/init” і отримує нове ім’я „init”
Контекст процесу
etc/init
Етап 5
Init створює shell для читання команд з системної консолі
Контекст процесу
etc/init
Користувацький режим
Init створює getty для кожного контакту зв’язку та shell для виконання команд з файлу „etc/rc”
Контекст процесу
etc/init
Початок багато- користувацького режиму
Init очікує завершення процесів. Кожна подія завершення приводить до створення нового getty для відповідного каналу зв’язку
Контекст процесу
etc/init
Багато- користувацький режим
Один активний процес
Стійкий стан системи
Декілька процесів
Ініціа-лізація ядра

При виході з однокористувацького режиму процес init створює багатокористувацьке середовище. З цією метою він створює процес getty для кожного активного каналу зв’язку. Init також продовжує процес shell для виконання команд, що зберігаються у файлі “/etc/rc”. Цей файл вміщує послідовність команд shell, що дозволяють монтувати файлові системи, запускати процеси, що слідкують за подіями, вилучати застарілі тимчасові файли та ініціювати виконання програм обміну для користувачів. Вміст файлу “/etc/rc” індивідуальний для кожної системи UNIX.
Під час роботи ОС, init пасивний, в очікуванні завершення довільного з породженого ним процесів. Як тільки це відбувається, init активізується і створює нову програму getty для відповідної лінії зв’язку (Саме getty може завершитись, оскільки shell існує на протязі всього часу функціонування системи). Таким чином init не тільки створює багатокористувацьку структуру, але і підтримує її під час існування системи.
Останній учасник ініціалізації системи програма getty. Кожна з цих програм очікує, коли хтось зайде в систему через визначений канал зв’язку. При виконанні такої процедури getty виконує декілька налаштувань відповідно до протоколу каналу, а потім за системним викликом exec передає керування програмі login, яка реалізує перевірку паролю. Якщо пароль коректний, то знову за допомогою виклику exec контроль передається shell, що приймає команди користувача. Після завершення роботи активізується єдина “жива” рідна програма init і послідовністю fork–exec створюється новий процес getty, що керує каналом, який очікує нового входу по даному каналу.
SHAPE \* MERGEFORMAT Цикл подій для кожного каналу зв’язку
Init виконує fork-exec для утворення програми getty, що керує каналом зв’язку
Невірний пароль
Getty друкує повідомлення „login” та очікує входу в систему
При завершенні Shell „прокидається” init і послідовність fork-exec утворює новий getty для каналу
Shell виконує програми користувача до його виходу зі системи
Getty друкує повідомлення „login” та очікує входу в систему
Вірний пароль

Файлова система UNIX
Основна функція в довільній ОС – розділення простору зовнішньої пам’яті на іменовані ділянки – файли.
В UNIX файли є послідовностями байтів. Іноді до них звертаються як до текстових або двійкових але розрізняються вони лише вмістом (текстові файли можуть містити тільки значення, що можливі в коді ASCII), а не структурою, або методом доступу.
Файлова система UNIX ієрархічна, використовує багаторівневий метод зберігання файлів та створює ілюзію фізичного існування в рамках ОС.
В UNIX – каталоги – це файли, які може мати довільна програма. Але в них зберігається не вся інформація про файли, а тільки імена файлів і числа, що використовуються ядром для доступу до тонких структур.
Прихована частина файлової системи UNIX – це індексний дескриптор файлу. Існує по одному дескриптору на кожний файл і саме з ним працює файлова система. Індексний дескриптор описує розташування файла; його довжину; метод доступу до нього; числа створення, модифікації; ідентифікатор власника та інше. Звичайний користувач не працює з індексними дескрипторами.
Будова файлової системи UNIX
Блок 0 – блок початкового завантаження, містить коротку програму–завантажувач. Звичайно вона читає більш довгу вторинну програму, завантажуючи тим самим ядро ОС UNIX.
Блок 1– суперблок, містить заголовок файлової системи, що складається з основної інформації про неї, зокрема, про її розміри, число індексних дескрипторів, а також про параметри, що відносяться до списку вільних блоків. При монтуванні файлової системи, що виконується за командою mount, в таблиці змонтованих систем, розміщеній в ядрі, формується відповідний елемент, суперблок змонтованої системи записується в один з великих внутрішніх буферів ядра. Ядру повинні бути доступні суперблоки усіх змонтованих файлових систем, оскільки інформація, що в них знаходиться, дозволяє виконувати звертання до файлів та індексних дескрипторів.
SHAPE \* MERGEFORMAT Структура диску
Блок 0. Завантажувач
Блок 1. Суперблок.
Блок 2.
Індексні дескриптори(по 8 на блок)
Блок n.
Блок n + 1.
Останній блок.
. . .
. . .

Індексні дескриптори зберігаються в файловій системі в усіх блока окрім 0. У залежності від розмірів, різні файлові системи містять різне число індексних дескрипторів (це число вказане в суперблоці). Оскільки дескриптори мають фіксований розмір та послідовно пронумеровані, починаючи з 0, довільний з них можна знайти за його номером.
Кожний файл визначається індексним дескриптором, який містить:
- режим доступу;
- тип файлу;
- його довжину в байтах;
- ідентифікаційний номер власника і групи;
- розташування файлів;
- час створення;
- час останньої модифікації;
- час останнього звертання.
Але ім’я файлу зберігається в каталозі.
В UNIX розташування файла задається списком його блоків. Блоки можуть бути фізично розкидані на диску, але логічно вони створюють довгий ланцюжок, що містить весь набір даних. Ключ, що задає розташування файла, це список з 13 номерів блоків на диску, що зберігаються в індексному дескрипторі. Перші 10 номерів задаються перші 10 блоків файлу. Якщо дані файла розміщуються в цих 10 блоках або навіть не займають їх всі, то тільки декілька елементів списку вміщують дискові адреси.
Наприклад: Якщо файлу достатньо чотирьох блоків, то перші чотири елементи списку включають відповідні адреси, а інші дев’ять заповнені нулями.
В тому випадку коли довжина даних перевищує 10 блоків (5120 байт), перші десять елементів списку посилаються на блоки файла, а одинадцятий на блок, де розміщується список наступних 128 блоків файла. Цей блок називається посереднім. Для файлів довжина яких більша, ніж 138 (128 + 10) блоків (70656 байт), дванадцятий елемент списку вміщує адресу блоку, що включає адреси 128 посередніх блоків. Такий блок називається подвійним посереднім блоком.
Якщо файл має довжину більше ніж 16522 блоки (10 + 128 + 128 ? 128 = 8 459 264 байт), то в тринадцятому елементі списку знаходиться адреса потрійного посереднього блоку. Таким чином, max довжина файлу в системі UNIX дорівнює:
10 + 128 + 128 ? 128 + 128 ? 128 ? 128 = 2 113 674 блоки = 1 082 201 088 байт ? 1 Гбайт.
Вибір інформації з великих файлів більш складний, ніж з малих, оскільки для отримання адрес вимагаються проміжні звертання до посередніх блоків.
SHAPE \* MERGEFORMAT Адресація блоків файлу блоком покажчиків індексних дескрипторів
Блок покажчиків індексних дескрипторів
0
. . .
9
10
11
12
0
. . .
127
Потрійний посередній блок
Подвійний посередній блок
0
. . .
127
Посередній блок
0
. . .
9
10
. . .
137
138
. . .
16 521
16 522
. . .
2 113 673
0
. . .
127
0
. . .
127
. . .
0
. . .
127
0
. . .
127
. . .
0
. . .
127
0
. . .
127
0
. . .
127
. . .
128 посередніх блоків
16 384 посередніх блоків
128 подвійних посередніх блоків
Блоки файлу

Наприклад, для того, щоби прочитати файли з 10 000 блоків, система повинна звернутися до 10 000 його блоків, до одного подвійного посереднього та до 79 посередніх блоків.
Каталоги
Довільний каталог у файловій системі UNIX це розташований на диску файл, що містить список імен файлів та відповідний список номерів їх індексних дескрипторів. Для забезпечення збереження і цілісності файлової системи програмам заборонено писати в каталоги, але дозволено читання. Коли виконуються запити на створення або вилучення файлів, сама система виконує відповідні дії в каталогах. Як і кожний файл, каталог визначається своїм індексним дескриптором. Каталоги складаються з елементів по 16 байтів кожний, з яких 14– для імені, а 2– для номера індексного дескриптора файлу.
Перші елементи в каталозі ‘.’ та ‘. .’, вказують на індексні дескриптори самого каталогу та батьківського, відповідно. В кореневому каталозі обидва елементи показують на свій же кореневий каталог, оскільки він немає батька. Ці два обов’язкових елементи автоматично заносяться системою в каталог при його створені і не можуть бути вилучені користувачем. Каталог вважається порожнім, якщо він містить тільки ‘.’ та ‘. .’ файли.
З точки зору ядра системи UNIX шлях, що задається повним іменем файлу, є переходами між каталогами та індексними дескрипторами. Нехай існує повне ім’я файлу ’. ./а/в’. Це ім’я утворює ланцюжок з біжучого каталогу (його батьківський каталог) в підкаталог батьківського каталог ’а’, і нарешті, до файлу з іменем ’в’ в каталозі ’а’. Для того, щоби прослідкувати цей ланцюжок, система виконує такі дії:
1. Вибирає індексний дескриптор біжучої директорії. Цей дескриптор міститься в контексті процесу.
2. За допомогою інформації, що зберігається в цьому дескрипторі, виконується пошук в біжучому каталозі імені ‘. .’ і отримується номер його індексного дескриптора.
3. Система вибирає індексний дескриптор ‘. .’.
4. За допомогою інформації, що зберігається в дескрипторі ‘. .’, виконується пошук в батьківському каталозі файлу ’а’ і отримуємо номер.
5. Система вибирає індексний дескриптор ’а’.
6. За допомогою інформації, що зберігається в дескрипторі ’а’, виконується пошук в каталозі ’а’ файла з іменем ’в’ і отримується номер його індексного дескриптора.
7. Вибирається індексний дескриптор файлу ’в’.
8. Система звертається до файлу ’в’.
Як бачимо, звичайний доступ до файлу вимагає виконання великої роботи. Але при реальному функціонуванні системи відслідковування ланцюжків повного імені виконується не часто, частіше виконується звертання до раніше знайдених файлів.
Таким чином на диску зберігаються структури, що утворюють скелет файлової системи. До них відносяться: – суперблок; – індексний дескриптор; – каталоги файлів;  звичайні і спеціальні файли. В нормальних умовах з ними працює ядро, а при необхідності відновлення файлової системи – програми fsck та fsdb.
Розглянемо структури, що зберігаються в основній пам’яті, які забезпечують ядру доступ до файлової системи.
SHAPE \* MERGEFORMAT Структури даних ядра, що забезпечують доступ до файлів
Контекст процесу
. . .
Файли
. . .
Системна таблиця файлів
. . .
. . .
Системна таблиця індексних дескрипторів файлів
. . .
Дескриптори відкритих файлів

Суперблок зберігається в пам’яті тому, що вміщує декілька ключових параметрів файлової системи, в тому числі такий важливий параметр, як розташування списку вільних блоків. Довільний елемент таблиці індексних дескрипторів, що є резидентною в пам’яті, зберігає основну інформацію, необхідну для доступу до файлу, включаючи його режим та розташування блоків.
Таблиця файлів. Кожний її елемент містить покажчик на деяку адресу в таблиці індексних дескрипторів та покажчик чергового байта файла, що підлягає обробці (покажчик читання/запису). Контекст процесу посилається до відповідних таблиць відкритих файлів. Всі ці таблиці показують на таблицю індексних дескрипторів, визначений елемент якої адресує власне файл.