Главная » Галлюциногенные » Время является абсолютным поскольку ньютон. Ньютон ввел понятие «Абсолютное время»

Время является абсолютным поскольку ньютон. Ньютон ввел понятие «Абсолютное время»

Ещё одно, о чём надо упомянуть, говоря о Процессоре – так это об абсолютной неограниченной скорости его вычислений. Вернее, даже не скорости – «скорость» предполагает конечную исчислимую частоту подвижек в ходе реализации процесса. Но у вычислений Процессора нету никакой частоты, нету никаких временных процессов как таковых. Собственно, своё название «Процессор» получил благодаря той же компьютерной аналогии, как самое приближённое по смыслу подобие. Но только приближённое – различия Процессора с процессорами компьютерными носит фундаментальный и непреодолимый характер. Проще говоря, если охарактеризовать «скорость» вычислений Процессора, то ни один информационный символ ни одной программы из Инфополя вообще никак не будет изменён, пока Процессором не будут «произведены» соответственные вычисления. Простыми словами, Мир не шелохнётся, пока не узнает, как это сделать. Не шелохнётся также и восприятие ни одного из существ. Понимаю, что такое описание здорово напоминает те эзотерические бредни про то, что там, на «тонком плане» определённо творится «какая-то хрень» со временем. Посему внесём в тему времени ясность.

Логика взаимодействия разных программ в единой среде (Инфополе) предполагает наличие абсолютного для всей этой среды времени, синхронизирующего все процессы. Так вот, полагаю, параметры этого абсолютного времени устанавливает Архисущество и прописывает их в виде отдельного программного пакета в Инфополе.

Каким образом оно это делает? Элементарно. Сама концепция времени – это отношение скорости одного процесса к скорости другого процесса, то есть мы оперируем понятиями относительно времени. Любой процесс логически представляет собой дискретную смену состояний. Если мы говорим о некой программе или базе данных как последовательности символов, то состояние №1 (одна последовательность) скачкообразно сменяется на состояние №2 (другая последовательность). Такие смены происходят с некоторой частотой F. А теперь если мы будем считать одной базой данных всё Инфополе, то также придём к наличию частоты – теперь уже фундаментальной, на которой изменяются суммарное состояние всей информации всего Инфополя. Фишка в том, что период между сменами двух таких состояний будет минимальным из существующих, а значит, принципиально неисчислимым , ведь исчисление относительно: все остальные периоды более медленных процессов будут исчислены как число, кратное минимальному периоду. Так вот, этот минимальный период я назвал тиком квантом абсолютного времени . Обозначать его будем так: [тик ]. Применение этой размерности в формулах позволяет довести точность измерений времени до абсолютного максимума.



Так, частоту программ можно измерять как в секундах, так и в тиках:

F = =

И энергию существ тоже:

Е = [кэв/с] = [кэв/тик]

Ну а благодаря знанию частот разных программных процессов, мы легко можем перейти от концепции абсолютного времени к времени привычному. В чём мы меряем наше привычное время? В земных секундах. Так что чтобы перевести наше земное время в абсолютное и наоборот, нам нужно знать, сколько тиков помещается в одной земной секунде. Сколько точно пока не знаю, но полагаю, что определённо больше чем 10 50 (длительность одного тика должна быть намного меньше планковского времени).

Итак, простыми словами, дела обстоят следующим образом. Процессор со своей абсолютной мощностью просчитывает состояние всего Мироздания (всех программ Инфополя), после чего следует закрепление результата с сохранением всех изменений программ в Инфополе – 1 тик прошёл. Потом Процессор снова просчитывает всё Мироздание и вновь закрепляет результат – второй тик прошёл. Потом третий тик, четвёртый и так далее. Абсолютное время, таким образом, нужно для синхронизации всех процессов, проще говоря – для обеспечения единства всего Мироздания на уровне Инфополя.

А ещё – для синхронизации восприятия всех существ – то есть, для обеспечения единства всего Мироздания на уровне Метавосприятия.

Сидевший рядом француз, профессор Вавье, продолжил эту мысль:

Больше того: вернувшись на Землю, мы весьма реально увидим время. Время, от которого сейчас бежим со скоростью света. Мой двухлетний сын будет уже тридцатидвухлетним мужчиной. Кто знает, может быть, через неделю я уже стану дедом.

Джон недоверчиво взглянул на часы. Они показывали 15 часов 11 минут 23 июля 1981 года. Третий день полета, который должен был продолжаться месяц для космонавтов и целые тридцать лет для остальных землян и, что самое главное, для доживающего свои деньки дядюшки Гарвея!

Японец Окада, Главный хронолог, заметил недоверчивый взгляд Джона и улыбнулся:

Вижу, вы никак не возьмете в толк эти штучки со временем и пространством...

Я когда-то читал рассказ Уэллса "Новейший ускоритель", - вмешался Вавье, - где время тоже "сокращается", как у нас.

А мне как-то попался в руки "Потерянный горизонт" Джемса Хильтона, - добавил профессор Иванов, - повесть о некой долине в Тибете, где время текло медленнее. Впрочем, зачем в поисках "лупы времени" забираться в такие дебри? Достаточно посмотреть замедленный фильм (как обычно говорят, что совершенно неверно, все обстоит как раз наоборот - это фильм ускоренный!), чтобы увидеть, как, например, стакан, танцуя в воздухе, падает на стол несколько минут или цветок (вот тут-то как раз фильм замедленный) распускается за несколько секунд...

Но пионером в этой области был, пожалуй, все-таки Андерсен, - датчанин Янсен не был бы датчанином, если б не сказал этого. - Вы, конечно, помните ту сказку, в которой принцесса перед самой свадьбой каким-то чудом оказалась на небе, провела там всего три месяца, а потом вернулась к возлюбленному. А за это время, так сказать, в "междучасье", на Земле прошло много сотен лет и бедная путешественница во времени нашла в своей столице лишь очень древний памятник некой принцессе, которая неожиданно исчезла перед самой свадьбой...

Космонавты замолчали, Джон думал: "А что будет, если наша экспедиция немного задержится и мы вернемся не в 2011, а, скажем, в 2100 году? Не будет ли просрочено право наследования?" Чтобы не думать о вероятности столь печальных обстоятельств, он снова заговорил:

Можете меня обвинить в невежестве, но я никак не могу уразуметь всех этих различных времен. Для меня время - всегда время. Одно время.

Неужели только одно? - с сомнением заметил профессор Окада. - Вы сами в это не верите. Сколько раз вам приходилось говорить и слышать такие фразы: "Ну и времена нынче!", "Тяжелые времена" и так далее. Слышите: "времена", а не "время"! Множественное число!

Так только говорится...

Но так оно и есть. Почему время должно быть, черт побери, только одно? Время - это форма существования материи, ритм этого существования. Существование же может быть различным, следовательно, и ритмы тоже. Даже шарманка в состоянии менять ритм в зависимости от того, с какой скоростью мы вертим ручку. Даже у самого педантичного музыканта, постоянно с равными промежутками ударяющего по одной и той же клавише, даже у него мы заметим смену ритма, ибо невозможно выдержать абсолютно одинаковую частоту и силу ударов. А что же тогда можно сказать о том симфоническом сверхоркестре, которым является мир! Совершенно ясно, что для такого Мафусаила, как, например, уран с его продолжительным периодом полураспада, тысяча лет то же, что для нас мгновение! И опять же наше человеческое мгновение, длящееся полсекунды, должно казаться астрономически большим промежутком времени какому-нибудь Антимафусаилу, например пи-мезону, который, как вычислил еще в 1961 году доктор Гляссер, "живет" едва ли не две десятимиллионные доли миллиардной части секунды!

Теперь я кое-что понимаю, - виновато вставил Джон, но профессор Окада нетерпеливо махнул рукой:

Человек, говорящий "теперь понимаю", еще очень мало разбирается во времени! "Теперь" - это для человека отнюдь не объективная современность, а... прошлое! Например, когда вы смотрите на Солнце с Земли, то видите его не таким, какое оно "теперь" в вашем понимании, а воспринимаете лишь то, что в данный момент зафиксировала сетчатка вашего глаза, то есть фотографию того Солнца, каким оно было целых восемь минут назад. Именно столько времени нужно свету, чтобы проделать путь от Солнца до человеческого глаза. Даже выражение моего лица вы видите не "теперь", а увидите лишь в будущем, правда близком, а именно через... одну трехсотмиллионную долю секунды, так как "теперь" я нахожусь от вас на расстоянии метра.

И все это из-за Эйнштейна, - шутливо вздохнул профессор Иванов. - До самого начала нашего века со временем все было просто. Ньютон, как и многие до и после него, утверждал; "Абсолютное время движется равномерно и независимо от какого-либо объекта".

Если бы я даже и не знал о теории Эйнштейна, - заметил профессор Вавье, - то все равно догадался бы сам, что с этой равномерностью и единством времени что-то не так. Еще в школе я заметил, что час игры в футбол значительно короче, чем час математики, которую я откровенно ненавидел.

Господи помилуй! - не на шутку испугавшись, воскликнул профессор Иванов, - тогда каким же чудом вы заняли должность Первого математика? Если вы напутаете в вычислениях и "пнете" нашу ракету словно футбольный мяч в несколько ином направлении, то наш матч со временем и пространством может окончиться весьма плачевно! Мы можем вообще...

Он не договорил, вспомнив, что космическая этика считает шутки, касающиеся гибели в космосе, признаком дурного тона, чем-то вроде анекдотов о теще.

С самого начала следует четко сказать, что наша попытка объяснить морфологическую эволюцию в терминах генетики развития будет постоянно тормозиться своеобразием предмета, доводящим порой до отчаяния. В отличие от очевидных физиологических или морфогенетических изменений, которые возникают в жизни отдельной особи и которые можно непосредственно наблюдать и изучать экспериментально, эволюционные изменения живых организмов ускользают от наблюдения и масштабы их ограничены. Вследствие этого большая часть наших сведений о морфологической эволюции получена путем изучения не организмов, а их ископаемых остатков, которые мы можем рассматривать как организмы, пользуясь всеми знаниями, почерпнутыми из биологии. Этим мы вовсе не хотим сказать, что единственным источником наших данных об эволюции служит палеонтологическая летопись; мы просто хотели привлечь внимание к тому, что сведения, получаемые при изучении ископаемых остатков, качественно иные, нежели результаты биохимических, эмбриологических и генетических исследований, составляющие большую часть этой книги. Лишь обратившись к палеонтологической летописи, мы можем воссоздать подлинную эволюционную историю не только ныне живущих организмов, но и давно вымерших линий. Столь же важное значение имеют геологические данные, позволяющие измерять абсолютное время, на основании которого можно вычислить скорости эволюционного процесса.

В действительности существуют две шкалы геологического времени - относительная и абсолютная. Относительная шкала была создана в XIX в.; в ее основе лежит открытие английского инженера и маркшейдера Уильяма Смита (William Smith), что некоторые характерные ископаемые остатки, когда бы и где бы он их ни находил, всегда бывают расположены в слоях породы в одной и той же последовательности по отношению друг к другу. Это открытие легло в основу большинства геологических методов. Метод относительного датирования исходит из двух простых допущений. Первое состоит в том, что более молодые слои лежат поверх более древних, а второе - в том, что для каждого определенного геологического слоя характерны, как это обнаружил Смит, свои определенные ископаемые остатки. Среди них встречаются виды, которые жили только короткое время, и поэтому их можно обнаружить лишь в небольшом интервале стратиграфической летописи. Они послужили руководящими ископаемыми, которые дали возможность коррелировать слои горных пород на обширных территориях и построить относительную шкалу времени. Относительной шкалой времени пользовались задолго до того, как Дарвин опубликовал «Происхождение видов» (1859 г.), однако ее связь с абсолютным временем была в лучшем случае весьма слабой. В XVIII в. стали понимать, хотя и очень медленно, что описанная в Библии хронология событий, которую в общем принимали не только обычные люди, но и ученые, охватывает слишком короткий период времени, чтобы в него могли вместиться огромные изменения, произошедшие в истории Земли, даже если согласиться с теорией катастроф, гласившей, что жизнь многократно уничтожалась опустошительными стихийными бедствиями. Считалось, что Всемирный потоп был лишь последней из этих катастроф, раз за разом уничтожавших все, что было сотворено прежде.

Но историю Земли и жизни на ней можно было рассматривать и с иной точки зрения. Ее выдвинул в 1795 г. Дж. Хаттон (J. Hutton) в своей «Теории Земли». Хаттон утверждал, что происходящие сейчас процессы эрозии и воздыманий могли бы за достаточное время полностью изменить лицо Земли. Эту тему исчерпывающим образом разработал Чарлз Лайель (Charles Lyell) в своей книге «Основы геологии», впервые опубликованной в 1830 г. Она доминировала в геологии под названием доктрины униформизма. Ни в каких катастрофах или силах, не наблюдаемых на Земле в настоящее время, нет нужды: дожди и морозы и просто время могут сравнять горы с землей. Беспредельность времени - вот ключ к познанию истории Земли. Хаттон писал: «Мы не можем найти никаких следов начала и никаких наметок конца ».

Дарвиновская эволюция, приводящая к постепенным изменениям путем отбора мелких вариаций, требовала очень продолжительного времени: теория униформизма обеспечила это время. Однако за этим последовал тяжелый удар. Физик Уильям Томсон (William Thomson), позднее лорд Кельвин, в работах, опубликованных в 1862 г. и позднее, показал, что принцип униформизма противоречит второму закону термодинамики. Неограниченное время невозможно, потому что, хотя суммарная энергия во Вселенной остается постоянной, количество энергии, доступной для использования, уменьшается. Таким образом, Вселенная должна приближаться к своему концу. В этом Томсон был абсолютно прав. Только данная им оценка времени, остающегося до этого конца, была слишком занижена. Единственным известным в XIXв. механизмом, который мог бы нагревать Солнце, было гравитационное сжатие. Томсон показал, что такой механизм ограничивает жизнь Солнца, а тем самым и Земли сроком менее 100 млн. лет. Это очень сильно урезало время, имевшееся в распоряжении эволюции, так как лишь в последней пятой части истории Земли обнаружены следы многоклеточных организмов.

В XVII веке происходят существенные изменения в характере мышления, связанные с переосмыслением прежнего - античного и средневекового - понимания природы. Решающую роль в становлении механики как ведущей науки о природе сыграли формулированные Галилеем законы падения тел, благодаря которым ему удалось установить принцип, связывающий между собой пространство и время. Это привело к новому истолкованию понятия времени.

Начиная с Ньютона коррелятором понятия времени становится понятие «непрерывного течения», флюксии, благодаря которому движение определяется как единый, строго регулируемый процесс становления.

Весьма определенно различение времени и длительности проводится Декартом. Согласно Декарту, длительность совпадает с существованием вещи и есть нечто вполне реальное; он называет ее атрибутом, а иногда - модусом субстанции. Определяя время как число движения, Декарт идет за Аристотелем. Он связывает понятие времени с процедурой измерения, т. е. сравнения, соотнесения длительности той или иной вещи с длительностью равномерного движения вращения небосвода или качания маятника. Такое сравнение производится субъектом, его мышлением, а потому время, по Декарту, есть модус мышления, тогда как длительность - модус или атрибут самого бытия вещи. Психологическая трактовка длительности получила дальнейшее развитие и новые формы обоснования у Беркли и Юма. Юм убежден, что идея времени возникает из последовательности впечатлений и идей в нашем сознании. «...Время не может появиться в уме ни само по себе, ни в связи с постоянным и неизменным объектом, но... всегда открывается нами при помощи некоторой доступной восприятию последовательности изменяющихся объектов. У Юма нет больше различения понятий времени и длительности; он употребляет эти понятия как взаимозаменимые. «Время, или длительность, состоит из различных частей, ибо иначе мы не могли бы представить себе более долгой или более краткой длительности».

1.4.Исаак Ньютон: абсолютное и относительное время

Абсолютное, истинное математическое время само по себе и по самой своей сущности, протекает равномерно и иначе называется длительностью. Относительное, кажущееся или обыденное время есть или точная, или изменчивая, постигаемая чувствами, внешняя, совершаемая при посредстве какого- либо движения, мера продолжительности, употребляемая в обыденной жизни вместо истинного математического времени, как-то: час, день, месяц, год.

Ньютон убеждён в том, что абсолютное время не зависит ни от чего внешнего, его самостоятельность настолько велика, что оно не зависит даже от того, существует или не существует мир.

Учение Ньютона об абсолютных времени и пространстве было критически воспринято частью научного сообщества. К их числу принадлежал выдающийся физик и математик Христиан Гюйгенс. Он решительно высказывался как против понятий абсолютного пространства

и времени, так и против истинного движения, не считая возможным ни в каком эксперименте отличить абсолютное движение от относительного.

Среди современников Ньютона, оспаривавших учение об абсолютных времени и пространстве, был и немецкий философ Лейбниц. Он рассматривает понятия вечности, длительности и времени как метафизик. Идея абсолютного - это и есть вечность; она-то и служит онтологической предпосылкой потенциально бесконечного, каким является длительность. Для Лейбница единое (вечность) представляет собой условие возможности непрерывного (длительности). Он различает длительность и время. Длительность есть атрибут самих субстанций, тогда как время - это способ измерения длительности.

Попытку разрешить споры, возникшие в связи с проблемой времени между Ньютоном и Лейбницем предпринял Иммануил Кант. Он рассматривает время и пространство с точки зрения «чистой математики», которая, по его словам, «дает в высшей степени истинное знание и вместе с тем образец высшей очевидности для других наук».

Текущее значение абсолютного времени (time of day, wall time, время дня) определено в файле kernel/timer. с следующим образом.

struct timespec xtime;

Структура данных timespe c определена в файле в следующем виде.

struct timespec {

time_t tv_sec; /* seconds */

long tv_nsec; /* nanoseconds */

1970 года (UTC, Universal Coordinated Time, всеобщее скоординированное время). Указанная дата называется epoch (начало эпохи). В большинстве Unix-подобных операционных систем счет времени ведется с начала эпохи. В поле xtime.tv_nse c хранится количество наносекунд, которые прошли в последней секунде.

Чтение или запись переменной xtime требует захвата блокировки xtime_lock. Это блокировка - не обычная спин-блокировка, а секвентпая блокировка, которая рассматривается в главе 9, "Средства синхронизации в ядре".

Для обновления значения переменной xtime необходимо захватить секвентную блокировку на запись следующим образом.

write_seqlock(&xtime_lock);

/* обновить значение переменной xtime … */

write_sequnlock(&xtime_lock);

Считывание значения переменной xtim e требует применения функций read _

seqbegin() и read_seqretr y () следующим образом.

unsigned long lost;

seq = read_seqbegin(&xtime_lock);

usec = timer->get_offset(); lost = jiffies wall_jiffies; if (lost)

usec += lost * (1000000 / HZ);

sec = xtime.tv_sec;

usec += (xtime.tv_nsec / 1000);

} while (read_seqretry(&xtime_lock, seq));

Этот цикл повторяется до тех пор, пока не будет гарантии того, что во время считывания данных не было записи. Если во время выполнения цикла приходит прерывание таймера и переменная xtime обновляется во время выполнения цикла, возвращаемый номер последовательности будет неправильным и цикл повторится снова.

Главный пользовательский интерфейс для получения значения абсолютного времени - это системный вызов gettimeofda y () , который реализован как функция sys_gettimeofday() следующим образом.

asmlinkage long sys_gettimeofday(struct timeval *tv, struct timezone *tz)

if (likely(tv !=NULL)) { struct timeval_ktv; do_gettimeofday(&ktv);

if (copy_to_userftv, &ktv, sizeof(ktv))

if (unlikely(tz !=NULL)) {

if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))

Если из пространства пользователя передано ненулевое значение параметра tv, то вызывается аппаратно-зависимая функция do_gettimeofday() . Эта функция главным образом выполняет цикл считывания переменной xtime , который был только что рассмотрен. Аналогично, если параметр tz не равен нулю, пользователю возвращается значение часового пояса (time zone), в котором находится операционная система. Этот параметр хранится в переменной sys_tz . Если при копировании в пространство пользователя значения абсолютного времени или часового пояса возникли ошибки, то функция возвращает значение -EFAULT. В случае успеха возвращается нулевое значение.

Ядро предоставляет системный вызов time() 6 , однако системный вызов gettimeofday() полностью перекрывает его возможности. Библиотека функций языка С также предоставляет другие функции, связанные с абсолютным временем, такие как ftime() и ctirae() .

Системный вызов settimeofday() позволяет установить абсолютное время в указанное значение. Для того чтобы его выполнить, процесс должен иметь возможность использования CAP_SYS_TIME.

Если не считать обновления переменной xtime, то ядро не так часто использует абсолютное время, как пространство пользователя. Одно важное исключение- это код файловых систем, который хранят в индексах файлов значения моментов времени доступа к файлам.

Таймеры

Таймеры (timers), или, как их еще иногда называют, динамические таймеры, или таймеры ядра, необходимы для управления ходом времени в ядре. Коду ядра часто необходимо откладывать выполнение некоторых функций на более позднее время. Здесь намеренно выбрано не очень четкое понятие "позже". Назначение механизма нижних половин - это не задерживать выполнение, а не выполнять работу прямо сейчас. В связи с этим необходим инструмент, который позволяет задержать выполнение работы на некоторый интервал времени. Если этот интервал времени не очень маленький, но и не очень большой, то решение проблемы - таймеры ядра.

6 Дл я некоторы х аппаратны х платфор м функция sys_time () не реализована, а вместо этого она эмулируется библиотекой функций языка С на основании вызова gettimeofday () .

Таймеры очень легко использовать. Необходимо выполнить некоторые начальные действия, указать момент времени окончания ожидания, указать функцию, которая будет выполнена, когда закончится интервал времени ожидания, и активизировать таймер. Указанная функция будет выполнена, когда закончится интервал времени таймера. Таймеры не являются циклическими. Когда заканчивается интервал времени ожидания, таймер ликвидируется. Это одна из причин, почему таймеры называют динамическими 7. Таймеры постоянно создаются и ликвидируются, на количество таймеров не существует ограничений. Использование таймеров очень популярно во всех частях ядра.

Использование таймеров

Таймеры представлены с помощью структур time r list , которая определена в файле следующим образом.

struct tirner_list {

struct list_head entry; /* таймеры хранятся в связанном списке */

unsigned long expires; /* время окончание срока ожидания в импульсах системного таймера (jiffies) */

spinlock_t lock; /* блокировка для защиты данного таймера */

void (*function) (unsigned long); /*функция-обработчик таймера*/ unsigned long data; /* единственный аргумент обработчика */ struct tvec_t_base_s *base; /*внутренние данные таймера, не трогать! */

К счастью, использование таймеров не требует глубокого понимания назначения полей этой структуры. На самом деле, крайне не рекомендуется использовать поля этой структуры не по назначению, чтобы сохранить совместимость с возможными будущими изменениями кода. Ядро предоставляет семейство интерфейсов для работы с таймерами, чтобы упростить эту работу. Все необходимые определения находятся в файле . Большинство реализаций находится в файле kernel/timer.с.

Первый шаг в создании таймера - это его объявление в следующем виде.

struct timer_list my_timer;

Далее должны быть инициализированы поля структуры, которые предназначены для внутреннего использования. Это делается с помощью вспомогательной функции перед вызовом любых функций, которые работают с таймером.

my_timer.expire s = jiffie s + delay ; /* интервал времени таймера закончится через delay импульсов */

7 Другая причин а состоит в том, что в ядрах старых версий (до 2.3) существовали статические таймеры. Такие таймер ы создавались во врем я компиляции, а не во врем я выполнения. Он и имели ограниченны е возможности и из-за их отсутствия сейчас никто не огорчается.

my_timer.data = 0; /* в функцию-обработчик Судет передан параметр, равный нулю */

my_timer.function = my_function; /* функция, которая будет выполнена,

когда интервал времени таймера истечет */

Значение поля my_timer.expire s указывает время ожидания в импульсах системного таймера (необходимо указывать абсолютное количество импульсов). Когда текущее значение переменной jiffie s становится большим или равным значению поля my_time r . expires , вызывается функция-обработчик my_timer.functio n с параметром my_timer.data . Как видно из описания структуры timer_list , функция-обработчик должна соответствовать следующему прототипу.

void my_timer_function(unsigned long data);

Параметр dat a позволяет регистрировать несколько таймеров с одним обработчиком и отличать таймеры с различными значениями этого параметра. Если в аргументе нет необходимости, то можно просто указать нулевое (или любое другое) значение.

Последняя операция - это активизация таймера.

add_timer(&my_timer);

И таймер запускается! Следует обратить внимание на важность значения поля expired . Ядро выполняет обработчик, когда текущее значение счетчика импульсов системного таймера больше, чем указанное значение времени срабатывания таймера, или равно ему. Хотя ядро и гарантирует, что никакой обработчик таймера не будет выполняться до истечения срока ожидания таймера, тем не менее возможны задержки с выполнением обработчика таймера. Обычно обработчики таймеров выполняются в момент времени, близкий к моменту времени срабатывания, однако они могут быть отложены и до следующего импульса системного таймера. Следовательно, таймеры нельзя использовать для работы в жестком режиме реального времени.

Иногда может потребоваться изменить момент времени срабатывания таймера, который уже активизирован. В ядре реализована функция mod_time r () , которая позволяет изменить момент времени срабатывания активного таймера.

mod_timer(&my_timer, jiffies + new_delay); /* установка нового времени срабатывания*/

Функция mod_time r () позволяет также работать с таймером, который проинициализирован, но не активен. Если таймер не активен, то функция mod_timer() активизирует его. Эта функция возвращает значение 0, если таймер был неактивным, и значение 1, если таймер был активным. В любом случае перед возвратом из функции mod_time r () таймер будут активизирован, и его время срабатывания будет установлено в указанное значение.

Для того чтобы деактивизировать таймер до момента его срабатывания, необходимо использовать функцию del_time r () следующим образом.

del_timer(&my_timer);

Эта функция работает как с активными, так и неактивными таймерами. Если таймер уже неактивен, то функция возвращает значение 0, в другом случае возвращается значение 1. Следует обратить внимание, что нет необходимости вызывать эту

функцию для таймеров, интервал ожидания которых истек, так как они автоматически деактивипируются.

При удалении таймеров потенциально может возникнуть состояние конкуренции. Когда функция del_time r () возвращает управление, она гарантирует только то, что таймер будет неактивным (т.е. его обработчик не будет выполнен в будущем). Однако на многопроцессорной машине обработчик таймера может выполняться в этот момент на другом процессоре. Для того чтобы деактивизировать таймер и подождать, пока завершится его обработчик, который потенциально может выполняться, необходимо использовать функцию del_timer_syn c () :

del_timer_sync(&my_timer);

В отличие от функции del_timer() , функция del_timer_sync() не может вызываться из контекста прерывания.

Состояния конкуренции, связанные с таймерами

Так как таймеры выполняются асинхронно по отношению к выполняемому в данный момент коду, то потенциально могут возникнуть несколько типов состояний конкуренции за ресурсы. Во-первых, никогда нельзя использовать следующий код, как замену функции inod_timer ().

del_timer (my_timer) ;

my_timer->expires = jiffies + new_delay;

add_timer(my_timer);

Во-вторых, практически во всех случаях следует использовать функцию del_time r _sync (), а не функцию del_time r (). В противном случае нельзя гарантировать, что обработчик таймера в данный момент не выполняется. Представьте себе, что после удаления таймера код освободит память или каким-либо другим образом вмешается в ресурсы, которые использует обработчик таймера. Поэтому синхронная версия более предпочтительна.

Наконец, необходимо гарантировать защиту всех совместно используемых данпых, к которым обращается функция-обработчик таймера. Ядро выполняет эту функцию асинхронно по отношению к другому коду. Совместно используемые данные должны защищаться так, как рассматривалось в главах 8 и 9.

Реализация таймеров

Ядро выполняет обработчики таймеров в контексте обработчика отложенного прерывания после завершения обработки прерывания таймера. Обработчик прерывания таймера вызывает функцию update_process_time s () , которая в свою очередь вызывает функцию run_local_timer s () , имеющую следующий вид.

void run_local_timers(void)

raise_softirq(TIMER_SOFTIRQ);

Отложенное прерывание с номером TIMER_SOFTIRQ обрабатывается функцией run_tirner_softir q (). Эта функция выполняет на локальном процессоре обработчики всех таймеров, для которых истек период времени ожидания (если такие есть).

Таймеры хранятся в связанном списке. Однако в ядре было бы неразумным просматривать весь список в поисках таймеров, для которых истекло время ожидания, или поддерживать список в отсортированном состоянии на основании времени срабатывания таймеров. В последнем случае вставка и удаление таймеров заняли бы много времени. Вместо этого таймеры разбиваются на 5 групп на основании времени срабатывания. Таймеры перемещаются из одной группы в другую, по мере того как приближается момент времени срабатывания. Такое разбиение на группы гарантирует, что в большинстве случаев при выполнении обработчика отложенного прерывания, ответственного за выполнение обработчиков таймеров, ядро будет выполнять мало работы для поиска таймеров, у которых истек период ожидания. Следовательно, код управления таймерами очень эффективен.



Предыдущая статья: Следующая статья:

© 2015 .
О сайте | Контакты
| Карта сайта