Фізична організація пристроїв вводу-виводу. Класифікації
Зміст
Управління вводом-виводом
Однією з головних функцій ОС є управління усіма пристроями вводу-виводу комп'ютера. ОС повинна передавати пристроям команди, перехоплювати переривання і обробляти помилки; вона також повинна забезпечувати інтерфейс між пристроями та іншою частиною системи. З метою розвитку інтерфейс повинен бути однаковим для всіх типів пристроїв (незалежність від пристроїв).
Фізична організація пристроїв вводу-виводу
Пристрої вводу-виводу діляться на два типи: блок-орієнтовані пристрої і байт-орієнтовані пристрої. Блок-орієнтовані пристрої зберігають інформацію в блоках фіксованого розміру, кожен з яких має свою власну адресу. Найпоширеніше блок-орієнтоване пристрій - диск. Байт-орієнтовані пристрої не адресуються і не дозволяють проводити операцію пошуку, вони генерують чи споживають послідовність байтів. Прикладами є термінали, рядкові принтери, мережні адаптери. Однак деякі зовнішні пристрої не відносяться ні до одного класу, наприклад, годинник, який, з одного боку, не адресується, а з іншого боку, не породжують потоку байтів. Це пристрій лише видає сигнал переривання в деякі моменти часу.
Зовнішній пристрій зазвичай складається з механічного та електронного компонента. Електронний компонент називається контролером пристрою або адаптером. Механічний компонент представляє власне пристрій. Деякі контролери можуть керувати кількома пристроями. Якщо інтерфейс між контролером і пристроєм стандартизований, то незалежні виробники можуть випускати сумісні як контролери, так і пристрої.
Операційна система зазвичай має справу не з пристроєм, а з контролером. Контролер, як правило, виконує прості функції, наприклад, перетворює потік біт в блоки, що складаються з байт, і здійснюють контроль і виправлення помилок. Кожен контролер має кілька регістрів, які використовуються для взаємодії з центральним процесором. У деяких комп'ютерах ці регістри є частиною фізичного адресного простору. У таких комп'ютерах немає спеціальних операцій вводу-виводу. В інших комп'ютерах адреси регістрів вводу-виводу, званих часто портами, утворюють власний адресний простір за рахунок введення спеціальних операцій вводу-виводу (наприклад, команд IN і OUT в процесорах i86).
ОС виконує ввод-вивід, записуючи команди в регістри контролера. Наприклад, контролер гнучкого диска IBM PC приймає 15 команд, таких як READ, WRITE, SEEK, FORMAT і т.д. Коли команда прийнята, процесор залишає контролер і займається іншою роботою. При завершенні команди контролер організує переривання для того, щоб передати управління процесором операційній системі, яка має перевірити результати операції. Процесор отримує результати і статус пристрою, читаючи інформацію з регістрів контролера.
Організація програмного забезпечення вводу-виводу
Основна ідея організації програмного забезпечення вводу-виводу полягає в розбивці його на кілька рівнів, причому нижні рівні забезпечують екранування особливостей апаратури від верхніх, а ті, в свою чергу, забезпечують зручний інтерфейс для користувачів.
Ключовим принципом є незалежність від пристроїв. Вид програми не повинен залежати від того, чи читає вона дані з гнучкого диска або з жорсткого диска.
Дуже близькою до ідеї незалежності від пристроїв є ідея одностайної іменування, тобто для іменування пристроїв повинні бути прийняті єдині правила.
Іншим важливим питанням для програмного забезпечення вводу-виводу є обробка помилок. Взагалі кажучи, помилки слід обробляти якнайближче до апаратури. Якщо контролер виявляє помилку читання, то він повинен спробувати її скоригувати. Якщо ж це йому не вдається, то виправленням помилок повинен зайнятися драйвер пристрою. Багато помилки можуть зникати при повторних спробах виконання операцій вводу-виводу, наприклад, помилки, викликані наявністю порошин на голівках читання або на диску. І тільки якщо нижній рівень не може впоратися з помилкою, він повідомляє про помилку верхньому рівню.
Ще одне ключове питання - це використання блокуючих (синхронних) і неблокірующіх (асинхронних) передач. Більшість операцій фізичного вводу-виводу виконується асинхронно - процесор починає передачу і переходить на іншу роботу, поки не настає переривання. Користувальницькі програми набагато легше писати, якщо операції вводу-виводу блокуючі - після команди READ програма автоматично припиняється до тих пір, поки дані не потраплять в буфер програми. ОС виконує операції вводу-виводу асинхронно, але подає їх для користувача програм в синхронній формі.
Остання проблема полягає в тому, що одні устрою є поділюваними, а інші - виділеними. Диски - це колективні пристрої, тому що одночасний доступ декількох користувачів до диска не являє собою проблему. Принтер - це виділені пристрої, тому що не можна змішувати рядки, що друкуються різними користувачами. Наявність виділених пристроїв створює для операційної системи деякі проблеми.
Для вирішення поставлених проблем доцільно розділити програмне забезпечення вводу-виводу на чотири шари (малюнок 2.30):
- Обробка переривань,
- Драйвери пристроїв,
- Незалежний від пристроїв шар операційної системи,
- Користувацький шар програмного забезпечення.
Рис. 1. Багаторівнева організація підсистеми вводу-виводу
Обробка переривань
Переривання повинні бути приховані якнайглибше в надрах операційної системи, щоб якомога менша частина ОС мала з ними справу. Найкращий спосіб полягає у вирішенні процесу, який ініціював операцію вводу-виводу, блокувати себе до завершення операції і настання переривання. Процес може блокувати себе, використовуючи, наприклад, виклик DOWN для семафора, або виклик WAIT для перемінної умови, чи виклик RECEIVE для очікування повідомлення. При настанні переривання процедура обробки переривання виконує розблокування процесу, який ініціював операцію вводу-виводу, використовуючи виклики UP, SIGNAL чи посилаючи процесу повідомлення. У будь-якому випадку ефект від переривання буде полягати в тому, що раніше заблокований процес тепер продовжить своє виконання.
Драйвери пристроїв
Весь залежний від пристрою код поміщається в драйвер пристрою. Кожен драйвер управляє пристроями одного типу або, може бути, одного класу.
В операційній системі тільки драйвер пристрою знає про конкретні особливості якого-небудь пристрою. Наприклад, тільки драйвер диска має справу з доріжками, секторами, циліндрами, часом встановлення головки та іншими факторами, що забезпечують правильну роботу диска.
Драйвер пристрою приймає запит від пристроїв програмного шару і вирішує, як його виконати. Типовим запитом є читання n блоків даних. Якщо драйвер був вільний під час надходження запиту, то він починає виконувати запит негайно. Якщо ж він був зайнятий обслуговуванням іншого запиту, то знову надійшов запит приєднується до черги вже наявних запитів, і він буде виконаний, коли настане його черга.
Перший крок в реалізації запиту вводу-виводу, наприклад, для диска, полягає в перетворенні його з абстрактної форми в конкретну. Для дискового драйвера це означає перетворення номерів блоків в номери циліндрів, головок, секторів, перевірку, чи працює мотор, чи знаходиться головка над потрібним циліндром. Коротше кажучи, він повинен вирішити, які операції контролера потрібно виконати і в якій послідовності.
Після передачі команди контролеру драйвер повинен вирішити, чи блокувати себе до закінчення заданої операції чи ні. Якщо операція займає значний час, як при друку деякого блоку даних, то драйвер блокується до тих пір, поки операція не завершиться, і оброблювач переривання не розблокує його. Якщо команда вводу-виводу виконується швидко (наприклад, прокрутка екрана), то драйвер очікує її завершення без блокування.
Незалежний від пристроїв шар операційної системи
Більшість програмного забезпечення вводу-виводу є незалежною від пристроїв. Точна межа між драйверами і незалежними від пристроїв програмами визначається системою, тому що деякі функції, які могли б бути реалізовані незалежним способом, насправді виконані у вигляді драйверів для підвищення ефективності або з інших причин.
Типовими функціями для незалежного від пристроїв шару є:
забезпечення загального інтерфейсу до драйверам пристроїв, іменування пристроїв, захист пристроїв, забезпечення незалежного розміру блоку, буферизація, розподіл пам'яті на блок-орієнтованих пристроях, розподіл і звільнення виділених пристроїв, повідомлення про помилки. Зупинимося на деяких функціях даного переліку. Верхнім верствам програмного забезпечення не зручно працювати з блоками різної величини, тому даний шар забезпечує єдиний розмір блоку, наприклад, за рахунок об'єднання декількох різних блоків у єдиний логічний блок. У зв'язку з цим верхні рівні мають справу з абстрактними пристроями, які використовують єдиний розмір логічного блоку незалежно від розміру фізичного сектора.
При створенні файлу або заповненні його новими даними необхідно виділити йому нові блоки. Для цього ОС повинна вести список або бітову карту вільних блоків диска. На підставі інформації про наявність вільного місця на диску може бути розроблений алгоритм пошуку вільного блоку, незалежний від пристрою і реалізується програмним шаром, що знаходяться вище шару драйверів.
Користувацький шар програмного забезпечення
Хоча більша частина програмного забезпечення вводу-виводу знаходиться всередині ОС, деяка його частина міститься в бібліотеках, що пов'язуються з одними програмами. Системні виклики, які включають виклики вводу-виводу, зазвичай робляться бібліотечними процедурами. Якщо програма, написана мовою С, містить виклик
count = write (fd, buffer, nbytes), то бібліотечна процедура write буде пов'язана з програмою. Набір подібних процедур є частиною системи вводу-виводу. Зокрема, форматування вводу або вивоводу виконується бібліотечними процедурами. Прикладом може служити функція printf мови С, яка приймає рядок формату і, можливо, деякі змінні в якості вхідної інформації, потім будує рядок символів ASCII і робить виклик write для виведення цього рядка. Стандартна бібліотека вводу-виводу містить велику кількість процедур, які виконують ввод-вивід і працюють як частина користувальницької програми.
Інший категорією програмного забезпечення вводу-виводу є підсистема спулінга (spooling). Спулінг - це спосіб роботи з виділеними пристроями в мультипрограммной системі. Розглянемо типове пристрій, що вимагає спулінга - рядковий принтер. Хоча технічно легко дозволити кожному користувальницькому процесу відкрити спеціальний файл, пов'язаний з принтером, такий спосіб небезпечний через те, що користувальницький процес може монополізувати принтер на довільний час. Замість цього створюється спеціальний процес - монітор, який отримує виключні права на використання цього пристрою. Також створюється спеціальний каталог, званий каталогом спулінга. Для того, щоб надрукувати файл, користувальницький процес поміщає виведену інформацію в цей файл і поміщає його в каталог спулінга. Процес-монітор по черзі роздруковує всі файли, що містяться в каталозі спулінга.