Підсистема введення-виведення ядра 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Підсистема введення-виведення ядра



У цьому розділі йтиметься про деякі можливості, які надає підсистема введен­ня-виведення ядра, та їхнє місце в загальній інфраструктурі введення-виведення.

 

15.4.1. Планування операцій введення-виведення

Планування введення-виведення звичайно реалізоване як середньотермінове плану­вання, особливості якого описані в розділі 4 (розділ 4.2.2, рис. 4.2). Як відомо, з кож­ним пристроєм пов'язують чергу очікування, під час виконання блокувального

виклику (такого як read() або fcntl ()) потік поміщають у чергу для відповідного пристрою, з якої його звичайно вивільняє оброблювач переривання, як це було описано в розділі 15.3.2. Різним пристроям можуть присвоювати різні пріоритети.

Ще одним прикладом планування введення-виведення є дискове планування, розглянуте в розділі 12.

 

Буферизація

Найважливішою технологією підвищення ефективності обміну даними між при­строєм і застосуванням або між двома пристроями є буферизація. Для неї виділя­ють спеціальну ділянку пам'яті, яка зберігає дані під час цього обміну і є буфе­ром. Залежно від того, скільки буферів використовують і де вони перебувають, розрізняють кілька підходів до організації буферизації.

 

Необхідність реалізації буферизації

Перелічемо причини, які викликають необхідність буферизації.

♦ Різниця у пропускній здатності різних пристроїв. Наприклад, якщо дані зчи­тують із модему, а потім зберігають на жорсткому диску, без буферизації про­цес переходитиме у стан очікування перед кожною операцією отримання да­них від модему. Власне кажучи, буферизація потрібна у будь-якій ситуації, коли для читання даних потік має у циклі виконати блокувальну операцію введення-виведення для кожного отримуваного символу; без неї така робота буде вкрай неефективною.

♦ Різниця в обсязі даних, переданих пристроями або рівнями підсистеми вве­дення-виведення за одну операцію. Типовим прикладом у цьому разі є мереж-ний обмін даними, коли відправник розбиває велике повідомлення на фраг­менти, а одержувач у міру отримання поміщає ці фрагменти в буфер (його ще називають буфером повторного збирання - reassembly buffer) для того щоб зі­брати з них первісне повідомлення. Такий буфер ще більш необхідний, оскіль­ки фрагменти можуть приходити не в порядку відсилання.

♦ Необхідність підтримки для застосування семантики копіювання (copy se­mantics). Вона полягає в тому, що інформація, записана на диск процесом, має зберігатися в тому вигляді, у якому вона перебувала у пам'яті в момент запи­сування, незалежно від змін, зроблених після цього.

 

Способи реалізації буферизації

Розглянемо різні способи реалізації буферизації (рис. 15.2).

Буфер, у який копіюються дані від пристрою, можна організувати в адресному просторі процесу користувача. Хоча такий підхід і дає виграш у продуктивності, його не можна вважати прийнятним, оскільки сторінка із таким буфером може у будь-який момент бути заміщена у пам'яті та скинута на диск. Можна дозволи­ти процесам фіксувати свої сторінки у пам'яті під час кожної операції введен­ня-виведення, але це призводить до невиправданих витрат основної пам'яті.

Першим підходом, який реально використовують на практиці, є одинарна бу­феризація в ядрі. У цьому разі у ядрі створюють буфер, куди копіюють дані в міру їхнього надходження від пристрою. Коли цей буфер заповнюється, весь його вміст за одну операцію копіюють у буфер, що перебуває у просторі користувача. Анало­гічно під час виведення даних їх спочатку копіюють у буфер ядра, після чого вже ядро відповідатиме за їхнє виведення на пристрій. Це дає змогу реалізувати се­мантику копіювання, оскільки після копіювання даних у буфер ядра інформація із буфера користувача у підсистему введення-виведення гарантовано більше не потрапить — процес може продовжувати свою роботу і використовувати цей бу­фер для своїх потреб.

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

Узагальнення цієї схеми на п буферів називають циклічною буферизацією, її можна використовувати тоді, коли час збереження буфера перевищує час його за­повнення.

Подвійна буферизація дає змогу відокремити виробника даних від їхнього споживача подібно до того, як це робилося для розв'язання задачі виробників-споживачів у розділах 5 і 6.

Буферизація і кешування

Буферизацію варто відрізняти від кешування. Основна відмінність між ними по­лягає в тому, що буфер може містити єдину наявну копію даних, тоді як кеш за визначенням зберігає у більш швидкій пам'яті копію даних з іншого місця.

З іншого боку, ділянку пам'яті в деяких випадках можна використати і як бу­фер, і як кеш. Наприклад, якщо після виконання операції введення із викори­станням буфера надійде запит на таку саму операцію, дані можуть бути отримані із буфера, який при цьому буде частиною кеша. Сукупність таких буферів нази­вають буферним кешем (buffer cache).

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

15.7. Керування введенням-виведенням: UNIX і Linux

Цей розділ присвячено реалізації підсистеми введення-виведення в UNIX-систе­мах. Під час розгляду пристроїв спиратимемося на класифікацію (символьні та блокові пристрої), наведену в розділі 15.2. Особлива увага надаватиметься орга­нізації уніфікованого доступу до пристроїв через інтерфейс файлової системи.

 

15.7.1. Інтерфейс файлової системи

Спеціальні файли пристроїв

Для організації уніфікованого доступу до пристроїв введення-виведення важ­ливо вибрати спосіб звертання до них. У цьому розділі розглянемо прийнятий в UNIX-системах підхід інтерфейс файлової системи, за якого пристрої відобра­жаються спеціальними файлами.

У такому разі кожному драйверу пристрою відповідає один або кілька спе­ціальних файлів пристроїв. Такі файли за традицією поміщаються в каталог /dev, хоча ця вимога не є обов'язковою.

 

Кожний спеціальний файл пристрою характеризується чотирма атрибутами.

psaux

4. Ім'я файла використовують для доступу до пристрою із процесів користувача за допомогою файлових операцій. Прикладами імен файлів пристроїв можуть бути /dev/ttyO (перший термінал), /dev/null (спеціальний «порожній» пристрій, все виведення на який зникають), /dev/hda (перший жорсткий диск), /dev/hdal (перший розділ на цьому диску), /dev/fdO (дисковід гнучкого диску), /dev/mouse (миша) тощо.

5. Тип пристрою дає змогу розрізняти блокові та символьні пристрої. Для сим­вольних тип позначають як ' с', для блокових - як ' b'.

6. Номер драйвера (major number) — це ціле число (зазвичай займає 1 байт, хоча може й 2 байти), що разом із типом пристрою однозначно визначає драйвер, який обслуговує цей пристрій. Ядро системи використовує номер драйвера для визначення того, якому драйверу передати керування в разі доступу до відпо­відного файла пристрою. Зазначимо, що драйвери блокових і символьних при­строїв нумеруються окремо.

7. Номер пристрою (minor number) - ціле число, що характеризує конкретний пристрій, для доступу до якого використовують файл. Цей номер передають безпосередньо драйверу під час виконання кожної операції доступу до файла, на його підставі драйвер визначає, який код йому потрібно виконувати. Наведемо кілька рядків виведення утиліти Is, запущеної в каталозі /dev:

 

brw-rw--------   shekvl f1oppy C\J 0 Aug 30 2001 fdO
brw-rw--------   root disk 3, 0 Aug 30 2001 hda
brw-rw--------   root disk 3, 1 Aug 30 2001 hdal
1rwxrwxrwx   root root   5 Feb 7 2003 mouse
crw-rw-rw-   root root 1. 3 Aug 30 2001 null
crw--................   root root 10. 1 Oct 17 21:09 psaux
crw--w--------   shekvl osbook 4. 0 Aug 30 2001 ttyO

Виділено тип пристрою (перший символ стовпчика атрибутів), номер драйве­ра і номер пристрою (останні два значення розділені комами), а також ім'я файла. Звідси видно, що /dev/mouse насправді є символічним зв'язком, що вказує на справжній файл пристрою для PS/2-миші (/dev/psaux), і що пристрої, пов'язані з жорстким диском (файли /dev/hda і /dev/hdal), обслуговує той самий драйвер із номером 3.

Розглянемо, як відбувається звертання до драйверів через спеціальні файли. Насамперед, кожен драйвер під час своєї реєстрації у ядрі вказує, який номер драйвера він використовуватиме. Крім того, у коді драйвера мають бути реалізова­ні файлові операції драйвера. Кожна з них — це реакція на виконання із файлом пристрою стандартних файлових операцій (системних викликів openO, readO, writeO, lseekO тощо). У коді кожної операції можна виконати відповідні дії над пристроєм (туди передають номер пристрою, на підставі якого й відбувається ви­бір пристрою в коді драйвера).

У системі зберігають дві таблиці драйверів: одна — для символьних, інша — для блокових пристроїв. Кожна така таблиця — це масив елементів, проіндексований за номером драйвера. Елементами таблиць драйверів є структури даних, полями кожної з них є покажчики на реалізації файлових операцій відповідного драйвера.

Тип пристрою, номер драйвера і номер пристрою зберігають в індексному де­скрипторі відповідного файла. Під час виконання системного виклику для файла пристрою ядро ОС виконує такі дії:

8. звертається до індексного дескриптора файла пристрою;

9. отримує звідти тип пристрою, номер драйвера і номер пристрою;

10.за типом пристрою вибирає потрібну таблицю драйверів;

11.за номером драйвера знаходить відповідний елемент таблиці;

12. викликає реалізацію файлової операції для драйвера, що відповідає цьому системному виклику, і передає в неї номер пристрою.

Драйвер визначає пристрій за його номером та виконує із ним відповідні дії. Для створення файлів пристроїв у UNIX використовують утиліту mknod, у ви­клику якої потрібно задати всі чотири характеристики файла: $ mknod /dev/mydevice с 150 1

Так створюють файл символьного пристрою, який обслуговуватиме драйвер із номером 150 і передаватиме у його функції номер пристрою 1.

Зазначимо, що файли пристроїв зберігають на диску як звичайні файли, які в будь-який момент можуть бути створені та вилучені. У разі вилучення файла пристрою вилучають лише засіб доступу до драйвера, на сам драйвер це жодним чином не впливає. Якщо згодом файл пристрою створити заново, через нього можна буде знову працювати із пристроєм, звертаючись до драйвера.

Використання для доступу до драйверів інтерфейсу файлової системи дає змогу легко забезпечити захист пристроїв від несанкціонованого доступу — для цього потрібно просто задати для файлів пристроїв відповідні права (такі права розглянемо у розділі 18).



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 316; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.33.178 (0.018 с.)