ПредишенСледващото

Подкрепа за някои от тези предизвикателства изисква подкрепата на драйвер за устройството. Тази подкрепа (за всичките три обаждания), предоставени от водача на анкетата на метод (анкета). Този метод има следния прототип:

неподписан инт (* анкета) (структура на файл * FILP, poll_table * изчакване);

метод Шофьор се извиква всеки път, когато дадена програма потребителското пространство прави анкета система повикване. изберете или epoll с участието на файлов дескриптор, свързани с водача. метод устройство е отговорен за тези две стъпки:

1. Call poll_wait за един или повече опашки, които могат да говорят за промяна в статута на проучването. Ако няма описания на файлове в момента на разположение за I / O, ядрото предизвиква процеса, за да бъде поставено на опашката за изчакване за всички описания на файлове преминали на призива система.

2. Връщане малко маска, описващ операцията (ако има такива), които могат да бъдат незабавно извършва, без да блокира.

И двете от тези операции обикновено са прости и много сходни от един шофьор на друг. Предполага се обаче, че само водачът може да предостави тази информация и, следователно, те трябва да се прилагат индивидуално от всеки шофьор.

нищожен poll_wait (структура на файл * FILP, wait_queue_head_t * wait_queue, poll_table * изчакване);

Втората задача се изпълнява от завръщането анкета битова маска за описване, които операции могат да бъдат завършени незабавно; също така е лесно. Например, ако устройството има четене на данни ще бъде направено без сън; метод анкета трябва да покаже това състояние на нещата. няколко знамена са свикнали да посочи какви са евентуалните операции (дефинирани от гледна точка на ):

Това малко трябва да се настрои, ако е на разположение за четене на "нормално" данни. Четим връща устройства (POLLIN | POLLRDNORM).

Това малко показва, че прочете наличната информация апарат е логическа комуникационен канал (от допълнителен помощен канал). Понастоящем се използва само на едно място в ядрото на Линукс (DECnet код) и, като правило, не се прилага за драйвери на устройства.

Когато един процес четете това устройство вижда края на файла, водачът трябва да инсталирате POLLHUP (виси). Метод, изберете повикващия каза устройството за четене, както диктува от функционалността на избор.

Възникнала грешка устройство. Когато се стартира проучване на общественото устройство отчита като чете и пише, и да четат и пишат код за грешка се връща без блокиране.

Това малко се помещава в върнатата стойност, ако дадено устройство може да се запише без блокиране.

Това малко има същото значение, както POLLOUT а понякога и това наистина е един и същ номер. връща записващо устройство (POLLOUT | POLLWRNORM).

Струва си да се повтаря, че POLLRDBAND и POLLWRBAND има смисъл само за описания на файлове, свързани с контакти: драйвери на устройства обикновено не използват тези знамена.

Описание анкета отнема много пространство за това, което е сравнително лесна за използване в практиката. Помислете за изпълнението на scullpipe метода анкета:

статично неподписан вътр scull_p_poll (структура на файл * FILP, poll_table * изчакване)

Struct scull_pipe * отклонение = filp-> private_data;

неподписан Int маска = 0;

* Този буфер е кръгла; тя се смята за завършена

* Ако "WP" е точно зад "RP" и празно, ако

poll_wait (FILP, dev-> INQ, изчакайте);

poll_wait (FILP, dev-> outq, изчакайте);

ако (dev-> RP! = dev-> WP)

маска | = POLLIN | POLLRDNORM; / * Разбираемо * /

маска | = POLLOUT | POLLWRNORM; / * Записваеми /

Този код просто добавя две опашки чакат да scullpipe poll_table. след това се показват съответните битова маска, в зависимост от това дали данните могат да бъдат прочетени или писмено.

Представен анкета код пропуска подкрепа за "край на файл", защото scullpipe не поддържа "края на файла". За повечето реални устройства метод анкета трябва да се върне POLLHUP. ако данните вече не (или не) е. Ако обаждащият се използва системата наричаме изберете. Този файл се отчита като чете. Без значение използва анкета или изберете. заявлението, знае, че това може да доведе чете, без да чака вечно, и метод връща четене, 0 сигнализираха в края на файла.

С реално на FIFO, например, читателят вижда края на файла, когато всички писатели закриване на досието, докато scullpipe читател никога не вижда края на файла. Поведението е различна, тъй като FIFO е предназначен да бъде канал за комуникация между двата процеса и scullpipe кофа за боклук, където всеки може да постави на данни, докато има поне един читател. Освен това, то няма смисъл да се приведе отново в действие това, което вече е на разположение в ядрото, така че ние сме избрали в този пример, различно поведение за изпълнение.

Изпълнение на "края на файла", както и в FIFO, би било да се направи проверка на фон dev-> nwriters в четене и в анкета и да докладва за "края на файла" (както е описано по-горе), ако няма процес, който има устройство отворен за писане. За съжаление, когато такова изпълнение, ако читател отвори scullpipe устройство преди писателя, той ще види "в края на файла", без да има шанс да се изчака данни. Най-добрият начин за решаване на този проблем е да се заключва на открито. както недвижими FIFO; тази задача е оставена като упражнение за читателя.

Взаимодействие с четат и пишат

Анкета цел покана е да се определи и да изберете предварително дали операцията на I / O е блокиран. Във връзка с това те се допълват четат и пишат. Какво е по-важно, анкета и изберете са полезни, защото те позволяват на заявление в същото време се очаква множество потоци от данни, въпреки че ние не използваме тази функция в черепа на примера. За да си свършат работата както трябва, имате нужда от правилното прилагане на трите предизвикателства: въпреки следните правила имат повече или по-малко каза, ние ги обобщим тук.

Четене на данни от устройството

• Ако има данни във входния буфер, достъпът за четене трябва да се върне веднага, без никакво забележимо забавяне, дори и да има по-малко данни, отколкото поискани от прилагането и на водача е сигурен, че останалите данни ще пристигнат в близко бъдеще. Винаги можете да се върнете по-малко данни, отколкото се изисква, най-малко един байт, ако е удобно по някаква причина, (ние го направихме в скул). В този случай, трябва да се върне в анкетата POLLIN | POLLRDNORM.

• При липса на данни във входния буфер, прочетете по подразбиране трябва да бъде блокирано, докато има поне един байт. От друга страна, ако зададената O_NONBLOCK. прочетете връща незабавно на стойност -EAGAIN (макар че в някои по-стари System V в този случай се връща 0). В тези случаи, в анкетата, трябва да ви информирам, че устройството не е достъпен за четене, докато не се получи най-малко един байт. В момента, в буфера е някои данни дърпаме обратно в предишния случай.

• Ако ние сме в края на файла, за четене трябва да се върне незабавно връщане на стойност 0, независимо от O_NONBLOCK. анкета в този случай трябва да информира POLLHUP.

Записване устройство

• Ако има място в изходния буфер, пише трябва да се върне незабавно. Това може да отнеме малко данни от исканата предизвикателство, но той трябва да вземе най-малко един байт. В този случай, в анкетата казва, че устройството е достъпно за записване, връщайки POLLOUT | POLLWRNORM.

• Ако изход буфер е пълен, блокове, докато има празно пространство, освободени по подразбиране запис. Ако зададете O_NONBLOCK. пиша веднага се връща с -EAGAIN стойност (стар върна System V 0). В тези случаи на анкетата трябва да докладва, че файлът не може да се записва. Ако, от друга страна, устройството може да не приеме повече информация, пишете ни -ENOSPC ( "няма място в устройството", "Няма място на устройството"), независимо от O_NONBLOCK за настройка.

• Никога не направи изчакващо повикване в чакат данните за запис, преди да се върне, дори и ако O_NONBLOCK изчистени. Много приложения използват изберете. за да видите дали блокиран пишат. Ако устройството се отчита като писане, разговорът не трябва да бъде блокиран. Ако една програма, която използва устройството има за цел да гарантира, че данните от опашката в изходния буфер действително се предава, така че водачът трябва да осигури метод fsync. Например, сменяем устройството трябва да има входна точка fsync един.

Въпреки, че това е един добър набор от общи правила, тя също трябва да се признае, че всяко устройство е уникален, и че понякога правилата трябва да бъдат леко променена. Например, устройството ориентирани запис (като лента) не може да се извърши частично записа.

Възстановяване на диска в процес на отнемане

Видяхме как метода на запис по себе си не отчита всички нужди за предаване на данни. fsync функцията. причинил система разговор със същото име, запълва тази празнина. Методът на прототип е

Int (* fsync) (структура на файл * файл, структура dentry * dentry, вътр datasync);

Ако приложение трябва винаги да бъдете сигурни, че данните са изпратени към устройството, методът на fsync трябва да се извършва независимо от това дали O_NONBLOCK е настроен. Повикване fsync трябва да се върне само, когато данните в устройството са напълно прехвърлени (т.е. изходната буфер е празен), дори и ако е необходимо известно време. datasync аргумент се използва за разграничаване на системни функции fsync и fdatasync; като такава, тя е от интерес само към кода на файловата система и могат да бъдат игнорирани от водачите.

подлежащата структура

Реалното изпълнение на системни функции, анкета и да изберете, е достатъчно проста, за тези, които се интересуват от това как тя работи; epoll е малко по-сложно, но на базата на един и същ механизъм. Всеки път, когато потребител прилагането призовава анкета. изберете или epoll_ctl (* Това е функцията, която създава вътрешна структура на данните за бъдещите предизвикателства epoll_wait.). ядрото вика метода анкета на всички файлове, които са цитирани от поканата система, подавайки всеки един от тях по същия poll_table. Структура poll_table е само обвивка около функция, която създава реалната структура на данните. За да се сондира и изберете тази структура е свързан списък на страниците, съдържащи памет poll_table_entry структура. Всеки файл съдържа poll_table_entry структура и указатели wait_queue_head_t прехвърлени poll_wait заедно с опашката чакат свързания обект. Call poll_wait понякога допринася за процеса на опашката на чакащите. Цялата структура трябва да бъде обслужван ядро, така че процесът може да бъде отстранен от всички тези опашки, за да се върне в анкетата или изберете.

Ако нито един от изследваните шофьорите не показват, че I / O може да се случи, без да блокира, анкета повикване просто спи, докато една от (вероятно много) чакам опашки не се събуди.

Интересна анкета в изпълнението е, че методът на водача анкета може да се нарече с нулев указател като аргумент poll_table на. Тази ситуация може да възникне по няколко причини. Ако анкетата за кандидатстване призвание. прехвърлени на таймаута е 0 (което означава, че не трябва да има изчакване), няма причина да се съберат опашката на чакащите, а системата просто не прави нищо. Индексът poll_table също веднага да NULL след всяка анкета шофьор което показва, че вход / изход е възможно. Защото от сега нататък ядрото знае, че очакванията няма да бъде, тя не се изгради списък на опашки.

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

Ние се опитахме да покажем на фигура 6-1 структури от данни, които участват в изследването; Тази цифра е изобразено реални структурите от данни, тъй като не се отчитат естеството на масата за мулти-анкета и пренебрегва показалеца на файл, който е част от всеки poll_table_entry. Читателите, интересуващи се от действителното изпълнение, силно се препоръчва да се търси в и FS / select.c.

Анкета и изберете

Фигура 6-1. Структурата на данните, зад анкетата

В момента можем да разберем мотивите за новата система epoll повикване. Обикновено, анкета или изберете повикването включва само малък брой описания на файлове, така че създаването на разходи структури от данни са ниски. Все пак, има приложения, които работят с хиляди описания на файлове. Така създаването и заличаване на структура на данни между всеки вход / изход операция става прекалено скъпи. epoll семейство система повикване позволява на приложенията да се създаде този вид вътрешно ядро ​​структура на данните, само веднъж и да го използвате многократно.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!