Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Підсистема введення-виведення ядраСодержание книги
Поиск на нашем сайте
У цьому розділі йтиметься про деякі можливості, які надає підсистема введення-виведення ядра, та їхнє місце в загальній інфраструктурі введення-виведення.
15.4.1. Планування операцій введення-виведення Планування введення-виведення звичайно реалізоване як середньотермінове планування, особливості якого описані в розділі 4 (розділ 4.2.2, рис. 4.2). Як відомо, з кожним пристроєм пов'язують чергу очікування, під час виконання блокувального виклику (такого як read() або fcntl ()) потік поміщають у чергу для відповідного пристрою, з якої його звичайно вивільняє оброблювач переривання, як це було описано в розділі 15.3.2. Різним пристроям можуть присвоювати різні пріоритети. Ще одним прикладом планування введення-виведення є дискове планування, розглянуте в розділі 12.
Буферизація Найважливішою технологією підвищення ефективності обміну даними між пристроєм і застосуванням або між двома пристроями є буферизація. Для неї виділяють спеціальну ділянку пам'яті, яка зберігає дані під час цього обміну і є буфером. Залежно від того, скільки буферів використовують і де вони перебувають, розрізняють кілька підходів до організації буферизації.
Необхідність реалізації буферизації Перелічемо причини, які викликають необхідність буферизації. ♦ Різниця у пропускній здатності різних пристроїв. Наприклад, якщо дані зчитують із модему, а потім зберігають на жорсткому диску, без буферизації процес переходитиме у стан очікування перед кожною операцією отримання даних від модему. Власне кажучи, буферизація потрібна у будь-якій ситуації, коли для читання даних потік має у циклі виконати блокувальну операцію введення-виведення для кожного отримуваного символу; без неї така робота буде вкрай неефективною. ♦ Різниця в обсязі даних, переданих пристроями або рівнями підсистеми введення-виведення за одну операцію. Типовим прикладом у цьому разі є мереж-ний обмін даними, коли відправник розбиває велике повідомлення на фрагменти, а одержувач у міру отримання поміщає ці фрагменти в буфер (його ще називають буфером повторного збирання - reassembly buffer) для того щоб зібрати з них первісне повідомлення. Такий буфер ще більш необхідний, оскільки фрагменти можуть приходити не в порядку відсилання. ♦ Необхідність підтримки для застосування семантики копіювання (copy semantics). Вона полягає в тому, що інформація, записана на диск процесом, має зберігатися в тому вигляді, у якому вона перебувала у пам'яті в момент записування, незалежно від змін, зроблених після цього.
Способи реалізації буферизації Розглянемо різні способи реалізації буферизації (рис. 15.2). Буфер, у який копіюються дані від пристрою, можна організувати в адресному просторі процесу користувача. Хоча такий підхід і дає виграш у продуктивності, його не можна вважати прийнятним, оскільки сторінка із таким буфером може у будь-який момент бути заміщена у пам'яті та скинута на диск. Можна дозволити процесам фіксувати свої сторінки у пам'яті під час кожної операції введення-виведення, але це призводить до невиправданих витрат основної пам'яті. Першим підходом, який реально використовують на практиці, є одинарна буферизація в ядрі. У цьому разі у ядрі створюють буфер, куди копіюють дані в міру їхнього надходження від пристрою. Коли цей буфер заповнюється, весь його вміст за одну операцію копіюють у буфер, що перебуває у просторі користувача. Аналогічно під час виведення даних їх спочатку копіюють у буфер ядра, після чого вже ядро відповідатиме за їхнє виведення на пристрій. Це дає змогу реалізувати семантику копіювання, оскільки після копіювання даних у буфер ядра інформація із буфера користувача у підсистему введення-виведення гарантовано більше не потрапить — процес може продовжувати свою роботу і використовувати цей буфер для своїх потреб. Використання одинарного буфера не позбавлене недоліків, головний з яких пов'язаний з тим, що в момент, коли буфер переповнений, нові дані нікуди помістити (а буфер може бути переповнений деякий час, наприклад, поки його зберігають на диску або поки йде завантаження з диска сторінки з буфером користувача). Для вирішення цієї проблеми запропонована технологія подвійної буферизації, за якої у пам'яті ядра створюють два буфери. Коли перший з них заповнений, дані починають надходити в другий, і до моменту, коли заповниться другий, перший уже буде готовий прийняти нові дані і т. д. Узагальнення цієї схеми на п буферів називають циклічною буферизацією, її можна використовувати тоді, коли час збереження буфера перевищує час його заповнення. Подвійна буферизація дає змогу відокремити виробника даних від їхнього споживача подібно до того, як це робилося для розв'язання задачі виробників-споживачів у розділах 5 і 6. Буферизація і кешування Буферизацію варто відрізняти від кешування. Основна відмінність між ними полягає в тому, що буфер може містити єдину наявну копію даних, тоді як кеш за визначенням зберігає у більш швидкій пам'яті копію даних з іншого місця. З іншого боку, ділянку пам'яті в деяких випадках можна використати і як буфер, і як кеш. Наприклад, якщо після виконання операції введення із використанням буфера надійде запит на таку саму операцію, дані можуть бути отримані із буфера, який при цьому буде частиною кеша. Сукупність таких буферів називають буферним кешем (buffer cache). Використання буферного кеша дає можливість накопичувати дані для збереження їх на диску великими обсягами за одну операцію, що сприяє підвищенню ефективності роботи підсистеми введення-виведення (не слід забувати при цьому про небезпеку втрати даних у разі вимкнення живлення). 15.7. Керування введенням-виведенням: UNIX і Linux Цей розділ присвячено реалізації підсистеми введення-виведення в UNIX-системах. Під час розгляду пристроїв спиратимемося на класифікацію (символьні та блокові пристрої), наведену в розділі 15.2. Особлива увага надаватиметься організації уніфікованого доступу до пристроїв через інтерфейс файлової системи.
15.7.1. Інтерфейс файлової системи Спеціальні файли пристроїв Для організації уніфікованого доступу до пристроїв введення-виведення важливо вибрати спосіб звертання до них. У цьому розділі розглянемо прийнятий в UNIX-системах підхід інтерфейс файлової системи, за якого пристрої відображаються спеціальними файлами. У такому разі кожному драйверу пристрою відповідає один або кілька спеціальних файлів пристроїв. Такі файли за традицією поміщаються в каталог /dev, хоча ця вимога не є обов'язковою.
Кожний спеціальний файл пристрою характеризується чотирма атрибутами.
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:
Виділено тип пристрою (перший символ стовпчика атрибутів), номер драйвера і номер пристрою (останні два значення розділені комами), а також ім'я файла. Звідси видно, що /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; просмотров: 344; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.214.43 (0.007 с.) |