69762

Введення-виведення у режимі користувача

Лекция

Информатика, кибернетика и программирование

Тут зупинимося на взаємодії підсистеми введення-виведення із процесами режиму користувача та на різних методах організації введення-виведення з режиму користувача. Синхронне введення-виведення У більшості випадків введення-виведення на рівні апаратного...

Украинкский

2014-10-09

63 KB

6 чел.

Тема 10. Введення-виведення у режимі користувача

Тут зупинимося на взаємодії підсистеми введення-виведення із процесами режиму користувача та на різних методах організації введення-виведення з режиму користувача.

10.1. Синхронне введення-виведення

У більшості випадків введення-виведення на рівні апаратного забезпечення кероване перериваннями, а отже є асинхронним. Однак використати асинхронну обробку даних завжди складніше, ніж синхронну, тому найчастіше введення-виведення в ОС реалізоване у вигляді набору блокувальних або синхронних системних викликів, подібних до read(), write() або fcntl (). Під час виконання такого виклику поточний потік призупиняють, переміщуючи в чергу очікування для цього пристрою. Після завершення операції введення-виведення і отримання всіх даних від пристрою потік переходить у стан готовності та може продовжити своє виконання.

Однак синхронне введення-виведення підходить не для всіх застосувань. Зокрема, воно не підходить для таких категорій програм:

серверів, що обслуговують багатьох клієнтів (отримавши з'єднання від одного клієнта, потрібно мати можливість відразу обслуговувати й інших);

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

мультимедійних застосувань (відіславши запит на читання одного кадру, потрібно одночасно показувати інші).

Для вирішення цієї проблеми запропоновано кілька підходів, про які йтиметься нижче.

10.2. Багатопотокова організація введення-виведення

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

Такий підхід має багато переваг і може бути рекомендований для використання у багатьох видах застосувань. Наведемо приклад розробки багатопотокового сервера за принципом «потік для запиту» (thread per request).

У таких серверах є головний потік, який очікує безпосередніх запитів клієнта на отримання даних (виконуючи синхронну операцію read О або recvfromO для сокетів). Після отримання кожного запиту головний потік створює новий робочий потік для обробки його запиту, після чого продовжує очікувати подальших запитів. Робочий потік обробляє запит і завершується. Такий підхід застосовують для зв'язку без збереження стану, коли обробка одного запиту не залежить від обробки іншого. Ось псевдокод сервера, що працює за таким принципом:

void concurrent_server() {

 for (; ;) {

read (fd. &request); // синхронно очікувати запит

// створити потік для обробки запиту

create_thread (worker_thread. request):

}

}

// функція потоку обробки запиту

void worker_thread(request_t request) {

process_request(request); // обробити запит

}

Переваги такого підходу полягають у простоті реалізації та низьких вимогах до ресурсів, недоліки — у недостатній масштабованості (за великої кількості одночасних запитів витрати на створення потоків для кожного із них можуть спричиняти зменшення продуктивності).

У зв'язку з використанням багатопотоковості для організації асинхронного введення-виведення виникають ще деякі проблеми.

♦ Не завжди варто додавати багатопотоковість в однопотокове застосування тільки тому, що в ньому знадобилося виконати асинхронне введення-виведення.

♦ Потрібно реалізовувати синхронізацію потоків.

  •  Може знизитися надійність застосування.
  •  Кваліфікація програмістів може виявитися недостатньою для реалізації багатопотоковості.

Усе це призводить до значного поширення технологій, альтернативних до цього підходу. Розглянемо їх.

10.3. Введення-виведення із повідомленням

Першою технологією, яку можна використати для організації введення-виведення без блокування і яка не вимагає організації багатопотоковості, є введення-виведення із повідомленням (notification-driven I/O) [77]. Ця технологія має й інші назви, наприклад мультиплексування введення-виведення (I/O multiplexing).

Загальні принципи введення-виведення із повідомленням

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

У цьому разі виконання введення-виведення поділяють на кілька етапів.

  1.   Спеціальний системний виклик (виклик повідомлення) визначає, чи можна виконати синхронне введення-виведення хоча б для одного дескриптора із заданого набору без блокування потоку. У POSIX визначено виклики повідомлення poll() і select().
  2.   Як тільки хоча б один дескриптор із набору стає готовий до введення-виведення без блокування, виклик повідомлення повертає керування; при цьому поточний потік може визначити, для яких саме дескрипторів може бути виконане введення-виведення або які з них змінили свій стан (тобто отримати повідомлення про стан дескрипторів).
  3.   Потік, що викликає, може тепер у циклі обійти всі дескриптори, визначені внаслідок повідомлення на етапі 2, і виконати введення-виведення для кожного з них, блокування поточного потоку ця операція в загальному випадку не спричинить.

Проілюструємо застосування цієї технології на прикладі реалізації реактивного сервера [54]. Такий сервер відповідає на запити клієнтів в одному потоці виконанням у циклі опитування стану набору дескрипторів, визначення тих із них, на які прийшли запити, та подальшого виконання цих запитів.

Введення-виведення із повідомленням про стан дескрипторів

Спочатку реалізуємо реактивний сервер на основі технології введення-виведення із повідомленням про стан дескрипторів (state-based notification). Це традиційний підхід, який використовується багато років. Необхідно виконати такі кроки.

  1.   Підготувати структуру даних (назвемо її fdarr) з описом усіх дескрипторів, стан яких потрібно відстежувати.
  2.   Передати fdarr у системний виклик повідомлення (у POSIX до таких викликів належать уже згадані select () і poll ()). Після виходу із виклику повідомлення fdarr міститиме інформацію про стан усіх відстежуваних дескрипторів (які з них готові до виконання введення-виведення без блокування, а які – ні).
  3.   Для дослідження результатів повідомлення обійти в циклі всі елементи fdarr і для кожного із них визначити готовність відповідного дескриптора; якщо він готовий – виконати для нього введення-виведення.

Ось псевдокод реактивного сервера із використанням повідомлення про стан дескрипторів:

void reactive_server () {

// цикл опитування набору дескрипторів fdarr. підготовленого раніше

for ( ; : ) {

select (&fdarr);        // прослуховування набору

// цикл визначення активних дескрипторів

for (і=0; і <= count(fdarr); i++) {

if ( requestjs_ready (fdarr[i]) ) { // якщо був запит

read (fdarr[i], &request); // одержати дані запиту

process_request (request); // обслужити клієнта

}

}

}

}

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

select () повертає інформацію про ті запити, які потрібно обслужити;

усі ці запити обслуговують один за одним без затримок на введення-виведення; поки їх обслуговують, надходять нові;

коли всі запити, про які сповістив минулий виклик select(), обслужені, починають нову ітерацію зовнішнього циклу, select () викликають знову, і він негайно повертає відомості про всі запити, які надійшли із часу минулого виклику.

Отже, запити потрапляють на обробку групами тим більшими, чим більше приходить запитів. Немає очікування ні під час виклику select(), ні під час читання даних із дескриптора. Усе це значно підвищує продуктивність.

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

Основною особливістю введення-виведення із повідомленням про стан дескрипторів є те, що в разі його використання не зберігається стан. Кожен виклик повідомлення вимагає передавання всього набору дескрипторів і повертає «миттєвий знімок» стану цих дескрипторів. Це потребує повного обходу цього списку як всередині виклику повідомлення, так і в коді, що його викликав. Такий обхід може серйозно позначитися на продуктивності у разі великої кількості дескрипторів. Таким чином, інформація про неактивні дескриптори даремно копіюватиметься у ядро і назад під час кожного виклику повідомлення.

Введення-виведення із повідомленням про події

Для того щоб підвищити ефективність цієї схеми, запропоновано інший підхід -введення-виведення із повідомленням про події (event-based notification) [77].

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

Найвідомішими є приклади реалізації такого підходу для FreeBSD (kqueue) і для Linux 2.6 (epoll).

Виконання введення-виведення в цьому разі зводиться до таких кроків.

1. Спеціальний системний виклик (у Linux epol l_create()) створює структуру даних у ядрі; зазвичай як параметр у такий виклик передають максимальну кількість дескрипторів, які потрібно контролювати. Таку структуру даних на-зивають прослуховувальним об'єктом.

  1.   Після створення такого об'єкта для нього потрібно сформувати набір контрольованих дескрипторів, для кожного з них вказують події, які цікавлять потік, що виконував виклик. У Linux це робиться окремим викликом epoll_ctl(), один із можливих варіантів виконання якого додає дескриптор у набір.
  2.   Виклик повідомлення (у Linuxepoll_wait()) при цьому повертає інформацію тільки про ті дескриптори, які змінили стан із моменту останнього виклику (а не про всі дескриптори, як для select() або poll ()).

Ось псевдокод реактивного сервера із використанням повідомлення про події:

void reactive_server2 () {

epfd = epoll_create();   // створити прослуховувальний об'єкт

// додати дескриптори в прослуховувальний об'єкт

for (i=0; i<=count(fdarr);i++)

epoll_ctl(epfd. ADD.  fdarr[i]);

// цикл опитування набору дескрипторів у прослуховувальному об'єкті

for ( : ; ) {

epoll_wait (epfd. Sactive);    // визначення активного набору

// цикл обслуговування запитів

for (і=0; і <= count(active); i++) {

read (active[i]. &request): // одержати дані запиту

process_request (request);  // обслужити клієнта

}

}

}

Легко помітити, що внутрішній цикл спростився. Зазначимо також, що використання внутрішньої структури даних позбавляє необхідності обходу всіх дескрипторів усередині epoll_wait().

10.4. Асинхронне введення-виведення

Асинхронне введення-виведення реалізоване у деяких UNIX-системах (є стандарт POSIX для таких операцій). Одна з найповніших реалізацій цієї технології доступна також в системах лінії Windows ХР, де її називають введенням-виведен-ням із перекриттям (overlapped I/O). Основна ідея тут полягає в тому, що потік, який почав виконувати введення-виведення, не блокують до його завершення. Асинхронне введення-виведення зводиться до виконання таких дій.

  •  Потік виконує системний виклик асинхронного введення або виведення, який ставить операцію введення-виведення в чергу і негайно повертає керування.
  •  Потік продовжує виконання паралельно з операцією введення-виведення.
  •  Коли операція введення-виведення завершується, потік отримує про це повідомлення.

Операція може бути перервана до свого завершення.

Основним підходом до отримання повідомлення про завершення асинхронного введення-виведення є виконання операції очікування завершення введення-виведення. При цьому потік призупиняють до завершення асинхронної операції.

Контрольні питання:

1. Синхронне введення-виведення.

2. Багатопотокова організація введення-виведення.

3. Загальні принципи введення-виведення із повідомленням.

4. Введення-виведення із повідомленням про стан дескрипторів.

5. Введення-виведення із повідомленням про події.

6. Асинхронне введення-виведення.


 

А также другие работы, которые могут Вас заинтересовать

54678. Предмет органической химии. Особенности органических соединений. Источники органических веществ. Значение органических веществ 309.5 KB
  Именно этому акту органическая химия обязана своим названием Органические соединения органические вещества класс химических соединений в состав которых входит углерод за исключением карбидов угольной кислоты карбонатов оксидов углерода и цианидов Соединения углерода выделенные из живых организмов назвали органическими веществами....
54679. Организация питания в походах и путешествиях 45.5 KB
  Турист в водных походах тратит приблизительно 60 ккал день на кг собственного веса или 3500 ккал день а при нормальных ежедневных нагрузках 25003000 Ккал день. Такой вид питания часто необходимо предусматривать в транспорте утром с поезда сошли а потом ещё часов 56 на автотранспорте до реки добираться надо в день стапеля Стапелем называется процесс сборки сплавных средств. Часто проходит в населённом пункте где нет возможности развести костёр в последний день прохождения населённый пункт в близи ж д станции во время ожидания...
54680. Організація змістовної життєдіяльності дітей в групі продовженого дня 135 KB
  Мета особистісне орієнтованої освіти знайти підтримати розвинути людину в людині закласти в ній механізм самореалізації Передмова Внаслідок посилення демократичних тенденцій у житті суспільства освітні системи як його значущі складові почали переносити акцент із масових педагогічних явищ на особистість дитини вивчення можливостей і обставин її індивідуального розвитку умов саморозкриття і самореалізації людини на різних етапах ЇЇ життєдіяльності. На сторінках проблемної...
54681. Будова та функції органів дихання 362 KB
  Цілі: сформувати в учнів поняття про дихання як процес необхідний для життя; устоновити взаемозвязок будови і функції органів дихання; зясувати як змінюеться повітря в дихальних шляхах; обгронтувати необхідність дихання носом; продовжувати формувати науковий світогляд на основі знань про еволюцію дихальної системи; розвивати вміння порівнювати аналізувати загальнувати;вдосконалювати вміння а навички роботи з текстом підручникамалюнками. Обладнання: таблиці Органи дихання таблиці з...
54682. Орієнтація на вулиці 44.5 KB
  So, you know a lot about London! But what is the difference in Road Safety in this country and what we must know to cross the street there? Right! You should first look right when you cross the street in London.
54683. Мій край – моя історія. Оріхів -місто серця мого 61.5 KB
  Нас зацікавила історія нашого міста району яким воно було у давнину коли одержало статус міста хто був першим головою міста На всі ці питання можна одержати відповідь із книжок Оріхів. Статус міста Оріхів одержав у 1801 році 19 лютого і став центром Мелітопольського повіту Таврійської губернії. В розпорядження міста була віддана земля 2602 десятини.
54685. Монополизм: сущность, формы, последствия. Естественная монополия 22.63 KB
  Рынок, где доминирует монополия, находится в резком контрасте со свободным рынком, на котором конкурирующие продавцы предлагают для продажи стандартизированный товар. Доступ других фирм на монополизированный рынок затруднен или невозможен, так как существуют барьеры, не позволяющие конкурентам войти в отрасль.
54686. Oберегu моєї оселі 123 KB
  Мета: Пропаганда літератури із народознавства, історії нашого народу, його мови, звичаїв, пробудити цікавість до народної символіки, прикмет, до невмирущих скарбів народу.